sigmoid
sigmoid函数的公式如下:
这个函数有以下两个问题:
(1) 非零均值
(2) 梯度消失
对于第(2)个问题比较好理解,因为sigmoid函数的梯度的最大值是0.25,随着网络层数的增多,sigmoid函数的梯度连乘容易使得梯度值非常小导致梯度消失。对于第(1)个问题,为什么零均值会更好?对于非零均值的激活函数,以sigmoid函数为例,计算后会得到全大于0的输出作为下一层的输入。如果使用零均值的激活函数,在计算后可以得到有小于0有大于0的输出作为下一层的输入,相比起非零均值有着更容易拟合任何函数的能力。当然,非零均值并不是不好的,只是相比起零均值,可能没有那么容易去拟合任意函数,但随着层数的叠加也是总可以拟合任意函数的。
tanh
tanh函数的公式如下:
可以看到tanh相比起sigmoid函数,是一个零均值的激活函数,也是一个将神经元输出压缩到一定范围的激活函数。tanh函数可以得到$[-1,1]$范围的输出。tanh函数的问题和sigmoid函数的问题一样,就是会导致梯度消失,但是tanh函数导致梯度消失的程度没有sigmoid函数严重。
ReLU
ReLU函数的公式如下:
ReLU函数有三个优点:
(1) 解决了梯度消失的问题
(2) 计算速度非常快,只需要比较取最大值,无需进行幂运算
(3) 收敛速度快,因为在正数区域的梯度恒等于1
Relu函数存在的问题如下:
(1) 梯度爆炸
(2) 非零均值
(3) 神经元“死亡”,一旦一个神经元的输出小于等于0,则关于这个神经元的输出对参数的梯度都会等于0,关于这个神经元的参数得不到更新
对于问题(3),只要这个神经元不是在第一层,则关于这个神经元的参数在后续还是有机会得到更新的,因为其他神经元的参数更新后,关于这个神经元的输入会发生变化,对应的输出也会发生变化,但输出大于0时,就可以继续更新关于这个神经元的参数了。但是这种约束可能会降低神经元的学习效率。
PReLU
PReLU针对ReLU可能造成的神经元“死亡”问题提出了改进,计算公式如下:
当$\alpha$等于0时,PReLU就是ReLU。PReLU中的$\alpha$是通过学习调整参数得到的,即$\alpha$是模型参数的一部分。