反向传播算法的数学推导

本文严重参考了 CSDN 反向传播算法（过程及公式推导）

基本定义

在上图所示的简单神经网络中，layer 1 是输入层，layer 2 是隐藏层，layer 3是输出层。我们用上图来阐述一些变量名称的意义：

名称 | 含义
bil b_{i}^{l}bil​ | 第 l ll 层的第 i ii 个神经元的偏置
w ji l w_{ji}^{l}wjil​ | 第 l−1 l-1l−1 层的第 i ii 个神经元连接第 l ll 层的第 j jj 个神经元
zil z_{i}^{l}zil​ | 第 l ll 层的第 i ii 个神经元的输入
ail a_{i}^{l}ail​ | 第 l ll 层的第 i ii 个神经元的输出
σ\sigmaσ | 激活函数

通过上面的定义，我们可以知道：

zjl=∑i w ji lai l−1+bjl z_{j}^{l} = \sum_{i}w_{ji}^{l}a_{i}^{l-1} + b_{j}^{l}zjl​=∑i​wjil​ail−1​+bjl​

ajl=σ zjl=σ(∑i w ji lai l−1+bjl)a_{j}^{l} = \sigma z_{j}^{l} = \sigma \left( \sum_{i}w_{ji}^{l}a_{i}^{l-1} + b_{j}^{l} \right)ajl​=σzjl​=σ(∑i​wjil​ail−1​+bjl​)

我们令损失函数为二次代价函数 (Quadratic Cost Function) ：

J=1 2 n∑x∣∣y(x)−aL(x)∣∣2 J = \frac{1}{2n} \sum_{x} \lvert \lvert y(x) - a^{L}(x) \rvert \rvert ^ {2}J=2n1​∑x​∣∣y(x)−aL(x)∣∣2

其中，x xx 表示输入样本，y(x)y(x)y(x) 表示实际分类，aL(x)a^{L}(x)aL(x) 表示预测分类，L LL 表示网络的最大层数。当只有一个输入样本时，损失函数 J JJ 标示为：

J=12∑x∣∣y(x)−aL(x)∣∣2 J = \frac{1}{2} \sum_{x} \lvert \lvert y(x) - a^{L}(x) \rvert \rvert ^ {2}J=21​∑x​∣∣y(x)−aL(x)∣∣2

最后我们将第 l ll 层第 i ii 个神经元中产生的错误定义为：

δil≡∂J∂zil\delta_{i}^{l} \equiv \frac{\partial{J}}{\partial{z_{i}^{l}}}δil​≡∂zil​∂J​

公式推导

损失函数对最后一层神经网络产生的错误为：

