深度神经网络及TensorFlow实现1-激活函数(Activation Function)


1、线性模型

先看个TensorFlow游乐场的例子,来验证线性模型的局限性。

以判断零件是否合格为例,输入为x1x2,其中x1代表一个零件质量和平均质量的差,x2代表一个零件长度和平均长度的差。假设一个零件的质量和长度离平均质量和长度越近,那么这个零件越有可能合格。于是训练数据有可能服从下图所示分布。

这里写图片描述

上图蓝色代表合格零件,黄色代表不合格零件。


1
下图显示了使用TensorFlow游乐场训练线性模型解决这个问题的效果。
网址:
http://playground.tensorflow.org/#activation=tanh&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=0&noise=0&networkShape=4,2&seed=0.21266&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&hideText=false
这里写图片描述
说明线性模型无法解决此类问题。


2
接着看下图
这里写图片描述
上图说明在线性可分问题中,线性模型能很好区分不同颜色的点。线性模型能解决线性可分问题。


3
但在显示世界中,绝大部分的问题都是无法线性分割的。如果将激活函数换成非线性的,那么可以得到如下效果。
这里写图片描述
从上图可以看出,当加入非线性元素之后,神经网络模型就可以很好区分不同颜色的点了。


2、浅谈深度学习中的激活函数

如果我们将每一个神经网络中的节点的输出通过一个非线性函数,那么整个神经网络的模型就不再是线性的了。这个非线性函数就是激活函数。

在ICML2016的一篇论文Noisy Activation Functions中,作者将激活函数定义为一个几乎处处可微的 h : R → R 。
这里写图片描述
在实际应用中,我们还会涉及到以下的一些概念:

a.饱和
当一个激活函数h(x)满足
limn+h(x)=0
时我们称之为右饱和。

当一个激活函数h(x)满足
limnh(x)=0
时我们称之为左饱和。当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。

b.硬饱和与软饱和
对任意的x,如果存在常数c,当x>c时恒有 h′(x)=0则称其为右硬饱和,当x < c时恒有h′(x)=0则称其为左硬饱和。

若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和。但如果只有在极限状态下偏导数等于0的函数,称之为软饱和。

1.Sigmoid函数

维基:https://en.wikipedia.org/wiki/Sigmoid_function
Sigmoid函数曾被广泛地应用,但由于其自身的一些缺陷,现在很少被使用了。Sigmoid函数被定义为:
f(x)=11+ex
函数对应的图像是:
这里写图片描述

优点:
1.Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。
2.求导容易。

缺点:
1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。
2.其输出并不是以0为中心的。

2.tanh函数

现在,比起Sigmoid函数我们通常更倾向于tanh函数。tanh函数被定义为

tanh(x)=1e2x1+e2x

函数位于[-1, 1]区间上,对应的图像是:
这里写图片描述
优点:
1.比Sigmoid函数收敛速度更快。
2.相比Sigmoid函数,其输出以0为中心。
缺点:
还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。

3.ReLU

ReLU是最近几年非常受欢迎的激活函数。被定义为
y={0(x0)x(x0)

对应的图像是:
这里写图片描述
但是除了ReLU本身的之外,TensorFlow还提供了一些相关的函数,比如定义为min(max(features, 0), 6)的tf.nn.relu6(features, name=None);或是CReLU,即tf.nn.crelu(features, name=None)。其中(CReLU部分可以参考这篇论文)。
优点:
1.相比起Sigmoid和tanh,ReLU(e.g. a factor of 6 in Krizhevsky et al.)在SGD中能够快速收敛。例如在下图的实验中,在一个四层的卷积神经网络中,实线代表了ReLU,虚线代表了tanh,ReLU比起tanh更快地到达了错误率0.25处。据称,这是因为它线性、非饱和的形式。
这里写图片描述

2.Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
3.有效缓解了梯度消失的问题。
4.在没有无监督预训练的时候也能有较好的表现。
这里写图片描述
5.提供了神经网络的稀疏表达能力。

缺点:
随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

LReLU、PReLU与RReLU

这里写图片描述
通常在LReLU和PReLU中,我们定义一个激活函数为
f(yi)={yi(yi>0)aiyi(yi0)
-LReLU
ai比较小而且固定的时候,我们称之为LReLU。LReLU最初的目的是为了避免梯度消失。但在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的a,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU。

-PReLU
PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。
这里写图片描述

在论文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification中,作者就对比了PReLU和ReLU在ImageNet model A的训练效果。
值得一提的是,在tflearn中有现成的LReLU和PReLU可以直接用。

-RReLU
在RReLU中,我们有

f(yji)={xji(xji>0)ajixji(xji0)

ajiU(l,u),l<u   and   l,u[0,1)
其中,aji是一个保持在给定范围内取样的随机变量,在测试中是固定的。RReLU在一定程度上能起到正则效果。
这里写图片描述
在论文Empirical Evaluation of Rectified Activations in Convolution Network中,作者对比了RReLU、LReLU、PReLU、ReLU 在CIFAR-10、CIFAR-100、NDSB网络中的效果。

ELU

ELU被定义为

f(x)={a(ex1)x(x<0)(0x)

其中a>0。
这里写图片描述
优点:
1.ELU减少了正常梯度与单位自然梯度之间的差距,从而加快了学习。
2.在负的限制条件下能够更有鲁棒性。

ELU相关部分可以参考这篇论文

Softplus与Softsign

Softplus被定义为
f(x)=log(ex+1)
Softsign被定义为
f(x)=x|x|+1

目前使用的比较少,在这里就不详细讨论了。TensorFlow里也有现成的可供使用。激活函数相关TensorFlow的官方文档
总结
关于激活函数的选取,目前还不存在定论,实践过程中更多还是需要结合实际情况,考虑不同激活函数的优缺点综合使用。同时,也期待越来越多的新想法,改进目前存在的不足。

参考:
CS231n Convolutional Neural Networks for Visual Recognition
Quora - What is the role of the activation function in a neural network?
深度学习中的激活函数导引
Noisy Activation Functions-ICML2016
浅谈深度学习中的激活函数 - The Activation Function in Deep
[TensorFlow 学习笔记-06]激活函数(Activation Function)

3.TensorFlow激活函数使用

激活函数activation function 运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经网络。神经网络之所以能解决非线性问题(入语音、图像识别),本质上就是激活函数加入了非线性因素,弥补了线性模型的表达力,把“激活的神经元的特征”通过函数保留并映射到下一层。
因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的。
激活函数不会更改输入数据的维度,也就是输入和输出的维度是相同的。TensorFlow中有如下激活函数,这里包括平滑的非线性的激活函数,如sigmoid、tanh、elu、softplus、softsign,也包括连续但不是处处可微的函数relu、relu6、crelu、relu_x,以及随机正则化函数dropout:

tf.nn.relu()
tf.nn.sigmoid()
tf.nn.tanh()
tf.nn.elu()
tf.nn.bias_add()
tf.nn.crelu()
tf.nn.relu6()
tf.nn.softplus()
tf.nn.softsign()
tf.nn.dropout()
tf.nn.relu_layer(x, weights, biases,name=None)
def relu_layer(x, weights, biases, name=None):
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告