当前位置:   article > 正文

relu函数_人工智能-深度学习-激活函数ReLU,Sigmoid,TanH,ELU,MaxOut

relu函数可以用xavier初始化方法吗
9b6ef2018d411e596caba59d05edfde1.png

激活函数:在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)

762603c2f30db837f0d595da74867784.png

激活函数的本质

激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。

举一个例子来说明:假如我的任务是,将下面的这幅图中的三角形和圆形分开,也就是一个典型的二分类问题:

02cfd7ada6b2ea2e9187114fd6b0f9cc.png

我们用肉眼能很轻松的得出结论:无法用一条直线将这两种图形完全分开。比如我这里使用一个单层感知机:

c53b8cb97f86c5c279e8acbf94ef2188.png
efb5a4ad7e96af6102fcf5c215d32449.png

方程:

就是上图右边的直线,无论如何更改参数,它都不能很好的完成这个二分类问题,因为问题本身就是线性不可分的。

在每一层叠加完后,我们为输出与输入之间加上一个激活函数,此时的方程就变成了这样:

0ca20578e5b98502128c737008fa4190.png
2d259a31aef0ed2141c45fbc99965b94.png

这样也许就能将这个线性不可分的问题解决了。最后也许就是这个样子:

b636f5dd816563e834093baf6d56412d.png

常见的激活函数:

5cca77460973d1286a06a821a3fa3d43.png

1. ReLU是目前使用最频繁的一个函数(Rectified Linear Unit),如果你不知道你的激活函数应该选择哪个,那么建议你选择ReLU试试。一般情况下,将ReLU作为你的第一选择

  • 公式:
  • 导数:
1ce22c2d5561ddb210cb8e4c7f05709c.png

首先,Relu一定程度上缓解了梯度问题(正区间) 其次, 计算速度非常快,这一点也可以明显比较出来。 最后, Relu加速了模型的收敛, 比sigmoid与tanh要快很多。

ReLu是分段线性函数,它的非线性性很弱,因此网络一般要做得很深。但这正好迎合了我们的需求,因为在同样效果的前提下,往往深度比宽度更重要,更深的模型泛化能力更好。所以自从有了Relu激活函数,各种很深的模型都被提出来了,一个标志性的事件是应该是VGG模型和它在ImageNet上取得的成功.

ReLU也有几个需要特别注意的问题:

1)ReLU的输出不是zero-centered

2)某些神经元可能永远不会被激活(Dead ReLU Problem),导致相应的参数永远不能被更新。

有两个主要原因可能导致这种情况产生:

1) 非常不幸的参数初始化,这种情况比较少见

2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx 非0,通常α=0.01 ( Leaky ReLU函数: f(x)=max(αx,x) )。为了解决zero-centered问题,提出了ELU (Exponential Linear Units) 函数,f(x)=x if x>0 otherwise a(e^x −1).

2. Sigmoid函数

  • 公式:
  • 求导:
e36c7fd8a911f1e0fa4bd869011b0fba.png

sigmod函数的导数:

6a8f5eaed040e394b200eb3d7bf2365f.png

虽然simoid函数有诸多缺陷,但依然是目前主流的激活函数之一。其主要有以下几个缺陷:sigmoid 极容易导致梯度消失问题。

如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。

计算费时。 在神经网络训练中,常常要计算sigmid的值, 幂计算会导致耗时增加。但这不是什么大问题,最多是换个显卡, 模型跑的时间长点而已。 sigmoid 函数不是关于原点中心对称的(zero-centered)。

3. Tanh函数:

  • 公式:
  • 导数:
fa0c581c2dac05cad50ed777a3149313.png

它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

4.Leaky ReLU函数(PReLU)

函数表达式

eaef05e95f63acf67fabc1c6789ce03c.png
b5a210268084a938cd53495f9cae180c.png

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx 而非0,通常α=0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x) 其中α 可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

5.ELU (Exponential Linear Units) 函数

函数公式:

58827649a897d2048ef67509c5a25097.png

函数及其导数的图像如下图所示:

09f85e938ca885e62d9603a4fb77e8dc.png

ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:

  • 不会有Dead ReLU问题
  • 输出的均值接近0,zero-centered

它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

6.MaxOut函数

这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:

c92b73c0bb56bfb082d1830c486369be.png

上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:

dcfd1f70aa398ef5e1731ce552f7d6ce.png

权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。

我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

应用中如何选择合适的激活函数?

这个问题目前没有确定的方法,凭一些经验吧。

1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。

2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.

3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/85609
推荐阅读
相关标签
  

闽ICP备14008679号