神经网络中各种激活函数比较

Posted 合唱团abc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络中各种激活函数比较相关的知识,希望对你有一定的参考价值。

ReLU 激活函数:

ReLu使得网络可以自行引入稀疏性,在没做预训练情况下,以ReLu为激活的网络性能优于其它激活函数。 
数学表达式: $y = max(0,x)$

第一,sigmoid的导数只有在0附近的时候有比较好的激活性,在正负饱和区的梯度都接近于0,所以这会造成梯度消失,而relu函数在大于0的部分梯度为常数,所以正半区不会产生梯度消失现象。第二,relu函数在负半区的导数为0 ,所以一旦神经元激活值进入负半区,那么梯度就会为0,也就是说这个神经元不会经历训练,即所谓的稀疏性。第三,relu函数的导数计算更快,程序实现就是一个if-else语句,而sigmoid函数要进行浮点四则运算

ReLU 的缺点是,它在训练时比较脆弱并且可能“死掉”

神经元死亡:如果梯度太大,而学习率又不小心设置得太大,就会导致权重一下子更新过多,就有可能出现这种情况:对于任意训练样本 [公式] ,网络的输出都是小于0的。对于relu函数来说,则所有流过这个神经元的梯度将都变成 0,该神经元不会被更新。

解决方案:

1、把relu换成leaky relu,保证让激活函数在输入小于零的情况下也有非零的梯度。

2、采用较小的学习率

3、采用 momentum based 优化算法,动态调整学习率

Leaky ReLU 是为解决“ ReLU 死亡”问题的尝试。

ReLU 中当 x<0 时,函数值为 0。而 Leaky ReLU 则是给出一个很小的梯度值,比如 0.01

maxout
https://arxiv.org/pdf/1302.4389.pdf
 
Maxout 具有 ReLU 的优点(如:计算简单,不会 梯度饱和),同时又没有 ReLU 的一些缺点 (如:容易 go die)。不过呢,还是有一些缺点的嘛:就是把参数double了。

Sigmoid 激活函数:

sigmoid 激活函数在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。 
数学表达式: $y = (1 + exp(-x))^{-1}$  

$ y\' = y (1-y) $

缺点:

激活函数计算量大,反向传播求梯度时,求导涉及除法
反向传播时,很容易就会出现梯度消失或梯度爆炸的情况,从而无法完成深层网络的训练

梯度消失或梯度爆炸的原因:

以下图的反向传播为例(假设每一层只有一个神经元且对于每一层y_i=\\sigma\\left(z_i\\right)=\\sigma\\left(w_ix_i+b_i\\right),其中\\sigma为sigmoid函数)

可以推导出

\\begin{align}
&\\frac{\\partial C}{\\partial b_1}=\\frac{\\partial C}{\\partial y_4}\\frac{\\partial y_4}{\\partial z_4}\\frac{\\partial z_4}{\\partial x_4}\\frac{\\partial x_4}{\\partial z_3}\\frac{\\partial z_3}{\\partial x_3}\\frac{\\partial x_3}{\\partial z_2}\\frac{\\partial z_2}{\\partial x_2}\\frac{\\partial x_2}{\\partial z_1}\\frac{\\partial z_1}{\\partial b_1}\\\\
&=\\frac{\\partial C}{\\partial y_4}\\sigma\'\\left(z_4\\right)w_4\\sigma\'\\left(z_3\\right)w_3\\sigma\'\\left(z_2\\right)w_2\\sigma\'\\left(z_1\\right)
\\end{align}

\\sigma\'\\left(x\\right)的最大值为\\frac{1}{4},而我们初始化的网络权值|w|通常都小于1,因此|\\sigma\'\\left(z\\right)w|\\leq\\frac{1}{4},因此对于上面的链式求导,层数越多,求导结果\\frac{\\partial C}{\\partial b_1}越小,因而导致梯度消失的情况出现。

这样,梯度爆炸问题的出现原因就显而易见了,即|\\sigma\'\\left(z\\right)w|>1,也就是w比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。因为\\sigma\'\\left(z\\right)的大小也与w有关(z=wx+b),除非该层的输入值x在一直一个比较小的范围内。

其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应(导数的链式求导法则)。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。

 

Tanh 激活函数:

Tanh 激活函数使得输出与输入的关系能保持非线性单调上升和下降关系,比sigmoid 函数延迟了饱和期(即导数接近0)对神经网路的容错性好。 
数学表达式: 

$y\' = \\frac{4}{(e^x + e^{-x})^2}$

 

以上是关于神经网络中各种激活函数比较的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:神经网络中的激活函数

常用激活函数比较

形象的解释神经网络激活函数的作用是啥?

神经网络中的各种损失函数介绍

神经网络为啥要用sigmoid函数?为啥要映射到0-1之间?求解释

神经网络为啥要用sigmoid函数?为啥要映射到0-1之间?求解释