GLU 与 SwiGLU 激活函数详解:从门控线性单元到大模型 FFN 标配

从 GLU 门控线性单元的公式推导出发,讲解 Swish 的平滑非单调特性,再推出 PaLM 与 LLaMA 采用的 SwiGLU,并系统列出 Bilinear、ReGLU、GEGLU、SwiGLU 等变体替换 FFN 后对应的前馈网络公式。

PaLM 和 LLaMA 中都使用 SwiGLU 替换了 FFN,本文介绍一下 GLU 和 SwiGLU。

GLU论文链接: https://arxiv.org/pdf/1612.08083.pdf

关于符号的说明:本文对应着两篇论文,一篇是GLU,另一篇是SwiGLU。在下文中描述GLU和SwiGLU时各自使用对应论文中的符号,所以有可能出现符号不一致的问题。

1、GLU函数

GLU(Gated Linear Unit,门控线性单元)是一种在深度学习中用于增强模型表现的激活函数。GLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力和性能。

关键性质

  1. 门控机制:GLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 非线性:GLU结合了线性变换和非线性激活,使得模型能够学习复杂的模式。
  3. 信息过滤:通过门控机制,GLU能够过滤掉不重要的信息,从而增强模型的表现。

解决的问题

  1. 信息选择性:GLU通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 非线性增强:GLU结合了线性变换和非线性激活,从而增强了模型的非线性特性。
  3. 提高模型性能:GLU在许多任务中表现出色,特别是在自然语言处理(NLP)和序列建模任务中。

    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}}$。

公式(1)是原论文中提出的公式形式,当GLU作为激活函数时一般不是上述公式(1)的形式。激活函数 ReLU 的公式为 $\text{ReLU} = \max(0, x)$,其含义就是当输入向量 $x$ 的值小于 0 时直接阻断,当时输入向量 $x$ 的值大于 0 值直接通过。参考ReLU激活函数,激活函数GLU的公式为如下公式(2)的形式:

$$
\begin{equation}\text{GLU}(x) = x \otimes \sigma (g(x))\end{equation}
$$

这里有一个新符号 $g(x)$ 表示的是向量 $x$ 经过一层MLP或者卷积层,其他部分的符号与公式(1)中是相同的。可以看出公式(2)的右半部分与公式(1)的右半部分是完全一样的,所不同的是公式(2)中的左半部分直接就是向量 $x$,这和上面描述的激活函数ReLU是相似的,当 $\sigma(g(x))$ 趋近于 0 时表示对 $x$ 进行阻断,当$\sigma(g(x))$ 趋近于 1 时表示允许$x$ 通过,以此实现门控激活函数的效果。

2、Swish函数

Swish激活函数是一种在深度学习中广泛应用的激活函数,由Google Brain团队提出。Swish函数通过引入一个可学习的参数,使得激活函数在训练过程中能够自适应地调整,从而提高模型的性能。

Swish函数的数学表达式为:

$$
\text{Swish}(x) = x \cdot \sigma(\beta x)
$$

其中:

  • $x$ 是输入。
  • $\sigma$ 是Sigmoid函数,定义为 $\sigma(x) = \frac{1}{1 + e^{-x}}$。
  • $\beta$ 是一个可学习的参数,控制函数的形状。

关键性质

  1. 平滑性:Swish函数是连续且平滑的,这有助于提高模型的稳定性和收敛速度。
  2. 非单调性:Swish函数是非单调的,这意味着它在某些区间内是递增的,而在其他区间内是递减的。这种特性使得Swish能够捕捉到更复杂的模式。
  3. 可学习性:通过引入可学习参数 $\beta$,Swish函数能够在训练过程中自适应地调整,从而提高模型性能。
  4. 近似ReLU:当 $\beta$ 趋向于无穷大时,Swish函数近似于ReLU函数;当 $\beta$ 趋向于0时,Swish函数近似于线性函数。

解决的问题

  1. 平滑激活:Swish通过引入Sigmoid函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
  2. 非单调性:Swish的非单调性使得它能够捕捉到更复杂的模式,比ReLU等单调激活函数更具表现力。
  3. 可学习性:Swish通过引入可学习参数 $\beta$,使得激活函数能够自适应地调整,从而提高模型性能。

    3、SwiGLU函数

SwiGLU(Swish-Gated Linear Unit)是一种结合了Swish和GLU(Gated Linear Unit)特点的激活函数,旨在提高深度学习模型的性能。SwiGLU通过引入门控机制和Swish激活函数,使得模型能够更有效地选择性通过信息,从而增强模型的表达能力和性能。

SwishGLU函数的数学表达式为:

$$
\text{SwiGLU}(a, b) = \text{Swish}(a) \otimes \sigma(b)
$$

其中

  • $a$ 和 $b$ 是输入张量。
  • $\text{Swish}(x) = x \cdot \sigma(x)$ 是Swish激活函数。
  • $\sigma(x) = \frac{1}{1 + e^{-x}}$ 是Sigmoid激活函数。
  • $\otimes$表示逐元素乘法(Hadamard乘积)。

