GELU (Gaussian Error Linear Unit)
GELU(ガウス誤差線形ユニット)は各入力を正規累積分布関数でスケーリングする、BERT、GPT-2、ビジョンTransformerで使われる滑らかな活性化関数です。コードも紹介します。
ガウス誤差線形ユニット(GELU)は、GELU(x) = x · Φ(x)で定義される活性化関数です。ここでΦは標準正規分布の累積分布関数です。標準正規変数が入力値を下回る確率に応じて各入力に重みを付けるため、大きな正の入力はほぼそのまま通過し、大きな負の入力はほぼゼロになり、ゼロ付近の入力は約半分にスケーリングされます。Dan Hendrycks氏とKevin Gimpel氏は、2016年の論文Gaussian Error Linear Units (GELUs)でGELUを提案しました。GELUは、BERT、GPT-2、GPT-3、ビジョントランスフォーマー(ViT)などのTransformerモデルで標準的な活性化関数となり、各フィードフォワードブロックの2つの線形レイヤーの間に配置されます。
GELUの仕組み#
Hendrycks氏とGimpel氏は、確率的正則化からGELUを導出しました。各入力xに対し、確率Φ(x)で値を保持し、それ以外ではゼロにするランダムなマスクを掛けることを考えます。これは、入力に応じて保持確率が上がるドロップアウトのようなものです。GELUはこの処理の期待値Φ(x) · xであり、入力を値に応じて滑らかにゲートします。一方、ReLUは符号に応じて不連続にゲートします。
こうして得られる曲線には、学習上重要な次の3つの特性があります。
- 全域で滑らか: GELUとその導関数は連続しており、ゼロに折れ曲がりがありません。そのため、バックプロパゲーション中に重みが小さく変化すると、出力も小さく変化します。
- 単調ではない: 負の入力では、出力がいったん低下した後、ゼロに向かって上昇します。x ≈ −0.75で約−0.17の最小値に達します。
- 負の入力に対する勾配: 中程度に負の入力を持つユニットにも勾配が伝わるため、ReLUユニットなら学習が止まる領域でも学習を続けられます。
Φには誤差関数が含まれるため、一般的な近似が2種類あります。tanh形式の0.5x(1 + tanh(√(2/π)(x + 0.044715x³)))は、厳密なGELUとの差が約0.0005以内で、GPT-2で使われました。シグモイド形式のx · σ(1.702x)は差が約0.02以内で、OpenAIのCLIPで使われるQuickGELUです。PyTorchのnn.GELUはデフォルトで厳密な形式を計算し、approximate="tanh"を指定するとtanh形式を計算します。
import torch
from torch import nn
x = torch.tensor([-3.0, -1.0, -0.75, 0.0, 1.0, 3.0])
# Exact GELU: x * Phi(x), where Phi is the standard normal CDF
exact = nn.GELU()(x)
# Tanh approximation, as used in GPT-2
approx = nn.GELU(approximate="tanh")(x)
print(f"GELU exact: {[round(v, 4) for v in exact.tolist()]}")
print(f"GELU tanh: {[round(v, 4) for v in approx.tolist()]}")
print(f"ReLU: {nn.ReLU()(x).tolist()}")厳密なGELUは[-0.004, -0.1587, -0.17, 0.0, 0.8413, 2.996]を、tanh形式は[-0.0036, -0.1588, -0.17, 0.0, 0.8412, 2.9964]を、ReLUは[0.0, 0.0, 0.0, 0.0, 1.0, 3.0]を出力します。GELUは−0.75付近の最小値で−0.17を出力し、Φ(1) = 0.8413であるため1を0.8413に変換し、±3ではReLUとほぼ同じ値になります。2種類のGELU形式の違いは小数第4位にしか現れません。
GELUの用途#
- GPTモデル: OpenAI初のGPTは2018年にGELUを採用し、GPT-2とGPT-3もこれを引き継ぎました。
- BERT: GoogleのBERTはGPTに続いてReLUではなくGELUを選択し、現在も多くのBERT系エンコーダーがGELUを使用しています。
- ビジョントランスフォーマー: ViTは各エンコーダーブロックのMLPでGELUを適用します。ResNetを現代化する際にReLUをGELUへ置き換えたConvNeXtをはじめ、多くのビジョンバックボーンがこれに続きました。
- 検出トランスフォーマー: Ultralyticsパッケージでは、Baiduのリアルタイム検出トランスフォーマーであるRT-DETRのAIFI Transformerエンコーダーが、2つのフィードフォワードレイヤーの間でGELUを適用します。
近年の多くの大規模言語モデル(LLM)は、通常のGELUからゲート付きフィードフォワードレイヤーへ移行しました。GoogleのGemmaは、GELUで活性化した射影と2つ目の線形射影を乗算するGEGLUを使用します。Llama、PaLM、Qwenは、SiLUベースのSwiGLUを使用します。
GELUと関連する活性化関数の比較#
- ReLU: max(0, x)は計算コストが低く、正確なゼロを出力しますが、ゼロで折れ曲がります。GELUの論文では、評価したすべてのコンピュータビジョン、自然言語処理、音声タスクで、GELUがReLUとELUを上回ったと報告されています。
- SiLU(Swish): x · σ(x)は全体的に似た形状で、最小値は約−0.28とより深くなります。Transformerでは通常GELUが使われ、畳み込み検出器ではSiLUがより一般的です。
- Leaky ReLU: 負の入力に対して一定の直線的な傾きを保ちます。一方、GELUの負の領域は、ゼロに戻る曲線です。
- GEGLU: ゲート付きの派生形式で、学習可能な2つ目の射影を追加します。Noam Shazeer氏が2020年にT5で比較した際、同じパラメーター数では、GEGLUのフィードフォワードレイヤーは検証データの対数パープレキシティ1.633を達成しました。GELUは1.679、ReLUは1.677でした。










