4.2.1 FFN 计算与激活函数:从标准 FFN 到 GLU / SwiGLU / GeGLU

Transformer 的每一层通常包含两大子模块:注意力(Attention)与前馈网络(FFN, Feed-Forward Network)。
注意力负责“信息交互”,FFN 更像是对每个 token 的表示做一次“非线性变换与重映射”,提升表达能力。


1) 标准 FFN(以 ReLU 为例)

标准 FFN 的核心结构是“两层线性层 + 中间激活函数”,对输入 xxx 做:

FFN(x)=ReLU(xW1+b1)W2+b2 FFN(x) = \mathrm{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2

逐项解释(把每一步拆开看)

  1. 第一层线性变换(升维)
    xW1+b1xW_1 + b_1xW1+b1:把输入特征映射到更高维的“中间表示空间”。
    直觉:让模型在更大的空间里“展开”特征,方便后续非线性组合。

  2. 激活函数(引入非线性)
    ReLU(⋅)\mathrm{ReLU}(\cdot)ReLU():让表示变得非线性,否则两层线性叠加仍等价于一层线性。

  3. 第二层线性变换(降维)
    ReLU(⋅)W2+b2\mathrm{ReLU}(\cdot)W_2 + b_2ReLU()W2+b2:再映射回原维度(通常与输入维度一致),便于残差连接。


2) GLU:线性门控单元(Gated Linear Unit)

标准 FFN 的激活函数只是对数值做形状变换,而 GLU 引入“门控”
它不是简单地“激活全部信息”,而是先学一个“门”去决定哪些信息通过、哪些被抑制

GLU 常见形式(你给出的写法):

GLU(x)=xV⋅σ(xW+b) GLU(x) = xV \cdot \sigma(xW + b) GLU(x)=xVσ(xW+b)

在 FFN 中的一个门控版本可以写成:

FFNGLU(x)=(xV⋅σ(xW1+b))W2 FFN_{GLU}(x) = (xV \cdot \sigma(xW_1 + b))W_2 FFNGLU(x)=(xVσ(xW1+b))W2

拆解理解:为什么叫“门控”

  • xVxVxV:一条线性路径,产生“候选内容”(content)。
  • σ(xW1+b)\sigma(xW_1 + b)σ(xW1+b):另一条线性路径后接 Sigmoid,产生 000111 的“门”(gate)。
  • 两者做逐元素乘法 ⋅\cdot:门值接近 000 的维度会被抑制,接近 111 的维度会通过。

直观类比:信息过滤器

xVxVxV 看成“准备说的话”,把 σ(⋅)\sigma(\cdot)σ() 看成“是否允许说这句话的开关”。
GLU 让网络能学会“针对性放行信息”,而不是对所有通道一视同仁地激活。


3) SwiGLU / GeGLU:用更强的激活替换 Sigmoid 门

GLU 的门函数用的是 Sigmoid σ(⋅)\sigma(\cdot)σ()
后续很多大模型把门函数替换成更强的非线性(更平滑、梯度更友好):

  • SwiGLU:门函数用 Swish / SiLU
  • GeGLU:门函数用 GeLU

可以用统一的“门控模板”理解:

FFNgate(x)=(xV⋅ϕ(xW1+b))W2 FFN_{gate}(x) = (xV \cdot \phi(xW_1 + b))W_2 FFNgate(x)=(xVϕ(xW1+b))W2

其中 ϕ(⋅)\phi(\cdot)ϕ() 可以是 σ(⋅)\sigma(\cdot)σ()(GLU)、Swish(⋅)\mathrm{Swish}(\cdot)Swish()(SwiGLU)、GeLU(⋅)\mathrm{GeLU}(\cdot)GeLU()(GeGLU)。


4) 为什么大模型常用 SwiGLU 替换传统 FFN

关键点 1:表达能力更强

标准 FFN 的非线性是一条路径上的“逐点变换”。
门控结构相当于 两条路径相乘,可以表达更复杂的特征交互模式。

关键点 2:训练更稳定(梯度更友好)

Swish / GeLU 通常比 Sigmoid 门更平滑,避免过强饱和导致的梯度衰减。

关键点 3:参数量控制:从 2 个矩阵变 3 个矩阵,通常要缩减中间维度

门控 FFN 往往需要额外一组线性投影参数(多一个矩阵),为了保持总体参数规模,通常会降低中间层宽度。


5) 实际案例:LLaMA2-7B 的 FFN 中间层维度为什么是 11008

已知:

  • FFN 输入维度 d=4096d = 4096d=4096
  • 传统 FFN 常取中间维度 4d=163844d = 163844d=16384

