五分钟读完一篇文章之激活函数

神经网络(Neural Networks)中的每个神经元节点接受上一层神经元的输出值作为当前神经元的输入值,并将输入值通过函数处理后传递给下一层神经元,这个函数称为激活函数(Activation Function)。

神经元结构
图 神经元结构

激活函数的主要作用是提供网络的非线性表达能力。没有激活函数的情况下,每一层节点的输入都是上层节点输出的线性映射,很容易验证,即便是有再多的隐藏层,其整个网络和单层的神经网络都是等价的。因为线性模型的参数数量非常少,模型复杂度非常有限,所以我们引入非线性函数作为激活函数,使得深层神经网络不再是输入的线性组合,而是几乎可以逼近任意泛函的非线性网络。

激活函数应具有的良好性质
1.非线性:激活函数的意义所在,上文已经说明;
2.可微性(除有限个点外): 如果激活函数不具有可微性,就不能使用梯度下降法进行训练;
3.单调性:原因不明(个人理解,使网络方便训练 );
4.计算简单:激活函数的前向计算次数与神经元的个数成正比,计算简单的非线性函数更适合做激活函数;
5.非饱和性:避免在某些区间梯度接近于零(即梯度消失),使得权重无法继续更新的问题;
6.输出范围有限: 有限的输出值使得基于梯度的优化方法更加稳定,因为特征的表示受有限权值的显著影响,但同时也会限制神经网络的表达能力;
7. 近似恒等变换(Identity):即f(x)≈x,输出的幅值不会随着深度的增加而发生显著的变化,从而使网络更加稳定,梯度也更容易回传(与非线性矛盾,激活函数一般仅在部分定义域内满足该条件);
8. 较少参数:激活函数一般不含有参数,Maxout是个例外;
9.归一化(Normalization):使样本分布变为零均值和单位方差(BN层思想的产物),从而进行稳定训练 。

常用激活函数
常用激活函数
图 常用激活函数

Sigmoid函数
曾经认为在物理结构上最接近神经元,所以被广泛使用,现在除二分类外一般不使用。
缺点
1.软饱和性:当x趋于无穷时,f(x)的两侧导数逐渐趋于0,即梯度消失(Gradient Vanishing);
2.输出非0均值(Zero-centered):这会导致后层的神经元的输入是非0均值的信号,以Z=W0X0+W1X1为例, 假设输入均为正数,那么W的局部梯度也为正数,使得反向传播过程中出现Zigzag现象(同时向正方向或负方向更新),使得神经网络收敛缓慢;
3.含有幂运算:求解相对耗时,显著增加训练时间。

Zigzag现象
图 Zigzag现象

tanh函数
解决了Sigmoid函数的非0均值输出问题,梯度消失与幂运算的问题仍然存在。

Relu函数(常用)
优点
1.在正区间解决了梯度消失问题;
2.计算速度快;
3.收敛速度快于Sigmoid与tanh函数;
4.实际结构相对于Sigmoid函数更接近神经元;
5.在负区间梯度就为0,拥有一定稀疏性。
缺点
1.输出非0均值;
2.dead ReLU(神经元坏死现象):某些神经元可能永远不会被激活,导致相应的参数不能更新;
(1) 非常不幸的参数初始化(比较少见)
(2) 随着训练的推进,部分输入会落入硬饱和区(如果learning rate太大,会加速此过程),使网络进入此状态
解决方法:采用Xavier初始化方法,较小的learning rate或使用adagrad等自动调节learning rate的算法。
3.非有限输出范围,不对数据幅值进行压缩。

dead ReLU
图 dead ReLU

Leaky ReLU函数
Leaky ReLU有ReLU的所有优点,而且不会出现dead ReLU问题。但在实际操作中,Leaky ReLU并不总是好于ReLU。

ELU (Exponential Linear Units) 函数
ELU有ReLU的所有优点,而且有接近于0均值的输出,负饱和区相对于Leaky ReLU对于噪声增加了一定的鲁棒性(负值部分携带的信息增多)。
缺点
含有幂运算,显著增加训练时间。

Maxout函数
优点
1.线性分段函数,拟合能力强;
2.ReLU和Leaky ReLU的推广;
3.没有饱和区,没有死区。
缺点
双倍的参数与神经元数量。

总结
1.一般不使用Sigmoid;
2.使用Leaky ReLU、Maxout、ELU;
3…使用ReLU时,注意learning rate;
4.尝试tanh,不要抱有较大希望,理论上效果不如 ReLU 和 Maxout。

猜你喜欢

转载自blog.csdn.net/weixin_41006390/article/details/105378456