logo

激活函数

wangzf / 2023-03-21


目录

隐藏层

激活函数在深度学习中扮演着非常重要的角色,它给神经网络赋予了非线性, 从而使得神经网络能够拟合任意复杂的函数。如果没有激活函数,无论多么复杂的网络, 都等价于单一的线性变换,无法对非线性函数进行拟合。

为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  1. 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。
  2. 激活函数及其导函数要尽可能的简单,有利于提高网络的计算效率。
  3. 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。

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

恒等函数

Linear

线性激活函数是一种简单的线性函数,基本上,输入到输出过程中不经过修改。

σ(x)=x

img

Sigmoid

Sigmoid 型函数是指一类 S 型曲线函数,为两端饱和函数。 常用的 Sigmoid 型函数有 Logistic 函数和 Tanh 函数。

img

Tanh 函数的输出是零中心化(Zero-Centered),而 Logistic 函数的输出恒大于 0。 非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift), 并进一步使得梯度下降的收敛速度变慢。

Logistic

Logistic 型函数将实数压缩到 (0,1) 区间内。一般只在二分类的最后输出层使用。

σ(x)=11+ex

其中:

img

img

Logistic 函数的三个主要缺陷:

  1. 梯度消失 Logistic 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Logistic 的梯度趋近于 0。 神经网络使用 Logistic 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。 这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。 该问题叫作梯度消失。因此,如果一个大型神经网络包含 Logistic 神经元,而其中很多个都处于饱和状态, 那么该网络无法执行反向传播。
  2. 不以零为中心 Logistic 输出不以零为中心的。
  3. 计算成本高昂
    • 指数函数(ex)与其他非线性激活函数相比,计算成本高昂。

Tanh

Tanh(Hyperbolic Tangent)函数,双曲正切函数,也是一种 Sigmoid 型函数。 Tanh 函数可以看作放大并平移的 Logistic 函数,将实数压缩到 [1,1] 区间内, 输出期望为 0,解决了 Logistic 函数中值域期望不为 0 的问题。 在实践中,Tanh 函数的使用优先性高于 Logistic 函数。

σ(x)=exexex+ex

img

img

主要缺陷为:

  1. 有梯度消失的问题,因此在饱和时也会杀死梯度
  2. 计算复杂度高

Hard-Logistic 和 Hard-Tanh

Logistic 函数和 Tanh 函数都是 Sigmoid 型函数,具有饱和性,但是计算开销较大。 因为这两个函数都是在中间(0 附近)近似线性,两端饱和。因此,这两个函数可以通过分段函数来近似

Hard-Logistic 函数如下:

HardLogistic(x)={1,gl(x)1gl,0gl(x)10,gl(x)0=max(min(gl(x),1),0)=max(min(0.25x+0.5,1),0)

其中:

img

Hard-Tanh 函数如下:

HardTanh(x)=max(min(gt,1),1)=max(min(x,1),1)

其中:

ReLU

在神经网络发展的历史上,Sigmoid 激活函数很早就开始使用了, 而在现代神经网络中,默认推荐的是使用 ReLU(Rectified Linear Unit 整流线性单元)函数

ReLU

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

σ(x)={xx00x<0=max{0,x}

img

img

但是 ReLU 神经元也存在一些缺点:

  1. 不以零为中心
    • 和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心
  2. 前向传导(forward pass)过程中,如果 x<0,则神经元保持非激活状态, 且在后向传导(backward pass)中杀死梯度。这样权重无法得到更新, 网络无法学习。当 x=0 时,该点的梯度未定义,但是这个问题在实现中得到了解决, 通过采用左侧或右侧的梯度的方式

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

Leaky ReLU

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

σ(x)=max(0.1x,x)

img

PReLU

Parameteric ReLU

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

σ(x)=max{αx,x}

其中:

这里引入了一个随机的超参数 α,它可以被学习,因为可以对它进行反向传播。 这使神经元能够选择负区域最好的梯度,有了这种能力,它们可以变成 ReLU 或 Leaky ReLU

总之,最好使用 ReLU,但是你可以使用 Leaky ReLU 或 Parametric ReLU 实验一下, 看看它们是否更适合你的问题

ELU

ELU,指数线性单元,是对 ReLU 的改进,能够缓解死亡 ReLU 问题

σ(x)={x,x>0α(ex1)x0

img

SELU

SELU,扩展型指数线性单元,SELU 激活能够对神经网络进行自归一化(self-normalizing)。 在权重用 LeCun Normal 初始化的前提下能够对神经网络进行自归一化。 不可能出现梯度爆炸或者梯度消失问题。需要和 Dropout 的变种 AlphaDropout 一起使用

σ(x)=λ{x,x>0α(ex1),x0

img

优点:

缺点:

GELU

GELU,高斯误差线性单元激活函数,在 Transformer 中表现最好

σ(x)=0.5x(1+tanh(2π(x+0.044715x3)))

img

可以看出,当 x 大于 0 时,输出为 x;但 x=0x=1 的区间除外, 这时曲线更偏向于 y

优点:

  1. 似乎是 NLP 领域的当前最佳,尤其在 Transformer 模型中表现最好
  2. 能避免梯度消失问题

缺点:

Swish

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

σ(x)=x1+ex

img

根据上图,可以观察到在 x 轴的负区域曲线的形状与 ReLU 激活函数不同, 因此,Swish 激活函数的输出可能下降,即使在输入值增大的情况下。大多数激活函数是单调的, 即输入值增大的情况下,输出值不可能下降。而 Swish 函数为 0 时具备单侧有界(one-sided boundedness)的特性, 它是平滑、非单调的。更改一行代码再来查看它的性能,似乎也挺有意思

Softmax

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

σ(a;k)=eaki=1neai

其中:

Softmax 函数针对溢出问题的改进:

σ(a;k)=eak+Cni=1eai+C

输出层

神经网络可以用在分类和回归问题上,不过需要根据情况改变输出层的激活函数。 一般而言,回归问题用恒等函数,分类问题用 Softmax 函数。

恒等函数

σ(x)=x

Softmax

yk=eaki=1neai

其中:

Softmax 函数针对溢出问题的改进形式:

yk=eak+Cni=1eai+C

Sigmoid

在预测概率的输出层中使用

σ(x)=11+ex

其中:

神经元数量

输出层的神经元数量需要根据待解决的问题决定

参考