首先我们来看下线性和非线性函数
线性变换函数,比如: y = 2 x y=2x y=2x y = x y =x y=x
非线性变换函数,比如: y = 2 x 2 y=2x^2 y=2x2 y = c o s x y=cosx y=cosx
非线性函数是指的一阶导数不为常数的函数
如果神经网络激活函数用线性函数,则网络的输出 y y y还是 x x x输入的一个线性函数,则模型无法表征非线性函数的输出
比如在第一层神经元: a 1 = w 1 x + b 1 a_1=w_1x+b_1 a1=w1x+b1
第二层神经元: a 2 = w 2 a 1 + b 2 = w 2 ( w 1 x + b 1 ) + b 2 a_2=w_2a_1+b_2=w_2(w_1x+b_1)+b_2 a2=w2a1+b2=w2(w1x+b1)+b2
= ( w 2 w 1 ) x + ( w 2 b 1 + b 2 ) = w ′ x + b ′ =(w_2w_1)x+(w_2b_1+b_2)=w^{'}x+b^{'} =(w2w1)x+(w2b1+b2)=w′x+b′
…
y y y的输出是 x x x的线性关系,线性函数的组合还是线性函数,所以网络再深,最后输出的 y y y还是 x x x的线性函数。所以用非线性激活函数,神经网络理论上可以逼近任意函数。
那么对于我们常见的非线性激活函数,他们各自又有什么特点和缺陷?
数学表达式:
f ( x ) = 1 1 + e − x f(x)= \frac {1}{1+e^{-x}} f(x)=1+e−x1
函数图形:
f ( x ) f(x) f(x)的导数数学表达式: f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) f(x)^{'}=f(x)(1-f(x)) f(x)′=f(x)(1−f(x))函数导数图形:
python实现如下:
import numpy as np
def sigmoid(x,derivative=False):
if derivative == True:
return x * (1 - x)
return 1 / (1+np.exp(-x))
我们知道 f ( x ) = s i g m o i d ( x ) f(x)=sigmoid(x) f(x)=sigmoid(x)其中 m a x f ( x ) ′ = 1 / 4 max f(x)^{'}=1/4 maxf(x)′=1/4,根据BP算法中的链式法则,当网络很深的时候,小于1的数(1/4)累乘会趋向于0,如下图所示:
我们令 θ u ( t ) \theta_u(t) θu(t)表示第 t t t层神经元 u u u的残差, f v ( x ) f_v(x) fv(x)表示为神经元v经过激活函数 f ( x ) f(x) f(x)的输出,则有如下公式:
∂ θ v ( t − q ) ∂ θ u ( t ) = { f v ′ ( n e t v ( t − 1 ) ) w u v i f q = 1 f v ′ ( n e t v ( t − q ) ) ∑ l = 1 n ∂ θ l ( t − q + 1 ) ∂ θ ( t ) w l v e l s e \frac{\partial\theta_v(t-q)}{\partial\theta_u(t)}=\begin{cases} f^{'}_v(net_v(t-1))w_{uv} \quad if \text{ }q=1 \\ f^{'}_v(net_v(t-q))\sum_{l=1}^n\frac{\partial\theta_l(t-q+1)}{\partial\theta(t)}w_{lv} \quad else \end{cases} ∂θu(t)∂θv(t−q)={fv′(netv(t−1))wuvif q=1fv′(netv(t−q))∑l=1n∂θ(t)∂θl(t−q+1)wlvelse
则 ∣ ∂ θ ( t − q ) ∂ θ ( t ) ∣ = ∣ ∏ m = 1 q W F ( N e t ( t − m ) ) ∣ ≤ ( ∣ W ∣ m a x N e t { ∣ F ′ ( N e t ) ∣ } ) q \begin{vmatrix} \frac{\partial\theta(t-q)}{\partial\theta(t)}\end{vmatrix}=\begin{vmatrix}\prod_{m=1}^qWF(Net(t-m))\end{vmatrix} \le (\begin{vmatrix}W\end{vmatrix}max_{Net}\{\begin{vmatrix}F^{'}(Net)\end{vmatrix}\})^q ∣∣∣∂θ(t)∂θ(t−q)∣∣∣=∣∣∏m=1qWF(Net(t−m))∣∣≤(∣∣W∣∣maxNet{∣∣F′(Net)∣∣})q
其中 m a x f ′ = 1 / 4 maxf^{'}=1/4 maxf′=1/4;则当 ∣ W ∣ < 4 \begin{vmatrix}W\end{vmatrix} < 4 ∣∣W∣∣<4时候,上式子将会是一个小于1的值的 q q q次乘方,则模型越往前传播,梯度会越来越小,甚至接近0,出现梯度消失现象,网络中的参数没法学习更新的情况。
sigmoid函数,将输出值映射到 (0,1)之间,都是正数,没有负数,这导致网络的学习表达能力将会受到限制。
数学表达式:
f ( x ) = e x − e − x e x + e − x = 2 1 + e − 2 x − 1 = 2 s i g m o i d ( 2 x ) − 1 f(x)= \frac {e^x-e^{-x}} {e^x+e^{-x}} = \frac {2}{1+e^{-2x}} -1=2sigmoid(2x)-1 f(x)=ex+e−xex−e−x=1+e−2x2−1=2sigmoid(2x)−1
从公式可以看出,tanh函数就是sigmoid函数的一个简单缩放,输出值在(-1,1)之间,输出是以0为中心的。
函数图形:
f ( x ) f(x) f(x)的导数数学表达式:
f ( x ) ′ = 1 − f ( x ) 2 f(x)^{'} = 1-f(x)^2 f(x)′=1−f(x)2
python实现如下:
def tanh(x, derivative=False):
if devivative == True:
return (1 - (x ** 2))
return np.tanh(x)
修正了sigmoid函数输出非0为中心的问题,但是还是不能解决梯度消失的问题
ReLu(Rectified Linear Unit)数学表达式:
f ( x ) = m a x ( 0 , x ) f(x) = max(0,x) f(x)=max(0,x)
函数图形:
函数导数数学表达式:
f ( x ) ′ = { 1 x > 0 0 x ≤ 0 f(x)^{'} = \begin {cases} 1 \quad x>0 \\ 0 \quad x \le 0 \end {cases} f(x)′={1x>00x≤0
这里需要说明的一点是,ReLu是非线性函数,因为导数不是一个常数,虽然看着简单,但是ReLu函数是分段函数,组合可以逼近任意函数。
ReLu函数,时间和空间复杂度最低,也不需要更高的指数运算,而且能够缓解梯度消失问题。
ReLu函数的一个缺陷是会引入死亡问题。什么叫“死亡问题”?
首先让我们来回顾下网络模型更新过程中的BP算法:
如上图所示,假设我们用平方和损失函数: E = 1 2 ∑ j = 1 M ( y j − t j ) 2 E = \frac {1}{2} \sum_{j=1}^{M}(y_j-t_j)^2 E=21j=1∑M(yj−tj)2 其中 t = { t 1 , . . . , t m } t =\{t_1,...,t_m\} t={t1,...,tm}是一个M维度的向量,代表的是每个样本的真实label标签。 y j y_j yj是输出预测的第 j j j个输出label值。BP反向传播更新参数梯度如下公式:
step1 :计算神经元输出值的导数
∂ E ∂ y j = y j − t j \frac {\partial E} {\partial y_j} = y_j-t_j ∂yj∂E=yj−tj
step2: 计算神经元输入值的导数(通常称为“残差”)
∂ E ∂ u j = ∂ E ∂ y j . ∂ y j ∂ u j = ( y j − t j ) . f ( x ) ′ = ( y j − t j ) . y j ( 1 − y j ) = e j \frac {\partial E}{\partial u_j}=\frac {\partial E} {\partial y_j}. \frac {\partial y_j} {\partial u_j}=(y_j-t_j).f(x)^{'}=(y_j-t_j).y_j(1-y_j)= e_j ∂uj∂E=∂yj∂E.∂uj∂yj=(yj−tj).f(x)′=(yj−tj).yj(1−yj)=ej
若 f ( x ) f(x) f(x)为sigmoid激活函数
step3: 计算权重梯度
∂ E ∂ w i j ′ = ∂ E ∂ u j . ∂ u j ∂ w i j ′ = e j . h i \frac {\partial E}{\partial w_{ij}^{'}}=\frac {\partial E} {\partial u_j}. \frac {\partial u_j} {\partial w_{ij}^{'}}=e_j.h_i ∂wij′∂E=∂uj∂E.∂wij′∂uj=ej.hi也就是第 n n n层的第 i i i个神经元与第 n + 1 n+1 n+1层的第 j j j个神经元连接的权重 w i j ′ w_{ij}^{'} wij′的每一次更新的梯度 Δ w i j ′ \Delta w_{ij}^{'} Δwij′就是第n层的第 i i i个神经元的输出值乘以第n+1层的第 j j j个神经元的残差
若输入 x ≤ 0 x \le 0 x≤0则经过ReLu激活函数后,神经元的输出为0,所谓的“死忙问题”,那么连接的该神经元的权重梯度为0,导致权重无法更新问题,神经元处于死忙状态。
Rectifier Nonlinearities Improve Neural Network Acoustic Models
数学表达式如下:
f ( x ) = { x x > 0 a x x ≤ 0 f(x)= \begin {cases} x \quad x>0 \\ ax \quad x \le 0 \end {cases} f(x)={xx>0axx≤0
函数图形如下:
函数导数数学表达式: f ( x ) ′ = { 1 x > 0 a x ≤ 0 f(x)^{'}=\begin {cases} 1 \quad x>0 \\ a \quad x \le 0 \end {cases} f(x)′={1x>0ax≤0
图像如下:
其中 a a a,是一个很小的常数,避免神经元输出为0,缓解了ReLu的“死忙问题”,但是 a a a是一个人工定的参数,不够灵活,所以,有一些工作,比如像Parametric ReLu把 a a a当做一个参数进行训练,网络自适应学习得来。
FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS
数学表达式:
f ( x ) = { x x > 0 a ( e x − 1 ) x ≤ 0 f(x)= \begin {cases} x \quad x>0 \\ a(e^x-1) \quad x \le 0 \end {cases} f(x)={xx>0a(ex−1)x≤0
函数图形:
导数数学表达式:
f ( x ) ′ = { 1 x > 0 a + f ( x ) x ≤ 0 f(x)^{'}= \begin {cases} 1 \quad x>0 \\ a+f(x) \quad x \le 0 \end {cases} f(x)′={1x>0a+f(x)x≤0
导数图形:
其中 a a a是一个很小的常数。整体来看,Leaky ReLu,ELU以及其它的一些变体,都是在保证ReLu激活函数优势的情况下,缓解神经元"死忙"问题,从ELU公式可以看出, x x x小于0的部分,用一个指数变化形式,相对复杂一些,计算开销比Leaky ReLu要高,但输出更加平滑。
正态分布又名高斯分布,是一个非常常见的连续概率分布。若随机变量 X X X服从一个位置参数 μ \mu μ、尺度参数 σ \sigma σ的正态分布,记为: X ∼ N ( μ , σ 2 ) X ∼ N(\mu,\sigma^2) X∼N(μ,σ2)则其概率密度函数为 f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=σ2π1e−2σ2(x−μ)2
正态分布的数学期望值 μ \mu μ等于位置参数,决定了分布的位置,其方差 σ 2 \sigma^2 σ2的开平方或标准差 σ \sigma σ等于尺度参数,决定了分布的幅度。我们通常说的标准正态分布是位置参数 μ = 0 \mu=0 μ=0,尺度参数 σ 2 = 1 \sigma^2=1 σ2=1的正态分布,下图展示了不同 μ \mu μ和 σ \sigma σ的正态分布图
拉普拉斯在误差分析实验中使用了正态分布,勒让德于1805年引入最小二乘法这一重要方法,而高斯则宣传在1794年就使用了该方法,并通过假设误差服从正态分布。
有几种不同的方法用来说明一个随机变量,最直观的方法是概率密度函数,这种方法能够表示随机变量每个取值多大的可能性。
正态分布的概率密度函数均值为 μ \mu μ,方差为 σ \sigma σ是高斯函数的一个实例:
f ( x ; μ , σ ) = 1 σ 2 π e x p ( − ( x − μ ) 2 2 σ 2 ) f(x;\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}exp(-\frac{(x-\mu)^2}{2\sigma^2}) f(x;μ,σ)=σ2π1exp(−2σ2(x−μ)2)如果一个随机变量 X X X服从这个分布,我们写作 X ∼ N ( μ , σ 2 ) X∼ N(\mu,\sigma^2) X∼N(μ,σ2)。如果 μ = 0 \mu=0 μ=0并且 σ = 1 \sigma=1 σ=1,这个分布被称为标准正态分布,这个分布简化为: f ( x ) = 1 2 π e x p ( − x 2 2 ) f(x)=\frac{1}{\sqrt{2\pi}}exp(-\frac{x^2}{2}) f(x)=2π1exp(−2x2),下图给出了不同参数的正态分布的函数图:
累积分布函数是指随机变量 X X X小于或等于 x x x的概率,用概率密度函数表示为 F ( x ; μ , σ ) = 1 σ 2 π ∫ − ∞ x e x p ( − ( t − μ ) 2 2 σ 2 ) d t F(x;\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}\int^x_{-\infty} exp(-\frac{{(t-\mu)}^2}{2\sigma^2})dt F(x;μ,σ)=σ2π1∫−∞xexp(−2σ2(t−μ)2)dt
标准正态分布的累积分布函数习惯上记为 Φ Φ Φ,它仅仅是 μ = 0 \mu=0 μ=0, σ = 1 \sigma=1 σ=1时的值,
Φ ( x ) = F ( x ; 0 , 1 ) = 1 2 π ∫ − ∞ x e x p ( − t 2 2 ) d t Φ(x)=F(x;0,1)=\frac{1}{\sqrt{2\pi}}\int^x_{-\infty} exp(-\frac{{t}^2}{2})dt Φ(x)=F(x;0,1)=2π1∫−∞xexp(−2t2)dt
正态分布的累积分布函数能够由一个叫做误差函数的特殊函数表示:
Φ ( z ) = 1 2 [ 1 + e r f ( z − μ σ 2 ) ] Φ(z)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{z-\mu}{\sigma\sqrt{2}}) \end{bmatrix} Φ(z)=21[1+erf(σ2z−μ)]
标准正态分布的累积分布函数习惯上记为Φ,它仅仅是指 μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0,σ=1时的值,用误差函数表示的公式简化为:
Φ ( z ) = 1 2 [ 1 + e r f ( z 2 ) ] Φ(z)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{z}{\sqrt{2}}) \end{bmatrix} Φ(z)=21[1+erf(2z)]
其中 e r f ( x ) erf(x) erf(x),称为误差函数(也称为高斯误差函数),它的定义如下:
e r f ( x ) = 1 π ∫ − x x e − t 2 d t = 2 π ∫ 0 x e − t 2 d t erf(x)=\frac{1}{\sqrt\pi}\int^x_{-x}e^{-t^2}dt=\frac{2}{\sqrt\pi}\int_0^xe^{-t^2}dt erf(x)=π1∫−xxe−t2dt=π2∫0xe−t2dt
累积分布函数图形如下:
Φ ( x ) = 1 2 π ∑ − ∞ x e − t 2 2 d t = 2 2 π ∑ − ∞ x e − ( t 2 ) 2 d t 2 Φ(x)=\frac{1}{\sqrt{2\pi}}\sum_{-\infty}^xe^{-\frac{t^2}{2}}dt=\frac{\sqrt{2}}{\sqrt{2\pi}}\sum_{-\infty}^{x}e^{-(\frac{t}{\sqrt{2}})^2}d\frac{t}{\sqrt{2}} Φ(x)=2π1∑−∞xe−2t2dt=2π2∑−∞xe−(2t)2d2t
= 1 π ∑ − ∞ x 2 e − z 2 d z = 1 π ∑ − ∞ 0 e − z 2 d z + 1 π ∑ 0 x 2 e − z 2 d z =\frac{1}{\pi}\sum_{-\infty}^{\frac{x}{\sqrt{2}}}e^{-z^2}dz=\frac{1}{\pi}\sum_{-\infty}^0e^{-z^2}dz+\frac{1}{\pi}\sum_{0}^{\frac{x}{\sqrt{2}}}e^{-z^2}dz =π1∑−∞2xe−z2dz=π1∑−∞0e−z2dz+π1∑02xe−z2dz
= 1 2 + 1 2 e r f ( x π ) = 1 2 [ 1 + e r f ( x 2 ) ] =\frac{1}{2}+\frac{1}{2}erf(\frac{x}{\sqrt{\pi}})=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}})\end{bmatrix} =21+21erf(πx)=21[1+erf(2x)]
GAUSSIAN ERROR LINEAR UNITS (GELUS)
论文中对比了GeLu激活函数在试验效果比ReLu,ELU都好,加上在bert中的应用,最近引起了广泛的关注。
函数数学公式:
f ( x ) = x P ( X ≤ x ) = x Φ ( x ) f(x)= xP(X \le x) = xΦ(x) f(x)=xP(X≤x)=xΦ(x)
其中 Φ ( x ) = 1 2 [ 1 + e r f ( x 2 ) ] ( 1 ) Φ(x)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}}) \end{bmatrix} { (1)} Φ(x)=21[1+erf(2x)](1)
X ∼ N ( 0 , 1 ) , Φ ( x ) X∼N(0,1){,}Φ(x) X∼N(0,1),Φ(x)是标准正态分布的累积分布函数,论文提供的近似求解公式:
f ( x ) = x Φ ( x ) = 0.5 x ( 1 + t a n h [ 2 / π ( x + 0.044715 x 3 ) ] ) ( 2 ) f(x)=xΦ(x)=0.5x(1+tanh[ \sqrt{2/\pi}(x+0.044715x^3)]) {(2)} f(x)=xΦ(x)=0.5x(1+tanh[2/π(x+0.044715x3)])(2)
函数图形:
函数导数图形:
GeLu函数综合了dropout和ReLu的特色,从上面公式我们也可以看出,从ReLu, Leakly ReLu,ELU等,都是在对输入神经元乘以1或者0或者一个 a a a常量进行变化,当 x ≥ 0 x \ge 0 x≥0的时候,以上三个函数都是乘以1作为神经元的输出,当 x ≤ 0 x \le 0 x≤0的时候,则乘以0或者 a a a作为神经元的输出。
但GeLu是对 x x x乘以标准正态分布的累积分布函数,根据 x x x的输入,平滑的进行变化,随着x变小, Φ ( x ) Φ(x) Φ(x)变小,则神经元的输入 x x x会以大概率的情况下“丢弃",整个过程相对ReLu激活函数更smooth
误差函数与标准正态分布的积分累积分布函数的关系为: Φ ( x ) = 1 2 [ 1 + e r f ( x 2 ) ] Φ(x)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}}) \end{bmatrix} Φ(x)=21[1+erf(2x)]
从上述(1)和(2)公式可以看出,需要证明:
e r f ( x 2 ) ≈ t a n h ( 2 π ( x + a x 3 ) ) erf(\frac{x}{\sqrt2}) \approx tanh(\sqrt{\frac{2}{\pi}}(x+ax^3)) erf(2x)≈tanh(π2(x+ax3))其中 a ≈ 0.044715 a \approx 0.044715 a≈0.044715
证明如下:
泰勒级数
在数学上,对于一个实数或复数 a a a领域上,以实数作为变量或以复数作为变量的函数,并且是无穷可微的函数 f ( x ) f(x) f(x),它的泰勒级数是以下这种形式的幂级数:
f ( x ) = ∑ n = 0 ∞ f ( n ) ( a ) n ! ( x − a ) n f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(a)}{n!}(x-a)^n f(x)=n=0∑∞n!f(n)(a)(x−a)n这里 n ! n! n!表示 n n n的阶乘,而 f ( n ) ( a ) f^{(n)}(a) f(n)(a)表示函数 f f f在点 a a a处的 n n n阶导数,如果 a = 0 a=0 a=0,也可以把这个级数称为麦克劳林级数。
指数函数 e x e^x ex的等价幂级数:
e x = 1 + ∑ n = 1 ∞ x n n ! = 1 + x + x 2 2 ! + x 3 3 ! + x 4 4 ! + . . . e^x=1+\sum_{n=1}^{\infty}\frac{x^n}{n!}=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+... ex=1+n=1∑∞n!xn=1+x+2!x2+3!x3+4!x4+...
t a n h ( x ) tanh(x) tanh(x)的泰勒级数: t a n h ( x ) = x − x 3 3 + o ( x 3 ) tanh(x)=x-\frac{x^3}{3}+o(x^3) tanh(x)=x−3x3+o(x3)
e r f ( x ) erf(x) erf(x)的泰勒级数: e r f ( x ) = 2 π ( x − x 3 3 ) + o ( x 3 ) erf(x)=\frac{2}{\sqrt{\pi}}(x-\frac{x^3}{3})+o(x^3) erf(x)=π2(x−3x3)+o(x3)
t a n h ( 2 π ( x + a x 3 ) ) = 2 π ( x + ( a − 2 3 π ) x 3 ) + o ( x 3 ) (3) tanh(\sqrt{\frac{2}{\pi}}(x+ax^3)) = \sqrt{\frac{2}{\pi}}(x+(a-\frac{2}{3\pi})x^3)+o(x^3) \text{ }\text{ }\text{(3) } tanh(π2(x+ax3))=π2(x+(a−3π2)x3)+o(x3) (3)
e r f ( x 2 ) = 2 π ( x − x 3 6 ) + o ( x 3 ) (4) erf(\frac{x}{\sqrt{2}})=\sqrt{\frac{2}{\pi}}(x-\frac{x^3}{6})+o(x^3) \text{ }\text{ }\text{(4) } erf(2x)=π2(x−6x3)+o(x3) (4)
令公式(3)和公式(4)相等,则 a ≈ 0.04553992412 a \approx 0.04553992412 a≈0.04553992412,与论文中 a a a为0.044715十分接近。
bert中的glue函数实现如下:
def gelu(x):
cdf = 0.5 * (1.0 + tf.tanh(
(np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x,3))))
return x * cdf
说明:本文图片素材来源Casper Hansen博文以及wikipedia