激活函数在深度学习中扮演着非常重要的角色,它给网络赋予了非线性,从而使得神经网络能够拟合任意复杂的函数。

非线性激活函数可以使神经网络随意逼近复杂函数。没有激活函数带来的非线性,多层神经网络和单层无异。

目前,深度学习中最流行的激活函数为 relu, 但也有些新推出的激活函数,例如 swish、GELU 据称效果优于relu激活函数。

  • tf.keras.activations.sigmoid
    将实数压缩到0到1之间,一般只在二分类的最后输出层使用。主要缺陷为存在梯度消失问题,计算复杂度高,输出不以0为中心。Sigmoid的函数和导数如下:

softmax激活函数多分类用法 各种激活函数的优缺点_激活函数


Sigmoid 函数的三个主要缺陷:

梯度消失:当我们向这个 sigmoid 函数输入一个很大的 x 值(正或负)时,Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢,该问题叫作梯度消失。如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。

不以零为中心:Sigmoid 输出不以零为中心的。激活函数的输出不以零为中心会导致神经网络收敛较慢

softmax激活函数多分类用法 各种激活函数的优缺点_神经网络_02


模型的最优解即是模型参数的最优解。通过逐轮迭代,模型参数会被更新到接近其最优解。这一过程中,迭代轮次多,则我们说模型收敛速度慢;反之,迭代轮次少,则我们说模型收敛速度快。

softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_03


softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_04


softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_05

因此,参数的更新步骤变为:

softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_06


参数更新方向由x的符号确定,Sigmoid 函数输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数,x恒大于零。当前所有参数更新方向一样,此时模型为了收敛,不得不走 Z 字形逼近最优解,这样才能保持同时增减,以两个参数为例:

softmax激活函数多分类用法 各种激活函数的优缺点_激活函数_07


我们希望 w0 适当增大,但希望 w1 适当减小,最终达到最优解为w0和w1,由于参数更新由输入值决定,故两个输入x符号相反才能保证w0 适当增大w1 适当减小,但sigmoid函数值输出一直正值,故只能走锯齿状,锯齿状并不是垂直方向或水平方向,而是使得w的两个分量同时增加或减少的方向。模型参数走绿色箭头能够最快收敛,但由于输入值的符号总是为正,所以模型参数可能走类似红色折线的箭头。如此一来,使用 Sigmoid 函数作为激活函数的神经网络,收敛速度就会慢上不少了。

计算复杂度高:exp() 函数与其他非线性激活函数相比,计算成本高昂。有指数计算,成本昂贵

  • tf.keras.activations.softmax

sigmoid的多分类扩展,一般只在多分类问题的最后输出层使用。

  • tf.nn.tanh

tanh(x) = sinh(x)/cosh(x) = ((exp(x) - exp(-x))/(exp(x) + exp(-x))),将实数压缩到-1到1之间,输出期望为0。主要缺陷为存在梯度消失问题,计算复杂度高。

softmax激活函数多分类用法 各种激活函数的优缺点_神经网络_08


Tanh 激活函数又叫作双曲正切激活函数(hyperbolic tangent activation function)。与 Sigmoid 函数类似,与 Sigmoid 不同,Tanh 函数的输出以零为中心,因为区间在-1 到 1 之间。在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值。唯一的缺点是:Tanh 函数也会有梯度消失的问题,因此在饱和时也会「杀死」梯度。

  • tf.keras.activations.relu

修正线性单元,最流行的激活函数,一般隐藏层使用。主要缺陷是:输出不以0为中心,输入小于0时存在梯度消失问题(死亡relu,alpha=0)。

softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_09


ReLU函数其实就是一个取最大值函数,当输入 x<0 时,输出为 0,当 x> 0 时,输出为 x。该激活函数使网络更快速地收敛。它不会饱和,即它可以对抗梯度消失问题,至少在正区域(x> 0 时)可以这样,因此神经元至少在一半区域中不会把所有零进行反向传播。由于使用了简单的阈值化(thresholding),ReLU 计算效率很高。

• 解决了gradient vanishing问题 (在正区间)

• 计算速度非常快,只需要判断输入是否大于0

• 收敛速度远快于sigmoid和tanh

ReLU也有几个需要特别注意的问题:

  1. ReLU的输出不是zero-centered
  2. Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。如果 x < 0,则神经元保持非激活状态,且在后向传导(backward pass)中「杀死」梯度。这样权重无法得到更新,网络无法学习。当 x = 0 时,该点的梯度未定义,但是这个问题在实现中得到了解决,通过采用左侧或右侧的梯度的方式。

为了解决 ReLU 激活函数中的梯度消失问题,当 x < 0 时,我们使用 Leaky ReLU,该函数试图修复 dead ReLU 问题。

  • tf.keras.activations.leaky_relu

对修正线性单元的改进,解决了死亡relu问题。

softmax激活函数多分类用法 各种激活函数的优缺点_softmax激活函数多分类用法_10


当 x < 0 时,它得到 0.1 的正梯度。该函数一定程度上缓解了 dead ReLU 问题,但是使用该函数的结果并不连贯。尽管它具备 ReLU 激活函数的所有特征,如计算高效、快速收敛、在正区域内不会饱和。

Leaky ReLU 可以得到更多扩展。不让 x 乘常数项,而是让 x 乘超参数,这看起来比 Leaky ReLU 效果要好。该扩展就是 Parametric ReLU。

softmax激活函数多分类用法 各种激活函数的优缺点_神经网络_11

  • tf.keras.activations.elu

指数线性单元,对relu的改进,能够缓解死亡relu问题。

softmax激活函数多分类用法 各种激活函数的优缺点_归一化_12


softmax激活函数多分类用法 各种激活函数的优缺点_神经网络_13

  • tf.keras.activations.selu
    扩展型指数线性单元。在权重用tf.keras.initializers.lecun_normal初始化前提下能够对神经网络进行自归一化。当实际应用这个激活函数时,必须使用 lecun_normal 进行权重初始化。如果希望应用 dropout,则应当使用AlphaDropout。
    归一化首先减去均值,然后除以标准差。经过归一化之后,网络的组件(权重、偏置和激活)的均值为 0,标准差为 1,这正是 SELU 激活函数的输出值。在初始化函数为 lecun_normal 的假设下,网络参数会被初始化一个正态分布(或高斯分布),然后在 SELU 的情况下,网络会在论文中描述的范围内完全地归一化。本质上看,当乘或加这样的网络分量时,网络仍被视为符合高斯分布。我们就称之为归一化。反过来,这又意味着整个网络及其最后一层的输出也是归一化的。内部归一化的速度比外部归一化快,这意味着网络能更快收敛;不可能出现梯度消失或爆炸问题
  • tf.keras.activations.swish

自门控激活函数。谷歌出品,相关研究指出用swish替代relu将获得轻微效果提升

softmax激活函数多分类用法 各种激活函数的优缺点_归一化_14

  • tf.keras.activations.gelu
    高斯误差线性单元激活函数。在Transformer中表现最好,在tf-nightly包中,能避免梯度消失问题