Activation Functions in Deep Learning.

本文目录:

  1. 激活函数的意义
  2. 激活函数应具有的性质
  3. 一些常用的激活函数

1. 激活函数的意义

(1) 从生物学的角度理解激活函数

早期激活函数的设计受到生物神经网络中神经元的启发,即对神经元进行简单的建模。

大脑中的神经元(neuron)通过树突(dendrites)接收其他神经元的输入信号,在胞体中进行信号的处理,通过轴突(axon)分发信号。当神经元中的信号累积达到一定阈值时产生电脉冲将信号输出,这个阈值称为点火率(firing rate)

激活函数是用来模拟“信号累积达到阈值并产生电脉冲”的过程。 值得一提的是,这种对神经元的建模是coarse的。真实神经元有很多不同的种类;突触是一个复杂的的非线性动态系统,树突进行的是复杂的非线性运算,轴突的输出时刻也很重要。因此近些年来神经网络中神经元的生物可解释性(Biological Plausibility)被逐渐弱化。

(2) 从非线性的角度理解激活函数

在神经网络中,使用激活函数(activation function)能够为网络引入非线性,增强网络的非线性表示能力;当不使用激活函数时(或激活函数为恒等函数 identity function),多层神经网络退化为单层网络:

\[W_2(W_1X+b_1)+b_2\\=W_2W_1X+W_2b_1+b_2\\=(W_2W_1)X+(W_2b_1+b_2)\\=W'x+b'\]

2. 激活函数应具有的性质

激活函数能为神经网络引入非线性,因此理论上任何非线性函数都可以作为激活函数。在选择激活函数时应考虑以下性质:

⚪ 性质1:连续可导

激活函数需要参与反向传播过程,因此需要计算激活函数的导数,这就要求激活函数需要连续可导

例如ReLU族激活函数在$x=0$处不可导。既可以人工指定该点处的梯度;又可以选用形状接近的连续函数进行近似(如softplus替代ReLU, CELU替代ELU)。

更多关于不可导函数的光滑化的相关内容可参考博客

⚪ 性质2:计算量小

激活函数应具有尽可能小的计算量,通常线性运算(如ReLU族)比指数运算(如S型曲线)具有更低的计算量。

通常可以对指数函数进行Taylor展开(如HardSigmoid,HardTanh)降低激活函数的计算复杂度。

⚪ 性质3:没有饱和区

饱和的定义是导数很接近$0$。若激活函数存在饱和区,则会使反向传播的梯度为$0$,从而导致梯度消失(gradient vanishing)现象。

早期的激活函数通常使用S型函数,如Sigmoid,Tanh;这类函数会把输出挤压到一个区域内,导致产生饱和区;这类函数也被称为squashing function

ReLU等无上界、有下界的激活函数,在正半轴没有饱和区,减缓了梯度消失现象;在负半轴则会置零(产生died ReLU现象, 即由于梯度为$0$阻断了反向传播过程)或趋于饱和。

⚪ 性质4:没有偏置偏移

若激活函数的输出不是zero-centered的,会使得后一层神经元的输入产生偏置偏移(bias shift),从而减慢梯度下降的收敛速度。

对于某一层神经元的计算,假设具有两个参数$w_1,w_2$,则$y=\sigma(w_1x_1+w_2x_2+b)$,反向传播时两个参数$w_1,w_2$的梯度为:

\[\nabla_{w_1}L=\frac{\partial L}{\partial {w_1}} = \frac{\partial L}{\partial y} \frac{\partial y}{\partial {w_1}} = \frac{\partial L}{\partial y}\cdot \sigma' \cdot x_1 = \nabla_yL \cdot \sigma' \cdot x_1\] \[\nabla_{w_2}L= \nabla_yL \cdot \sigma' \cdot x_2\]

若上一层的激活函数使得该层神经元的输入值大于$0$,则$\text{sign}(\nabla_{w_1}L)=\text{sign}(\nabla_{w_2}L)$,则梯度只能沿着$w_1,w_2$同时增大或减小的方向进行更新,从而减慢梯度下降的收敛速度。

当激活函数的值域同时包含正和负值的输出,则能够有效缓解偏置偏移现象。

⚪ 性质5:具有生物可解释性

生物神经元通常具有单侧抑制(即大于阈值才会被激活)、宽兴奋边界(即输出范围较宽,如$[0,+∞)$)、稀疏激活(即同时被激活的神经元较少)等特性。

ReLU及之前的激活函数在设计时受到生物学的启发,而其后的激活函数在设计时逐渐淡化了生物可解释性。

⚪ 性质6:提取上下文信息

通常的激活函数是标量函数,如ReLU对神经元输入的每一个标量值分别进行计算。如果能够将激活函数拓展为多输入函数,则能够捕捉输入的上下文信息,增强神经元的表达能力。

某个特征位置的上下文信息既可以从所有输入特征中获取(如maxoutDynamic ReLU),也可以由在该特征的一个邻域上获取(如Dynamic Shift-MaxFReLU)。

⚪ 性质7:具有通用近似性

直观上神经网络每一层的每个神经元都应具有不同的激活曲线。可以设计一些由超参数控制的通用近似激活函数,使得每个神经元学习不同的激活曲线。每个神经元的激活超参数参与反向传播的梯度更新。

设计通用近似的激活函数主要有两种思路。第一种是使用一些通用的函数逼近方法,如分段线性近似(APL, PWLU)、Padé近似(PAU, OPAU)。第二种是寻找现有激活函数的光滑逼近,如手工设计近似(ACON, SMU)、使用Dirac函数寻找光滑近似(SAU)。

3. 一些常用的激活函数

下面介绍的激活函数根据设计思路也可分类如下:

激活函数 表达式 函数图像
Step \(\begin{cases} 1, & x≥0 \\ 0, &x<0 \end{cases}\)
Sigmoid \(\frac{1}{1+e^{-x}}\)
Hardsigmoid:降低Sigmoid计算量 \(\begin{cases} 1, & x≥1 \\ (x+1)/2, & -1<x<1 \\ 0, &x≤-1 \end{cases}\)
Tanh \(2\text{Sigmoid}(2x)-1\\=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}\)
Hardtanh:降低Tanh计算量 \(\begin{cases} 1, & x>1 \\ x, & -1≤x≤1 \\ -1, &x<-1 \end{cases}\)
Softplus:连续形式的ReLU \(\int_{}^{}\text{Sigmoid}(x)dx \\=\ln(1+e^x)\)
ReLU \(\max(x,0) \\=\begin{cases} x, & x≥0 \\ 0, &x<0 \end{cases}\)
ReLU6:部署移动端 \(\min(\max(x,0),6) \\=\begin{cases} 6, & x\geq 6 \\ x, & 0\leq x<6 \\ 0, &x<0 \end{cases}\)
Maxout:分段线性单元 \(\mathop{\max}_{j\in [1,k]}x^TW_{i,j}+b_{ij}\)
LeakyReLU:解决Dead ReLU \(\max(x,0.01x) \\=\begin{cases} x, & x≥0 \\ 0.01x, &x<0 \end{cases}\)
APL:通过ReLU构造分段线性 \(\max(0,x)\\+\sum_{s=1}^{S}a^s\max (0,-x+b^s)\)
PReLU:可学习参数$\alpha$ \(\max(x,\alpha x) \\=\begin{cases} x, & x≥0 \\ \alpha x, &x<0 \end{cases}\)
RReLU:均匀分布采样$\alpha$ \(\max(x,\alpha x) \\=\begin{cases} x, & x≥0 \\ \alpha x, &x<0 \end{cases}\)
ELU:解决bias shift \(\begin{cases}x, & x≥0 \\α(e^x-1), & x<0\end{cases}\)
GELU:引入正则化 \(x\Phi(x)=x\int_{-∞}^{x} \frac{e^{-\frac{t^2}{2}}}{\sqrt{2\pi}}dt \\ = x\cdot \frac{1}{2}(1+\text{erf}(\frac{x}{\sqrt{2}}))\)
CELU:连续可微的ELU \(\begin{cases}x, & x≥0 \\α(e^{\frac{x}{\alpha}}-1), & x<0\end{cases}\)
SELU:自标准化的ELU \(\begin{cases}\lambda x, & x≥0 \\\lambda α(e^x-1), & x<0\end{cases}\)
Swish:自动搜索 \(x\cdot \text{Sigmoid}(\beta x) \\ = \frac{x}{1+e^{-\beta x}}\)
HardSwish:降低Swish计算量 \(x \cdot \frac{\text{ReLU6}(x+3)}{6} \\ = \begin{cases} x , & x \geq 3 \\ \frac{x(x+3)}{6} , & -3 \leq x <3 \\ 0, & x < -3 \end{cases}\)
ELiSH:遗传算法 \(\text{Sigmoid}(x) \cdot \text{ELU}(x) \\= \begin{cases}\frac{x}{1+e^{-x}}, & x≥0 \\\frac{e^x-1}{1+e^{-x}}, & x<0\end{cases}\)
HardELiSH:降低ELiSH计算量 \(\text{HardSigmoid}(x) \cdot \text{ELU}(x) \\= \begin{cases} x, & x≥1 \\ x(x+1)/2, & 0 \leq x<1 \\ (e^x-1)(x+1)/2, & -1\leq x<0 \\ 0, &x≤-1 \end{cases}\)
PAU:Padé近似 \(\frac{a_0+a_1x+a_2x^2+...+a_mx^m}{1+|b_1||x|+|b_2||x|^2+...+|b_n||x|^n}\)
Mish:进一步搜索Swish \(x\cdot \text{tanh}(\text{softplus}(x)) \\ =x\cdot \text{tanh}(\ln(1+e^x))\)
Dynamic ReLU:动态ReLU \(\mathop{\max}_{1\leq k \leq K} \{a_c^k(x)x_c+b_c^k(x)\}\)
Dynamic Shift-Max:循环移位多输入 \(\mathcal{\max}_{1\leq k\leq K} \{\sum_{j=0}^{J-1} a_{i,j}^k(x)x_{\frac{C}{G}}(i,j)\}\)
FReLU:卷积窗口输入 \(\mathcal{\max}_{1\leq k\leq K} \{\sum_{j=0}^{J-1} a_{i,j}^k(x)x_{\frac{C}{G}}(i,j)\}\)
ACON:最大值函数的$\alpha$-softmax近似 \((p_1-p_2)x\sigma(\beta (p_1-p_2)x)+p_2x\)
PWLU:分段线性近似 \(\begin{cases} (x-B_L)*K_L+Y_P^0, & x<B_L \\ (x-B_R)*K_R+Y_P^N, & x\geq B_R \\ (x-B_{idx})*K_{idx}+Y_P^{idx}, & \text{others} \end{cases}\)
OPAU:正交Padé近似 \(\frac{c_0+c_1f_1(x)+c_2f_2(x)+...+c_kf_k(x)}{1+|d_1||f_1(x)|+|d_2||f_2(x)|+...+|d_l||f_l(x)|}\) PAU
SAU: 使用Dirac函数近似 \(\frac{(1-\alpha)\sigma}{\sqrt{2\pi}} e^{-\frac{x^2}{2\sigma^2}}+ \frac{ x}{2} + \frac{(1-\alpha) x}{2}\text{erf}(\frac{x}{\sqrt{2}\sigma})\)
SMU: 最大值函数的光滑近似 \(\frac{(1+\alpha)x+(1-\alpha)x \text{erf}(\mu (1-\alpha)x)}{2}\)
Squareplus: Softplus的代数近似 \(\text{squareplus}(x,b) =\frac{1}{2}(x+\sqrt{x^2+b})\)

⚪ 参考文献