AI summary
type
status
date
slug
summary
category
tags
icon
password

激活函数作用

神经网络是线性的,无法解决非线性的问题,加入激活函数就是给模型引入非线性能力。
不同的激活函数,特点和作用不同:
  • Sigmoidtanh 的特点是将输出限制在 (0,1)(-1,1) 之间,适合做概率值的处理,例如 LSTM 中的各种门;而 ReLU 就不行,因为无最大值限制,可能会出现很大值。
  • ReLU 适合用于深层网络的训练,而 Sigmoidtanh 则不行,因为它们会出现梯度消失。

梯度爆炸和梯度消失

模型中的梯度爆炸和梯度消失问题:
  1. 激活函数导致的梯度消失,像 sigmoid 和 tanh 都会导致梯度消失;
  1. 矩阵连乘也会导致梯度消失,这个原因导致的梯度消失无法通过更换激活函数来避免。直观的说就是在反向传播时,梯度会连乘,当梯度都小于 1.0 时,就会出现梯度消失;当梯度都大于 1.0 时,就会出现梯度爆炸。
如何解决梯度爆炸和梯度消失问题:
  1. 上述第一个问题只需要使用像 ReLU 这种激活函数就可以解决;
  1. 上述第二个问题没有能够完全解决的方法,目前有一些方法可以很大程度上进行缓解该问题,比如:对梯度做截断解决梯度爆炸问题、残差连接、normalize。由于使用了残差连接和 normalize 之后梯度消失和梯度爆炸已经极少出现了,所以目前可以认为该问题已经解决了。

Sigmoid

Sigmoid 函数公式为:
导数公式为:
notion image
优点:
  • 平滑,易于求导
  • 取值范围是 (0, 1),可直接用于求概率值的问题或者分类问题;比如 LSTM 中的门,二分类或者多标签分类问题;
缺点:
  • 计算量大,包含幂运算,以及除法运算;
  • sigmoid 导数的取值范围是 [0, 0.25],最大值都是小于 1 的,反向传播时又是"链式传导",经过几次相乘之后很容易就会出现梯度消失的问题
  • sigmoid 的输出的均值不是0(即zero-centered),这会导致当前层接收到上一层的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布;

Tanh

Tanh 函数公式为:
从上述公式的第二行可以看出,tanh 函数可以由 sigmoid 函数经过平移和拉伸得到。tanh 函数的取值范围是 (-1, 1)
导数公式:
notion image
tanh 函数可以理解为是基于 sigmoid 函数的一种改进的激活函数,所以对于 sigmoid 函数的缺点,它能够解决一部分。但是 tanh 函数依然有着不少的缺点。tanh 函数的特点如下:
  • 它的输出范围是 (-1, 1),解决了 sigmoid 函数输出的均值不是0(zero-centered)的问题;
  • tanh 的导数取值范围是 (0, 1),可以看出其在反向传播的"链式传导"过程中的梯度消失问题要比 sigmoid 函数要好一些,但是其依然存在着梯度消失问题;
  • 幂运算依然存在,计算量比较大

ReLU 系列

ReLU

ReLU 全称为 Rectified Linear Unit,即修正线性单元函数。该函数的公式比较简单:
导数也很简单,唯一需要注意的是在 0 处其实是不可导的,但是人为规定为此处导数为 0
notion image
优缺点:
  • 当 z>0 时,ReLU 激活函数的导数恒为常数 1,这就避免了 sigmoid 和 tanh 会在神经网络层数比较深的时候出现的梯度消失的问题;
  • 计算复杂度低,不再含有幂运算,只需要一个阈值就能够得到其导数;
  • 经过实际实验发现,使用 ReLU 作为激活函数,模型收敛的速度比 sigmoid 和 tanh 快
  • 当 z<0 时,ReLU 激活函数的导数恒为常数 0,这既带来了一些有利的方面,也导致了一些坏的方面,分别进行描述。
    • 有利的方面:在深度学习中,目标是从大量数据中学习到关键特征,也就是把密集矩阵转化为稀疏矩阵,保留数据的关键信息,去除噪音,这样的模型就有了鲁棒性。ReLU 激活函数中将 z<0 的部分置为 0,就是产生稀疏矩阵的过程。
    • 坏的方面:将 z<0 的部分梯度直接置为0会导致 Dead ReLU Problem(神经元坏死现象)。可能会导致部分神经元不再对输入数据做响应,无论输入什么数据,该部分神经元的参数都不会被更新。(这个问题是一个非常严重的问题,后续不少工作都是在解决这个问题)
  • ReLU 有可能会导致梯度爆炸问题,解决方法是梯度截断;
  • ReLU 的输出不是 0 均值的,这个和 sigmoid 类似。(后续的优化工作 ELU 在该问题上解决的比较好,ELU 的输出是近似为 0 的)

