0%

大模型激活函数

ReLU

Relu(Rectified Linear Unit)——修正线性单元函数

数学公式:

ReLU(x)=max(0,x)ReLU(x) = max(0, x)

ReLU作为激活函数的特点:

  • 相比Sigmoid和Tanh,ReLU摒弃了复杂的计算,提高了运算速度。
  • 解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数,但要防范ReLU的梯度爆炸。

ReLU 强制将x<0部分的输出置为0,可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于死亡状态,所以使用ReLU的网络,学习率不能设置太大。

LeakyReLU(x)={x,if x0negative_slopex,otherwise\mathrm{LeakyReLU}(x) = \begin{cases} x, & \text{if } x \ge 0 \\ \text{negative\_slope} \cdot x, & \text{otherwise} \end{cases}

Leaky ReLU中的公式为常数,一般设置 0.01。这个函数通常比 Relu 激活函数效果要好,但是效果不是很稳定,所以在实际中 Leaky ReLu 使用的并不多。

PRelu(参数化修正线性单元)是Leaky ReLU的一个变体,公式中参数a_i作为一个可学习的参数,会在训练的过程中更新。

RReLU(随机纠正线性单元)也是Leaky ReLU的一个变体。在RReLU中,负值的斜率a_{ji}在训练中是随机的,在测试时会固定下来。RReLU的亮点在于,在训练环节中,a_{ji}是从一个均匀分布U(I,u)中随机抽取的数值。

GeLU

GeLU(Gaussian Error Linear Units)即高斯误差线性单元,它是一种高性能的神经网络激活函数,因为GeLU的非线性变化是一种符合预期的随机正则变换方式,公式如下:

xP(Xx)=xΦ(x)x P ( X \leq x )=x \Phi( x )

其中Φ(x)指的是x高斯分布的累积分布,完整形式如下:

xP(Xx)=xxe(Xμ)22σ22πσdXx P ( X \leq x )=x \int_{-\infty}^{x} {\frac{e^{-{\frac{( X-\mu)^{2}} {2 \sigma^{2}}}}} {\sqrt{2 \pi} \sigma}} \, \mathrm{d} X

计算结果如下:

0.5x(1+tanh[2π(x+0.044715x3)])0 . 5 x ( 1+t a n h [ \sqrt{\frac{2} {\pi}} ( x+0 . 0 4 4 7 1 5 x^{3} ) ] )

或者可以表示为:

xσ(1.702x)x \sigma( 1 . 7 0 2 x )

由此可知,概率P ( X ≤ x ) 即X的高斯正态分布ϕ(X)的累积分布Φ(x)是随着x的变化而变化的,当x增大,Φ(x)增大,当x减小,Φ(x)减小,即当x越小,在当前激活函数激活的情况下,越有可能激活结果为0,即此时神经元被dropout,而当x越大越有可能被保留。

代码实现(bert):

def gelu(x):
"""Gaussian Error Linear Unit.

This is a smoother version of the RELU.
Original paper: https://arxiv.org/abs/1606.08415
Args:
x: float Tensor to perform activation.

Returns:
`x` with the GELU activation applied.
"""
cdf = 0.5 * (1.0 + tf.tanh(
(np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x, 3)))))
return x * cdf
  1. GELU可以看作是ReLU的平滑近似,它不再是硬性地在0点截断,而是根据输入数值在高斯分布中的分位来决定输出的缩放比例,输入越小(负得越多),就越趋近于输出0,输入越大,就越趋近于输出x。
  2. GeLU相比ReLU增加非线性因子和数据统计特性。

参考文章:https://cloud.tencent.com/developer/article/1876554

GLU/SwiGLU

GLU(Gated Linear Unit)即门控线性单元,门控机制的核心思想是让网络自己学习去控制信息的流动。它不再是一个简单的、由输入值本身决定的开关,而是引入一个独立的“门控”分支,来动态决定哪些信息可以通过,以及通过多少。

GLU(x,W,V)=(xW+b)σ(xV+c)\mathrm{G L U} ( x , W , V )=( x W+b ) \otimes\sigma( x V+c )

其中:

  • x 是输入。
  • W,V,b,c 是可学习的权重和偏置。
  • (xW+b) 是内容分支,负责正常的线性变换。
  • σ(xV+c) 是门控分支,σ是Sigmoid函数,其输出在 (0, 1) 之间。
  • ⊗ 代表逐元素相乘。

SwiGLU是GLU的一个变体,它将门控分支的激活函数从Sigmoid换成了Swish函数。

Swish函数:

Swish(x)=xσ(βx)\operatorname{S w i s h} ( x )=x \cdot\sigma( \beta x )

其中σ是Sigmoid函数

SwiGLU:

SwiGLU(x,W,V)=Swish(xW+b)(xV+c)\mathrm{S w i G L U} ( x , W , V )=\mathrm{S w i s h} ( x W+b ) \otimes( x V+c )

总结对比:

特性 ReLU GELU SwiGLU
机制 静态阈值开关 平滑的静态开关 动态、数据驱动的门控
数学形式 max(0, x) x * Φ(x) Swish(xW) ⊗ (xV)
平滑性 在0点不平滑 平滑 平滑
表达能力 较弱 中等 非常强
核心思想 简单、非线性 ReLU的平滑近似 学习如何控制信息流
代表模型 早期CNNs, RNNs BERT, GPT-2/3 LLaMA, PaLM, Mixtral, GPT-4

参考文章:https://zhuanlan.zhihu.com/p/1962167666010748360

欢迎关注我的其它发布渠道