1.激活函数的选择:
-
非线性
无论使用多少线性变换,都还是线性的,只能解决线性的问题
-
连续可导
反向传播过程中求导
-
定义域是 R R R(全体实数)
为了数值上的稳定,需要能够映射全体实数
-
单调递增的曲线
激活函数只是增加非线性,并不需要改变对输入的响应状态,应该随着$y$的增大而增大
2.激活函数的作用
让结果在一定范围内输出;使得可以进行非线性拟合。
3.常见激活函数
(1)sigmoid函数
sigmoid函数的缺点:
- 梯度消失现象
当线性单元输出 y y y的值非常大或者非常小时, s i g m o i d sigmoid sigmoid函数的导数等于0; s i g m o i d sigmoid sigmoid导数的最大值为0.25,也就是说神经网络反向传播时,每层梯度会缩小 1 / 4 1/4 1/4或者更多。
所以当网络层数很多,或者某层出现极端的输出时,反向传播的链式法则就会导致前几层的梯度几乎为0,参数不会被更新,上图的四层网络其实就等价为两层网络。这就是梯度消失现象。
- 神经网络更慢的收敛
如图中 ∂ L ∂ w 1 \frac{\partial L}{\partial w_1} ∂w1∂L和 ∂ L ∂ w 2 \frac{\partial L}{\partial w_2} ∂w2∂L式中标黄的值恒为正,两个值的正负完全取决于 ∂ L ∂ o \frac{\partial L}{\partial o} ∂o∂L,这就意味着两个偏导数的符号始终一致,被强制正向或者反向更新,这种情况会使神经网络更慢的收敛到预定的位置。(sigmoid函数的输出恒为正值,不是以零为中心的,这会导致权值更新时只能朝一个方向更新,从而影响收敛速度。)
- 计算复杂度高,因为sigmoid函数是指数形式。
(2)tanh函数/双曲正切函数
tanh 激活函数是sigmoid 函数的改进版,是以零为中心的对称函数,收敛速度快,不容易出现 loss 值晃动,但是无法解决梯度消失的问题。tanh激活函数的计算量也是指数级的,计算相对复杂。
(3)ReLU函数
需要注意的是,ReLU函数不是一个线性函数,它是一个分段线性函数,所以可以用它来学习 数据中的复杂关系。
只有当神经元输出大于0的时候才会回传梯度,小于0时不会反向传播。
优点:
-
计算简单开销较小、收敛速度较快
-
ReLU激活函数的导数是一个非饱和函数,在 y > 0 y>0 y>0区域上,不会出现梯度消失的问题
-
稀疏性
ReLU函数在训练过程中,可以动态控制神经元的状态,要么大于0被激活,要么等于0被抑制,这种性质被称为稀疏性。
稀疏性导致简洁的模型,这些模型通常具有更好的预测能力和更少的过拟合。在稀疏网络中,神经元更有可能实际上正在处理问题的有意义的方面。例如,在检测图像中猫的模型中,可能存在可以识别耳朵的神经元,如果图像是关于建筑物的,则显然不应激活该神经元。最后,稀疏网络比密集网络更快,因为要计算的东西更少。
ReLu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
稀疏性的好处:首先如果输入的参数发生了一个很小的改动,那么只有少部分的神经元需要改变状态,而不需要全局调整,使得信息的耦合程度降低;其次这种动态开启和关闭神经元的做法可以支持不同输入维度和中间层维度的特征学习(表达维度尺寸可变);经过实验和经验表明,这种稀疏的表达方式,一般是线性可分或者弱线性可分,这种性质可以降低网络训练的难度(稀疏表达线性可分);最后虽然输出的特征是稀疏的,但是被激活的输出仍然保持原有的表达能力(保持特征的表达能力)
- 比 Sigmoid 更符合生物学神经激活机制
缺点:
-
与sigmoid函数一样,也是非零均值化函数,会影响网络的收敛效果(可以使用输出的归一化方式来解决)
-
梯度爆炸
relu函数没有上界,如果线性单元输出过大,或者网络是循环结构,就会导致梯度累积超出计算机的数值上限,这就是梯度爆炸现象。(可以用参数初始化和重新设计网络结构来解决)
- 神经元坏死
在训练过程中,可能会出现一些神经元始终不会被激活,从而让网络表达能力下降的问题,这个现象被称为神经元坏死现象。
就是训练的时候很”脆弱”,很容易就”die”了。举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
(4)Leaky ReLU函数
在保留一定稀疏性的情况下,也避免了神经元坏死。
(5)Parametric ReLU函数
将负半轴的梯度值,更换成了可以动态学习调整的参数,是否保留稀疏性或者抑制神经元,都要通过训练过程来确定。