计算机系统应用教程网站

网站首页 > 技术文章 正文

神经网络中的激活函数

btikc 2024-09-06 18:07:14 技术文章 13 ℃ 0 评论

1.为什么神经网络需要使用激活函数?

  • 不使用激活函数,神经网络的每一层输出都是上层输入的线性函数,由于线性成分的叠加还是线性成分,无论神经网络有多少层,整个神经网络依然相当于线性回归,输出都是输入的线性组合,并不能拟合非线性假设。
  • 使用激活函数,改变线性规则,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到更多的非线性模型中。
  • 解决反向传播过程中的梯度消失问题,在反向传播的公式中,求取参数的梯度时要反复乘上g'(x)的值。实践中发现,经常乘着乘着值很快趋于0了,导致参数更新幅度太小,收敛过于缓慢,这被称为梯度消失,梯度消失跟激活函数、网络结构等都有关。

2.常用的激活函数

2.1ReLU激活

ReLU是修正线性单元(Rectified Linear Unit)的缩写,指线性整流函数。它的计算公式和曲线如下,

ReLu作为激活函数的优势是它在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。

该函数在正区间导数恒为1,不会导致梯度消失,它的计算非常便捷。在实际应用上,他的表现相当好,神经网络收敛比Sigmoid和tanh快得多,是目前应用最广泛的激活函数

优点:目前最受欢迎的激活函数,在x<0时,硬饱和,在x>0时,导数为1,所以在x>0时保持梯度不衰减,从而可以缓解梯度消失的问题,能更快收敛,并提供神经网络的稀疏表达能力。

缺点:随着训练的进行,在负区间上导数恒为0,不会继续传递梯度,导致无法更新权重,称为‘神经元死亡’。少量节点死亡问题不大,但是大量节点死亡,就会出现拟合效果很差且不能改进的局面(loss一直很大)。应对的方法一般有:

  • 减小学习率,学习率太大,容易让参数更新太猛,导致一些神经元死亡;
  • 改用Leaky ReLU函数,即 max(αx,x),其中α 是一个很小的正数。

2.2Leak ReLU激活


ReLU激活激活的变种,负值信号 传递一点出来,一般用在生成网络(GAN)中。其他的ReLU激活变种还有,基本都是对负值信号做一些处理,这里就不展开介绍了。

2.3Sigmoid激活

sigmoid, 名为S型函数. 它是一类函数,但通常指代standard logistic distribution分布。在Sigmoid函数中,a的值在[0,1]之间,我们可以将其理解为一个阀,就像是人的神经元一样,当我们一个神经元受到的刺激时,我们并不是立刻感觉到,而是当这个刺激值超过了阀值,才会让神经元向上级神经元发出信号。

函数公式和曲线图如下,

求导,

函数曲线图:

优点:在于输出映射在(0,1)范围内,单调连续,适合用作输出层,求导容易;

缺点:一旦输入落入饱和区,一阶导数接近0,就可能产生梯度消失的情况,计算时涉及到指数函数,比较费时。

对于Logistic回归而言,Sigmoid函数用于预测输入属于某一类别的概率,只能用它。但是在神经网络中,使用Sigmoid函数仅仅是作为非线性成分,而且往往它的表现并不好,我们可以考虑使用其他的非线性函数。

2.4 tanh 激活

双曲正切函数tanh的公式如下,

函数图像如下

它实际上是Sigmoid的变形,因为

它避免了Sigmoid输出恒正的缺点,并且扩大了导数值。但它也容易导致梯度消失,且计算较慢。

2.5softplus函数

该函数对relu做了平滑处理,更接近脑神经元的激活模型。

2.6 softmax函数

除了用于二分类还可以用于多分类,将各个神经元的输出映射到(0,1空间)。在目标检测模型的最后一层一般会用到softmax来激活。

2.7 dropout函数

tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)

一个神经元以概率keep_prob决定是否被抑制,如果被抑制,神经元的输出为0,如果不被抑制,该神经元将被放大到原来的1/keep_prob倍,默认情况下,每个神经元是否被抑制是相互独立的。

3.Tensorflow中的激活函数API

TensorFlow提供了多种激活函数,

import tensorflow as tf

tf.sigmoid()
tf.tanh()
tf.nn.relu()
tf.nn.softplus()
tf.nn.softmax()
tf.nn.dropout()
tf.nn.elu()

在CNN中一般使用tf.nn.relu的原因是因为,尽管relu会导致一些信息的损失,但是性能突出。在刚开始设计模型时,都可以采用relu的激活函数。高级用户也可以自己创建自己的激活函数,评价激活函数是否有用的主要因素参看如下几点:

  • 1)该函数是单调的,随着输入的增加增加减小减小,从而利用梯度下降法找到局部极值点成为可能;
  • 2)该函数是可微分的,以保证函数定义域内的任意一点上导数都存在,从而使得梯度下降法能够正常使用来自这类激活函数的输出。

总结:

激活函数用于对某些运算的结果进行平滑或者微分,其目标是为神经网络引入非线性,曲线能够刻画出输入的复杂的变化,更符合现实真实的情况。在实际项目中一般这样来选择激活函数,当输入数据特征相差明显时,用tanh效果很好,当特征相差不明显时用sigmoid效果比较好,sigmoid和tanh作为激活函数需要对输入进行规范化,否则激活后的值进入平坦区,而relu不会出现这种情况,有时也不需要输入规范化,因此85%-90%的神经网络会使用relu函数

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表