首先激活函数的作用是:对模型加入非线性因素,解决线性模型无法解决的问题。通过下图可以很清楚看到加入激活函数之后的变化:
下边对常用的激活函数做一个总结:
Sigmoid
公式:
函数曲线以及梯度(导数)曲线:
可以发现sigmoid把输入挤压到0-1之间,这可以用来做输出的归一化。 问题:
- sigmoid函数的梯度大多集中在0-0.25之间,反向传播时链式相乘,会导致比较严重的梯度消失。
- 输出不是以0为中心的(zero-centered),降低收敛效率。
- 解析式中含有幂运算,计算机求解比较耗时。
tanh函数
公式:
tanh其实就是sigmoid的变体,把函数值域拉到-1到1之间:
问题:
- 梯度下降很快,在x等于3或着-3左右就将到0了,着也导致比较严重的梯度消失。
RuLU
公式:
优势:
- 在正区间,梯度始终为1,解决了梯度消失的问题。
- 计算速度特别快,只需要计算是否大于0。
- 收敛速度远大于sigmoid和tanh。
问题:
- 输出不是以0为中心的(zero-centered),降低收敛效率。
- Dead RuLU问题:指的是某些神经元可能永远无法被激活和更新。当为负数时,在反向传播时梯度为0,RuLU完全失效。
Leaky RuLU(PReLU)
公式:
其中是一个非常小的数,比如0.01。这样,输入小于0时,PReLU的梯度不常为0了。用以解决Dead RuLU问题。
理论来说,Leaky ReLU有ReLU的优点,但是在实际操作中,并没有完全明确的Leaky ReLU总好于ReLU。
ELU(Exponential Linear Units)
函数和梯度图像如下:
优势:
- 不存在Dead RuLU问题。
- 输出zero-centered。
GeLU
在目前BERT中使用的激活函数,GeLU可以看做Dropout和ReLU的结合,主要思想是为激活函数引入随机性,使得模型训练过程更加鲁棒。
ReLU会确定性的将输入乘以0或者1,Dropout会随机乘以0,而GeLU也是将输入乘以0或者1来实现,只是乘以0或者1取决于考虑输入自身分布下的随机选择。
公式: