BERT、GPT 系的 FFN 默认激活函数是 GeLU,公式一般直接给 $\mathrm{GELU}(x)=x\,\Phi(x)$,$\Phi$ 是标准正态 CDF。但为什么是"乘一个 CDF"这种怪形状?原始论文(Hendrycks & Gimpel, 2016)的出发点是 dropout 的一个思想实验:把 ReLU 的硬门控换成随机门控再取期望,CDF 就是算这个期望时积分积出来的。这篇文章走一遍这个推导,再看它和 ReLU、SiLU 在行为上的差别。
出发点:ReLU 是确定性门控,能不能随机化
ReLU 写作 $x\cdot\mathbf 1[x>0]$,门是确定性的:输入为正必过,为负必死。把示性函数换成一个依赖输入的随机门——$x$ 越大通过概率越大——就得到一个随机版本的激活:$\tilde h = x\cdot m$,$m\sim\mathrm{Bernoulli}(\pi(x))$,$\pi(x)$ 是 $x$ 的单调增函数。训练时采样 $m$,推理时取期望 $h(x)=\mathbb E[\tilde h]=x\,\pi(x)$。问题只剩一个:$\pi(x)$ 取什么?
一个自然的答案是让门反映"符号判断的置信度":假设我们对 $x$ 的观测有噪声,$x$ 本身是从某个分布里采出来的,那么 $x>0$ 的概率就是门控概率。取最简单的高斯假设 $x\sim\mathcal N(\mu,\sigma^2)$,把观测值本身记作 $\mu$,则
$$ \pi(\mu) = P(x > 0 \mid \mu) = P\Big(\frac{x-\mu}{\sigma} > -\frac{\mu}{\sigma}\Big) = \Phi\Big(\frac{\mu}{\sigma}\Big). $$
代入期望即得(把 $\mu$ 换回 $x$)
$$ \mathrm{GELU}(x) = x\,\Phi(x/\sigma). $$
$\sigma=1$ 就是标准形式。推导里没有任何"试出来"的成分:随机门控 + 高斯噪声假设,CDF 是必然结果。
从高斯积分再确认一眼
也可以不绕 dropout,直接算"输入带噪声的 ReLU 期望"。设 $z\sim\mathcal N(x, 1)$,
$$ \mathbb E_z[\max(z,0)] = \int_0^{\infty} z\,\frac{1}{\sqrt{2\pi}}e^{-(z-x)^2/2}\,dz. $$
配方 $(z-x)^2 = z^2 - 2xz + x^2$,把被积函数改写成标准正态密度乘以 $e^{xz - x^2/2}$ 的形式,积分拆成两项:第一项是 $\phi$ 型积分给出 $x\Phi(x)$,第二项是 $\phi(x)$(标准正态密度在 $x$ 处的值)。完整结果是
$$ \mathbb E_z[\max(z,0)] = x\,\Phi(x) + \phi(x). $$
注意这比 GeLU 多一个 $\phi(x)$ 尾巴。两者的差别是噪声放的位置:$\max(z,0)$ 是"先加噪再门控",GeLU 是"先对符号做概率判断再门控"($x\cdot P(z>0)$ 而不是 $\mathbb E[\max(z,0)]$)。GeLU 选择后者,保住了"输出随 $x$ 单调"和"负区有非零小输出"这两条性质,同时不带额外积分项。
性质清单:与 ReLU、SiLU 对比
写开 $\Phi(x)=\frac12\big(1+\mathrm{erf}(x/\sqrt2)\big)$,几个关键行为:
负区不是死区。$x<0$ 时 GeLU $\approx \phi(x)$ 量级的小正值,且 $\mathrm{GELU}(-x) = -x\,\Phi(-x) \approx x\,\phi(x)\cdot(\text{渐近})$,两边绝对值不对称:负侧被压得更狠。对比 SiLU $=x\,\sigma(x)$(sigmoid 门控),两者形状几乎重合,差别在远负区:GeLU 衰减为 $\phi(x)\sim e^{-x^2/2}$ 高斯型,SiLU 衰减为 $x e^{-x}$ 指数型,GeLU 收得更干净。
非单调性。GeLU 在 $x\approx -0.75$ 附近有一个微小的下凹(最小值约 $-0.17$),这是它和 ReLU 的本质区别:负区允许"负一点"的输出。原始论文的动机之一是标准 dropout 在激活上乘 Bernoulli mask 等价于乘随机门,GeLU 把这个思想内化成确定性的非线性,方差依赖输入(输入大时门接近 1、方差小;输入在 0 附近时方差最大),这比均匀 dropout 更符合"该保留的保留、该正则的正则"。
工程实现:erf 太贵,用 tanh 凑
硬件上 erf 没有快速指令,原始论文和 GPT 实现都用 tanh 近似:
$$ \mathrm{GELU}(x)\approx \frac{x}{2}\Big(1+\tanh\big[\sqrt{2/\pi}\,(x+0.044715x^3)\big]\Big). $$
$0.044715$ 是为了让近似在 $x=\pm1$ 附近误差最小凑出来的系数,$\sqrt{2/\pi}$ 来自 $\mathrm{erf}$ 的 Padé 近似展开。PyTorch 的 gelu(approximate='tanh') 走的就是这条。两个版本的数值差在 $10^{-3}$ 量级,对训练结果影响可忽略,但量化时注意:tanh 近似用初等函数组合,量化图融合比 erf 版友好,部分推理引擎只支持 tanh 版。
为什么后来主流换成了 SiLU/SwiGLU
GeLU 在 GPT-2/3 时代是默认,LLaMA 系之后 FFN 基本换成 SwiGLU(下一篇的主角)。回头看,GeLU 的符号概率解释虽然优雅,但它是单门的;GLU 族把激活函数本身做成"两个分支相乘"的门控结构,表达能力多一个矩阵。GeLU 的历史价值在于打通了"激活函数 = 随机门控的期望"这个视角——一旦接受这个视角,从 ReLU 到 GeLU 到 GLU 族就是同一条线上的三次放宽:先让门随机(ReLU→GeLU),再让门由数据自己学(GeLU→GLU)。
小结
GeLU 是"随机门控 ReLU 在高斯噪声假设下的期望":$\mathrm{GELU}(x)=x\Phi(x)$ 里的 CDF 不是拟合出来的形状,是 $P(x>0)$ 的必然形式。它比 ReLU 多负区小尾巴和非单调性,比 SiLU 的负区衰减更干净(高斯型 vs 指数型);工程上用 tanh 近似规避 erf 开销。它被 SwiGLU 取代不是推导错了,而是门控思想的进一步推广——这个推广是下一篇的内容。