在感知器模型、神经网络模型、深度学习模型中均会看见激活函数的声影。激活函数又被称为转移函数、激励函数、传输函数或限幅函数,其作用就是将可能的无限域变换到一指定的有限范围内输出,这类似于生物神经元具有的非线性转移特性。
常用的激活函数有:线性函数、斜坡函数、阶跃函数、符号函数、Sigmoid函数、双曲正切函数、Softplus函数、Softsign函数、Relu函数及其变形、Maxout函数等。
线性函数
线性函数是最简单的激活函数:
y=F(x)=kx.
其中
y 为输出值,
x 为输入信号的加权和,
k 是一个常数,表示直线的斜率。
在深度学习模型中,线性函数几乎不被用到。因为其体现不出深度学习模型的价值,如假定深度学习模型有
m 层,则最终的输出为
y=kmkm−1...k1x ,其等价于单层的线性模型
y=k′x (
k′=kmkm−1...k1 )的输出。
斜坡函数
斜坡函数的定义如下所示:
y=F(x)=⎧⎩⎨⎪⎪r,x,−r,当x≥r当|x|<r当x≤−r
r 和
−r 分别是处理单元的最大值和最小值,称为饱和值,一般
|r|=1 。
阶跃函数
阶跃函数属于硬限幅函数的一种:
y=F(x)={1,0,当x>0当x≤0
符号函数
符号函数也是属于硬限幅函数的一种,其是根据输入变量的正负情况决定输出,若输入变量为正,则输出1;若输入变量为负,则输出-1;输入变量为0时可为1或-1:
y=F(x)={1,−1,当x>0当x≤0
注:硬限幅函数虽说简单直观,但在深度学习中,很多时候将其应用在隐藏层意义不大,还会适得其反,因此其主要被应用在输出层。
Sigmoid函数
Sigmoid函数为S型函数的一种,函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,并且求导容易(因深度学习在更新参数时,常采用梯度下降法,此时需要对激活函数求导)。但由于其软饱和性,当 |x|≫1 时, y 趋于0或1,导致其导数无限趋于0,容易产生梯度消失,此时会使训练出现问题。并且其输出并不是以0为中心的。
y=F(x)=11+e−x.
注: Sigmoid函数的导数为
F′(x)=F(x)(1−F(x)) 。
双曲正切函数
双曲正切函数(tanh函数)也是S型函数的一种,Sigmoid函数存在的问题它基本上也都存在,不过相对于Sigmoid函数,它是原点对称的。而且在0周围,曲线变化趋势更陡,因此在训练过程中,权重每次更新的步长更大,能够更快地收敛到最优值(也可能是局部最优)。并且当 s=0 时有 y=0 ,即同时具有双级输出。当要求输出(-1 1)范围的信号时,它常被采用。
y=F(x)=ex−e−xex+e−x.
注: tanh函数的导数为
F′(x)=(1−F(x))2 。
Softplus函数
Softplus被定义为:
y=F(x)=log(1+ex).
Softsign函数
Softsign函数被被定义为:
y=F(x)=x1+|x|.
Relu函数及其变形
ReLU是最近几年非常受欢迎的激活函数。虽说Sigmoid和tanh效果不错,但是很容易出现梯度消失现象–当输入 |x| 较大时,梯度变得非常小,从而导致SGD收敛速度下降或者无法收敛。ReLU函数被定义为:
y=F(x)=max{0,x}.
不过ReLU也不是十全十美的,观察其定义便可以发现在
x>0 时,梯度恒为1,可以保证稳定的下降速度;可当
x≤0 时,梯度却恒为0。虽说这样的特性能强化神经网络的稀疏表达能力,但随着训练的进行,可能会出现神经元不可逆转的死亡,权重从此以后便无法更新。
为了缓解上面的问题,ReLU的变形LReLU、PReLU与RReLU应运而生。其基本思想均是,当 x≤0 时不再是恒为0输出,而是为其乘上一个比较小的系数 α ,因此激活函数的定义变成:
y=F(x)=max{αx,x}.
在LReLU中, α 固定为非常小的值。 α 的引入虽说可以避免梯度消失问题,但如何选择合适的 α 也是一件非常头疼的事情。通常都是通过先验知识人工赋值的。但有人观察到,损失函数对 α 的导数是可以求得的,因此可以将它作为一个参数进行训练,如同用梯度下降法训练各个层之间的权重。于是自适应PReLU方法被提出。
RReLU是LReLU的“随机”版本–
α 是随机的。核心思想就是在训练过程中,
α 是从一个高斯分布
U(l,u) 中随机生成的(
α∼U(l,u),l<u,l,u∈[0,1] ),然后在测试过程中进行修正。
Maxout函数
Maxout函数的定义如下:
y=F(x)=maxj∈[1,k]zj.
相当于在每个输出神经元前面隐藏地又多了一层。这一层有
k 个神经元,此时Maxout网络的输出为
k 个“隐隐层”神经元中的最大值。公式中
zj 的计算公式为:
zj=Wjx+wj0.
如果设置Maxout的参数
k=5 ,Maxout层就如下所示:
上面左图显示的是传统的激活策略,采用Maxout的时候,会发现参数个数成
k 倍增加。因为本来在第
i 层到第
i+1 层,单个输出神经元只对应一组参数,但现在却需要对此神经元同时训练
k 组参数,然后选择激活值最大的作为激活值。也有人在看到“隐隐层”的输入-输出映射关系时,会疑惑Maxout似乎等价于线性激活函数,其实不然,因为在激发函数中有了max操作,所以整个Maxout网络其实是一种非线性的变换。
Maxout的拟合能力是非常强的,已有证明表明两层Maxout可以拟合任意的的凸函数。其实这块很好理解,首先是任意的凸函数都可以由分段线性函数以任意精度拟合,而Maxout又是取 k 个隐隐含层节点的最大值,这些”隐隐含层”节点也是线性的,所以Maxout激活函数并不是一个固定的函数,它是一个分段线性函数。
简单总结一下
其实激活函数的主要作用就是将输入进行线性或非线性映射,对于其范围没有限制,上面介绍的只是一些常见的,其他的如 sinx 、 arctanx 等也都可以。为什么在训练深度学习模型时常用ReLU、Sigmoid、tanh等函数,主要是在深度学习训练过程中,不宜使用过度复杂的函数,因为在参数优化时会增加求导及计算成本。
具体哪种激活函数最优?目前还不存在定论。一般需要综合考虑各个激活函数的优缺点,再结合自己的实际情况选择到底使用哪个。并且在一个模型中,不同层可以选定不同的激活函数,如第一层选用ReLU函数、第二次选用Sigmoid函数、……、输出层选用线性函数。
参考资料
- http://blog.csdn.net/hjimce/article/details/50414467 深度学习(二十三)Maxout网络学习
- http://www.cnblogs.com/rgvb178/p/6055213.html 浅谈深度学习中的激活函数
- https://item.jd.com/12128543.html 《深度学习》[美] Ian,Goodfellow,[加] Yoshua,Bengio,[加] Aaron Courville著