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

深度学习常用**函数

常用的**函数有:线性函数、斜坡函数、阶跃函数、符号函数、Sigmoid函数、双曲正切函数、Softplus函数、Softsign函数、Relu函数及其变形、Maxout函数等。

线性函数

线性函数是最简单的**函数:

y=F(x)=kx.

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

深度学习常用**函数

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

斜坡函数

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

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

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

深度学习常用**函数

阶跃函数

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

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

深度学习常用**函数

符号函数

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

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

深度学习常用**函数

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

Sigmoid函数

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

y=F(x)=11+ex.

深度学习常用**函数

注: Sigmoid函数的导数为F(x)=F(x)(1F(x))

双曲正切函数

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

y=F(x)=exexex+ex.

深度学习常用**函数

注: tanh函数的导数为F(x)=(1F(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,可以保证稳定的下降速度;可当x0时,梯度却恒为0。虽说这样的特性能强化神经网络的稀疏表达能力,但随着训练的进行,可能会出现神经元不可逆转的死亡,权重从此以后便无法更新。

为了缓解上面的问题,ReLU的变形LReLU、PReLU与RReLU应运而生。其基本思想均是,当x0时不再是恒为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**函数并不是一个固定的函数,它是一个分段线性函数。

简单总结一下

其实**函数的主要作用就是将输入进行线性或非线性映射,对于其范围没有限制,上面介绍的只是一些常见的,其他的如sinxarctanx等也都可以。为什么在训练深度学习模型时常用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著

相关文章: