神经网络强大的表示能力应该归功于网络模型中的激活函数,深度学习中,很多数学形式其实都是光滑逼近的结果。比如激活函数,sigmoid、swish、gelu、softplus,这里从光滑近似的角度统一理解激活函数。

更新:Transformer使用的激活函数GELU。

关于激活函数

神经网络中激活函数的作用:

  • 输出层,获得概率意义
  • 中间层,产生非线性
  • 门机制,如LSTM,信息筛选

激活函数作为输出层,获得概率意义;作为中间层,产生非线性,这些接下来会谈到。这里简单说说作为门机制的激活函数,比如以下网络模型,

称为Gated Linear Units (GLU),这里激活函数$\sigma(x)$​起到门控的作用。整体上看是一种swish形式的门机制。

激活函数的设计关注如下几点:

  • 非线性,产生非线性
  • 光滑性,以便求梯度
  • 线性区,以便在一定范围内保持输出的均值(0中心)与方差统计特征不漂移
  • 活性范围,关系到下层和输出
  • 非饱和性
  • 计算性能,计算复杂度不能太大

对于第三点,这里展开说说。所谓的线性区是要求激活函数在自变量$x$​取值一定范围内,满足

这样,输入$x$和输出$x’$​的均值与方差统计特征的变化不大,以保证网络学习的稳定。

关于次梯度,例如RELU激活函数在$x=0$​处不可导,那么是不是对于深度学习模型来说就无法进行误差逆向传播优化?

事实上,在工程上,有一种叫做次梯度的解决方案。就以RELU函数为例,当$x \gt 0$时,梯度为1,当$x \lt 0$时梯度为0。而0这个位置不存在梯度,而次梯度即选择$[0, 1]$区间中的任意值。在实现时,一般会选择一个区间内的固定值。

逼近0-1函数

Heaviside step函数,

在深度学习中其意义是,如果logit取值为负半轴,则把类别判别为负类(0),如果取值为正半轴,则把类别判别为正类(+1)。另外,从生物学上看,$H(x)$可以直接描述神经元的激活或非激活状态,或者说是一个开关,要么开,要么关。但是$H(x)$并不光滑,对于模型训练来说,寻找其光滑逼近版本相当重要。

这个取值可以改为$1,-1$​,即,

这个函数不可导,模型优化困难。考虑到

如果规定$H(0) = \frac{1}{2}$,那么有$H(x) = \frac{1}{2}[1 + \operatorname{sign}(x)]$。​

当$x \ne 0$时,$H(x)$可以用$|x|$表示,

根据$H(x)$​的分段特性可以为均匀分布的概率密度函数提供紧凑的表达形式,如下

$H(x)$​​本身难计算梯度,其梯度是一个非常特殊的函数狄拉克函数$\delta(x)$​,

为此,应用于深度学习需要其光滑版本。以sigmoid为首的很多激活函数就是逼近$H(x)$的光滑版本。

sigmoid

对$H(x)$​函数的逼近是寻找一个S型函数且区间在$(0, 1)$或$(-1, 1)$,最常见的是$\sigma(x)$函数,

Sigmoid函数导出的另外一个角度中我们知道,$\sigma(x)$函数来说$\max(x)$的光滑逼近$ \ln(1 + e^x)$的梯度,

可以用$\tanh(x)$来表示,

这两个激活函数都存在当$x$很大时梯度饱和,即接近0。

tanh

注意到,$\tanh (x)$可以用$\sigma(x)$表示

是$\sigma(x)$​的一个仿射变换,因此还是S型函数,不过取值区间变为$(-1, 1)$。

$\tanh(x)$与$\sigma(x)$的梯度与自身相关,即:

这个性质很有用,可以复用已有的计算结果。

softsign

softsign激活函数为,

该激活函数来自$\operatorname{sign}(x)$的近似,

softsign激活函数可以推广开来,

按照类似的思路,有,

激活函数用S型函数逼近0-1阶跃函数的好处是在$x$较小时,有

例如$\tanh(x) \approx x$,这样通过激活函数输出后,均值和方差大致保存不变,这样便于模型的训练和优化。

逼近RELU函数

RELU函数,

从神经元的角度看,RELU激活函数描述两种状态:

  • 非激活状态,即负半轴
  • 激活状态的激活程度,即正半轴,且不具有饱和性

用一句话来说就是单边抑制宽兴奋边界,这是有生物学合理性。但是从数学角度看,RELU的定义非光滑,不利于优化。

RELU激活函数的图形呈现无上界有下界,但有一个严重的问题,即死区,当网络输出值在负半轴时,非激活状态一直延续到后层。解决方案有:

  • 平滑RELU,平滑$H(x)$或平滑整体$x \times H(x)$,也就是寻找$\max(0, x)$的光滑版本,如果是前者,则寻找一个S型函数逼近即可。
  • 分段化RELU,使其负半轴取值不为0

简而言之,如果找到$H(x)$的光滑逼近函数,那么也就找到$\operatorname{relu}(x)$的光滑逼近;如果找到$\max(0, x)$的光滑逼近,那么也找到$\operatorname{relu}(x)$​​的光滑。