Leaky ReLU

为了解决 ReLU 的 Dead ReLU 问题,提出了 渗漏整流线性单元(Leaky ReLU),该方法是 ReLU 的一个变体。其在 z>0 的部分与 ReLU 一样保持不变;在 z<0 的部分,采用一个非常小的斜率 0.01
notion image
能够在一定程度上解决 Dead ReLU 问题,但是该方法的缺点是效果并不稳定,所以实际实验中使用该方法的并不多。
PReLU 的全称为 Parametric Relu;PReLU 的全称为 Random ReLU。
这两个方法和 Leaky ReLU 类似,都是 ReLU 的变体。也都是为了解决 Dead ReLU 问题而提出来的。PReLU 提出了可学习的斜率,RReLU 的斜率是均匀分布随机产生的,训练过程中每次都不同,推理时会固定为均值。

ELU

ELU(指数线性单元)。与 ReLU 相比,ELU 有负值,这会使激活的平均值接近零,让模型学习得更快。
公式为:
notion image
其中 不是固定的,是通过反向传播学习出来的。ELU的一个小问题是需要 exp 计算,运算量会更大一些。
  • 融合了 sigmoid 和 ReLU,左侧具有软饱和性,右侧无饱和性。
  • 右侧线性部分使得 ELU 能够缓解梯度消失,而左侧软饱能够让 ELU 对输入变化或噪声更鲁棒。
  • ELU 的输出均值接近于零,所以收敛速度更快。
在神经网络中,饱和性(Saturation)是指激活函数的输出趋于某个固定值(或范围),并且在该区域内对输入的变化不敏感(即梯度接近于零)。这种现象会导致梯度消失问题,从而影响神经网络的训练效果。

GeLU

Gaussian Error Linear Units。
notion image
GELU 激活函数的优缺点:
  • 从其函数图像可以看出,在负值区域,不再全为0,这解决了 Dead ReLU 问题;
  • GELU 函数是处处连续、光滑可导的;

计算

第一种方法是精确求解。有一个函数为 Gauss Error function (gef),由于使用率非常高所以在常见的库(比如TensorFlow、PyTorch)中都有针对该函数的优化,该函数的公式如下:
另一种方法是不精确求解,而是求解其近似值:

Swish

公式为:
其中 是Sigmoid函数,x 是输入, 是一个可调节的超参数。
导数为:
notion image
  • 和ReLU一样,没有上边界,因此不会出现梯度饱和现象
  • 有下边界,可以产生更强的正则化效果(x左半轴慢慢趋近于0)
  • 非单调,增强了输入数据和要学习的权重的表达能力
  • 处处连续且可导,更容易训练
Swish函数的设计灵感来自于自动搜索算法,它通过引入一个可调节的超参数来增加非线性程度。当beta为0时,Swish函数退化为线性函数;当beta趋近于无穷大时,Swish函数趋近于ReLU函数。
需要注意的是,Swish函数相对于其他激活函数来说计算开销较大,因为它需要进行Sigmoid运算。

GLU

Google 的 PaLM 和 Meta 的 LLaMA 都使用了 SwiGLU 来增强 Transformer 架构中的 FFN 层的性能。SwiGLU 是Gated Linear Units(GLU)激活函数的一种变体。
FFN 层存在于 Transformer 架构的编码器和解码器部分中。例如,下方的编码器块由多头注意力层和一个 FFN 层组成。
notion image
FFN层包括两个线性变换,中间插入一个非线性激活函数。最初的Transformer 架构采用了 ReLU 激活函数。
GLU 其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个 sigmoid 函数用来控制信息能够通过多少。
其中 表示逐元素相乘,g 表示一层 MLP 或者卷积。当 趋于 0 时表示对 x 进行阻断,趋于 1 时表示允许 x 通过。
SwiGLU 就是采用 Swish 作为激活函数的 GLU 变体。

Softmax

Softmax 是用于多类分类问题的激活函数,将输入向量转换为一个概率分布,输出的每个值都在 (0,1) 范围内,且所有输出值的总和为 1。
T 为温度参数,T 越大,Softmax 的输出更加平滑,越小越尖锐。