面试积累 - FFN 层激活函数
在 FFN 层中,有几个常见的激活函数,这次我们尝试梳理它们。
GLU 变体公式
图片来源:论文 GLU Variants Improve Transformer
说明:
为什么需要激活函数
在神经网络中,我们对神经元进行线性变换
激活函数赋予了神经网络非线性,如果没有激活函数,神经网络就是多个线性换堆叠,对于一个两层的网络
其可以写成
什么函数可以作为激活函数
在解答这个问题之前,我们看看激活函数参与了什么过程:
1.它参与了神经网络的非线性变换
2.它参与了反向传播
因此,它必须是一个非线性函数(条件 1 ),他必须可导(或者仅在有限点不可导)。
此外,它最好计算的效率高,梯度性质较好,输出范围适当,且足够平滑。
很遗憾,下面的条件很难一起满足。
在接下来的内容中,我们根据是否存在
其中:
-
:用来计算“门”的那一路输入; -
:门控信号; -
:真正要通过的信息; -
:逐元素相乘。
非门控函数
RELU
最简单的函数,其输出范围
当输入长期小于

函数如图所示
LeakyReLU
为了解决ReLU在负半轴导数为0的情况,我们对其在负半轴做一下修改
其中
图就不放了。
sigmoid
其易于求导,设 sigmoid 函数为
当
函数范围变成

tanh
其导数为

门控函数
GeLU
GeLU 输入和门控都取决于
其与正态分布损失函数有关
其中

Swish与SiLU
Swish 与 SiLU 输入和门控都取决于
当

GeGLU 与 SwiGLU
将 GeLU 右边的门控函数套娃成 GeLU,即得到 GeGLU
将 GeLU 右边的门控函数套娃成 Swish,即得到 SwiGLU


由于就是直接将 GeLU 套娃,对函数本身没有什么好说的,我们回到 FFN 层来区别三者
GeLU,GeGLU,SwiGLU in FFN
在 FFN 层中,三者公式如下,其中 GeGLU,SwiGLU 需要额外一个可学习的权重矩阵
GELU FFN:
GeGLU FFN:
SwiGLU FFN:
顺带一说,对于一个长度为 len*d1 的输入,首先经过三个 d1*d1 的注意力矩阵,经过缩放,残差链接与 LN 后,进入FFN层,此时会先遇到一个维度为 d1*d2 的升维矩阵
一般来说
!!! note 注意
主流的大模型几乎清一色使用SwiGLU,FFN层无门控模型已经实质上不存在了,因此
近似计算
以上函数可以近似计算,这里在面试中不太重要,因此先不更新。