RELU改进应该满足一下几点:

  • 平滑RELU的函数应该连续可导
  • 平滑RELU的函数负半轴应该非单调,以便增加非线性
  • 平滑RELU的函数,在$x$​较小时,$R_s(x) \approx x$

RELU改进方案:

  • Noisy ReLU
  • Softplus
  • ELU
  • SELU
  • GELU

下面我们来谈谈它们的设计思路。

Noisy ReLU

考虑添加噪声

这个激活函数的出发点是增加鲁棒性。

ELU & SELU

改变RELU死区问题的一个思路是分段化,负半轴通过一定技巧避免其取值为0,常见有ELU函数,

其中 $\alpha \ge 0$​ 。

SELU函数,

其中$\lambda=1.0507,\alpha=1.67326$​​ ,这两个参数用来微调ELU激活函数。SELU激活函数来自论文Self-Normalizing Neural Networks。论文提到该激活函数不使用Normalization手段能够自动归一化。

Softplus

Softplus函数为,

我们都知道Logsumexp是max的光滑近似,

因此取$n=2, x_1 = x, x_2 = 0, \alpha=1$​有,

因为是 RELU 的光滑化版本,故称为 SmoothReLU。这里Logsumexp可以认为是Softplus的推广。

此外,还有积分思路,

取$k=\frac{1}{2}$​得Softplus函数。Softplus激活函数是单调的,负半轴无法提供更多的非线性功能。

Swish

过去的一篇文章Google的激活函数Swish是怎么设计出来的?也分析过Swish的导出,可参看。Swish函数为,

$\sigma(x)$可以看做是一个门,控制$x$​​的输出。易知,

然后注意到Heaviside step函数$H(x)$可以用$\tanh(x)$逼近,即,

我们取$k=\frac{1}{2}$​,有基于$H(x)$​光滑逼近的$\operatorname{relu}(x) $​近似,

Mish

后面的文章更新了Mish激活函数的分析,见Mish激活函数的设计思路

GELU

GELU,全称为Gaussian Error Linear Unit,也算是RELU的变种。对比一下和RELU的区别,

首先我们知道误差函数$\operatorname{erf}(x)$,

是一个像logistics函数图像一样的函数,易证$\operatorname{erf}(\frac{x}{\sqrt{2}}) \in (-1, 1)$​​,函数图像如下,

可以变换到$(0, 1)$​​区间,即$\frac{1}{2} \Big[ 1 + \operatorname{erf}(\frac{x}{\sqrt{2}}) \Big]$​​,是$H(x)$的光滑近似。有趣的是,标准正态分布的累积分布函数可以用$\operatorname{erf}(x)$​​表示,

GELU可以由标准正态分布的累积分布函数表示,

因此有,

由于$\frac{1}{2} \Big[ 1 + \operatorname{erf}(\frac{x}{\sqrt{2}}) \Big]$​,是$H(x)$​​的光滑近似,于是有,

论文Gaussian Error Linear Units (GELUs)中还有如下结论近似$\operatorname{GELU}(x)$,

测试该函数可以用scipy.special.erf,有些框架并没有提供该函数则会使用近似。也就有,

其实该近似挺符合我们的数学直觉,$\operatorname{erf}(\frac{x}{\sqrt{2}})$本身是S型函数,$\tanh(x)$也是S型函数,因此,

形式的函数也是S型函数,通过$a,b$参数控制S形状可以逼近$\operatorname{erf}(\frac{x}{\sqrt{2}})$​​。

自行构造

光滑近似的构造是相当灵活的,可以自行构造。例如根据

有,

于是relu激活函数有近似,

这里$\alpha \to 0$取等号,实践中可以取$\alpha = 0.01$​。​

类似地,考虑$|x| \approx \sqrt{x^2 + \alpha}$,有​

其中$\alpha$​是一个可以小的数,如$\alpha = 0.1$​​。可视化图像如下,

考虑到$\operatorname{relu}(x) = x \times H(x)$,只要找到$H(x)$的光滑近似,自然就有$\operatorname{relu}(x)$的光滑近似。因此,也有,

诸如此类,等等。

补充:更多自行设计激活函数的思路可看最新文章天马行空:设计自己的激活函数

总结

本文从光滑近似的角度统一理解激活函数。函数光滑近似能够创造更多的性能优良的激活函数。

sigmoid类激活函数的本质是平滑$H(x)$,relu类函数的本质是平滑$\operatorname{relu}(x) = x \times H(x)$。​

对$\operatorname{relu}(x) = \max(0, x) = x \times H(x)$​的光滑近似能够创造更多的激活函数,光滑近似思路有两种,平滑$H(x)$​或平滑整体$x \times H(x)$​​,如果是前者,则寻找一个S型函数逼近即可,不同的逼近方式获得不同的激活函数。

转载请包括本文地址:https://allenwind.github.io/blog/10705
更多文章请参考:https://allenwind.github.io/blog/archives/