大模型--激活函数汇总--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是 xsigmoid(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,而在处理负输入时引入了额外的衰减因子,从而可能有助于缓解梯度消失问题并加速训练过程。