但使用 SwiGLU 后,FFN 由“2 个矩阵”变成“3 个矩阵”。
为了让参数量大致保持不变,通常把中间层宽度从 4d4d4d 缩小到大约 2/32/32/3

23×16384≈10922 \frac{2}{3} \times 16384 \approx 10922 32×1638410922

然后为了满足硬件友好(例如维度是 256 的整数倍),做取整到最近的倍数,最终得到:

  • 中间层维度:110081100811008

这类“取整到某个倍数”的做法很常见,因为它能提升张量计算效率与吞吐。


6) Swish(SiLU)激活函数

Swish 的常见形式:

Swish(x)=x⋅σ(βx) \mathrm{Swish}(x) = x \cdot \sigma(\beta x) Swish(x)=xσ(βx)

其中 β\betaβ 控制形状:

  • β→0\beta \rightarrow 0β0σ(βx)\sigma(\beta x)σ(βx) 接近常数 0.50.50.5,整体更接近线性。
  • β→∞\beta \rightarrow \inftyβσ(βx)\sigma(\beta x)σ(βx) 更像阶跃函数,整体接近 ReLU。
  • β=1\beta = 1β=1,Swish 与 SiLU 等价。

直观特性

  • 平滑:不像 ReLU 在 0 处有折点。
  • 允许负值有小幅通过:负半轴不是完全归零,能减轻“死神经元”问题并保留一定信息流。

7) GeLU 激活函数(近似表达式)

GeLU 常见近似写法:

GeLU(x)≈0.5x(1+tanh⁡(2π(x+0.044715x3))) \mathrm{GeLU}(x) \approx 0.5x\left(1 + \tanh\left(\sqrt{\frac{2}{\pi}}\left(x + 0.044715x^{3}\right)\right)\right) GeLU(x)0.5x(1+tanh(π2 (x+0.044715x3)))

直观特性

GeLU 可以理解为“带随机性/概率意义的平滑门控”:
对小负值不完全抑制,对大正值更倾向保留,整体比 ReLU 更平滑、比 Sigmoid 更不容易饱和。


1.4.5 常见激活函数公式与性质(含优缺点与案例解释)

下面从“数值范围、梯度行为、计算代价、训练稳定性”的角度整理常见激活函数。


1) Sigmoid

定义

σ(x)=11+e−x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1

导数(常用形式)

σ′(x)=σ(x)(1−σ(x)) \sigma'(x) = \sigma(x)\left(1-\sigma(x)\right) σ(x)=σ(x)(1σ(x))

缺点分析

  1. 梯度饱和(vanishing gradient)
    xxx 很大时,σ(x)≈1\sigma(x)\approx 1σ(x)1,导数 σ′(x)≈0\sigma'(x)\approx 0σ(x)0
    xxx 很小时,σ(x)≈0\sigma(x)\approx 0σ(x)0,导数同样接近 000
    结果:深层网络反向传播时梯度容易越来越小,训练变慢或停滞。

  2. 输出非零中心(not zero-centered)
    σ(x)∈(0,1)\sigma(x)\in (0,1)σ(x)(0,1),输出总为正,可能导致梯度更新方向有偏,优化效率下降。

  3. 指数计算代价
    包含 e−xe^{-x}ex,相对简单线性函数更耗时。

例子:为什么在深层网络隐藏层不常用 Sigmoid

当网络很深时,若多层都使用 Sigmoid,很多层会进入饱和区间,梯度几乎传不过去;
因此它更常见于“概率输出”(例如二分类输出层),而非大模型隐藏层。


2) Tanh

定义

tanh⁡(x)=ex−e−xex+e−x \tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+exexex

优点

  • 零中心输出tanh⁡(x)∈(−1,1)\tanh(x)\in (-1,1)tanh(x)(1,1),输出以 0 为中心,优化时方向偏置更小。

缺点

  • 仍然会饱和:当 ∣x∣|x|x 很大时,tanh⁡(x)→±1\tanh(x)\rightarrow \pm 1tanh(x)±1,梯度接近 0。
  • 仍有指数运算:计算代价相对高。

例子:相比 Sigmoid 的“更好”,但仍不够适合超深网络

tanh 的零中心让优化更顺,但它的饱和问题依旧明显,因此在现代大模型隐藏层也不占主流。


3) ReLU

定义

ReLU(x)=max⁡(0,x) \mathrm{ReLU}(x) = \max(0,x) ReLU(x)=max(0,x)

优点

  1. 缓解梯度消失:当 x>0x>0x>0 时梯度为常数 1,不易饱和。
  2. 收敛快:线性且稀疏激活(很多负值直接变 0)。
  3. 计算便宜:只需比较与取最大,无指数运算。

