深度学习的发展趋势
回顾一下deep learning的历史:
- 1958: Perceptron (linear model)
- 1969: Perceptron has limitation
- 1980s: Multi-layer perceptron
- Do not have significant difference from DNN today
- 1986: Backpropagation
- Usually more than 3 hidden layers is not helpful
- 1989: 1 hidden layer is “good enough”, why deep?
- 2006: RBM initialization (breakthrough)
- 2009: GPU
- 2011: Start to be popular in speech recognition
- 2012: win ILSVRC image competition 感知机(Perceptron)非常像我们的逻辑回归(Logistics Regression)只不过是没有sigmoid激活函数。09年的GPU的发展是很关键的,使用GPU矩阵运算节省了很多的时间。
Fully Connect Feedforward Network举例
也可以写成矩阵形式:
s
i
g
m
o
i
d
sigmoid
sigmoid
(
(
(权重w【黄色】
×
\times
× 输入【蓝色】
+
+
+ 偏移量b【绿色】
)
)
)
=
=
= 输出
反向传播
符号表示
- 损失函数(Loss function)是定义在单个训练样本上的,也就是就算一个样本的误差,比如我们想要分类,就是预测的类别和实际类别的区别,是一个样本的,用 l l l表示。
- 代价函数(Cost function)是定义在整个训练集上面的,也就是所有样本的误差的总和的平均,也就是损失函数的总和的平均,有没有这个平均其实不会影响最后的参数的求解结果。
- 总体损失函数(Total loss function)是定义在整个训练集上面的,也就是所有样本的误差的总和。也就是平时我们反向传播需要最小化的值,用 L L L表示。
如图,
C
n
C^n
Cn 是一个表示
y
n
y^n
yn 和
y
^
n
\hat{y}^n
y^n 之间距离的函数。
L
(
θ
)
L(\theta)
L(θ) (total loss)是总的
C
n
C^n
Cn 之和。
计算Loss对Params的偏导数
取一个Neuron来看
符号说明
如图,
x
1
,
x
2
x_1,x_2
x1,x2是input,
w
1
,
w
2
w_1, w_2
w1,w2是weight,
b
b
b是bias,
z
=
x
1
w
1
+
x
2
w
2
+
b
z=x_1w_1+x_2w_2+b
z=x1w1+x2w2+b是激活前的值,
a
a
a是经过途中蓝色神经元激活后(比如sigmoid)的值。
过程
我们要计算的目标是
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l, 由链式法则
∂
l
∂
w
=
∂
z
∂
w
×
∂
l
∂
z
\frac{\partial l}{\partial w}=\frac{\partial z}{\partial w}\times \frac{\partial l}{\partial z}
∂w∂l=∂w∂z×∂z∂l.
-
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z(Forward pass的部分)
- 可以秒算,因为 z = ∑ i = 1 n a i w i z=\sum_{i=1}^{n} a_iw_i z=∑i=1naiwi,其中 a i a_i ai是前一个神经元的输入,所以一个 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z就是 a a a.
-
∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l ( Backward pass的部分 )
- 初看貌似很复杂,但我们把整个网络方向反过来看,同样利用链式法则, ∂ l ∂ z = ∂ a ∂ z × ∂ l ∂ a \frac{\partial l}{\partial z}=\frac{\partial a}{\partial z} \times \frac{\partial l}{\partial a} ∂z∂l=∂z∂a×∂a∂l.
- ∂ a ∂ z \frac{\partial a}{\partial z} ∂z∂a即 σ ′ ( z ) \sigma'(z) σ′(z),当输入确定后,逐层迭代,它就是一个定值.
-
∂
l
∂
a
\frac{\partial l}{\partial a}
∂a∂l类比于正向传播,同样利用链式法则,
∂
l
∂
a
=
∑
i
=
1
n
∂
z
i
∂
a
×
∂
l
∂
z
i
\frac{\partial l}{\partial a}=\sum_{i=1}^n \frac{\partial z_i}{\partial a}\times\frac{\partial l}{\partial z_i}
∂a∂l=∑i=1n∂a∂zi×∂zi∂l
- 其中 ∂ z ∂ a \frac{\partial z}{\partial a} ∂a∂z可以秒算,就是 w i w_i wi(因为 z = ∑ i = 1 n a i w i z=\sum_{i=1}^{n} a_iw_i z=∑i=1naiwi)
-
∂
l
∂
z
i
\frac{\partial l}{\partial z_i}
∂zi∂l当确定了loss function(
l
(
y
,
y
^
)
l(y,\hat{y})
l(y,y^))之后也不复杂(常见的loss function比如交叉熵、mean square等)
……
套娃下去,从output往前看。
-
把 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z 和 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l相乘,我们就可以得到 ∂ l ∂ w \frac{\partial l}{\partial w} ∂w∂l, 即 ∂ l ∂ w = ∂ z ∂ w × ∂ l ∂ z \frac{\partial l}{\partial w}=\frac{\partial z}{\partial w}\times \frac{\partial l}{\partial z} ∂w∂l=∂w∂z×∂z∂l.
-
所有我们就可以得到神经网络中所有的参数,然后用梯度下降就可以不断更新,得到损失最小的函数。
例子
我成功的把自己也绕晕了,用一个简单的例子再梳理一下后向传播。
如图,从输出层往前看,
- 首先
∂
l
∂
z
5
=
∂
l
∂
y
1
×
∂
y
1
∂
z
5
=
σ
′
(
z
5
)
∂
l
∂
y
1
\frac{\partial l}{\partial z_5}=\frac{\partial l}{\partial y_1}\times\frac{\partial y_1}{\partial z_5} = \sigma'(z_5)\frac{\partial l}{\partial y_1}
∂z5∂l=∂y1∂l×∂z5∂y1=σ′(z5)∂y1∂l
同理 ∂ l ∂ z 6 = ∂ l ∂ y 6 × ∂ y 2 ∂ z 6 = σ ′ ( z 6 ) ∂ l ∂ y 2 \frac{\partial l}{\partial z_6}=\frac{\partial l}{\partial y_6}\times\frac{\partial y_2}{\partial z_6} = \sigma'(z_6)\frac{\partial l}{\partial y_2} ∂z6∂l=∂y6∂l×∂z6∂y2=σ′(z6)∂y2∂l
公式中每个量都是可算的,好的,那么目前为止,我们把 ∂ l ∂ z 5 , ∂ l ∂ z 6 \frac{\partial l}{\partial z_5},\frac{\partial l}{\partial z_6} ∂z5∂l,∂z6∂l直接当做已知量喽。 - 继续,
∂
l
∂
z
3
=
∂
l
∂
a
3
×
∂
a
3
∂
z
3
=
σ
′
(
z
3
)
∂
l
∂
a
3
\frac{\partial l}{\partial z_3}=\frac{\partial l}{\partial a_3}\times\frac{\partial a_3}{\partial z_3} = \sigma'(z_3)\frac{\partial l}{\partial a_3}
∂z3∂l=∂a3∂l×∂z3∂a3=σ′(z3)∂a3∂l
-
又因为 z 5 = w 11 ′ a 3 + w 21 ′ a 4 , z 6 = w 12 ′ a 3 + w 22 ′ a 4 z_5 = w_{11}'a_3+w_{21}'a_4, z_6 = w_{12}'a_3+w_{22}'a_4 z5=w11′a3+w21′a4,z6=w12′a3+w22′a4,即 a 3 a_3 a3与 z 5 , z 6 z_5, z_6 z5,z6都有关, a 3 a_3 a3是 z 5 , z 6 z_5, z_6 z5,z6的函数, 用 a 3 ( z 5 , z 6 ) a_3(z_5, z_6) a3(z5,z6)表示.
-
所以,继续链式法则: ∂ l ∂ a 3 = ∂ l ∂ z 5 × ∂ z 5 ∂ a 3 + ∂ l ∂ z 6 × ∂ z 6 ∂ a 3 \frac{\partial l}{\partial a_3}=\frac{\partial l}{\partial z_5}\times\frac{\partial z_5}{\partial a_3}+\frac{\partial l}{\partial z_6}\times\frac{\partial z_6}{\partial a_3} ∂a3∂l=∂z5∂l×∂a3∂z5+∂z6∂l×∂a3∂z6,由前面计算, ∂ l ∂ z 5 , ∂ l ∂ z 6 \frac{\partial l}{\partial z_5},\frac{\partial l}{\partial z_6} ∂z5∂l,∂z6∂l是已知量; ∂ z 5 ∂ a 3 = w 11 ′ , ∂ z 6 ∂ a 3 = w 12 ′ \frac{\partial z_5}{\partial a_3}=w_{11}', \frac{\partial z_6}{\partial a_3}=w_{12}' ∂a3∂z5=w11′,∂a3∂z6=w12′
-
整理得 ∂ l ∂ z 3 = ∂ l ∂ a 3 × ∂ a 3 ∂ z 3 = σ ′ ( z 3 ) ∂ l ∂ a 3 = σ ′ ( z 3 ) ( ∂ l ∂ z 5 w 11 ′ + ∂ l ∂ z 6 w 12 ′ ) \frac{\partial l}{\partial z_3}=\frac{\partial l}{\partial a_3}\times\frac{\partial a_3}{\partial z_3} = \sigma'(z_3)\frac{\partial l}{\partial a_3}=\sigma'(z_3)(\frac{\partial l}{\partial z_5}w_{11}'+\frac{\partial l}{\partial z_6}w_{12}') ∂z3∂l=∂a3∂l×∂z3∂a3=σ′(z3)∂a3∂l=σ′(z3)(∂z5∂lw11′+∂z6∂lw12′)
同理 ∂ l ∂ z 4 = ∂ l ∂ a 4 × ∂ a 4 ∂ z 4 = σ ′ ( z 4 ) ∂ l ∂ a 4 = σ ′ ( z 4 ) ( ∂ l ∂ z 5 w 21 ′ + ∂ l ∂ z 6 w 22 ′ ) \frac{\partial l}{\partial z_4}=\frac{\partial l}{\partial a_4}\times\frac{\partial a_4}{\partial z_4} = \sigma'(z_4)\frac{\partial l}{\partial a_4}=\sigma'(z_4)(\frac{\partial l}{\partial z_5}w_{21}'+\frac{\partial l}{\partial z_6}w_{22}') ∂z4∂l=∂a4∂l×∂z4∂a4=σ′(z4)∂a4∂l=σ′(z4)(∂z5∂lw21′+∂z6∂lw22′)
……
后面再继续套娃,即可第一层算出 ∂ l ∂ z \frac{\partial l}{\partial z} ∂z∂l
-
恩,滤了一遍,我把自己捋清楚了,但我估计看的人还是很晕。其实懂了之后过程很简单,就是有些繁琐,手写很快就捋完了,附一个手写版本。
参考文献
本文笔记摘自Datawhale组队学习,仅仅结合自己的理解略加修改。