激活函数:在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)
激活函数的本质
激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。
举一个例子来说明:假如我的任务是,将下面的这幅图中的三角形和圆形分开,也就是一个典型的二分类问题:
我们用肉眼能很轻松的得出结论:无法用一条直线将这两种图形完全分开。比如我这里使用一个单层感知机:
方程:
就是上图右边的直线,无论如何更改参数,它都不能很好的完成这个二分类问题,因为问题本身就是
线性不可分
的。
在每一层叠加完后,我们为输出与输入之间加上一个激活函数,此时的方程就变成了这样:
这样也许就能将这个线性不可分的问题解决了。最后也许就是这个样子:
常见的激活函数:
1. ReLU是目前使用最频繁的一个函数(Rectified Linear Unit,如果你不知道你的激活函数应该选择哪个,那么建议你选择ReLU试试。一般情况下,将ReLU作为你的第一选择
公式:导数:
首先,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函数
公式:求导:
sigmod函数的导数:
虽然simoid函数有诸多缺陷,但依然是目前主流的激活函数之一。其主要有以下几个缺陷:sigmoid 极容易导致梯度消失问题。
如果我们初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。
计算费时。在神经网络训练中,常常要计算sigmid的值, 幂计算会导致耗时增加。但这不是什么大问题,最多是换个显卡, 模型跑的时间长点而已。 sigmoid 函数不是关于原点中心对称的(zero-centered)。
3. Tanh函数:
公式:导数:
它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
4.Leaky ReLU函数(PReLU)
函数表达式
人们为了解决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) 函数
函数公式:
函数及其导数的图像如下图所示:
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隐藏层每个神经元的计算公式如下:
上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
权重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.
举报/反馈

制造业企业信息化

69获赞 40粉丝
记录造业信息化的思考和实践,个人成长。
关注
0
0
收藏
分享