1. GELU ってなに?
GELU(Gaussian Error Linear Unit)は、入力 を「その値が正規分布に従ってどれだけ有益か」を確率的に重み付けして出力する活性化関数です。 数式はシンプル:
ここで は標準正規分布の累積分布関数。ReLU が を完全に 0 にするのに対し、GELU は 滑らかに 0〜1 の重みを掛けるのが特徴です。
2. いつ登場したの?なぜ最近話題に?
GELU は 2016年に論文で初登場しましたが、当時はそれほど注目されていませんでした。
- 提案論文:Gaussian Error Linear Units (GELUs)
- 本格的に注目されたのは 2018年の BERT 登場時。このTransformerモデルでGELUが採用されたことで一気に広まりました。
私がG検定を取得した2021年のG検定の教材などに載っていなかった気がします。これは近年のモデルで急速に普及した関数だからとのこと。
3. “柔らかい判断” のイメージ
たとえるなら 「テストの合格ラインが 50 点きっかりではなく、49 点なら 49%、60 点ならほぼ 100% 合格」 という“あいまい合否”。ReLU は 50 点未満をバッサリ不合格 (=0) にしますが、GELU は近い点数ほど合格可能性を残すため、勾配が途切れにくく学習がスムーズになります。
4. 近似式で高速化!
GELU の元の数式()には累積正規分布関数が含まれ、計算コストが高めです。そこで、「だいたい同じ形になるような簡単な関数」で近似することで、処理を軽くすることができます。
たとえば PyTorch では次のような tanh を使った高速近似が採用されています:
import torch.nn.functional as F
def gelu_fast(x):
return 0.5 * x * (1 + torch.tanh(
0.79788456 * (x + 0.044715 * torch.pow(x, 3))))
これは 高速・省メモリながらも元の GELU と非常に近い挙動を保つことができ、実用上問題ありません。
5. PyTorch 実装は 1 行
import torch.nn as nn
act = nn.GELU() # そのまま呼び出せる
試しに入力と出力を確認:
import torch
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
print(act(x))
# tensor([-0.0454, -0.1588, 0.0000, 0.8412, 1.9546])
負値も完全には切り捨てられず、0 付近は滑らかに変化しているのがわかります。
6. いつ使う?いつ避ける?
シナリオ | GELU の効果 | 備考 |
---|---|---|
Transformer 系(BERT/GPT) | ◎ 精度向上が報告多数 | デフォルトで採用例多い |
画像分類で深層 CNN | ○ ReLU より微増のケースも | BatchNorm 併用推奨 |
軽量モデル/Edge | △ ReLU の方が高速 | GELU は計算コスト ↑ |
まとめ
GELU は「入力を確率的に活かす」ことで勾配を滑らかに保ち、深層モデルでも学習を安定させます。まずは nn.GELU()
を ReLU と差し替え、学習曲線と val 精度を比較してみましょう。意外な性能アップが得られるかもしれません!