BP(Back Propagation)神经网络,即反向传播神经网络。它是一种按误差逆向传播算法训练的多层前馈网络,并且层与层之间存储着大量输入-输出映射关系。它的训练规则是通过把误差反向传播,使用梯度下降算法,从而调整网络中的权重,是的最终误差最小。
它有三层组成:输入层、隐含层和输出层。隐含层的权重我们无法得知,但是可以通过输出层结果和预期结果的误差来间接调整隐含层的权重。
激活函数是神经网络中神经元(一般是隐含层)节点上运行的函数,它负责把神经元的输入映射到输出,这里的映射是指非线性映射。如果不使用激活函数,那么每一层的输入输出都是线性运算,无法解决具体问题。使用了激活函数,就可以使整个神经网络逼近任何一个非线性函数。
目前有多种激活函数,本文所使用的激活函数:sigmoid函数,它能将变量映射到0~1之间。
f ( x ) = 1 1 + e ( − x ) f(x) = \frac{1}{1+e^{(-x)}} f(x)=1+e(−x)1
图像如下:
第0层是输入层,第1层是第一层隐含层,第2层是第二层隐含层,第三层是输出层(对于多分类问题,输出层的神经元不只一个)
w j k [ l ] w_{j k}^{[l]} wjk[l] 表示从网络中第 ( l − 1 ) (l-1) (l−1)层第 k k k个神经元到第 l l l层第 j j j个神经元的连接权重,同时也是第 l l l 层权重矩阵第 j j j 行第 k k k 列的元素。
b j [ l ] b_{j}^{[l]} bj[l] 表示第 l l l层第 j j j 个神经元的偏置,同时也是第 l l l 层偏执向量的第 j j j个元素。
z j k [ l ] z_{j k}^{[l]} zjk[l] 表示表示第 l l l 层第 j j j 个神经元的线性结果,同时也是该神经元激活函数的输入。
a j [ l ] a_{j}^{[l]} aj[l] 表示第 l {l} l 层第 j j j 个神经元的激活函数输出。
σ 表示激活函数。
第 l l l 层中第 j j j 个神经元的激活为:
a j [ l ] = σ ( z j [ l ] ) = σ ( ∑ k w j k [ l ] a k [ l − 1 ] + b j [ l ] ) a_{j}^{[l]} = \sigma(z_{j}^{[l]}) = \sigma(\sum_kw_{j k}^{[l]}a_{k}^{[l-1]} + b_{j}^{[l]}) aj[l]=σ(zj[l])=σ(k∑wjk[l]ak[l−1]+bj[l])
w [ l ] w^{[l]} w[l] 表示第 l l l 层的权重矩阵。
b [ l ] b^{[l]} b[l] 表示第 l l l 层的偏置向量。
a [ l ] a^{[l]} a[l] 表示第 l l l 层的神经元向量。
结合上图所示:
w [ 1 ] = [ w 11 [ 1 ] w 12 [ 1 ] w 21 [ 1 ] w 22 [ 1 ] w 31 [ 1 ] w 32 [ 1 ] ] w^{[1]}=\left[\begin{array}{lll}w_{11}^{[1]} & w_{12}^{[1]} & \\ w_{21}^{[1]} & w_{22}^{[1]} & \\ w_{31}^{[1]} & w_{32}^{[1]}\end{array}\right] w[1]=⎣⎢⎡w11[1]w21[1]w31[1]w12[1]w22[1]w32[1]⎦⎥⎤
w [ 2 ] = [ w 11 [ 2 ] w 12 [ 2 ] w 13 [ 2 ] w 21 [ 2 ] w 22 [ 2 ] w 23 [ 2 ] ] w^{[2]}=\left[\begin{array}{lll}w_{11}^{[2]} & w_{12}^{[2]} & w_{13}^{[2]} \\ w_{21}^{[2]} & w_{22}^{[2]} & w_{23}^{[2]}\end{array}\right] w[2]=[w11[2]w21[2]w12[2]w22[2]w13[2]w23[2]]
b [ 1 ] = [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] ] b^{[1]}=\left[\begin{array}{l}b_{1}^{[1]} \\ b_{2}^{[1]} \\ b_{3}^{[1]}\end{array}\right] b[1]=⎣⎢⎡b1[1]b2[1]b3[1]⎦⎥⎤
b [ 2 ] = [ b 1 [ 2 ] b 2 [ 2 ] ] b^{[2]}=\left[\begin{array}{l}b_{1}^{[2]} \\ b_{2}^{[2]}\end{array}\right] b[2]=[b1[2]b2[2]]
进行线性矩阵运算:
z [ 1 ] = w [ 1 ] ∗ a [ 0 ] + b [ 1 ] = [ w 11 [ 1 ] w 12 [ 1 ] w 21 [ 1 ] w 22 [ 1 ] w 31 [ 1 ] w 32 [ 1 ] ] ⋅ [ a 1 [ 0 ] a 2 [ 0 ] ] + [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] ] = [ w 11 [ 1 ] a 1 [ 0 ] + w 12 [ 1 ] a 2 [ 0 ] + b 1 [ 1 ] w 21 [ 1 ] a 1 [ 0 ] + w 22 [ 1 ] a 2 [ 0 ] + b 2 [ 1 ] w 31 [ 1 ] a 1 [ 0 ] + w 32 [ 1 ] a 2 [ 0 ] + b 3 [ 1 ] ] z^{[1]}=w^{[1]} * a^{[0]} + b^{[1]}=\left[\begin{array}{lll}w_{11}^{[1]} & w_{12}^{[1]} & \\ w_{21}^{[1]} & w_{22}^{[1]} & \\ w_{31}^{[1]} & w_{32}^{[1]}\end{array}\right] \cdot\left[\begin{array}{c}a_{1}^{[0]} \\ a_{2}^{[0]}\end{array}\right]+\left[\begin{array}{l}b_{1}^{[1]} \\ b_{2}^{[1]} \\ b_{3}^{[1]}\end{array}\right]=\left[\begin{array}{c}w_{11}^{[1]} a_{1}^{[0]}+w_{12}^{[1]} a_{2}^{[0]}+b_{1}^{[1]} \\ w_{21}^{[1]} a_{1}^{[0]}+w_{22}^{[1]}a_{2}^{[0]}+b_{2}^{[1]} \\ w_{31}^{[1]}a_{1}^{[0]}+w_{32}^{[1]}a_{2}^{[0]}+b_{3}^{[1]}\end{array}\right] z[1]=w[1]∗a[0]+b[1]=⎣⎢⎡w11[1]w21[1]w31[1]w12[1]w22[1]w32[1]⎦⎥⎤⋅[a1[0]a2[0]]+⎣⎢⎡b1[1]b2[1]b3[1]⎦⎥⎤=⎣⎢⎡w11[1]a1[0]+w12[1]a2[0]+b1[1]w21[1]a1[0]+w22[1]a2[0]+b2[1]w31[1]a1[0]+w32[1]a2[0]+b3[1]⎦⎥⎤
那么,前向传播过程可以表示为:
a [ l ] = σ ( w [ l ] a [ l − 1 ] + b [ l ] ) a^{[l]}=\sigma\left(w^{[l]} a^{[l-1]}+b^{[l]}\right) a[l]=σ(w[l]a[l−1]+b[l])
上述讲述的前向传播过程,输入层只有1个列向量,也就是只有一个输入样本。对于多个样本,输入不再是1个列向量,而是m个列向量,每1列表示一个输入样本。m个 a [ l − 1 ] a^{[l-1]} a[l−1]列向量组成一个m列的矩阵 A [ l − 1 ] A^{[l-1]} A[l−1]。
A [ l − 1 ] = [ ∣ ∣ ⋯ ∣ a [ l − 1 ] ( 1 ) a [ l − 1 ] ( 2 ) … a [ l − 1 ] ( m ) ∣ ∣ … ∣ ] A^{[l-1]}=\left[\begin{array}{cccc}| & | & \cdots & | \\ a^{[l-1](1)} & a^{[l-1](2)} & \dots & a^{[l-1](m)} \\ | & | & \dots & |\end{array}\right] A[l−1]=⎣⎡∣a[l−1](1)∣∣a[l−1](2)∣⋯……∣a[l−1](m)∣⎦⎤
多样本输入的前向传播过程可以表示为:
Z [ l ] = w [ l ] ⋅ A [ l − 1 ] + b [ l ] A [ l ] = σ ( Z [ l ] ) \begin{array}{c} Z^{[l]}=w^{[l]} \cdot A^{[l-1]}+b^{[l]} \\ A^{[l]}=\sigma\left(Z^{[l]}\right) \end{array} Z[l]=w[l]⋅A[l−1]+b[l]A[l]=σ(Z[l])
与单样本输入相比,多样本 w [ l ] w^{[l]} w[l]和 b [ l ] b^{[l]} b[l]的定义是完全一样的,不同的只是 Z [ l ] Z^{[l]} Z[l]和 A [ l ] A^{[l]} A[l]从1列变成m列,每1列表示一个样本的计算结果。
在有监督学习的机器学习算法中,我们期望能够最小化每个样例的误差。在使用梯度下降算法等其他优化算法都会使用误差,而误差就是来自于损失函数。
损失函数用于单个训练样本,而成本函数是多个训练样本的平均损失,也就是成本函数是每个样本的成本总和的平均值。优化策略旨在最小化成本函数。
下面例举几个常用的损失函数:
L ( y ^ , y ) = ∣ y − y ^ ∣ L(\hat{y},y)=|y-\hat{y}| L(y^,y)=∣y−y^∣
y y y 表示真实值或期望值, y ^ \hat{y} y^ 表示预测值
L ( y ^ , y ) = ( y − y ^ ) 2 L(\hat{y},y)=(y-\hat{y})^{2} L(y^,y)=(y−y^)2
y y y 表示真实值或期望值, y ^ \hat{y} y^ 表示预测值
交叉熵损失:
L ( y ^ , y ) = − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) L(\hat{y}, y)=-y \log (\hat{y})-(1-y) \log (1-\hat{y}) L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
y y y 表示真实值或期望值, y ^ \hat{y} y^ 表示预测值
反向传播的基本思想:通过计算输出层与期望值之间的误差来调整网络中的权重,使得误差变小(最小化损失函数或成本函数),反向传播基于四个基础等式。
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。为了更快的逼近最优解,从梯度反方向计算能够使求解过程变得更快。
假设函数 f : R n × 1 → R f:R^{n \times 1} \rightarrow R f:Rn×1→R 将输入的列向量( n × 1 n \times 1 n×1 )映射为一个实数。那么,函数 f f f 的梯度定义为:
∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] \nabla_{x} f(x)=\left[\begin{array}{c}\frac{\partial f(x)}{\partial x_{1}} \\ \frac{\partial f(x)}{\partial x_{2}} \\ \vdots \\ \frac{\partial f(x)}{\partial x_{n}}\end{array}\right] ∇xf(x)=⎣⎢⎢⎢⎢⎡∂x1∂f(x)∂x2∂f(x)⋮∂xn∂f(x)⎦⎥⎥⎥⎥⎤
同理,假设函数 f : R m × n → R f: R^{m \times n} \rightarrow R f:Rm×n→R 将输入的矩阵(shape: m × n m \times n m×n )映射为一个实数。函数 f f f 的梯度定义为:
∇ A f ( A ) = [ ∂ f ( A ) ∂ A 11 ∂ f ( A ) ∂ A 12 … ∂ f ( A ) ∂ A 13 ∂ f ( A ) ∂ A 21 ∂ f ( A ) ∂ A 22 … ∂ f ( A ) ∂ A 2 n ⋮ ⋮ ⋱ ⋮ ∂ f ( A ) ∂ A m 1 ∂ f ( A ) ∂ A m 2 … ∂ f ( A ) ∂ A m n ] \nabla_{A} f(A)=\left[\begin{array}{cccc}\frac{\partial f(A)}{\partial A_{11}} & \frac{\partial f(A)}{\partial A_{12}} & \dots & \frac{\partial f(A)}{\partial A_{13}} \\ \frac{\partial f(A)}{\partial A_{21}} & \frac{\partial f(A)}{\partial A_{22}} & \dots & \frac{\partial f(A)}{\partial A_{2 n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f(A)}{\partial A_{m 1}} & \frac{\partial f(A)}{\partial A_{m 2}} & \dots & \frac{\partial f(A)}{\partial A_{m n}}\end{array}\right] ∇Af(A)=⎣⎢⎢⎢⎢⎡∂A11∂f(A)∂A21∂f(A)⋮∂Am1∂f(A)∂A12∂f(A)∂A22∂f(A)⋮∂Am2∂f(A)……⋱…∂A13∂f(A)∂A2n∂f(A)⋮∂Amn∂f(A)⎦⎥⎥⎥⎥⎤
可以简化为:
( ∇ A f ( A ) ) i j = ∂ f ( A ) ∂ A i j \left(\nabla_{A} f(A)\right)_{i j}=\frac{\partial f(A)}{\partial A_{i j}} (∇Af(A))ij=∂Aij∂f(A)
为了最小化误差,需要我们不断调整神经网络中的权重 w w w 和偏置 b b b 。我们使用梯度下降算法来逼近最优解,为此我们需要知道权重 w w w 和偏置 b b b 的梯度,也就是总误差对二者的偏导数 ∂ L ∂ b j [ l ] \frac{\partial L}{\partial b_{j}^{[l]}} ∂bj[l]∂L和 ∂ L ∂ w j k [ l ] \frac{\partial L}{\partial w_{j k}^{[l]}} ∂wjk[l]∂L。
为了计算这些偏导数,引入一个中间变量 δ j [ l ] \delta_{j}^{[l]} δj[l],它表示网络中第 l l l 层第 j j j 个神经元的误差。反向传播能够计算出误差 δ j [ l ] \delta_{j}^{[l]} δj[l] ,再根据链式法则求出 ∂ L ∂ b j [ l ] \frac{\partial L}{\partial b_{j}^{[l]}} ∂bj[l]∂L和 ∂ L ∂ w j k [ l ] \frac{\partial L}{\partial w_{j k}^{[l]}} ∂wjk[l]∂L。
定义网络中第 l l l 层第 j j j 个神经元的误差为 δ j [ l ] \delta_{j}^{[l]} δj[l] :
δ j [ l ] = ∂ L ( a [ L ] , y ) ∂ z j [ l ] \delta_{j}^{[l]}=\frac{\partial L\left(a^{[L]},y\right)}{\partial z_{j}^{[l]}} δj[l]=∂zj[l]∂L(a[L],y)
其中 L L L表示最后一层,也就是输出层, L ( a [ L ] , y ) L(a^{[L]},y) L(a[L],y) 表示损失函数, y y y 表示真实值, a [ L ] a^{[L]} a[L] 表示输出层的预测值。
每一层的误差向量可以表示为:
δ [ l ] = [ δ 1 [ l ] δ 2 [ l ] ⋮ δ n [ l ] ] \delta^{[l]}=\left[\begin{array}{c}\delta_{1}^{[l]} \\ \delta_{2}^{[l]} \\ \vdots \\ \delta_{n}^{[l]}\end{array}\right] δ[l]=⎣⎢⎢⎢⎢⎡δ1[l]δ2[l]⋮δn[l]⎦⎥⎥⎥⎥⎤
下面正式推导四个基本公式:
δ j [ L ] = ∂ L ∂ a j [ L ] σ ′ ( z j [ L ] ) \delta_{j}^{[L]}=\frac{\partial L}{\partial a_{j}^{[L]}} \sigma^{\prime}\left(z_{j}^{[L]}\right) δj[L]=∂aj[L]∂Lσ′(zj[L])
L表示输出层层数。以下用 ∂ L \partial L ∂L 表示 ∂ L ( a [ L ] , y ) \partial L\left(a^{[L]}, y\right) ∂L(a[L],y)
写成矩阵形式是:
δ [ L ] = [ ∂ L ∂ a 1 [ L ] ∂ L ∂ a 2 [ L ] ⋮ ∂ L ∂ a j [ L ] ] ⊙ [ σ ′ ( z 1 [ L ] ) σ ′ ( z 2 [ L ] ) ⋮ σ ′ ( z j [ L ] ) ] \delta^{[L]}= \left[\begin{array}{c}\frac{\partial L}{\partial a_{1}^{[L]}} \\ \frac{\partial L}{\partial a_{2}^{[L]}} \\ \vdots \\ \frac{\partial L}{\partial a_{j}^{[L]}}\end{array}\right] \odot\left[\begin{array}{c}\sigma^{\prime}\left(z_{1}^{[L]}\right) \\ \sigma^{\prime}\left(z_{2}^{[L]}\right) \\ \vdots \\ \sigma^{\prime}\left(z_{j}^{[L]}\right)\end{array}\right] δ[L]=⎣⎢⎢⎢⎢⎢⎡∂a1[L]∂L∂a2[L]∂L⋮∂aj[L]∂L⎦⎥⎥⎥⎥⎥⎤⊙⎣⎢⎢⎢⎢⎢⎢⎡σ′(z1[L])σ′(z2[L])⋮σ′(zj[L])⎦⎥⎥⎥⎥⎥⎥⎤
表示成公式:
δ [ L ] = ∇ a L ⊙ σ ′ ( z [ L ] ) \delta^{[L]}=\nabla_{a} L \odot \sigma^{\prime}\left(z^{[L]}\right) δ[L]=∇aL⊙σ′(z[L])
由上图所示,该图中只有一个输出只有一个神经元,具体问题中可能有多个输出神经元。成本函数是每个输出神经元的损失函数之和,每个输出神经元的误差与其它神经元没有关系。
计算输出层的误差 δ j [ L ] = ∂ L ∂ z j [ L ] \delta_{j}^{[L]}=\frac{\partial L}{\partial z_{j}^{[L]}} δj[L]=∂zj[L]∂L ,根据链式法则
δ j [ L ] = ∂ L ∂ a j [ L ] ∂ a j [ L ] ∂ z j [ L ] \delta_{j}^{[L]}=\frac{\partial L}{\partial a_{j}^{[L]}} \frac{\partial a_{j}^{[L]}}{\partial z_{j}^{[L]}} δj[L]=∂aj[L]∂L∂zj[L]∂aj[L]
σ \sigma σ 表示激活函数,由 a j [ L ] = σ ( z j [ L ] ) a_{j}^{[L]}=\sigma\left(z_{j}^{[L]}\right) aj[L]=σ(zj[L]),计算出 ∂ a j [ L ] ∂ z j [ L ] = σ ′ ( z j [ L ] ) \frac{\partial a_{j}^{[L]}}{\partial z_{j}^{[L]}}=\sigma^{\prime}\left(z_{j}^{[L]}\right) ∂zj[L]∂aj[L]=σ′(zj[L]) ,代入最后得到
δ j [ L ] = ∂ L ∂ a j [ L ] σ ′ ( z j [ L ] ) \delta_{j}^{[L]}=\frac{\partial L}{\partial a_{j}^{[L]}} \sigma^{\prime}\left(z_{j}^{[L]}\right) δj[L]=∂aj[L]∂Lσ′(zj[L])
最后再向量化:
δ [ L ] = ∇ a L ⊙ σ ′ ( z [ L ] ) \delta^{[L]}=\nabla_{a} L \odot \sigma^{\prime}\left(z^{[L]}\right) δ[L]=∇aL⊙σ′(z[L])
这里有混淆的地方,我们先提前假设以下,以免下面为什么权重矩阵转置了产生疑惑。
第 ( l ) (l) (l)层一共有 j j j个神经元,第 ( l + 1 ) (l+1) (l+1)层一共有 k k k个神经元,那么前向传播的权重矩阵为: ( k , j ) (k,j) (k,j)
δ j [ l ] = ∑ k w k j [ l + 1 ] δ k [ l + 1 ] σ ′ ( z j [ l ] ) \begin{array}{c} \delta_{j}^{[l]}=\sum_{k} w_{k j}^{[l+1]} \delta_{k}^{[l+1]} \sigma^{\prime}\left(z_{j}^{[l]}\right) \end{array} δj[l]=∑kwkj[l+1]δk[l+1]σ′(zj[l])
写成矩阵形式:
δ [ l ] = [ [ w 11 [ l ] w 12 [ l ] … w 1 k [ l ] w 21 [ l ] w 22 [ l ] … w 2 k [ l ] ⋮ ⋮ ⋱ ⋮ w j 1 [ l ] w j 2 [ l ] … w j k [ l ] ] [ δ 1 [ l + 1 ] δ 2 [ l + 1 ] ⋮ δ k [ l + 1 ] ] ] ⊙ [ σ ′ ( z 1 [ l ] ) σ ′ ( z 2 [ l ] ) ⋮ σ ′ ( z j [ l ] ) ] \delta^{[l]}=\left[\begin{array}{lll} \left[\begin{array}{lll}w_{11}^{[l]} & w_{12}^{[l]} & \dots & w_{1k}^{[l]} \\ w_{21}^{[l]} & w_{22}^{[l]} & \dots & w_{2k}^{[l]} \\ \vdots & \vdots & \ddots & \vdots\\ w_{j1}^{[l]} & w_{j2}^{[l]} & \dots & w_{jk}^{[l]} \end{array}\right] \left[\begin{array}{c}\delta_{1}^{[l+1]} \\ \delta_{2}^{[l+1]} \\ \vdots \\ \delta_{k}^{[l+1]}\end{array}\right] \end{array}\right] \odot\left[\begin{array}{c}\sigma^{\prime}\left(z_{1}^{[l]}\right) \\ \sigma^{\prime}\left(z_{2}^{[l]}\right) \\ \vdots \\\sigma^{\prime}\left(z_{j}^{[l]}\right)\end{array}\right] δ[l]=⎣⎢⎢⎢⎢⎡⎣⎢⎢⎢⎢⎡w11[l]w21[l]⋮wj1[l]w12[l]w22[l]⋮wj2[l]……⋱…w1k[l]w2k[l]⋮wjk[l]⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡δ1[l+1]δ2[l+1]⋮δk[l+1]⎦⎥⎥⎥⎥⎤⎦⎥⎥⎥⎥⎤⊙⎣⎢⎢⎢⎢⎢⎢⎡σ′(z1[l])σ′(z2[l])⋮σ′(zj[l])⎦⎥⎥⎥⎥⎥⎥⎤
矩阵形状:(j,k) * (k,1) ⊙ \odot ⊙ (j,1) = (j,1)
权重矩阵的形状从(k,j)转置变成(j,k)。
表示成公式:
δ [ l ] = [ w [ l + 1 ] T δ [ l + 1 ] ] ⊙ σ ′ ( z [ l ] ) \delta^{[l]}=\left[w^{[l+1]^{T}} \delta^{[l+1]}\right] \odot \sigma^{\prime}\left(z^{[l]}\right) δ[l]=[w[l+1]Tδ[l+1]]⊙σ′(z[l])
z k [ l + 1 ] = ∑ j w k j [ l + 1 ] a j [ l ] + b k [ l + 1 ] = ∑ j w k j [ l + 1 ] σ ( z j [ l ] ) + b k [ l + 1 ] z_{k}^{[l+1]}=\sum_{j} w_{k j}^{[l+1]} a_{j}^{[l]}+b_{k}^{[l+1]}=\sum_{j} w_{k j}^{[l+1]} \sigma\left(z_{j}^{[l]}\right)+b_{k}^{[l+1]} zk[l+1]=∑jwkj[l+1]aj[l]+bk[l+1]=∑jwkj[l+1]σ(zj[l])+bk[l+1]
对 z j [ l ] z_{j}^{[l]} zj[l] 求偏导:
∂ z k [ l + 1 ] ∂ z j [ l ] = w k j [ l + 1 ] σ ′ ( z j [ l ] ) \frac{\partial z_{k}^{[l+1]}}{\partial z_{j}^{[l]}}=w_{k j}^{[l+1]} \sigma^{\prime}\left(z_{j}^{[l]}\right) ∂zj[l]∂zk[l+1]=wkj[l+1]σ′(zj[l])
根据链式法则:
δ j [ l ] = ∂ L ∂ z j [ l ] = ∑ k ∂ L ∂ z k [ l + 1 ] ∂ z k [ l + 1 ] ∂ z j [ l ] = ∑ k w k j [ l + 1 ] δ k [ l + 1 ] σ ′ ( z j [ l ] ) \delta_{j}^{[l]}=\frac{\partial L}{\partial z_{j}^{[l]}}=\sum_{k}\frac{\partial L}{\partial z_{k}^{[l+1]}}\frac{\partial z_{k}^{[l+1]}}{\partial z_{j}^{[l]}}=\sum_{k} w_{k j}^{[l+1]} \delta_{k}^{[l+1]} \sigma^{\prime}\left(z_{j}^{[l]}\right) δj[l]=∂zj[l]∂L=∑k∂zk[l+1]∂L∂zj[l]∂zk[l+1]=∑kwkj[l+1]δk[l+1]σ′(zj[l])
为了避免和公式二混淆,提前假设:第 ( l − 1 ) (l-1) (l−1)层一共有 k k k个神经元,第 ( l ) (l) (l)层一共有 j j j个神经元,那么前向传播的权重矩阵为: ( j , k ) (j,k) (j,k)
∂ L ∂ b j [ l ] = δ j [ l ] ∂ L ∂ w j k [ l ] = a k [ l − 1 ] δ j [ l ] \begin{array}{c} \frac{\partial L}{\partial b_{j}^{[l]}}=\delta_{j}^{[l]} \\ \frac{\partial L}{\partial w_{j k}^{[l]}}=a_{k}^{[l-1]} \delta_{j}^{[l]} \end{array} ∂bj[l]∂L=δj[l]∂wjk[l]∂L=ak[l−1]δj[l]
写成矩阵形式:
∂ L ∂ b [ l ] = [ δ 1 [ l ] δ 2 [ l ] ⋮ δ j [ l ] ] = δ [ l ] \frac{\partial L}{\partial b^{[l]}}=\left[\begin{array}{c}\delta_{1}^{[l]} \\ \delta_{2}^{[l]} \\ \vdots \\ \delta_{j}^{[l]}\end{array}\right]=\delta^{[l]} ∂b[l]∂L=⎣⎢⎢⎢⎢⎡δ1[l]δ2[l]⋮δj[l]⎦⎥⎥⎥⎥⎤=δ[l]
矩阵形状:(j,1)
矩阵形状:(j,1) * (1,k) = (j,k), 和 w [ l ] w^{[l]} w[l] 的维度一致 。
表示成公式:
z j [ l ] = ∑ k w j k [ l ] a k [ l − 1 ] + b j [ l ] z_{j}^{[l]}=\sum_{k} w_{j k}^{[l]} a_{k}^{[l-1]}+b_{j}^{[l]} zj[l]=∑kwjk[l]ak[l−1]+bj[l]
L 对 b j [ l ] b_{j}^{[l]} bj[l] 求偏导,根据链式法则得到
∂ L ∂ b j [ l ] = ∂ L ∂ z j [ l ] ∂ z j [ l ] b j [ l ] = ∂ L ∂ z j [ l ] ∗ 1 = δ j [ l ] \frac{\partial L}{\partial b_{j}^{[l]}}=\frac{\partial L}{\partial z_{j}^{[l]}} \frac{\partial z_{j}^{[l]}}{b_{j}^{[l]}}= \frac{\partial L}{\partial z_{j}^{[l]}} * 1 = \delta_{j}^{[l]} ∂bj[l]∂L=∂zj[l]∂Lbj[l]∂zj[l]=∂zj[l]∂L∗1=δj[l]
L 对 w j k [ l ] w_{j k}^{[l]} wjk[l] 求偏导,根据链式法则得到
∂ L ∂ w j k [ l ] = ∂ L ∂ z j [ l ] ∂ z j [ l ] w j k [ l ] = a k [ l − 1 ] δ j [ l ] \frac{\partial L}{\partial w_{j k}^{[l]}}=\frac{\partial L}{\partial z_{j}^{[l]}} \frac{\partial z_{j}^{[l]}}{w_{j k}^{[l]}}=a_{k}^{[l-1]} \delta_{j}^{[l]} ∂wjk[l]∂L=∂zj[l]∂Lwjk[l]∂zj[l]=ak[l−1]δj[l]
根据梯度下降法原理,朝着梯度的反方向更新参数
b j [ l ] ← b j [ l ] − α ∂ L ∂ b j [ l ] w j k [ l ] ← w j k [ l ] − α ∂ L ∂ w j k [ l ] \begin{array}{c} b_{j}^{[l]} \leftarrow b_{j}^{[l]}-\alpha \frac{\partial L}{\partial b_{j}^{[l]}} \\ w_{j k}^{[l]} \leftarrow w_{j k}^{[l]}-\alpha \frac{\partial L}{\partial w_{j k}^{[l]}} \end{array} bj[l]←bj[l]−α∂bj[l]∂Lwjk[l]←wjk[l]−α∂wjk[l]∂L
写成矩阵形式:
b [ l ] ← b [ l ] − α ∂ L ∂ b [ l ] w [ l ] ← w [ l ] − α ∂ L ∂ w [ l ] \begin{array}{l} b^{[l]} \leftarrow b^{[l]}-\alpha \frac{\partial L}{\partial b^{[l]}} \\ w^{[l]} \leftarrow w^{[l]}-\alpha \frac{\partial L}{\partial w^{[l]}} \end{array} b[l]←b[l]−α∂b[l]∂Lw[l]←w[l]−α∂w[l]∂L
这里的 α \alpha α 指的是学习率。学习率决定了反向传播过程中梯度下降的步长。
1.权重矩阵的初始化,不能都初始化为0,会使整个模型变成无效的线性运算,具体原因自行查找。
2.对于多分类问题,一般是分几类就设计几个输出神经元。假设分四类,就设置四个神经元,(1,0,0,0) (0,1,0,0)(0,0,1,0)(0,0,0,1)。