在学习神经网络之前,你可能需要一点机器学习的基础。其中机器学习的相关内容可以参考:超级简单的机器学习入门
人工神经网络(Artificial Neural Network,ANN)模拟了生物神经网络,构建人工神经元,并按照一定拓扑结构来建立人工神经元之间的连接.
神经网络一般可以看作一个
非线性模型
,其基本组成单元为具有非线性激活函数的神经元
,大量神经元之间相互连接
,神经元之间的连接权重
就是需要学习的参数。误差反向传播
机制大大提高了神经网络的学习能力,基于此可以在机器学习的框架下通过梯度下降方法
来进行学习。
1)神经元是构成神经网络的基本单元,用来接收一组输入信号并产生输出.
其中MP神经元
是比较原始基础的神经元。
特点:MP 神经元中的激活函数
为0或1的阶跃函数
,而现代神经元中的激活函数通常要求是连续可导的函数
.
2)假设一个神经元接收 个输入 1 , 2 , ⋯ , _1, _2, ⋯ , _ x1,x2,⋯,xD,令向量 = [ 1 ; 2 ; ⋯ ; ] = [_1; _2; ⋯ ; _] x=[x1;x2;⋯;xD]来表示这组输入,并用净输入
∈ ℝ 表示一个神经元所获得的输入信号的加权和
。
其计算公式如下:
z = ∑ d = 1 D w d x d + b = w ⊤ x + b \begin{aligned} z & =\sum_{d=1}^{D} w_{d} x_{d}+b \\ & =\boldsymbol{w}^{\top} \boldsymbol{x}+b \end{aligned} z=d=1∑Dwdxd+b=w⊤x+b
3)净输入在经过一个非线性函数(⋅)后,得到神经元的活性值
,
= ( ) = () a=f(z)
激活函数
.激活函数的具体介绍可以看下一小节。4)一个典型的神经元结构示例
单一的神经元是远远不够完成复杂的功能,需要通过很多神经元一起协作.这样通过一定的连接方式
或信息传递方式
进行协作的神经元可以看作一个网络,就是神经网络
.
目前常用的神经网络有三种
1)前馈网络
有向无环路图
表示.全连接前馈网络
和卷积神经网络
等.2)记忆网络
记忆网络
,也称为反馈网络,网络中的神经元不但可以接收其他神经元的信息,也可以接收自己的历史信息
循环神经网络
、Hopfield 网络
、玻尔兹曼机
、受限玻尔兹曼机
等.3)图网络
知识图谱
、社交网络
、分子网络
等.图卷积网络
、图注意力网络
、消息传递神经网络
等.4)三种网络结构的对比
1)激活函数在神经元中非常重要的.可以增强网络的表示能力和学习能力
激活函数需要具备以下几点性质:
连续并可导
(允许少数点上不可导)的非线性函数
.- 激活函数及其导函数要尽可能的
简单
,有利于提高网络计算效率.- 激活函数的导函数的值域要
在一个合适的区间
内,不能太大也不能太小,否则会影响训练的效率和稳定性.
以下是几种常见的激活函数。
Sigmoid 型函数
是指一类 S 型曲线函数,为两端饱和函数
.常用的 Sigmoid型函数有Logistic函数
和Tanh函数
.
对于函数 (),若 → −∞ 时,其导数 ′() → 0,则称其为
左饱和
.若 → +∞时,其导数′() → 0,则称其为右饱和
.当同时满足左、右饱和时,就称为两端饱和
.
Logistic函数
Logistic函数定义为:线性函数
;当输入值靠近两端时对输入进行抑制.输入越小,越接近 0;输入越大,越接近 1.阶跃激活函数
相比,Logistic函数是连续可导
的,其数学性质更好.Tanh函数
Tanh函数也是一种Sigmoid型函数.其定义为:tanh ( x ) = exp ( x ) − exp ( − x ) exp ( x ) + exp ( − x ) \tanh (x)=\frac{\exp (x)-\exp (-x)}{\exp (x)+\exp (-x)} tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)
Tanh函数 可以看作放大并平移的 Logistic函数,其值域是(−1, 1)。以下是 Tanh函数 与 Logistic函数的相互转化公式
tanh ( x ) = 2 σ ( 2 x ) − 1 \tanh (x)=2 \sigma(2 x)-1 tanh(x)=2σ(2x)−1
Tanh函数
的输出是零中心化
的,而 Logistic 函数
的输出恒大于 0
.非零中心化
的输出会使得其后一层的神经元的输入发生偏置偏移
,并进一步使得梯度下降的收敛速度变慢
.Logistic函数 和 Tanh函数 在中间(0附近)近似线性,两端饱和,计算开销较大。因此,这两个函数可以通过分段函数
来近似.
以 Logistic 函数 ()
为例,其导数为 ′() = ()(1 − ()).Logistic 函数在0附近的一阶泰勒展开
为
g l ( x ) ≈ σ ( 0 ) + x × σ ′ ( 0 ) = 0.25 x + 0.5 \begin{aligned} g_{l}(x) & \approx \sigma(0)+x \times \sigma^{\prime}(0) \\ & =0.25 x+0.5 \end{aligned} gl(x)≈σ(0)+x×σ′(0)=0.25x+0.5
这样Logistic函数
可以用 分段函数 hard-logistic()
来近似.
hard − logistic ( x ) = { 1 g l ( x ) ≥ 1 g l 0 < g l ( x ) < 1 0 g l ( x ) ≤ 0 = max ( min ( g l ( x ) , 1 ) , 0 ) = max ( min ( 0.25 x + 0.5 , 1 ) , 0 ) \begin{aligned} \operatorname{hard}-\operatorname{logistic}(x) & =\left\{\begin{array}{ll} 1 & g_{l}(x) \geq 1 \\ g_{l} & 0
同样,Tanh函数
在0附近的一阶泰勒展开
为
g t ( x ) ≈ tanh ( 0 ) + x × tanh ′ ( 0 ) = x , g_{t}(x) \approx \tanh (0)+x \times \tanh ^{\prime}(0) =x, gt(x)≈tanh(0)+x×tanh′(0)=x,
这样 Tanh函数
也可以用 分段函数 hard-tanh()
来近似.
hard − tanh ( x ) = max ( min ( g t ( x ) , 1 ) , − 1 ) = max ( min ( x , 1 ) , − 1 ) \begin{aligned} \operatorname{hard}-\tanh (x) & =\max \left(\min \left(g_{t}(x), 1\right),-1\right) \\ & =\max (\min (x, 1),-1) \end{aligned} hard−tanh(x)=max(min(gt(x),1),−1)=max(min(x,1),−1)
ReLU
是目前深度神经网络中经常使用的激活函数,其定义为:
ReLU ( x ) = { x x ≥ 0 0 x < 0 = max ( 0 , x ) \begin{aligned} \operatorname{ReLU}(x) & =\left\{\begin{array}{ll} x & x \geq 0 \\ 0 & x<0 \end{array}\right. \\ & =\max (0, x) \end{aligned} ReLU(x)={x0x≥0x<0=max(0,x)其图像为:
优点
缺点:
解决方案:
在实际使用中,为了避免上述情况,有几种ReLU的变种也会被广泛使用.
1. 带泄露的ReLU
:在输入 < 0时,保持一个很小的梯度 γ \gamma γ(往往小于1)
LeakyReLU ( x ) = { x if x > 0 γ x if x ≤ 0 = max ( 0 , x ) + γ min ( 0 , x ) = max ( x , γ x ) \begin{aligned} \operatorname{LeakyReLU}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma x & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\gamma \min (0, x)\\ & = \max (x,\gamma x) \end{aligned} LeakyReLU(x)={xγx if x>0 if x≤0=max(0,x)+γmin(0,x)=max(x,γx)
2.带参数的ReLU
:引入一个可学习的参数,不同神经元可以有不同的参数。对于第 个神经元,其 PReLU 的定义为:
PReLU i ( x ) = { x if x > 0 γ i x if x ≤ 0 = max ( 0 , x ) + γ i min ( 0 , x ) , \begin{aligned} \operatorname{PReLU}_{i}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma_{i} x & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\gamma_{i} \min (0, x), \end{aligned} PReLUi(x)={xγix if x>0 if x≤0=max(0,x)+γimin(0,x),
3.ELU函数
:一个近似的零中心化的非线性函数
ELU ( x ) = { x if x > 0 γ ( exp ( x ) − 1 ) if x ≤ 0 = max ( 0 , x ) + min ( 0 , γ ( exp ( x ) − 1 ) ) \begin{aligned} \operatorname{ELU}(x) & =\left\{\begin{array}{ll} x & \text { if } x>0 \\ \gamma(\exp (x)-1) & \text { if } x \leq 0 \end{array}\right. \\ & =\max (0, x)+\min (0, \gamma(\exp (x)-1)) \end{aligned} ELU(x)={xγ(exp(x)−1) if x>0 if x≤0=max(0,x)+min(0,γ(exp(x)−1))
4.Softplus 函数
:可以看作 ReLU 函数的平滑版本,其定义为
Softplus ( x ) = log ( 1 + exp ( x ) ) . \text { Softplus }(x)=\log (1+\exp (x)) \text {. } Softplus (x)=log(1+exp(x)).
激活函数 | 函数 | 导数 |
---|---|---|
Logistic 函数 |
f ( x ) = 1 1 + exp ( − x ) f(x)=\frac{1}{1+\exp (-x)} f(x)=1+exp(−x)1 | f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^{\prime}(x)=f(x)(1-f(x)) f′(x)=f(x)(1−f(x)) |
Tanh 函数 |
f ( x ) = exp ( x ) − exp ( − x ) exp ( x ) + exp ( − x ) f(x)=\frac{\exp (x)-\exp (-x)}{\exp (x)+\exp (-x)} f(x)=exp(x)+exp(−x)exp(x)−exp(−x) | f ′ ( x ) = 1 − f ( x ) 2 f^{\prime}(x)=1-f(x)^{2} f′(x)=1−f(x)2 |
ReLU 函数 |
f ( x ) = max ( 0 , x ) f(x)=\max (0, x) f(x)=max(0,x) | f ′ ( x ) = I ( x > 0 ) f^{\prime}(x)=I(x>0) f′(x)=I(x>0) |
ELU 函数 |
f ( x ) = max ( 0 , x ) + min ( 0 , γ ( exp ( x ) − 1 ) ) f(x)=\max (0, x)+\min (0, \gamma(\exp (x)-1)) f(x)=max(0,x)+min(0,γ(exp(x)−1)) | f ′ ( x ) = I ( x > 0 ) + I ( x ≤ 0 ) ⋅ γ exp ( x ) f^{\prime}(x)=I(x>0)+I(x \leq 0) \cdot \gamma \exp (x) f′(x)=I(x>0)+I(x≤0)⋅γexp(x) |
SoftPlus 函数 |
f ( x ) = log ( 1 + exp ( x ) ) f(x)=\log (1+\exp (x)) f(x)=log(1+exp(x)) | f ′ ( x ) = 1 1 + exp ( − x ) f^{\prime}(x)=\frac{1}{1+\exp (-x)} f′(x)=1+exp(−x)1 |
前馈神经网络
(Feedforward Neural Network,FNN)是最早发明的简单人工神经网络。
输入层
,最后一层称为输出层
,其他中间层称为隐藏层
.无反馈
,信号从输入层向输出层单向传播,可用一个有向无环图
表示.前馈神经网络的图示
记号 | 含义 |
---|---|
L L L | 神经网络的层数 |
M l M_l Ml | 第 层神经元的个数 |
( ⋅ ) _(⋅) fl(⋅) | 第 层神经元的激活函数 |
W ( l ) ∈ R M l × M l − 1 \boldsymbol{W}^{(l)} \in \mathbb{R}^{M_{l} \times M_{l-1}} W(l)∈RMl×Ml−1 | 第 − 1层到第 层的权重矩阵 |
b ( l ) ∈ R M l \boldsymbol{b}^{(l)} \in \mathbb{R}^{M_{l}} b(l)∈RMl | 第 − 1层到第 层的偏置 |
z ( l ) ∈ R M l \boldsymbol{z}^{(l)} \in \mathbb{R}^{M_{l}} z(l)∈RMl | 第 层神经元的净输入(净活性值) |
a ( l ) ∈ R M l \boldsymbol{a}^{(l)} \in \mathbb{R}^{M_{l}} a(l)∈RMl | 第 层神经元的输出(活性值) |
令(0) = ,前馈神经网络通过不断迭代下面公式进行信息传播:
z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) a ( l ) = f l ( z ( l ) ) \begin{aligned} \boldsymbol{z}^{(l)} & =\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} \\ \boldsymbol{a}^{(l)} & =f_{l}\left(\boldsymbol{z}^{(l)}\right) \end{aligned} z(l)a(l)=W(l)a(l−1)+b(l)=fl(z(l))
活性值 (−1)
计算出第层神经元的净活性值 ()
,然后经过一个激活函数得到第 层神经元的活性值
损失函数:
L ( y , y ^ ) = − y ⊤ log y ^ \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})=-\boldsymbol{y}^{\top} \log \hat{\boldsymbol{y}} L(y,y^)=−y⊤logy^
结构化风险函数:
R ( W , b ) = 1 N ∑ n = 1 N L ( y ( n ) , y ^ ( n ) ) + 1 2 λ ∥ W ∥ F 2 \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})=\frac{1}{N} \sum_{n=1}^{N} \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)+\frac{1}{2} \lambda\|\boldsymbol{W}\|_{F}^{2} R(W,b)=N1n=1∑NL(y(n),y^(n))+21λ∥W∥F2
在梯度下降方法的每次迭代中,第 层的参数 ( ) ^{()} W(l) 和 ( ) ^{()} b(l) 参数更新方式为:
W ( l ) ← W ( l ) − α ∂ R ( W , b ) ∂ W ( l ) = W ( l ) − α ( 1 N ∑ n = 1 N ( ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) ) + λ W ( l ) ) , b ( l ) ← b ( l ) − α ∂ R ( W , b ) ∂ b ( l ) = b ( l ) − α ( 1 N ∑ n = 1 N ∂ L ( y ( n ) , y ^ ( n ) ) ∂ b ( l ) ) , \begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{W}^{(l)}} \\ & =\boldsymbol{W}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N}\left(\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right)+\lambda \boldsymbol{W}^{(l)}\right), \\\\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{b}^{(l)}} \\ & =\boldsymbol{b}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N} \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}\right), \end{aligned} W(l)b(l)←W(l)−α∂W(l)∂R(W,b)=W(l)−α⎝⎛N1n=1∑N⎝⎛∂W(l)∂L(y(n),y^(n))⎠⎞+λW(l)⎠⎞,←b(l)−α∂b(l)∂R(W,b)=b(l)−α⎝⎛N1n=1∑N∂b(l)∂L(y(n),y^(n))⎠⎞,
偏导数
,如果通过链式法则逐一对每个参数进行求偏导比较低效.反向传播算法
来高效地计算梯度∂ L ( y , y ^ ) ∂ w i j ( l ) = ∂ z ( l ) ∂ w i j ( l ) ∂ L ( y , y ^ ) ∂ z ( l ) , ∂ L ( y , y ^ ) ∂ b ( l ) = ∂ z ( l ) ∂ b ( l ) ∂ L ( y , y ^ ) ∂ z ( l ) \begin{array}{l} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial w_{i j}^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}}, \\\\ \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{b}^{(l)}}=\frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}} \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \end{array} ∂wij(l)∂L(y,y^)=∂wij(l)∂z(l)∂z(l)∂L(y,y^),∂b(l)∂L(y,y^)=∂b(l)∂z(l)∂z(l)∂L(y,y^)
(1)计算偏导数 ∂ z ( l ) ∂ w i j ( l ) \frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} ∂wij(l)∂z(l),因为 z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) \boldsymbol{z}^{(l)}=\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)} z(l)=W(l)a(l−1)+b(l)
∂ z ( l ) ∂ w i j ( l ) = [ ∂ z 1 ( l ) ∂ w i j ( l ) , ⋯ , ∂ z i ( l ) ∂ w i j ( l ) , ⋯ , ∂ z M l ( l ) ∂ w i j ( l ) ] = [ 0 , ⋯ , ∂ ( w i : ( l ) a ( l − 1 ) + b i ( l ) ) ∂ w i j ( l ) , ⋯ , 0 ] = [ 0 , ⋯ , a j ( l − 1 ) , ⋯ , 0 ] ≜ [ ] ( a j ( l − 1 ) ) ∈ R 1 × M l , \begin{aligned} \frac{\partial \boldsymbol{z}^{(l)}}{\partial w_{i j}^{(l)}} & =\left[\frac{\partial z_{1}^{(l)}}{\partial w_{i j}^{(l)}}, \cdots, \frac{\partial z_{i}^{(l)}}{\partial w_{i j}^{(l)}}, \cdots, \frac{\partial z_{M_{l}}^{(l)}}{\partial w_{i j}^{(l)}}\right] \\\\ & =\left[0, \cdots, \frac{\partial\left(\boldsymbol{w}_{i:}^{(l)} \boldsymbol{a}^{(l-1)}+b_{i}^{(l)}\right)}{\partial w_{i j}^{(l)}}, \cdots, 0\right] \\\\ & =\left[0, \cdots, a_{j}^{(l-1)}, \cdots, 0\right] \\\\ & \triangleq []\left(a_{j}^{(l-1)}\right) \quad \in \mathbb{R}^{1 \times M_{l}}, \end{aligned} ∂wij(l)∂z(l)=[∂wij(l)∂z1(l),⋯,∂wij(l)∂zi(l),⋯,∂wij(l)∂zMl(l)]=⎣⎡0,⋯,∂wij(l)∂(wi:(l)a(l−1)+bi(l)),⋯,0⎦⎤=[0,⋯,aj(l−1),⋯,0]≜[](aj(l−1))∈R1×Ml,
(2)计算偏导数 ∂ z ( l ) ∂ b ( l ) \frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}} ∂b(l)∂z(l) 因为 ( ) ^{()} z(l) 和 ( ) ^{()} b(l) 的函数关系为 z ( l ) = W ( l ) a ( l − 1 ) + ( ) \boldsymbol{z}^{(l)}=\boldsymbol{W}^{(l)} \boldsymbol{a}^{(l-1)}+ ^{()} z(l)=W(l)a(l−1)+b(l)
∂ z ( l ) ∂ b ( l ) = I M l ∈ R M l × M l \frac{\partial \boldsymbol{z}^{(l)}}{\partial \boldsymbol{b}^{(l)}}=\boldsymbol{I}_{M_{l}} \quad \in \mathbb{R}^{M_{l} \times M_{l}} ∂b(l)∂z(l)=IMl∈RMl×Ml
(3)计算偏导数 ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} ∂z(l)∂L(y,y^). 偏导数 ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} ∂z(l)∂L(y,y^)表示第层神经元对最终损失的影响,因此一般称为第 层神经元的误差项
,用 δ ( ) \delta ^{()} δ(l) 来表示.
误差项
δ ( ) \delta ^{()} δ(l) 也间接反映了不同神经元对网络能力的贡献程度,从而比较好地解决了贡献度分配问题
根据链式法则,第 层的误差项为
δ ( l ) ≜ ∂ L ( y , y ^ ) ∂ z ( l ) = ∂ a ( l ) ∂ z ( l ) ⋅ ∂ z ( l + 1 ) ∂ a ( l ) ⋅ ∂ L ( y , y ^ ) ∂ z ( l + 1 ) = diag ( f l ′ ( z ( l ) ) ) ⋅ ( W ( l + 1 ) ) ⊤ ⋅ δ ( l + 1 ) = f l ′ ( z ( l ) ) ⊙ ( ( W ( l + 1 ) ) ⊤ δ ( l + 1 ) ) ∈ R M l , \begin{aligned} \delta^{(l)} & \triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ & =\frac{\partial \boldsymbol{a}^{(l)}}{\partial \boldsymbol{z}^{(l)}} \cdot \frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol{a}^{(l)}} \cdot \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ & =\operatorname{diag}\left(f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right)\right) \cdot\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \cdot \delta^{(l+1)} \\ & =f_{l}^{\prime}\left(\boldsymbol{z}^{(l)}\right) \odot\left(\left(\boldsymbol{W}^{(l+1)}\right)^{\top} \delta^{(l+1)}\right) \in \mathbb{R}^{M_{l}}, \end{aligned} δ(l)≜∂z(l)∂L(y,y^)=∂z(l)∂a(l)⋅∂a(l)∂z(l+1)⋅∂z(l+1)∂L(y,y^)=diag(fl′(z(l)))⋅(W(l+1))⊤⋅δ(l+1)=fl′(z(l))⊙((W(l+1))⊤δ(l+1))∈RMl,
其中⊙是向量的点积运算符,表示每个元素相乘.
第 层的误差项可以通过第 + 1层的误差项计算得到,这就是误差的反向传播
.
第 层的一个神经元的误差项是所有与该神经元相连的第 + 1 层的神经元的误差项的权重和,再乘上该神经元激活函数的梯度.
因此, L ( y , y ^ ) \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}}) L(y,y^) 关于第 层权重 ( ) ^{()} W(l) 的梯度为
∂ L ( y , y ^ ) ∂ W ( l ) = δ ( l ) ( a ( l − 1 ) ) ⊤ ∈ R M l × M l − 1 \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{W}^{(l)}}=\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top} \quad \in \mathbb{R}^{M_{l} \times M_{l-1}} ∂W(l)∂L(y,y^)=δ(l)(a(l−1))⊤∈RMl×Ml−1
同理, L ( y , y ^ ) \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}}) L(y,y^) 关于第 层偏置 ( ) ^{()} b(l) 的梯度为
∂ L ( y , y ^ ) ∂ b ( l ) = δ ( l ) ∈ R M l \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{b}^{(l)}}=\delta^{(l)} \quad \in \mathbb{R}^{M_{l}} ∂b(l)∂L(y,y^)=δ(l)∈RMl
因此,使用误差反向传播算法的前馈神经网络训练过程可以分为以下三步:
(1) 前馈计算每一层的净输入 ( ) ^{()} z(l) 和激活值 ( ) ^{()} a(l),直到最后一层;
(2) 反向传播计算每一层的误差项 δ ( ) \delta^{()} δ(l);
(3) 计算每一层参数的偏导数,并更新参数.
输入: 训练集,验证集,学习率, 正则化系数,网络层数,神经元数量 M l M_l Ml, 1 ≤ ≤ .
随机初始化 , ;
repeat
对训练集 中的样本随机重排序
for = 1 ⋯ do
从训练集 中选取样本 ( ( ) , ( ) ) (^{()}, ^{()}) (x(n),y(n))
前馈计算每一层的净输入 ( ) ^{()} z(l) 和激活值 ( ) ^{()} a(l),直到最后一层;
反向传播计算每一层的误差 δ ( ) \delta^{()} δ(l);
// 计算每一层参数的导数
∀ l , ∂ L ( y ( n ) , y ^ ( n ) ) ∂ W ( l ) = δ ( l ) ( a ( l − 1 ) ) ⊤ \forall l, \quad \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial W^{(l)}}=\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top} ∀l,∂W(l)∂L(y(n),y^(n))=δ(l)(a(l−1))⊤
∀ l , ∂ L ( y ( n ) , y ^ ( n ) ) ∂ b ( l ) = δ ( l ) \forall l, \quad \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}=\delta^{(l)} ∀l,∂b(l)∂L(y(n),y^(n))=δ(l)
// 更新参数
W ( l ) ← W ( l ) − α ( δ ( l ) ( a ( l − 1 ) ) ⊤ + λ W ( l ) ) \boldsymbol{W}^{(l)} \leftarrow \boldsymbol{W}^{(l)}-\alpha\left(\delta^{(l)}\left(\boldsymbol{a}^{(l-1)}\right)^{\top}+\lambda\boldsymbol{W}^{(l)}\right) W(l)←W(l)−α(δ(l)(a(l−1))⊤+λW(l))
b ( l ) ← b ( l ) − α δ ( l ) \boldsymbol{b}^{(l)} \leftarrow \boldsymbol{b}^{(l)}-\alpha \delta^{(l)} b(l)←b(l)−αδ(l)
end
until 神经网络模型在验证集 上的错误率不再下降;
输出: , b b b
神经网络的参数学习比线性模型要更加困难,主要原因有两点:
非凸优化问题
神经网络的优化问题是一个
非凸优化问题
.
梯度消失问题
梯度消失问题:
Sigmoid 型函数饱和区的导数接近于 0.误差经过每一层传递都会不断衰减.当网络层数很深时,梯度就会不停衰减,甚至消失,使得整个网络很难训练.
因为手动用链式法则来计算风险函数对每个参数的梯度非常琐碎并容易出错,导致实现神经网络变得十分低效.实际上,参数的梯度可以让计算机来自动计算.
主流的深度学习框架都包含了自动梯度计算
的功能,自动计算梯度的方法可以分为以下三类:数值微分
、符号微分
和自动微分
.
数值微分
是用数值方法来计算函数()的导数.函数()的点的导数定义为
f ′ ( x ) = lim Δ x → 0 f ( x + Δ x ) − f ( x ) Δ x f^{\prime}(x)=\lim _{\Delta x \rightarrow 0} \frac{f(x+\Delta x)-f(x)}{\Delta x} f′(x)=Δx→0limΔxf(x+Δx)−f(x)
数值微分方法非常容易实现,但找到一个合适的扰动 Δ 却十分困难.
如果 Δ 过小,会引起数值计算问题,比如舍入误差
;如果Δ 过大,会增加截断误差
,使得导数计算不准确.
因此,数值微分的实用性比较差.
截断误差
.f ′ ( x ) = lim Δ x → 0 f ( x + Δ x ) − f ( x − Δ x ) 2 Δ x . f^{\prime}(x)=\lim _{\Delta x \rightarrow 0} \frac{f(x+\Delta x)-f(x-\Delta x)}{2 \Delta x} . f′(x)=Δx→0lim2Δxf(x+Δx)−f(x−Δx).
数值微分的另外一个问题是
计算复杂度
.假设参数数量为,则每个参数都需要单独施加扰动,并计算梯度.
假设每次正向传播的计算复杂度为()
,则计算数值微分的总体时间复杂度为(^2)
.
符号微分是一种基于符号计算的自动求导方法.即将数值代入数学表示中进行计算.符号计算也叫代数计算.
这里的变量被看作符号,一般不需要代入具体的值.
符号计算的输入和输出都是数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程
等运算.
自动微分是一种可以对一个(程序)函数进行计算导数的方法.
自动微分的基本原理是所有的数值计算可以分解为一些基本操作,包含+, −, ×, / 和一些初等函数 exp, log,sin, cos 等,然后利用链式法则
来自动计算一个复合函数的梯度.
例:令复合函数(; , )为
f ( x ; w , b ) = 1 exp ( − ( w x + b ) ) + 1 f(x ; w, b)=\frac{1}{\exp (-(w x+b))+1} f(x;w,b)=exp(−(wx+b))+11
其计算图为:
前向模式和反向模式可以看作应用链式法则的两种梯度累积方式.
标量
,因此采用反向模式为最有效的计算方式,只需要一遍计算.