深度学习的发展趋势
回顾一下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组队学习,仅仅结合自己的理解略加修改。
- Datawhale2021年12月组队学习开源文档P13深度学习简介
- Datawhale2021年12月组队学习开源文档P14反向传播