关键性质

  1. 门控机制:SwiGLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 平滑性:Swish函数的平滑性有助于提高模型的稳定性和收敛速度。
  3. 非单调性:Swish函数的非单调性使得SwiGLU能够捕捉到更复杂的模式。
  4. 信息过滤:通过门控机制,SwiGLU能够过滤掉不重要的信息,从而增强模型的表现。

解决的问题

  1. 信息选择性:SwiGLU通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 平滑激活:Swish通过引入Sigmoid函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
  3. 非单调性:Swish的非单调性使得SwiGLU能够捕捉到更复杂的模式,比ReLU等单调激活函数更具表现力。

    FFN公式及其变体

我们知道FFN就是输入向量 $x$ 先经过一个MLP层,将维度上升到原来的4倍,然后过一个激活函数层,最后再经过一个MLP层,将维度还原回去。其公式为:

$$
\begin{equation}\text{FFN}(x, W_1, W_2, b_1, b_2) = \text{ReLU}(xW_1+b_1)W_2+b_2\end{equation}
$$

有些研究,比如T5,将实验中的偏置项去掉了,这样FFN就变为了如下形式:

$$
\begin{equation}\text{FFN}_{\text{ReLU}}(x, W_1, W_2) = \text{ReLU}(xW_1)W_2\end{equation}
$$

把这里的激活函数由 ReLU 替换为 GeLU 或 Swish 之后,就得到两种新的FFN,公式如下,下面这两种也都有相应的实验结果。

$$
\begin{equation}\text{FFN}_{\text{GeLU}}(x, W_1, W_2) = \text{GeLU}(xW_1)W_2\end{equation}
$$

$$
\begin{equation}\text{FFN}_{\text{Swish}}(x, W_1, W_2) = \text{Swish}(xW_1)W_2\end{equation}
$$

GLU公式及其变体

上一小节中的公式(1)为原始的 GLU 公式,在这里我们重新写一遍,如下

$$
\begin{equation}\text{GLU}(x, W, V, b, c)=\sigma(xW+b) \otimes (xV+c)\end{equation}
$$

在该公式中,左侧部分有一个Sigmoid函数,把这个函数替换为其他函数就可以得到GLU函数的各种变体,下面是其一系列变体。

$$
\begin{equation}\text{Bilinear}(x, W, V, b, c)=(xW+b) \otimes (xV+c)\end{equation}
$$

$$
\begin{equation}\text{ReGLU}(x, W, V, b, c)=\text{ReLU}(xW+b) \otimes (xV+c)\end{equation}
$$

$$
\begin{equation}\text{GEGLU}(x, W, V, b, c)=\text{GELU}(xW+b) \otimes (xV+c)\end{equation}
$$

$$
\begin{equation}\text{SwiGLU}(x, W, V, b, c, \beta)=\text{Swish}_{\beta}(xW+b) \otimes (xV+c)\end{equation}
$$

接下来把所有的偏置项都给去掉,就得到下述五个公式,大同小异没什么本质区别:

$$
\begin{equation}\begin{split}
&\text{GLU}(x, W, V)=\sigma(xW) \otimes (xV) \
&\text{Bilinear}(x, W, V)=(xW) \otimes (xV) \
&\text{ReGLU}(x, W, V)=\text{ReLU}(xW) \otimes (xV) \
&\text{GEGLU}(x, W, V)=\text{GELU}(xW) \otimes (xV) \
&\text{SwiGLU}(x, W, V, \beta)=\text{Swish}_{\beta}(xW) \otimes (xV)
\end{split}\end{equation}
$$

FFN的变体与GLU的变体结合

将 GLU 及其各种变体替换掉 FFN 中的第一个MLP和激活函数,就可以得到如下新版的 FFN 公式:

$$
\begin{equation}\begin{split}
&\text{FFN}{\text{GLU}}(x, W, V)=\big[\sigma(xW) \otimes (xV)\big] W_2 \
&\text{FFN}
{\text{Bilinear}}(x, W, V)=\big[(xW) \otimes (xV)\big] W_2 \
&\text{FFN}{\text{ReGLU}}(x, W, V)=\big[\text{ReLU}(xW) \otimes (xV)\big] W_2 \
&\text{FFN}
{\text{GEGLU}}(x, W, V)=\big[\text{GELU}(xW) \otimes (xV)\big] W_2 \
&\text{FFN}_{\text{SwiGLU}}(x, W, V)=\big[\text{Swish}(xW) \otimes (xV)\big] W_2
\end{split}\end{equation}
$$

接下来就是做实验验证上述各个新版的FFN与原版的FFN究竟哪个效果更好了。就目前来看,PaLM 和 LLaMA 中都是使用的$\text{FFN}_{\text{SwiGLU}}$。

总结

SwiGLU激活函数结合了Swish和GLU的优点,通过引入门控机制和平滑非单调特性,解决了ReLU等激活函数的一些固有问题。SwiGLU在许多深度学习任务中表现出色,特别是在计算机视觉和自然语言处理任务中。它通过门控机制和平滑激活,使得模型能够更快地收敛并达到更高的性能。

Reference

本文结束 感谢您的阅读