激活函数 activation function

激活函数 activation function

激活函数的角色是引入非线性(non-linearity),否则不管网络有多深,整个网络都可以直接替换为一个相应的仿射变换(affine transformation),即线性变换(linear transformation),比如旋转、伸缩、偏斜、平移(translation)。

例如,在二维特征空间上,蓝线表示负面情形 y = 0 y=0 ,绿线表示正面情形 y = 1 y=1

如果不使用激活函数,神经网络最好的分类效果如下:

在仿射变换的结果上应用激活函数,可以对特征空间进行扭曲翻转,最后得到一条线性可分的边界。运转中的sigmoid激活函数:

在同一个网络中混合使用不同类型的神经元是非常少见的,虽然没有什么根本性问题来禁止这样做。

Sigmoid

sigmoid 非线性函数的数学公式是:
f ( x ) = 1 1 + e x f(x)=\frac{1}{1+e^{-x}}

函数图像如上图所示,它将输入的值“挤压”到 [ 0 , 1 ] [0,1] 范围内,很大的负数变成0,很大的正数变成1。

在历史上,sigmoid 函数非常常用,这是因为它对于神经元的激活频率有良好的解释:从完全不激活(0)到在求和后的最大频率处的完全饱和(saturated)的激活(1)。

然而现在sigmoid函数已经很少使用了,这是因为它有两个主要缺点:

  • Sigmoid函数饱和使梯度消失:

    sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。在反向传播的时候,这个(局部)梯度将会与整个损失函数关于该门单元输出的梯度相乘。因此,如果局部梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,几乎就有没有信号通过神经元传到权重再到数据了。

    同时,为了防止饱和,必须对于权重矩阵初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习了。

  • Sigmoid函数的输出不是零中心的:

    这个性质并不是我们想要的,因为在神经网络后面层中的神经元得到的数据将不是零中心的,这一情况将影响梯度下降的运作,因为如果输入神经元的数据总是正数(比如在 f = w T x + b f=w^Tx+b 中每个元素都 x > 0 x>0 ),那么关于 w w 的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数(具体依整个表达式f而定)。这将会导致梯度下降权重更新时出现 Z Z 字型的下降。

    然而,由于整个批量的数据的梯度被加起来后,对于权重的最终更新将会有不同的正负,这样就从一定程度上减轻了这个问题。因此,该问题相对于上面的神经元饱和问题来说只是个小麻烦,没有那么严重。

激活变换效果:

Tanh

tanh神经元是一个简单放大的sigmoid神经元。

tanh非线性函数的数学公式是 t a n h ( x ) = 2 σ ( 2 x ) 1 tanh(x)=2\sigma(2x)-1 ,图像如上图所示。它将实数值压缩到 [ 1 , 1 ] [-1,1] 之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。

ReLU

ReLU(校正线性单元:Rectified Linear Unit)激活函数,当 x = 0 x=0 时函数值为0。当 x > 0 x>0 函数的斜率为1。使用 ReLU 比使用 tanh 的收敛快6倍。

在近些年ReLU变得非常流行,它的函数公式是 f ( x ) = m a x ( 0 , x ) f(x)=max(0,x)

ReLU的优点:

  • sigmoid 和 tanh 神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。

  • 相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用,据称这是由它的线性,非饱和的公式导致的。

ReLU的缺点:

  • 在训练的时候,当一个很大的梯度流过 ReLU 的神经元的时候,可能会导致梯度更新到一种特别的状态,从此,所有流过这个神经元的梯度将都变成0,导致数据多样化的丢失。

  • 如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/84759216
今日推荐