(rontolisp) docs
← 関数

torch:gelu

(torch:gelu a &key approximate)

ガウス誤差線形ユニット (PyTorch の nn.GELU / torch.nn.functional.gelu) です。 torch の演算だけで組み立てているため、専用の随伴なしで微分可能です。 :approximate で定式化を選びます。

:approximatePyTorch
:none (既定)x * (1 + erf(x / sqrt(2))) / 2approximate='none'
:tanhx * (1 + tanh(sqrt(2/pi) * (x + 0.044715 x^3))) / 2approximate='tanh'

既定は標準正規分布 X に対する x * P(X <= x) の厳密形で、 torch:erf の上に構築されています。:tanh 形式は GPT/BERT の 定式化で、厳密形とは 1e-3 程度で一致します。torch:relu と 違ってどこでも滑らかで、負側にもわずかな勾配を通します。Transformer の フィードフォワードブロックがこれを使うのはそのためです。

軸は精度だけではありません。--simd では :tanh 形式は加速されますが (mul / add / tanh だけで構成されるため)、 既定の形式は加速されません。linalg:erf が intercept 対象の カーネルに入っていないためです。