δiL=∂J∂ziL=∂J∂aiL⋅∂aiL∂ziL=∇J(aiL)σ′(ziL)\begin{aligned}\delta_{i}^{L} &= \frac{\partial{J}}{\partial{z_{i}^{L}}}\\&=\frac{\partial{J}}{\partial{a_{i}^{L}}} \cdot \frac{\partial{a_{i}^{L}}}{\partial{z_{i}^{L}}}\\&=\nabla J(a_{i}^{L}) \sigma^{'}(z_{i}^{L})\end{aligned}δiL​​=∂ziL​∂J​=∂aiL​∂J​⋅∂ziL​∂aiL​​=∇J(aiL​)σ′(ziL​)​

δL=∇J(aL)⊙σ′(zL)\delta^{L} = \nabla J(a^{L}) \odot \sigma^{'}(z^{L})δL=∇J(aL)⊙σ′(zL)

损失函数对第 j jj 层网络产生的错误为：

δjl=∂J∂zjl=∂J∂ajl⋅∂ajl∂zjl=∑i∂J∂zi l+1⋅∂zi l+1∂ajl⋅∂ajl∂zjl=∑i δi l+1⋅∂w ijl+1ajl+bi l+1∂ajl⋅σ′(zjl)=∑i δi l+1⋅w ijl+1⋅σ′(zjl)\begin{aligned}\delta_{j}^{l} &= \frac{\partial{J}}{\partial{z_{j}^{l}}} \\ &= \frac{\partial{J}}{\partial{a_{j}^{l}}} \cdot \frac{\partial{a_{j}^{l}}}{\partial{z_{j}^{l}}} \\ &= \sum_{i} \frac{\partial{J}}{\partial{z_{i}^{l+1}}} \cdot \frac{\partial{z_{i}^{l+1}}}{\partial{a_{j}^{l}}} \cdot \frac{\partial{a_{j}^{l}}}{\partial{z_{j}^{l}}} \\ &= \sum_{i} \delta_{i}^{l+1} \cdot \frac{\partial{w_{ij}^{l+1}a_{j}^{l} + b_{i}^{l+1}}}{\partial{a_{j}^{l}}} \cdot \sigma^{'}(z_{j}^{l}) \\ &=\sum_{i} \delta_{i}^{l+1} \cdot w_{ij}^{l+1} \cdot \sigma^{'}(z_{j}^{l}) \end{aligned}δjl​​=∂zjl​∂J​=∂ajl​∂J​⋅∂zjl​∂ajl​​=i∑​∂zil+1​∂J​⋅∂ajl​∂zil+1​​⋅∂zjl​∂ajl​​=i∑​δil+1​⋅∂ajl​∂wijl+1​ajl​+bil+1​​⋅σ′(zjl​)=i∑​δil+1​⋅wijl+1​⋅σ′(zjl​)​

δl=((w l+1)Tδ l+1)⊙σ′(zl)\delta^{l} = \left( \left( w^{l+1} \right)^{T} \delta^{l+1} \right) \odot \sigma^{'}(z^{l})δl=((wl+1)Tδl+1)⊙σ′(zl)

则通过损失函数我们可以计算权重的梯度为：

∂J∂w ji l=∂J∂zjl⋅∂zjl∂w ji l=δjl⋅∂(w ji lai l−1+bjl)∂w ji l=δjl⋅ai l−1\begin{aligned} \frac{\partial{J}}{\partial{w_{ji}^{l}}} &= \frac{\partial{J}}{\partial{z_{j}^{l}}} \cdot \frac{\partial{z_{j}^{l}}}{\partial{w_{ji}^{l}}} \\ &= \delta_{j}^{l} \cdot \frac{\partial{\left( w_{ji}^{l}a_{i}^{l-1} + b_{j}^{l} \right)}}{\partial{w_{ji}^{l}}} \\ &= \delta_{j}^{l} \cdot a_{i}^{l-1} \end{aligned}∂wjil​∂J​​=∂zjl​∂J​⋅∂wjil​∂zjl​​=δjl​⋅∂wjil​∂(wjil​ail−1​+bjl​)​=δjl​⋅ail−1​​

∂J∂w ji l=δjl⋅ai l−1\frac{\partial{J}}{\partial{w_{ji}^{l}}} = \delta_{j}^{l} \cdot a_{i}^{l-1}∂wjil​∂J​=δjl​⋅ail−1​

最后，通过损失函数计算偏执的梯度为：

∂J∂bjl=∂J∂zjl⋅∂zjl∂bjl=δjl⋅∂w ji lai l−1+bjl∂bjl=δjl\begin{aligned} \frac{\partial{J}}{\partial{b_{j}^{l}}} &= \frac{\partial{J}}{\partial{z_{j}^{l}}} \cdot \frac{\partial{z_{j}^{l}}}{\partial{b_{j}^{l}}} \\ &= \delta_{j}^{l} \cdot \frac{\partial{w_{ji}^{l} a_{i}^{l-1} + b_{j}^{l}}}{\partial{b_{j}^{l}}} \\ &=\delta_{j}^{l} \end{aligned}∂bjl​∂J​​=∂zjl​∂J​⋅∂bjl​∂zjl​​=δjl​⋅∂bjl​∂wjil​ail−1​+bjl​​=δjl​​