深度学习常用激活函数

在感知器模型、神经网络模型、深度学习模型中均会看见激活函数的声影。激活函数又被称为转移函数、激励函数、传输函数或限幅函数,其作用就是将可能的无限域变换到一指定的有限范围内输出,这类似于生物神经元具有的非线性转移特性。

深度学习常用激活函数_第1张图片
常用的激活函数有:线性函数、斜坡函数、阶跃函数、符号函数、Sigmoid函数、双曲正切函数、Softplus函数、Softsign函数、Relu函数及其变形、Maxout函数等。

线性函数

线性函数是最简单的激活函数:

y=F(x)=kx.

其中 y 为输出值, x 为输入信号的加权和, k 是一个常数,表示直线的斜率。

深度学习常用激活函数_第2张图片
在深度学习模型中,线性函数几乎不被用到。因为其体现不出深度学习模型的价值,如假定深度学习模型有 m 层,则最终的输出为 y=kmkm1...k1x ,其等价于单层的线性模型 y=kx k=kmkm1...k1 )的输出。

斜坡函数

斜坡函数的定义如下所示:

y=F(x)=r,x,r,xr|x|<rxr

r r 分别是处理单元的最大值和最小值,称为饱和值,一般 |r|=1

深度学习常用激活函数_第3张图片

阶跃函数

阶跃函数属于硬限幅函数的一种:

y=F(x)={1,0,x>0x0

深度学习常用激活函数_第4张图片

符号函数

符号函数也是属于硬限幅函数的一种,其是根据输入变量的正负情况决定输出,若输入变量为正,则输出1;若输入变量为负,则输出-1;输入变量为0时可为1或-1:

y=F(x)={1,1,x>0x0

深度学习常用激活函数_第5张图片
注:硬限幅函数虽说简单直观,但在深度学习中,很多时候将其应用在隐藏层意义不大,还会适得其反,因此其主要被应用在输出层。

Sigmoid函数

Sigmoid函数为S型函数的一种,函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,并且求导容易(因深度学习在更新参数时,常采用梯度下降法,此时需要对激活函数求导)。但由于其软饱和性,当 |x|1 时, y 趋于0或1,导致其导数无限趋于0,容易产生梯度消失,此时会使训练出现问题。并且其输出并不是以0为中心的。

y=F(x)=11+ex.

深度学习常用激活函数_第6张图片
注: Sigmoid函数的导数为 F(x)=F(x)(1F(x))

双曲正切函数

双曲正切函数(tanh函数)也是S型函数的一种,Sigmoid函数存在的问题它基本上也都存在,不过相对于Sigmoid函数,它是原点对称的。而且在0周围,曲线变化趋势更陡,因此在训练过程中,权重每次更新的步长更大,能够更快地收敛到最优值(也可能是局部最优)。并且当 s=0 时有 y=0 ,即同时具有双级输出。当要求输出(-1 1)范围的信号时,它常被采用。

y=F(x)=exexex+ex.

深度学习常用激活函数_第7张图片
注: tanh函数的导数为 F(x)=(1F(x))2

Softplus函数

Softplus被定义为:

y=F(x)=log(1+ex).

深度学习常用激活函数_第8张图片

Softsign函数

Softsign函数被被定义为:

y=F(x)=x1+|x|.

深度学习常用激活函数_第9张图片

Relu函数及其变形

ReLU是最近几年非常受欢迎的激活函数。虽说Sigmoid和tanh效果不错,但是很容易出现梯度消失现象–当输入 |x| 较大时,梯度变得非常小,从而导致SGD收敛速度下降或者无法收敛。ReLU函数被定义为:

y=F(x)=max{0,x}.

深度学习常用激活函数_第10张图片
不过ReLU也不是十全十美的,观察其定义便可以发现在 x>0 时,梯度恒为1,可以保证稳定的下降速度;可当 x0 时,梯度却恒为0。虽说这样的特性能强化神经网络的稀疏表达能力,但随着训练的进行,可能会出现神经元不可逆转的死亡,权重从此以后便无法更新。

为了缓解上面的问题,ReLU的变形LReLU、PReLU与RReLU应运而生。其基本思想均是,当 x0 时不再是恒为0输出,而是为其乘上一个比较小的系数 α ,因此激活函数的定义变成:

y=F(x)=max{αx,x}.

在LReLU中, α 固定为非常小的值。 α 的引入虽说可以避免梯度消失问题,但如何选择合适的 α 也是一件非常头疼的事情。通常都是通过先验知识人工赋值的。但有人观察到,损失函数对 α 的导数是可以求得的,因此可以将它作为一个参数进行训练,如同用梯度下降法训练各个层之间的权重。于是自适应PReLU方法被提出。

深度学习常用激活函数_第11张图片
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层就如下所示:

深度学习常用激活函数_第12张图片
上面左图显示的是传统的激活策略,采用Maxout的时候,会发现参数个数成 k 倍增加。因为本来在第 i 层到第 i+1 层,单个输出神经元只对应一组参数,但现在却需要对此神经元同时训练 k 组参数,然后选择激活值最大的作为激活值。也有人在看到“隐隐层”的输入-输出映射关系时,会疑惑Maxout似乎等价于线性激活函数,其实不然,因为在激发函数中有了max操作,所以整个Maxout网络其实是一种非线性的变换。

Maxout的拟合能力是非常强的,已有证明表明两层Maxout可以拟合任意的的凸函数。其实这块很好理解,首先是任意的凸函数都可以由分段线性函数以任意精度拟合,而Maxout又是取 k 个隐隐含层节点的最大值,这些”隐隐含层”节点也是线性的,所以Maxout激活函数并不是一个固定的函数,它是一个分段线性函数。

简单总结一下

其实激活函数的主要作用就是将输入进行线性或非线性映射,对于其范围没有限制,上面介绍的只是一些常见的,其他的如 sinx arctanx 等也都可以。为什么在训练深度学习模型时常用ReLU、Sigmoid、tanh等函数,主要是在深度学习训练过程中,不宜使用过度复杂的函数,因为在参数优化时会增加求导及计算成本。

具体哪种激活函数最优?目前还不存在定论。一般需要综合考虑各个激活函数的优缺点,再结合自己的实际情况选择到底使用哪个。并且在一个模型中,不同层可以选定不同的激活函数,如第一层选用ReLU函数、第二次选用Sigmoid函数、……、输出层选用线性函数。

参考资料

  1. http://blog.csdn.net/hjimce/article/details/50414467 深度学习(二十三)Maxout网络学习
  2. http://www.cnblogs.com/rgvb178/p/6055213.html 浅谈深度学习中的激活函数
  3. https://item.jd.com/12128543.html 《深度学习》[美] Ian,Goodfellow,[加] Yoshua,Bengio,[加] Aaron Courville著

你可能感兴趣的:(深度学习)