反向传播概述
为了有效的计算梯度,我们使用反向传播。
链式法则:
给定一组neural network参数
θ
\theta
θ, 我们把一个training data
x
n
x^n
xn带到neural network输出一个
y
n
y^n
yn,同时我们希望neural network输出
y
^
n
\hat{y}^n
y^n(target)。我们定义
y
n
y^n
yn和
y
^
n
\hat{y}^n
y^n距离的Function写作
C
n
C^n
Cn,
C
n
C^n
Cn大,loss大,这组参数不好。
把它所有training data根据这组参数得到的output和target之间的距离求和就得到了total loss(
L
(
θ
)
L(\theta)
L(θ))。把
L
(
θ
)
L(\theta)
L(θ)对摸一个参数
w
w
w做偏微分就得到了
∂
L
(
θ
)
∂
w
=
Σ
n
=
1
N
∂
C
n
(
θ
)
∂
w
\frac{\partial L(\theta)}{\partial w} = \Sigma_{n=1}^N \frac{\partial C^n(\theta)}{\partial w}
∂w∂L(θ)=Σn=1N∂w∂Cn(θ)。下面我们只要考虑某一笔training data 的loss对参数的偏微分(后面求和):
我们先考虑下面某一个neural:
这个neural是第一个layer的neural,所以她的输入是外界给他的
x
1
,
x
2
x_1,x_2
x1,x2。
以weight为例,看如何计算
∂
C
∂
w
\frac{\partial C}{\partial w}
∂w∂C:
根据链式法则,可以拆成两项: ∂ z ∂ w ∂ C ∂ z \frac{\partial z}{\partial w}\frac{\partial C}{\partial z} ∂w∂z∂z∂C
- Forward pass(前向过程):计算对于所有参数的 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z
- Backward pass(反向过程):计算对于所有激活函数输入z的 ∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C
反向传播-前向过程
计算对于所有参数的 ∂ z ∂ w \frac{\partial z}{\partial w} ∂w∂z
由权重所连接的输入值。
反向传播-反向过程
计算对于所有激活函数输入z的
∂
C
∂
z
\frac{\partial C}{\partial z}
∂z∂C
对于
∂
a
∂
z
\frac{\partial a}{\partial z}
∂z∂a,我们有
a
=
σ
a=\sigma
a=σ
σ
′
(
z
)
\sigma'(z)
σ′(z):
接下来,对于
∂
C
∂
a
\frac{\partial C}{\partial a}
∂a∂C,怎么算?
a与C的关系:a会影响
z
′
z'
z′、
z
′
′
z''
z′′,
z
′
z'
z′、
z
′
′
z''
z′′会影响C,所以:
∂
C
∂
z
=
∂
z
′
∂
a
∂
C
∂
z
′
+
∂
z
′
′
∂
a
∂
C
∂
z
′
′
\frac{\partial C}{\partial z} = \frac{\partial z'}{\partial a}\frac{\partial C}{\partial z'} + \frac{\partial z''}{\partial a}\frac{\partial C}{\partial z''}
∂z∂C=∂a∂z′∂z′∂C+∂a∂z′′∂z′′∂C
由于
z
′
=
a
w
3
+
.
.
.
z' = aw_3+...
z′=aw3+...,
z
′
′
=
a
w
4
+
.
.
.
z'' = aw_4+...
z′′=aw4+...
∂
C
∂
z
=
w
3
∂
C
∂
z
′
+
w
4
∂
C
∂
z
′
′
\frac{\partial C}{\partial z} = w_3\frac{\partial C}{\partial z'} + w_4\frac{\partial C}{\partial z''}
∂z∂C=w3∂z′∂C+w4∂z′′∂C
假设(*)我们通过某种方法把
∂
C
∂
z
′
,
∂
C
∂
z
′
′
\frac{\partial C}{\partial z'}, \frac{\partial C}{\partial z''}
∂z′∂C,∂z′′∂C算出来。那么
∂
C
∂
z
=
σ
′
(
z
)
[
w
3
∂
C
∂
z
′
+
w
4
∂
C
∂
z
′
′
]
\frac{\partial C}{\partial z} = \sigma'(z)[w_3\frac{\partial C}{\partial z'} + w_4\frac{\partial C}{\partial z''}]
∂z∂C=σ′(z)[w3∂z′∂C+w4∂z′′∂C]
我们假设有另一个神经元,输入是
∂
C
∂
z
′
,
∂
C
∂
z
′
′
\frac{\partial C}{\partial z'}, \frac{\partial C}{\partial z''}
∂z′∂C,∂z′′∂C,activate Function
σ
′
(
z
)
\sigma'(z)
σ′(z),那么输出为:
∂
C
∂
z
=
σ
′
(
z
)
[
w
3
∂
C
∂
z
′
+
w
4
∂
C
∂
z
′
′
]
\frac{\partial C}{\partial z} = \sigma'(z)[w_3\frac{\partial C}{\partial z'} + w_4\frac{\partial C}{\partial z''}]
∂z∂C=σ′(z)[w3∂z′∂C+w4∂z′′∂C]
给定z,
σ
′
(
z
)
\sigma'(z)
σ′(z)是常数,因为z在向前传递中已经确定。
最后,我们如果能算 ∂ C ∂ z ′ , ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z'}, \frac{\partial C}{\partial z''} ∂z′∂C,∂z′′∂C,那么问题就都解决了。
- 第一种情况红色的neural的output就是整个network的output:
∂ C ∂ y 1 \frac{\partial C}{\partial y_1} ∂y1∂C可以根据定义的Loss Function C算出来。 ∂ y 1 ∂ z ′ \frac{\partial y_1}{\partial z'} ∂z′∂y1根据激活函数算出。
- 第二种情况,不是最后一层:
那么,我们就重复上面假设(*),递归计算 ∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C,直到我们达到最后一层。
这种方法算反向过程很可怕,我们可以建立一个反向的network: