GeGLU(GELU-Gated Linear Unit)は GELU 関数と GLU ゲート機構を組み合わせた活性化関数であり、Google の Gemma シリーズ(2024年)で採用され、SwiGLU と並ぶ GLU ファミリーの代表的な活性化関数である。
PC構成ビルダーで最適なパーツを選択
GeGLU(GELU-Gated Linear Unit)は、Noam Shazeer が 2020年の論文「GLU Variants Improve Transformer」で SwiGLU・ReGLU と共に提案した活性化関数である。GeGLU(x, W, V) = GELU(xW) ⊙ (xV) で定義され、GELU をゲート関数として使用する点が SwiGLU(Swish ゲート)との違いである。
GeGLU は GLU(Gated Linear Unit)ファミリーに属する。GLU は 2016年に Dauphin et al. が提案した構造で、入力を2つのパスに分割し、一方をゲートとして使用する f(x) = σ(xW) ⊙ (xV) という形式である。GeGLU はこのゲート関数 σ を GELU に置き換えたものであり、SwiGLU(Swish ゲート)、ReGLU(ReLU ゲート)と共に GLU ファミリーの3大派生を構成する。
Google は 2024年に発表した Gemma 2(2B/9B/27B パラメータ)で GeGLU を全面採用し、同サイズ帯で LLaMA 2 を上回るベンチマーク結果を達成した。Gemma 1(2024年2月)も GeGLU ベースであり、Google の LLM アーキテクチャは一貫して GeGLU を選択している。2025年の Gemma 3(2B/4B/12B/27B)でも GeGLU が継続される。
| 活性化関数 | ゲート関数 | 数式 | 主な採用モデル |
|---|---|---|---|
| GLU | Sigmoid | σ(xW) ⊙ (xV) | GPT-J(一部) |
| ReGLU | ReLU | ReLU(xW) ⊙ (xV) | 実験的 |
| GeGLU | GELU | GELU(xW) ⊙ (xV) | Gemma 1/2/3 |
| SwiGLU | Swish | Swish(xW) ⊙ (xV) | LLaMA / Mistral / Qwen |
| BiGLU | Bilinear | (xW) ⊙ (xV) | 実験的 |
Shazeer(2020年)の実験結果では、C4 データセットでの perplexity で SwiGLU > GeGLU > ReGLU > GELU > ReLU の順であった。SwiGLU と GeGLU の差は 0.1-0.3% とごく僅かである。
| モデル | d_model | FFN 隠れ層 | 隠れ層比率 | 層数 | パラメータ総数 |
|---|---|---|---|---|---|
| Gemma 1 2B | 2,048 | 16,384 | 8.0x | 18 | 2.5B |
| Gemma 1 7B | 3,072 | 24,576 | 8.0x | 28 | 8.5B |
| Gemma 2 2B | 2,304 | 9,216 | 4.0x | 26 | 2.6B |
| Gemma 2 9B | 3,584 | 14,336 | 4.0x |
Gemma 2 では FFN 隠れ層を GeGLU のゲート機構に合わせて調整している。2B モデルでは隠れ層比率を 4.0x に抑えることでパラメータ効率を最適化し、同サイズ帯の LLaMA 2 7B と比較して推論速度を 2.5 倍に向上させた。
import torch
import torch.nn as nn
import torch.nn.functional as F
class GeGLU(nn.Module):
def __init__(self, dim, hidden_dim, bias=False):
super().__init__()
self.gate_proj = nn.Linear(dim, hidden_dim, bias=bias)
self.up_proj = nn.Linear(dim, hidden_dim, bias=bias)
self.down_proj = nn.Linear(hidden_dim, dim, bias=bias)
def forward(self, x):
gate = F.gelu(self.gate_proj(x))
up = self.up_proj(x)
return self.down_proj(gate * up)
実装上、SwiGLU との違いは F.silu を F.gelu に置き換えるだけであり、計算コストもほぼ同等である。
Google が SwiGLU ではなく GeGLU を選択した背景には以下の要因がある。
Q1: GeGLU は SwiGLU より優れているのか? A: 同等である。ベンチマーク上の差は 0.1-0.3% と統計的に有意とは言い難い。モデルアーキテクチャ全体の設計(層数・隠れ層サイズ・正規化手法)の方が精度への影響が大きい。
Q2: 既存の SwiGLU モデルを GeGLU に変換できるか? A: アーキテクチャの変更自体は容易(F.silu → F.gelu)だが、学習済み重みはそのまま使用できない。GeGLU に変換する場合はファインチューニングまたは再学習が必要。
Q3: GeGLU は GELU の上位互換か? A: はい。GeGLU は GELU にゲート機構を追加したものであり、同じ計算予算内で GELU を一貫して上回る。ただしパラメータ数が約 1.5 倍になるため、小規模モデルではオーバーヘッドが目立つ場合がある。
| 42 |
| 9.2B |
| Gemma 2 27B | 4,608 | 36,864 | 8.0x | 46 | 27.2B |