FFN前馈神经网络篇
为什么 需要 FFN前馈神经网络?
- 动机:Attention层 局限性。Attention机制能够处理词语之间的相互关系,但是它无法进行更为复杂的、非线性的数据处理。
什么是 FFN前馈神经网络?
- 介绍:处理来自Attention层的信息;在原始的Transformer模型中,FFN层通常由两个线性变换和一个非线性激活函数(如ReLU或GELU)组成。
FFN(x)=GELU(xW1+b1)W2+b2
- 其中 W1∈Rdmodel×dff、W2∈Rdff×dmodel,原始 Transformer 取 dff=4dmodel;FFN 对序列中每个位置(position-wise)独立作用,位置之间不交互。
FFN前馈神经网络 有什么优点?
- 优点:FFN层可以在每个Transformer模块中增加非线性处理能力,增强模型的整体表达能力。同时 FFN 承担了 Transformer 中大部分的参数量(约占 2/3),可以看作按 token 独立检索的键值记忆。
FFN前馈神经网络 变种有哪些?
- FFN层的变种:ReLU、GELU、GLU、GeGLU、Swish、SwiGLU (套娃即视感)
- ReLU: Rectified Linear Unit
ReLU(x)=max(0,x)
- GELU: Gaussian Error Linear Unit
GELU(x)=x⋅P(X≤x)=x⋅Φ(x),X∼N(0,1)
P为伯努利分布,X为标准正态分布;Φ(⋅) 为标准正态分布的累积分布函数。常用 tanh 近似:
GELU(x)≈0.5x(1+tanh[π2(x+0.044715x3)])
- GLU:Gated Linear Units
GLU(x)=(xW+b)⊗σ(xV+c)
- GEGLU
GEGLU(x)=GELU(xW+b)⊗(xV+c)
- Swish
Swish(x)=x⋅σ(βx)
β 可取可学习参数,β=1 时即 SiLU:SiLU(x)=x⋅σ(x)
- SwiGLU
SwiGLU(x)=Swish(xW+b)⊗(xV+c)
其中 σ 为 sigmoid 函数,⊗ 为逐元素相乘。由于多引入了一个门控矩阵 V,实践中通常把 dff 缩小到约 32×4dmodel(如 8d/3 再对齐到 64 的倍数),以保持参数量可比。
- 不同激活函数的 log-PPL 对比
此处原为一张 log-PPL 对比折线图(图片已丢失),结论:SwiGLU 表现最好,其次是 GEGLU / Swish / GELU,ReLU 垫底;因此在 LLaMA、PaLM 等模型中大量采用 SwiGLU。
可以看到SwiGLU最强,所以现在大部分都用这个了。