我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):
https://github.com/Sakura-gh/ML-notes
本节对应笔记:https://sakura-gh.github.io/ML-notes/ML-notes-html/9_Backpropagation.html
本节内容综述
- 反向传播就是更好地进行梯度下降的方法;
- 并不是很晦涩的数学属性,只需要知道
Chain Rule
;
- 本节课具体阐述了反向传播算法,具体都在“小细节”里。
小细节
Chain Rule

如上,定义了损失函数,进行了简单推导后,我们只需:
- 聚焦在
如何计算某一笔数据的偏微分
;
- 先考虑某一个神经元。
如上,将∂w∂l拆分成两项,前者
较容易计算,如下。

如下,对于某神经元,其输出对权重的偏微分就是输入。

而对于后者
∂z∂l,依然使用链式法则拆分。假设我们的 z 通过**函数得到 a 。即这个神经元的输出为 a=σ(z) 。接下来这个 a 会乘上下一层的权重,然后再加上其他的值得到下一神经元的输入 z′ … 我们这里先不管那么多,只考虑目前这个步骤。
有 ∂z∂l=∂z∂a∂a∂l
这里的 ∂z∂a 实际上就是简单的**函数微分σ′(z),如下图。

那么 ∂a∂l 是什么呢?
由 chain rule 可知
∂a∂l=∂a∂z′∂z′∂l+∂a∂z′′∂z′′∂l

如上图,首先易得 ∂a∂z′=w3 , ∂a∂z′′=w4 ,难点在于 ∂z′∂l 与 ∂z′‘∂l 。
先把其当成常数,把式子整理一下:
∂z∂l=σ′(z)[w3∂z′∂l+w4∂z′′∂l]
Back propagation - Backward pass

有没有注意到∂z∂l=σ′(z)[w3∂z′∂l+w4∂z′′∂l]
这个式子的形式和我们前面的∂z∂l=∂z∂a∂a∂l=σ′(z)∂a∂l
很像?
因此,我们可以想象一个新的“神经元”,其输入就是 ∂z′∂l 与 ∂z′′∂l ,输出是 ∂z∂l 。此外,因为 z 已经固定,σ′(z) 是一个常数;因此可以把这个神经元理解为一个放大器
。
Case 1. Output Layer
如果下面蓝色的神经元是隐藏层最后一层,那么此时就已知神经元输出,则由下式
∂z′∂l=∂z′∂y1∂y1∂l
一切都可计算:
-
∂z′∂y1 是**函数偏导;
-
∂y1∂l 是
loss 对
y1 偏微分。
Case 2:Not Output Layer
假设下图中红色的神经元并不是输出,那么:
-
z′ 经过**函数得到 a′ ;
-
a′ 继续到下一层,得到 za 和 zb 。

由上面的“放大器神经元”,我们知道有如下关系:
∂z′∂l=σ′(z′)[w5∂za∂l+w6∂zb∂l]
可见,尽管我们不知道当前 ∂z∂l 到底是多少,但是可以通过 ∂z′∂l 与 ∂z′′∂l 计算;而 ∂z′∂l 又可以由 ∂za∂l 和 ∂zb∂l 得到…由此,我们可以通过神经网络的反向传播(从 output layer 出发),一层层经过“放大器”,达到我们现在的神经元。

所以,我们算偏微分,是从后面的神经元开始算。如下。

先算 ∂z5∂l 与 ∂z6∂l 的偏微分,会很有效率。

接着后向传播,如上。
Summary

最后总结一下:
- 前向传播计算神经元对权重的偏微分;
- 后向传播计算目标值对神经元输出的偏微分;
- 二者相乘得到目标值对权重偏微分。