大模型的激活函数

本文结合chatgpt生成

现在主流大模型的 FFN 已经从早期的 ReLU/GELU,逐渐演化到 GLU 系列门控激活,尤其是 SwiGLU


1. 激活函数在大模型里主要出现在哪里?

一个标准 Transformer block 大致是:

\[x \rightarrow \text{Attention} \rightarrow \text{MLP/FFN} \]

其中 FFN 通常长这样:

\[\text{FFN}(x)=W_2 \sigma(W_1x+b_1)+b_2 \]

这里的 \(\sigma\) 就是激活函数。

早期 Transformer 使用的是 ReLU:

\[\text{ReLU}(x)=\max(0,x) \]

后来 BERT、GPT 系列早期模型大量使用 GELU:

\[\text{GELU}(x)=x\Phi(x) \]

其中 \(\Phi(x)\) 是标准正态分布的 CDF(CDF是累积分布函数),\(\Phi(x)=P(Z<x)\)

而现代 LLaMA、PaLM、Gemma、Mistral 等模型更常用的是 门控 MLP,例如 SwiGLU。


2. ReLU:简单但粗糙

ReLU:

\[\text{ReLU}(x)=\max(0,x) \]

优点是简单、稀疏、梯度稳定:

\[\text{ReLU}'(x)= \begin{cases} 1, & x>0 \\ 0, & x<0 \end{cases} \]

它的问题也明显:

  1. 负半轴直接截断,信息损失较硬;
  2. x<0时梯度为 0,可能出现 dead neuron(神经网络中某个神经元几乎永远输出 0);
  3. 对大模型这种高维表示来说,ReLU 的表达调制能力不够细腻。

ReLU 在早期深度学习里很重要,但现在大模型里已经不是主流选择。


3. GELU:GPT/BERT 时代的经典选择

GELU 是 Gaussian Error Linear Unit:

\[\text{GELU}(x)=x\Phi(x) \]

直觉上,它不是像 ReLU 那样硬切断负值,而是根据 (x) 在高斯分布下的概率做软门控。

常用近似形式是:

\[\text{GELU}(x) \approx 0.5x \left( 1+\tanh\left[ \sqrt{\frac{2}{\pi}}(x+0.044715x^3) \right] \right) \]

GELU 和 ReLU 的区别可以这样理解:

\[\text{ReLU}(x)=x \cdot \mathbf{1}_{x>0} \]

\[\text{GELU}(x)=x \cdot \Phi(x) \]

也就是说,ReLU 用一个硬门控 \(\mathbf{1}_{x>0}\),GELU 用一个连续概率门控 \(\Phi(x)\)

所以 GELU 的过渡更平滑:

  • 大正数基本保留;
  • 小负数不会完全杀死;
  • 大负数逐渐压制;
  • 梯度更平滑。

这也是为什么 BERT、GPT-2、GPT-3 这类模型广泛使用 GELU。


4. SiLU / Swish:SwiGLU 的基础

SiLU,也叫 Swish 的一种形式:

\[\text{SiLU}(x)=x\sigma(x) \]

其中

\[\sigma(x)=\frac{1}{1+e^{-x}} \]

所以:

\[\text{SiLU}(x)=\frac{x}{1+e^{-x}} \]

它和 GELU 很像,都是“输入乘以一个软门控因子”:

\[\text{GELU}(x)=x\Phi(x) \]

\[\text{SiLU}(x)=x\sigma(x) \]

区别是门控函数不同:

  • GELU 用高斯 CDF;
  • SiLU 用 sigmoid。

SiLU 的特点是平滑、非单调,在负半轴不会立刻归零,而是保留少量负值信息。


5. GLU:现代大模型的关键转向

GLU,全称 Gated Linear Unit。它的核心思想是:不要只对一个线性变换做激活,而是让一个分支去控制另一个分支。

普通 FFN 是:

\[\text{FFN}(x)=W_2\sigma(W_1x) \]

GLU 形式是:

\[\text{GLU}(x)= (W_a x) \odot \sigma(W_b x) \]

其中:

  • \(W_a x\) 是 value 分支;
  • \(\sigma(W_b x)\) 是 gate 分支;
  • \(\odot\) 表示逐元素乘法。

这就变成了:

\[\text{输出} = \text{内容} \times \text{门控} \]

这个结构比单纯激活函数更强,因为它允许模型动态决定哪些维度被放大、抑制或通过。


6. GEGLU:GELU + GLU

GEGLU 是把 GLU 里的 sigmoid 换成 GELU:

\[\text{GEGLU}(x)= (W_a x) \odot \text{GELU}(W_bx) \]

也可以写成:

\[\text{GEGLU}(x) = (W_a x) \odot \left[ (W_bx)\Phi(W_bx) \right] \]

它比普通 GELU FFN 更强,因为它不是:

\[\sigma(Wx) \]

而是:

\[(W_a x)\odot \sigma(W_bx) \]

即一个分支负责生成特征,另一个分支负责调制特征。

T5、PaLM 等模型相关工作中大量讨论过 GEGLU、SwiGLU 等门控 FFN 的效果。


7. SwiGLU:现代开源大模型的主流选择

SwiGLU 是现在很多 LLM 使用的激活结构。它结合了 Swish/SiLU 和 GLU:

\[\text{SwiGLU}(x)= (W_a x) \odot \text{SiLU}(W_bx) \]

展开就是:

\[\text{SwiGLU}(x) = (W_a x) \odot \left[ (W_bx)\sigma(W_bx) \right] \]

很多 LLaMA 系模型的 MLP 就是这种结构:

\[\text{FFN}_{\text{SwiGLU}}(x) = W_{\text{down}} \left( \text{SiLU}(W_{\text{gate}}x) \odot W_{\text{up}}x \right) \]

其中:

  • \(W_{\text{gate}}\):gate projection;
  • \(W_{\text{up}}\):up projection;
  • \(W_{\text{down}}\):down projection;
  • \(\odot\):逐元素乘法。

这也是现代大模型里最值得重点掌握的激活形式。


8. 为什么 SwiGLU 这么常用?

从表达能力上看,普通 MLP 是:

\[y = W_2\sigma(W_1x) \]

而 SwiGLU 是:

\[y = W_o \left( \text{SiLU}(W_gx) \odot W_ux \right) \]

后者多了一个乘性交互项。乘法结构本身就更强,因为它可以表示类似“条件选择”的关系。

可以把它理解为:

\[\text{feature}_i \leftarrow \text{content}_i \times \text{gate}_i \]

其中 gate 不是固定参数,而是由输入 x 动态生成的。

这使得 FFN 层不仅能做非线性变换,还能做输入相关的特征筛选。

从训练角度看,SwiGLU 也有几个优势:

  1. 比 ReLU 更平滑;
  2. 比普通 GELU FFN 表达能力更强;
  3. 门控结构改善了特征选择能力;
  4. 在相近参数量/计算量下,通常效果更好;
  5. 适合大规模 Transformer 的稳定训练。

9. 维度设计:SwiGLU 为什么不是简单扩大两倍?

普通 FFN 常见维度是:

\[d_{\text{ff}} = 4d_{\text{model}} \]

也就是:

\[x \in \mathbb{R}^{d} \]

先升维到:

\[4d \]

再降维回:

\[d \]

普通 FFN 参数量约为:

\[d \times 4d + 4d \times d = 8d^2 \]

SwiGLU 有三个矩阵:

\[W_g \in \mathbb{R}^{h \times d} \]

\[W_u \in \mathbb{R}^{h \times d} \]

\[W_o \in \mathbb{R}^{d \times h} \]

参数量约为:

\[3dh \]

为了和普通 FFN 的参数量相近,令:

\[3dh \approx 8d^2 \]

得到:

\[h \approx \frac{8}{3}d \]

所以很多使用 SwiGLU 的模型不会把 FFN hidden size 设成 4d,而是设成大约:

\[\frac{8}{3}d \]

例如 LLaMA 类模型中经常看到中间维度接近 2.67d,再做一些对齐,比如向 256 的倍数取整。


10. 从函数形状看几种激活

ReLU

\[\text{ReLU}(x)=\max(0,x) \]

特点:硬截断。

GELU

\[\text{GELU}(x)=x\Phi(x) \]

特点:概率式软门控。

SiLU

\[\text{SiLU}(x)=x\sigma(x) \]

特点:sigmoid 软门控,平滑非单调。

GLU

\[\text{GLU}(x)=a(x)\odot \sigma(b(x)) \]

特点:显式门控。

GEGLU

\[\text{GEGLU}(x)=a(x)\odot \text{GELU}(b(x)) \]

特点:GELU 门控。

SwiGLU

\[\text{SwiGLU}(x)=a(x)\odot \text{SiLU}(b(x)) \]

特点:SiLU 门控,现代 LLM 常用。


11. 一个更统一的理解

其实这些激活函数可以统一理解为:

\[\text{activation}(x)=x \cdot g(x) \]

其中 g(x) 是某种门控函数。

例如:

\[\text{ReLU}(x)=x\cdot \mathbf{1}_{x>0} \]

\[\text{GELU}(x)=x\cdot \Phi(x) \]

\[\text{SiLU}(x)=x\cdot \sigma(x) \]

而 GLU 系列则进一步变成:

\[\text{activation}(x)=a(x)\odot g(b(x)) \]

也就是:

\[\text{内容分支} \times \text{门控分支} \]

这正是现代 LLM MLP 层的核心趋势:从单输入非线性变成输入相关的门控调制。


现代大模型更偏好 SwiGLU 这类门控 FFN:

它的优势在于:平滑非线性 + 动态门控 + 乘性交互 + 更强的特征选择能力。对于现代 LLM 来说,激活函数已经不只是“给线性层加一点非线性”,而是 FFN 层进行条件计算和特征调制的重要机制。

Sigmoid和Tanh为什么不是大模型主流激活函数?

Sigmoid 和 Tanh 不是现代大模型主流激活函数,核心原因是:饱和、梯度小、计算和表达效率不如 GELU/SwiGLU 系列

Sigmoid:

\[\sigma(x)=\frac{1}{1+e^{-x}} \]

Tanh:

\[\tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \]

它们的问题主要有三个。

第一,容易饱和。
当 |x| 很大时,Sigmoid 输出接近 0 或 1,Tanh 输出接近 -1 或 1,此时梯度非常小:

\[\sigma'(x)=\sigma(x)(1-\sigma(x)) \]

\[\tanh'(x)=1-\tanh^2(x) \]

在饱和区间里梯度接近 0,深层网络训练时容易出现梯度传播效率低的问题。

第二,输出会被压缩。
Sigmoid 把值压到:

\[(0,1) \]

Tanh 把值压到:

\[(-1,1) \]

但大模型的 MLP 层通常希望中间表示保留更丰富的幅值信息。ReLU/GELU/SiLU/SwiGLU 这类函数不会把正半轴强行压到固定范围,更利于表示能力和梯度流动。

第三,现代大模型更需要门控调制。
现在主流不是单独用 Sigmoid/Tanh 做激活,而是用类似 SwiGLU 的结构:

\[\text{MLP}(x)=W_o\left(\text{SiLU}(W_gx)\odot W_ux\right) \]

它保留了“软门控”的思想,但不像单独 Sigmoid/Tanh 那样强压缩表示。也就是说,Sigmoid 的门控思想还在,但通常以 GLU/SwiGLU 的形式出现,而不是直接作为 FFN 激活函数。

同时Sigmoid 的非零中心的,它的输出均值通常大于 0,这样会导致下一层接收到的激活大多同号,从而使梯度更新方向更容易出现偏置。

一句话总结:Sigmoid/Tanh 太容易饱和、压缩信息、梯度传播不够好;现代大模型更偏好 GELU、SiLU、SwiGLU 这类平滑但不强行限幅的激活结构。

image

posted @ 2026-06-01 21:58  wljss  阅读(11)  评论(0)    收藏  举报