缺点

  1. 非零中心输出:输出 ≥0\ge 00
  2. Dead ReLU(神经元死亡)
    当某个神经元长期输入 x≤0x\le 0x0,输出恒为 0,梯度也为 0,参数无法更新,可能永久失活。

例子:Dead ReLU 的直观场景

如果某一层在训练早期就把某些通道权重推到使得输入长期为负的区域,这些通道会一直输出 0,后续再也学不到东西。


4) Leaky ReLU

定义

LeakyReLU(x)=max⁡(αx,x) \mathrm{LeakyReLU}(x)=\max(\alpha x, x) LeakyReLU(x)=max(αx,x)

其中 α\alphaα 通常取一个很小的正数(例如 0.010.010.01)。

优点

  • 缓解 Dead ReLU:当 x<0x<0x<0 时也保留一个小斜率 α\alphaα,梯度不再恒为 0。
  • 计算便宜:仍然是分段线性。

缺点

  • 需要手动设定 α\alphaα:不同任务/模型可能敏感。
  • 表达仍偏线性:负半轴只是一条小斜率直线,非线性能力有限。

例子:为什么 Leaky ReLU 在一些任务有效

当训练数据分布导致大量激活落在负区间时,Leaky ReLU 能保持梯度流动,不至于“整片通道失活”。


5) ELU

定义

ELU(α,x)={α(ex−1),x≤0x,x>0 \mathrm{ELU}(\alpha,x)= \begin{cases} \alpha(e^{x}-1), & x \leq 0 \\ x, & x > 0 \end{cases} ELU(α,x)={α(ex1),x,x0x>0

优点

  1. 输出均值更接近 0
    负区间不是直接归零,而是趋近某个负值,有助于让激活均值更接近 0,从而优化更稳定。
  2. 负区间饱和
    对很小的 xxx 会饱和到 −α-\alphaα,减少负值区域的噪声传播。

缺点

  • 需要指数运算:计算成本高于 ReLU / Leaky ReLU。
  • 超大规模模型中不常作为主流选择:更多时候会选择 Swish/GeLU 这类与 Transformer 更匹配的激活/门控结构。

6) Swish(再强调一次它的优势逻辑)

定义

Swish(x)=x⋅σ(βx) \mathrm{Swish}(x) = x \cdot \sigma(\beta x) Swish(x)=xσ(βx)

优点(从训练动力学角度理解)

  1. 平滑且非单调
    相比 ReLU 的硬折点,Swish 更平滑;非单调性意味着它可以在局部对不同幅度输入进行更灵活的响应。
  2. 负值有一定保留
    负输入不会全部变成 0,某些负值仍能产生非零输出与梯度,有助于信息流动。
  3. 兼具“无界性”和“门控感”
    正侧输出无上界,使得表达不被过度压缩;同时 σ(βx)\sigma(\beta x)σ(βx) 像一个连续门,控制通过比例。

例子:为什么 Swish 常用于门控结构(SwiGLU)

门控本质上希望“连续地选择信息”,Swish 自带连续门的味道(σ(βx)\sigma(\beta x)σ(βx)),比 Sigmoid 门更灵活、更平滑,因此常用于大模型 FFN。


7) Softmax(输出层常用)

Softmax 通常用于多分类输出层,把一组 logits 转成概率分布。

定义(对向量 xxx 的第 iii 个分量)

Softmax(xi)=exi∑j=1Nexj \mathrm{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{N} e^{x_j}} Softmax(xi)=j=1Nexjexi

直观解释:为什么它能构成概率分布

  • 指数保证输出为正;
  • 再除以所有指数和,保证总和为 1。

例子:多分类决策的“相对比较”

Softmax 的本质不是看某个 xix_ixi 的绝对大小,而是看它相对其它 xjx_jxj 的优势。
当某个 logit 比其他大很多时,它的概率会迅速接近 1,这体现了指数放大的“赢家通吃”效应。


小结:为什么现代大模型普遍用 SwiGLU 类结构

  • 标准 FFN:简单、便宜,但对“选择性信息通过”能力弱。
  • GLU:引入门控,能学会过滤与选择。
  • SwiGLU / GeGLU:用更强、更平滑的激活替换 Sigmoid 门,使门控更自然,训练更稳定。
  • 工程上:门控增加矩阵数,为控制参数量通常会缩减中间维度(如 LLaMA2-7B 的 11008)。

在 Transformer 的 FFN 里,“门控 + 平滑激活”成为主流,是因为它在表达能力、训练稳定性与工程效率之间取得了更好的平衡。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