1 GLU 结构

image-offi.png

如上图所示,激活函数使用swish为例(这是可以替换的),GLU 引入了两个升维线性层,GLU线性门控单元的FFN块计算公式:

\text{GLU}(x) = xV \cdot \sigma(xW + b) \quad
FFN_{GLU} = (xV \cdot \sigma(xW_1 + b))W_2

输出两个线性变换,然后对一个做激活,乘以线性变换的,相当于做了门控机制,选择哪些过,哪些不过

SwiGLU、GeGLU就是用Swish、GeLU激活函数分别去替换GLU中的激活函数。

一个例子: 在LLaMA2-7B中,FFN的原始输入维度为4096,一般而言中间层是输入维度的4倍等于16384,由于SwiGLU的原因FFN从2个矩阵变成3个矩阵,为了使得模型的参数量大体保持不变,中间层维度做了缩减,缩减为原来的2/3即10922,进一步为了使得中间层是256的整数倍,又做了取模再还原的操作,最终中间层维度为11008

Swish激活函数:

\text{Swish}(x) = x \times \text{sigmoid}(\beta \ast x)

GeLU激活函数:

\text{GeLU}(x) \approx 0.5x(1+\tanh(\frac{\sqrt{\pi}}{2}(x+0.044715x^3)))

现在大模型通常使用SwiGLU替换掉传统的FFN结构,目前可以解释为GLU能够基于输入数据动态调整哪些信息通过,有助于理解模型决策过程。