TensorFlow神经网络中的激活函数

激活函数是人工神经网络的一个极其重要的特征。它决定一个神经元是否应该被激活,激活表明神经元接收的信息与给定的信息有关。html

0fdecb5364e140738f05324691e72c88

激活函数对输入信息进行非线性变换。 而后将变换后的输出信息做为输入信息传给下一层神经元。算法

激活函数的做用网络

当咱们不用激活函数时,权重和误差只会进行线性变换。线性方程很简单,但解决复杂问题的能力有限。没有激活函数的神经网络实质上只是一个线性回归模型。激活函数对输入进行非线性变换,使其可以学习和执行更复杂的任务。咱们但愿咱们的神经网络可以处理复杂任务,如语言翻译和图像分类等。线性变换永远没法执行这样的任务。架构

激活函数使反向传播成为可能,由于激活函数的偏差梯度能够用来调整权重和误差。若是没有可微的非线性函数,这就不可能实现。机器学习

总之,激活函数的做用是可以给神经网络加入一些非线性因素,使得神经网络能够更好地解决较为复杂的问题。函数

在最新版本的TensorFlow 1.4.0(https://www.tensorflow.org/)中包含的激活函数:sigmoidsoftmax,relu,elu,selu,softplus,softsign,tanh,hard_sigmoid,linear,serialize,deserialize等,具体介绍以下:学习

Sigmoid函数以下:做用是计算 x 的 sigmoid 函数。具体计算公式为 y=1/(1+exp(−x)),将值映射到[0.0 , 1.0]区间翻译

    当输入值较大时,sigmoid将返回一个接近于1.0的值,而当输入值较小时,返回值将接近于0.0.htm

   优势:在于对在真实输出位于[0.0,1.0]的样本上训练的神经网络,sigmoid函数可将输出保持在[0.0,1.0]内的能力很是有用.blog

   缺点:在于当输出接近于饱和或者剧烈变化是,对输出返回的这种缩减会带来一些不利影响.

   当输入为0时,sigmoid函数的输出为0.5,即sigmoid函数值域的中间点

函数图像以下所示:

image

softmax函数也是一种sigmoid函数,但它在处理分类问题时很方便。sigmoid函数只能处理两个类。当咱们想要处理多个类时,该怎么办呢?只对单类进行“是”或“不是”的分类方式将不会有任何帮助。softmax函数将压缩每一个类在0到1之间,并除以输出总和。它实际上能够表示某个类的输入几率。

好比,咱们输入[1.2,0.9,0.75],当应用softmax函数时,获得[0.42,0.31,0.27]。如今能够用这些值来表示每一个类的几率。

softmax函数最好在分类器的输出层使用。

其定义为:

image


tanh函数以下:将值映射到[-1,1]区间

image

tanh与sigmoid很是接近,且与后者具备相似的优缺点, sigmoid和tanh的主要区别在于tanh的值为[-1.0,1.0]

优势在于在一些特定的网络架构中,可以输出负值的能力十分有用.

缺点在于注意tanh值域的中间点为0.0,当网络中的下一层期待输入为负值或者为0.0时,这将引起一系列问题.

1-14062415032MW

Relu(Rectified Linear Units修正线性单元)函数以下:relu函数是目前用的最多也是最受欢迎的激活函数。

relu在x<0时是硬饱和。因为当x>0时一阶导数为1。因此,relu函数在x>0时能够保持梯度不衰减,从而缓解梯度消失问题,还能够更快的去收敛。可是,随着训练的进行,部分输入会落到硬饱和区,致使对应的权重没法更新。咱们称之为“神经元死亡”。

公式和函数图像以下

417f598b58914ed6a46a714c05b79f6f

elu函数relu激活函数的改进版本,解决部分输入会落到硬饱和区,致使对应的权重没法更新的问题。计算激活函数relu,即max(features, 0),全部负数都会归一化为0,因此的正值保留为原值不变

    优势:在于不受”梯度消失”的影响,且取值范围在[0,+oo)

    缺点:在于使用了较大的学习速率时,易受达到饱和的神经元的影响

公式和图像以下:左边缩小方差,右边保持方差;方差总体仍是缩小的,而均值得不到保障。

image

image

selu函数:

    左边缩小方差,右边放大方差,适当选取参数alpha和lambda,使得总体上保持方差与指望。若是选取:

    lambda=1.0506,alpha=1.67326,那么能够验证若是输入的x是服从标准正态分布,那么SELU(x)的指望为0,方差为1.

image

image


softplus函数:能够看做是relu函数的平滑版本,公式和函数图像以下:

image

image


线性函数linear

   咱们看到了step函数的问题,梯度为零,在反向传播过程当中不可能更新权重和误差。此时,咱们能够用线性函数来代替简单的step函数。函数表达式:

f(x)=ax+b,


image

如何选择激活函数?

激活函数好或坏,不能凭感受定论。然而,根据问题的性质,咱们能够为神经网络更快更方便地收敛做出更好的选择。

用于分类器时,Sigmoid函数及其组合一般效果更好。

因为梯度消失问题,有时要避免使用sigmoid和tanh函数。

ReLU函数是一个通用的激活函数,目前在大多数状况下使用。

若是神经网络中出现死神经元,那么PReLU函数就是最好的选择。

请记住,ReLU函数只能在隐藏层中使用。

一点经验:你能够从ReLU函数开始,若是ReLU函数没有提供最优结果,再尝试其余激活函数。

梯度知识补充

在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。好比函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),若是是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。

    那么这个梯度向量求出来有什么意义呢?它的意义从几何意义上讲,就是函数变化增长最快的地方。具体来讲,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增长最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来讲,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度减小最快,也就是更加容易找到函数的最小值。

    

在机器学习算法中,在最小化损失函数时,能够经过梯度降低法来一步步的迭代求解,获得最小化的损失函数,和模型参数值。反过来,若是咱们须要求解损失函数的最大值,这时就须要用梯度上升法来迭代了。

    梯度降低法和梯度上升法是能够互相转化的。好比咱们须要求解损失函数f(θ)的最小值,这时咱们须要用梯度降低法来迭代求解。可是实际上,咱们能够反过来求解损失函数 -f(θ)的最大值,这时梯度上升法就派上用场了。

关于更多梯度降低,梯度上升的信息,参考http://www.javashuo.com/article/p-cnkzgeoo-eg.html

相关文章
相关标签/搜索