激活函数:Sigmoid,Tanh,Softmax,Swish,Relu系列,GLU+GTU
激活函数又称“非线性映射函数”,是深度卷积神经网络中不可或缺的模块。可以说,深度网络模型强大的表示能力大部分便是由激活函数的非线性单元带来的。激活函数是网络中非线性的来源,去除了该部分之后网络就只剩下线性运算部分,而且线性运算的组合叠加也是线性的,最后得到的结果模型等价于单层的线性模型。为了能够适用于复杂的情况,需要在网络中引入非线性单元。
1、Sigmoid(Logistic)函数
sigmoid函数的定义:
sigmoid函数的输出被限制在[0,1]之间,单调连续,并且根据其定义容易求导;0 对应生物神经元的“抑制状态”,1则恰好对应了“兴奋状态”。但对于sigmoid函数两端大于5(或小于-5)的区域,这部分输出会被压缩到1或0。这样的处理会带来梯度的饱和效应(软饱和性)。
根据simoid型函数梯度图,大于5或者小于-5部分梯度接近0。这会导致在误差反向传播过程中导数处于该区域的误差很难甚至无法传递至前层,进而导致整个网络无法训练。并且sigmoid型激活函数值域的均值并非为0,不是以0为中心的, 而是全部为正,这样的结果会导致经过sigmoid后的输出均大于0,使得下一层的输入是非0均值。
2、Tanh函数
tanh函数的定义:
tanh函数又称双曲正切函数,是在sigmoid型函数基础上为解决均值问题提出的。函数的取值范围为[-1,1],输出相应的均值为0。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。但是tanh函数仍为sigmoid型函数,使用tanh依然会发生梯度饱和现象。
与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。tanh的梯度相比较sigmoid更加陡峭。我们选择sigmoid还是tanh是根据问题中对梯度的要求而定的。
3、Softmax函数
softmax是另一种sigmoid函数,但是它是在分类中比较容易控制的一种激活函数。sigmoid只能处理两类的问题。softmax将输出结果压缩在0-1之间,并依据输出的总和来分类。softmax在输出层中使用是比较完美的,用来获得输入数据对应的类别的各种概率。softmax形式如下:
假设我们的一个输出结果是[1.2,0.9,0.75],当我们使用了softmax之后,这个值变成了[0.42, 0.31, 0.27],我们可以使用这些概率当做每一类的概率。
笼统解释:二分类情况一般使用sigmoid激活,多分类情形一般使用softmax进行激活。
4、Swish函数
swish函数的定义:
该函数是Google大脑团队提出的一个新的激活函数。从图像上来看,swish函数跟reLu差不多,唯一区别较大的是接近于0的负半轴区域。swish函数跟facebook提出的GLU激活函数也是类似的。
5、Relu系列函数(Rectified Linear Unit)
(1)relu函数
relu函数的定义:
relu(z) = max(z, 0)
修正线性单元relu实际上是一个分段函数,梯度在 x >= 0 为 1, 反之为 0。x >= 0时 完全消除了sigmoid函数的饱和效应;x<0时输出0,神经元不会被激活,意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,对计算来说非常有效率。计算复杂度上relu也相对sigmoid和tanh更为简单。实验中还发现relu函数有助于随机梯度下降方法收敛,收敛速度快6倍左右。但是仍然有缺陷。
在x<0时,梯度为0,这部分卷积结果响应一旦变为负值将无法影响网络训练,这种现象叫死区。如果学习率较大,会发现40%的死区。如果有一个合适的学习率,死区会大大减少。
(2)Leaky Relu函数
leaky relu函数的定义:
泄漏修正线性单元leaky relu为了缓解死区,将Relu函数中x<0那部分进行调整。其中α为0.01 或者 0.001数量级的较小正数。可以发现relu实际上是leaky relu的一种特例。
leaky relu存在的问题就是α是一个超参数,合适的值难设定并且较为敏感。因此leaky relu函数在实际使用上性能不是特别稳定。
prelu函数的定义:
参数化修正线性单元prelu解决了leaky relu超参数α难设定的问题,直接将α也作为一个网络可以学习的变量融入模型的整体训练过程。在求解prelu的过程中,仍然采用传统的误差反向传播和随机梯度下降,对于α的更新遵循链式法则。
实验证明,使用prelu作为激活函数的网络优于原始relu网络。同时自由度较大的各通道独享参数的prelu性能更优。
(4)RRelu函数
rrelu函数的定义:
随机修正线性单元rrelu是leaky relu的一个变体。在rrelu中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的。rrelu的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。
elu函数的定义:
指数化线性单元elu,在取值小于0的部分使用指数。elu具备relu的优点,同时elu也解决了relu函数自身“死区”问题。不过elu函数指数操作稍稍加大了工作量,实际计算中elu中超参数α一般设置为1。
(6)SELU函数
缩放指数型线性单元selu就是对elu加上一个缩放因子λ。
6、GLU函数+GTU函数
GLU、GTU 单元是基于Gate mechanism的,gate units有助于深度网络建模。
Tanh激活函数和GTU都存在梯度消失的问题,因为即使是GTU,当神经元的激活处于饱和区时,组成结构部分都会削弱梯度值。相反,GLU和Relu不存在这样的问题。GLU和Relu都拥有线性的通道,可以使梯度很容易通过激活的神经元,反向传播且不会减小。因此,采用GLU或Relu做为激活,训练时收敛速度更快
(1)GTU(Gated Tanh Unit)
表达式为:f(X) = tanh(X*W+b) * O(X*V+c)
组成结构:Tanh激活单元:tanh(X*W+b),加上一个Sigmoid激活单元:O(X*V+c),构成的gate unit,就构成了GTU单元。
(2)GLU(Gated Liner Unit)
表达式为:f(X) = (X * W + b) * O(X * V + c)
组成结构:Relu激活单元:(X * W + b),加上一个Sigmoid激活单元:O(X * V + c),构成的gate unit,就构成了GLU单元。
根据函数的特征,总结规律,使得网络更加容易且更快的收敛:
1. Sigmoid函数以及它们的联合通常在分类器的中有更好的效果
2. 由于梯度崩塌的问题,在某些时候需要避免使用Sigmoid和Tanh激活函数
3. ReLU函数是一种常见的激活函数,在目前使用是最多的
4. 如果遇到了一些死的神经元,我们可以使用Leaky ReLU函数
5. ReLU永远只在隐藏层中使用
6. 根据经验,一般可以从ReLU激活函数开始,但是如果ReLU不能很好的解决问题,再去尝试其他的激活函数
7. 如果使用 ReLU,要小心设置 learning rate,不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout