PaLM 和 LLaMA 中都使用 SwiGLU 替换了 FFN,本文介绍一下 GLU 和 SwiGLU。
GLU论文链接: https://arxiv.org/pdf/1612.08083.pdf
SwiGLU论文链接: https://arxiv.org/pdf/2002.05202.pdf
PaLM论文链接: https://arxiv.org/pdf/2204.02311.pdf
LLaMA论文链接: https://arxiv.org/pdf/2302.13971.pdf
关于符号的说明:本文对应着两篇论文,一篇是GLU,另一篇是SwiGLU。在下文中描述GLU和SwiGLU时各自使用对应论文中的符号,所以有可能出现符号不一致的问题。
GLU(Gated Linear Unit,门控线性单元)是一种在深度学习中用于增强模型表现的激活函数。GLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力和性能。
关键性质
解决的问题
出自2017年的论文 Language Modeling with Gated Convolutional Networks
GLU 全称为 Gated Linear Unit,即门控线性单元函数。在原始论文中使用下图1来解释该函数,下图是一个完整的网络结构,其中 "Input Sentence"、"Lookup Table" 都是输入层,"Softmax" 是输出层,这两部分都不考虑。接下来主要看的是下图的 "Convolution" 和 "Gating" 这两层,这两层对应的就是 GLU。
首先输入向量 $x$(在下图中使用的符号是 $E$)经过两个独立的卷积层/MLP层,得到向量 $A$ 和向量 $B$。此时,向量AA和向量BB的公式为:$A=x \cdot W + b$,$B=x \cdot V + c$。然后向量 $B$ 经过一个sigmoid函数之后,$\sigma(B)$ 中的每个元素就都变为了0~1之间的值,就可以起到控制信息是否通过的作用(下图画的是向量 $A$ 经过sigmoid函数,这是有点问题的)。
将向量 $A$ 与 $\sigma(B)$ 逐个元素相乘之后就得到了GLU层的最终输出结果,把上面描述的整个过程结合起来,GLU的公式如
$$ \begin{equation}\begin{split} \text{GLU}(x) &=A \otimes \sigma(B) \\ &= (x \cdot W + b) \otimes \sigma(x \cdot V + c) \end{split}\end{equation} $$
在该公式中,$x$ 表示输入向量,$\otimes$ 表示两个向量逐元素相乘,$\sigma$ 表示sigmoid函数,定义为 $\sigma(x) = \frac{1}{1 + e^{-x}}$。