大模型--激活函数汇总--32

1. 参考

邱锡鹏老师的《神经网络与深度学习》

2. 神经网络

𝐷 个输入𝑥1, 𝑥2, ⋯ , 𝑥D,
z净输入也叫净活性值(Net Activation).并用净输入(Net Input)𝑧 ∈ ℝ表示一个神经元所获得的输入信号𝒙的加权和,


𝒘 = [𝑤1; 𝑤2; ⋯ ; 𝑤𝐷] ∈ ℝ𝐷 是𝐷 维的权重向量,𝑏 ∈ ℝ是偏置.

净输入𝑧在经过一个非线性函数𝑓(⋅)后,得到神经元的活性值(Activation)𝑎,

其中非线性函数𝑓(⋅)称为激活函数(Activation Function).

激活函数在神经元中非常重要的.为了增强网络的表示能力和学习
能力,激活函数需要具备以下几点性质:
(1) 连续并可导(允许少数点上不可导)的非线性函数.可导的激活函数
可以直接利用数值优化的方法来学习网络参数.
(2) 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率.
(3) 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太
小,否则会影响训练的效率和稳定性.

Logistic

Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数.常用的 Sigmoid
型函数有Logistic函数和Tanh函数.

Logistic函数定义为

Logistic 函数可以看成是一个“挤压”函数,把一个实数域的输入“挤压”到(0, 1).
和感知器使用的阶跃激活函数相比,Logistic函数是连续可导的,
其数学性质更好.
因为Logistic函数的性质,使得装备了Logistic激活函数的神经元具有以下
两点性质:1)其输出直接可以看作概率分布,使得神经网络可以更好地和统计
学习模型进行结合.2)其可以看作一个软性门(Soft Gate),用来控制其他神经
元输出信息的数量.

Tanh函数

Tanh函数也是一种Sigmoid型函数.

Tanh函数可以看作放大并平移的Logistic函数,其值域是(−1, 1).

Logistic 函数和 Tanh 函数的形状.

Tanh 函数的输出是零中心化的(Zero-Centered),
而 Logistic 函数的输出恒大于 0.非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift)
并进一步使得梯度下降的收敛速度变慢.

输入数据是Zero-Centered,经过Logistic则变成了非中心话,数据的分布发生了变化。

Hard-Logistic函数和Hard-Tanh函数

Logistic函数和Tanh函数都是Sigmoid型函数,具有饱和性,而且计算你的开销很大,
中间(0附近)近似线性,两端饱和.因此,这两个函数可以通过分段函数来近似.

以 Logistic 函数 𝜎(𝑥) 为例,其导数为 𝜎′(𝑥) = 𝜎(𝑥)(1 − 𝜎(𝑥)).


样Logistic函数可以用分段函数hard-logistic(𝑥)来近似:

Tanh函数在0附近的一阶泰勒展开为

Tanh函数也可以用分段函数hard-tanh(𝑥)来近似.

Hard-Logistic函数和Hard-Tanh函数的形状.

计算起来就很简单了,不涉及指数的运算,只涉及乘法以及简单的比较大小

ReLU函数

ReLU(Rectified Linear Unit,修正线性单元)
也叫Rectifier函数,是目前深度神经网络中经常使用的激活函数.
ReLU实际上是一个斜坡(ramp)函数,定义为

优点

  • 采用 ReLU 的神经元只需要进行加、乘和比较的操作,计算上更加高效.
  • ReLU 函数也被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
  • 在生物神经网络中,同时处于兴奋状态的神经元非常稀疏.人脑中在同一时刻大概只有 1% ∼ 4% 的神经元处于活跃状态
  • Sigmoid 型激活函数会导致一个非稀疏的神经网络(两侧的区域虽然值接近饱和 但是不为零),而 ReLU 却具有很好的稀疏性,大约50%的神经元会处于激活状态.也就是只有一半的神经元有输出。
  • 在优化方面,相比于Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,且在 𝑥 > 0 时导数为 1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度.

缺点

  • ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率
  • ReLU 神经元在训练时比较容易“死亡”.
    在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个 ReLU 神经元在
    所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是
    0,在以后的训练过程中永远不能被激活.这种现象称为死亡 ReLU 问题(Dying ReLU Problem),并且也有可能会发生在其他隐藏层.

为了避免上述情况,有几种ReLU的变种也会被广泛使用.

带泄露的ReLU

带泄露的ReLU(Leaky ReLU)在输入 𝑥 < 0时,保持一个很小的梯度𝛾 ,这样当神经元非激活时也能有一个非零的梯度可以更新参数,避免永远不能被激活


其中 𝛾是一个很小的常数,比如0.01.当𝛾 < 1时,带泄露的ReLU也可以写为

带参数的ReLU


其中 𝛾𝑖 为 𝑥 ≤ 0 时函数的斜率

ELU函数

ELU(Exponential Linear Unit,指数线性单元) 是一个近似的零中心化的非线性函数,其定义为

x<0的部分 使用指数函数往下移1 代替

Softplus函数

Softplus(𝑥) = log(1 + exp(𝑥)).

Softplus函数其导数刚好是Logistic函数.Softplus函数虽然也具有单侧抑制、宽
兴奋边界的特性,却没有稀疏激活性

Swish函数

Swish 函数 是一种自门控(Self-Gated)激活函数,定义为

𝜎(⋅) ∈ (0, 1) 可以看作一种软性的门控机制.
当𝜎(𝛽𝑥)接近于1时,门处于“开”状态,激活函数的输出近似于𝑥 本身;
当𝜎(𝛽𝑥)接近于0时,门的状态为“关”,激活函数的输出近似于0.


当𝛽 = 0时,Swish函数变成线性函数𝑥/2
当𝛽 = 1时,Swish函数在𝑥 > 0时近似线性,在 𝑥 < 0 时近似饱和,同时具有一定的非单调性.
当 𝛽 → +∞ 时,𝜎(𝛽𝑥)趋向于离散的0-1函数

Swish函数近似为ReLU函数.因此,Swish函数可以看作线性函数和ReLU函数之间的非线性插值函数,其程度由参数𝛽 控制

MISH

一个新的 state of the art 的激活函数,ReLU 的继任者
,Mish 的梯度更平滑,Mish 检查了理想的激活函数应该是什么(平滑、处理负号等)的所有内容

Mish是 xtanh(ln(1+e^x))。
ReLU是 max(0,x),
Swish是 x
sigmoid(x)。

GELU 激活函数

def forward(self, input: torch.Tensor) -> torch.Tensor:
        abs_value = torch.abs(input)
        return input * torch.sigmoid(1.702 * abs_value) * torch.exp(0.851 * (input - abs_value))


这个激活函数结合了 sigmoid 函数和指数函数来近似 GELU (Gaussian Error Linear Unit) 的行为,但通过简化计算以提高效率。以下是详细的公式推导:


FastGELU 通过巧妙地结合 sigmoid 和指数函数,实现了对 GELU 的近似,同时保持了计算上的高效性。它在处理正输入时表现得类似于 GELU,而在处理负输入时引入了额外的衰减因子,从而可能有助于缓解梯度消失问题并加速训练过程。

posted @ 2024-12-11 16:11  jack-chen666  阅读(125)  评论(0编辑  收藏  举报