Activation Functions in Deep Learning.
本文目录:
- 激活函数的意义
- 激活函数应具有的性质
- 一些常用的激活函数
1. 激活函数的意义
(1) 从生物学的角度理解激活函数
早期激活函数的设计受到生物神经网络中神经元的启发,即对神经元进行简单的建模。
大脑中的神经元(neuron)通过树突(dendrites)接收其他神经元的输入信号,在胞体中进行信号的处理,通过轴突(axon)分发信号。当神经元中的信号累积达到一定阈值时产生电脉冲将信号输出,这个阈值称为点火率(firing rate)。
- 其他神经元的输入信号建模为$x_i$
- 树突的信号接收过程建模为$w_ix_i$
- 胞体的信号处理过程建模为$\sum_{i}^{}w_ix_i$
- 点火率建模为$-b$
- 信号累计与阈值的比较建模为$\sum_{i}^{}w_ix_i+b$
- 产生电脉冲建模为$f(\cdot)=\text{step}(\cdot)$
- 轴突的输出信号建模为$f(\sum_{i}^{}w_ix_i+b)$
激活函数是用来模拟“信号累积达到阈值并产生电脉冲”的过程。 值得一提的是,这种对神经元的建模是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对神经元输入的每一个标量值分别进行计算。如果能够将激活函数拓展为多输入函数,则能够捕捉输入的上下文信息,增强神经元的表达能力。
某个特征位置的上下文信息既可以从所有输入特征中获取(如maxout,Dynamic ReLU),也可以由在该特征的一个邻域上获取(如Dynamic Shift-Max,FReLU)。
⚪ 性质7:具有通用近似性
直观上神经网络每一层的每个神经元都应具有不同的激活曲线。可以设计一些由超参数控制的通用近似激活函数,使得每个神经元学习不同的激活曲线。每个神经元的激活超参数参与反向传播的梯度更新。
设计通用近似的激活函数主要有两种思路。第一种是使用一些通用的函数逼近方法,如分段线性近似(APL, PWLU)、Padé近似(PAU, OPAU)。第二种是寻找现有激活函数的光滑逼近,如手工设计近似(ACON, SMU)、使用Dirac函数寻找光滑近似(SAU)。
3. 一些常用的激活函数
- Reference:Pytorch中的激活函数层
下面介绍的激活函数根据设计思路也可分类如下:
- S型激活函数:形如S型曲线的激活函数。包括Step,Sigmoid,HardSigmoid,Tanh,HardTanh
- ReLU族激活函数:形如ReLU的激活函数。包括ReLU,Softplus,ReLU6,LeakyReLU,PReLU,RReLU,ELU,GELU,CELU,SELU
- 自动搜索激活函数:通过自动搜索解空间得到的激活函数。包括Swish,HardSwish,Elish,HardElish,Mish
- 基于梯度的激活函数:通过梯度下降为每个神经元学习独立函数。包括APL,PAU,ACON,PWLU,OPAU,SAU,SMU
- 基于上下文的激活函数:多输入单输出函数,输入上下文信息。包括maxout,Dynamic ReLU,Dynamic Shift-Max,FReLU
激活函数 | 表达式 | 函数图像 |
---|---|---|
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})\) |
⚪ 参考文献
- Activation Functions: Comparison of trends in Practice and Research for Deep Learning:(arXiv1811)一篇激活函数综述。
- Rectifier Nonlinearities Improve Neural Network Acoustic Models:(ICML2013)LeakyReLU:使用修正的非线性提高神经网络声学模型。
- Maxout Networks:(arXiv1302)Maxout:自适应分段线性单元。
- Learning Activation Functions to Improve Deep Neural Networks:(arXiv1412)APL:自适应分段线性单元。
- Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification:(arXiv1502)PReLU:分类任务超越人类表现。
- Empirical Evaluation of Rectified Activations in Convolutional Network:(arXiv1505)RReLU:受限激活函数的经验验证。
- Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs):(arXiv1511)ELU:消除偏差偏置的指数线性单元。
- Bridging Nonlinearities and Stochastic Regularizers with Gaussian Error Linear Units:(arXiv1606)GELU:随机正则化的高斯误差线性单元。
- Continuously Differentiable Exponential Linear Units:(arXiv1704)CELU:连续可微的指数线性单元。
- Self-Normalizing Neural Networks:(arXiv1706)SELU:自标准化的指数线性单元。
- Searching for Activation Functions:(arXiv1710)Swish:自动搜索得到的一种自门控的激活函数。
- The Quest for the Golden Activation Function:(arXiv1808)ELiSH:使用遗传算法寻找最优激活函数。
- Padé Activation Units: End-to-end Learning of Flexible Activation Functions in Deep Networks:(arXiv1907)PAU:基于Padé近似的可学习激活函数。
- Mish: A Self Regularized Non-Monotonic Activation Function:(arXiv1908)Mish:一种自正则化的非单调激活函数。
- Dynamic ReLU:(arXiv2003)DY-ReLU:动态整流线性单元。
- Funnel Activation for Visual Recognition:(arXiv2007)FReLU:为视觉任务设计的激活函数。
- Activate or Not: Learning Customized Activation:(arXiv2009)ACON:学习自定义的激活函数。
- Learning specialized activation functions with the Piecewise Linear Unit:(arXiv2104)PWLU:使用分段线性单元学习激活函数。
- Orthogonal-Padé Activation Functions: Trainable Activation functions for smooth and faster convergence in deep networks:(arXiv2106)OPAU:基于正交Padé近似的可训练激活函数。
- SAU: Smooth activation function using convolution with approximate identities:(arXiv2109)SAU:使用Dirac函数构造激活函数的光滑近似。
- SMU: smooth activation function for deep networks using smoothing maximum technique:(arXiv2111)SMU:基于光滑最大值技术的光滑激活函数。
- Squareplus: A Softplus-Like Algebraic Rectifier:(arXiv2112)Squareplus:一种类似softplus的代数整流器。