AI・機械学習
上級

GeGLU活性化関数(ジージーエルユー カッセイカカンスウ)

GeGLU(GELU-Gated Linear Unit)は GELU 関数と GLU ゲート機構を組み合わせた活性化関数であり、Google の Gemma シリーズ(2024年)で採用され、SwiGLU と並ぶ GLU ファミリーの代表的な活性化関数である。

0 回閲覧
0 いいね

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 が継続される。

GeGLU と GLU ファミリーの比較

活性化関数ゲート関数数式主な採用モデル
GLUSigmoidσ(xW) ⊙ (xV)GPT-J(一部)
ReGLUReLUReLU(xW) ⊙ (xV)実験的
GeGLUGELUGELU(xW) ⊙ (xV)Gemma 1/2/3
SwiGLUSwishSwish(xW) ⊙ (xV)LLaMA / Mistral / Qwen
BiGLUBilinear(xW) ⊙ (xV)実験的

Shazeer(2020年)の実験結果では、C4 データセットでの perplexity で SwiGLU > GeGLU > ReGLU > GELU > ReLU の順であった。SwiGLU と GeGLU の差は 0.1-0.3% とごく僅かである。

Gemma での GeGLU 実装パラメータ

モデルd_modelFFN 隠れ層隠れ層比率層数パラメータ総数
Gemma 1 2B2,04816,3848.0x182.5B
Gemma 1 7B3,07224,5768.0x288.5B
Gemma 2 2B2,3049,2164.0x262.6B
Gemma 2 9B3,58414,3364.0x429.2B
Gemma 2 27B4,60836,8648.0x4627.2B

Gemma 2 では FFN 隠れ層を GeGLU のゲート機構に合わせて調整している。2B モデルでは隠れ層比率を 4.0x に抑えることでパラメータ効率を最適化し、同サイズ帯の LLaMA 2 7B と比較して推論速度を 2.5 倍に向上させた。

PyTorch 実装

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 に置き換えるだけであり、計算コストもほぼ同等である。

SwiGLU との使い分け

  • SwiGLU を選ぶべき場合: LLaMA / Mistral / Qwen のアーキテクチャを踏襲する場合。既存の学習済み重みからのファインチューニング・マージを行う場合
  • GeGLU を選ぶべき場合: Gemma 系のアーキテクチャを踏襲する場合。Google の学習インフラ(TPU v5e / Pathways)と組み合わせる場合
  • 性能差: 両者の差は perplexity 0.1-0.3% とごく僅かであり、実用上は互換と考えて差し支えない

Google が GeGLU を選択した理由

Google が SwiGLU ではなく GeGLU を選択した背景には以下の要因がある。

  • BERT との一貫性: Google は BERT / T5 / PaLM で GELU を使用してきた歴史があり、GELU ベースの GeGLU はインフラとの親和性が高い
  • TPU 最適化: Google の TPU(v4/v5e/v5p)は GELU のカスタム実装が高度に最適化されており、Swish より GELU の方が TPU 上での実行効率が高い
  • 学習安定性: Google の内部実験では、大規模(100B+)モデルの学習初期段階で GeGLU が SwiGLU よりわずかに安定する傾向が報告されている

よくある質問(FAQ)

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 倍になるため、小規模モデルではオーバーヘッドが目立つ場合がある。

まとめ

  • GeGLU は GELU ゲーティングによる GLU ファミリーの活性化関数
  • Google の Gemma シリーズ(1/2/3)で全面採用
  • SwiGLU との性能差はごく僅か(0.1-0.3%)で、実用上は同等
  • Google の TPU インフラとの親和性が選択の主因
  • 実装は SwiGLU と同じ構造でゲート関数を GELU に変更するだけ