这节课主要说了神经网络的一种求梯度方式:反向传播。原来只理解在链式求导上,而这节课阐述了反向传播实际也是在反向求一个神经网络
pdf 视频
梯度下降
不过是求线性回归、逻辑回归还是神经网络都是使用梯度下降方法:)
那么神经网络求梯度如下
网络参数:
θ
=
{
w
1
,
w
2
,
⋯
,
b
1
,
b
2
,
⋯
}
\theta=\left\{w_{1}, w_{2}, \cdots, b_{1}, b_{2}, \cdots\right\}
θ={w1,w2,⋯,b1,b2,⋯}
梯度为:
∇
L
(
θ
)
=
[
∂
L
(
θ
)
/
∂
w
1
∂
L
(
θ
)
/
∂
w
2
⋮
∂
L
(
θ
)
/
∂
b
1
∂
L
(
θ
)
/
∂
b
2
⋮
]
\begin{array}{l} \nabla \mathrm{L}(\theta) =\\ {\left[\begin{array}{c} \partial \mathrm{L}(\theta) / \partial w_{1} \\ \partial \mathrm{L}(\theta) / \partial w_{2} \\ \vdots \\ \partial \mathrm{L}(\theta) / \partial b_{1} \\ \partial \mathrm{L}(\theta) / \partial b_{2} \\ \vdots \end{array}\right]} \end{array}
∇L(θ)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡∂L(θ)/∂w1∂L(θ)/∂w2⋮∂L(θ)/∂b1∂L(θ)/∂b2⋮⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
然后更新:
Compute
∇
L
(
θ
0
)
θ
1
=
θ
0
−
η
∇
L
(
θ
0
)
Compute
∇
L
(
θ
1
)
θ
2
=
θ
1
−
η
∇
L
(
θ
1
)
\begin{array}{ll} \text { Compute } \nabla \mathrm{L}\left(\theta^{0}\right) & \theta^{1}=\theta^{0}-\eta \nabla \mathrm{L}\left(\theta^{0}\right) \\ \text { Compute } \nabla \mathrm{L}\left(\theta^{1}\right) & \theta^{2}=\theta^{1}-\eta \nabla \mathrm{L}\left(\theta^{1}\right) \end{array}
Compute ∇L(θ0) Compute ∇L(θ1)θ1=θ0−η∇L(θ0)θ2=θ1−η∇L(θ1)
但是这样做,参数太多了,因为是全连接,多层,很可能达到百万级参数,直接求太多参数了
但是有个有效的方法,反向传播(Backpropagation)。
个人认为和动态规划思想有点类似,共用底层的计算,稍后会介绍,实际上最底层的计算就是靠近输出层的梯度。
链式求导回顾
只有一条分支:
y
=
g
(
x
)
z
=
h
(
y
)
y=g(x) \quad z=h(y)
y=g(x)z=h(y)
Δ x → Δ y → Δ z \Delta x \rightarrow \Delta y \rightarrow \Delta z Δx→Δy→Δz
d z d x = d z d y d y d x \frac{d z}{d x}=\frac{d z}{d y} \frac{d y}{d x} dxdz=dydzdxdy
多条分支:
x
=
g
(
s
)
y
=
h
(
s
)
z
=
k
(
x
,
y
)
x=g(s) \quad y=h(s) \quad z=k(x, y)
x=g(s)y=h(s)z=k(x,y)
d
z
d
s
=
∂
z
∂
x
d
x
d
s
+
∂
z
∂
y
d
y
d
s
\frac{d z}{d s}=\frac{\partial z}{\partial x} \frac{d x}{d s}+\frac{\partial z}{\partial y} \frac{d y}{d s}
dsdz=∂x∂zdsdx+∂y∂zdsdy
反向传播
具体要求什么?要求梯度,损失的定义是交叉熵C之和:
L
(
θ
)
=
∑
n
=
1
N
C
n
(
θ
)
L(\theta)=\sum_{n=1}^{N} C^{n}(\theta)
L(θ)=n=1∑NCn(θ)
对一个w求偏导:
∂
L
(
θ
)
∂
w
=
∑
n
=
1
N
∂
C
n
(
θ
)
∂
w
\frac{\partial L(\theta)}{\partial w}=\sum_{n=1}^{N} \frac{\partial C^{n}(\theta)}{\partial w}
∂w∂L(θ)=n=1∑N∂w∂Cn(θ)
之前已经说过直接对C求w的偏导参数太多,可以拆成以下2步:(Forward pass) X (Backward pass)
利用链式求导:
∂
C
∂
w
=
∂
z
∂
w
∂
C
∂
z
\frac{\partial C}{\partial w}= \quad \frac{\partial z}{\partial w} \frac{\partial C}{\partial z}
∂w∂C=∂w∂z∂z∂C
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z就是Forward pass要求的
∂ C ∂ z \frac{\partial C}{\partial z} ∂z∂C就是Backward pass要求得
Forward pass
对所有参数计算 ∂ z / ∂ w \partial z / \partial w ∂z/∂w
∂ z / ∂ w 1 = x 1 ∂ z / ∂ w 2 = x 2 \begin{array}{l} \partial z / \partial w_{1}= x_{1} \\ \partial z / \partial w_{2}= x_{2} \end{array} ∂z/∂w1=x1∂z/∂w2=x2
为什么叫Forward pass可以看到,计算方向是Forward
Backward pass
对每个激活函数的输入z求 ∂ C / ∂ z \partial C / \partial z ∂C/∂z
∂
C
∂
z
=
∂
a
∂
z
∂
C
∂
a
\frac{\partial C}{\partial z}=\frac{\partial a}{\partial z} \frac{\partial C}{\partial a}
∂z∂C=∂z∂a∂a∂C
拆分:
∂
a
∂
z
=
σ
′
(
z
)
\frac{\partial a}{\partial z} = \sigma^{\prime}(z)
∂z∂a=σ′(z)
∂
C
∂
a
=
∂
z
′
∂
a
∂
C
∂
z
′
+
∂
z
′
′
∂
a
∂
C
∂
z
′
′
\frac{\partial C}{\partial a}=\frac{\partial z^{\prime}}{\partial a} \frac{\partial C}{\partial z^{\prime}}+\frac{\partial z^{\prime \prime}}{\partial a} \frac{\partial C}{\partial z^{\prime \prime}}
∂a∂C=∂a∂z′∂z′∂C+∂a∂z′′∂z′′∂C
所以:
∂ C ∂ z = σ ′ ( z ) [ w 3 ∂ C ∂ z ′ + w 4 ∂ C ∂ z ′ ′ ] \frac{\partial C}{\partial z}=\sigma^{\prime}(z)\left[w_{3} \frac{\partial C}{\partial z^{\prime}}+w_{4} \frac{\partial C}{\partial z^{\prime \prime}}\right] ∂z∂C=σ′(z)[w3∂z′∂C+w4∂z′′∂C]
这里回答了为什么可以把反向传播中Backward pass看做在求反向神经网络:
还剩最后一个问题就是 ∂ C ∂ z ′ \frac{\partial C}{\partial z^{\prime}} ∂z′∂C、 ∂ C ∂ z ′ ′ \frac{\partial C}{\partial z^{\prime \prime}} ∂z′′∂C不知道,但是如果 z ′ z^{\prime} z′、 z ′ ′ z^{\prime\prime} z′′的下一层就是输出层的话是可以直接计算的
∂
C
∂
z
′
=
∂
y
1
∂
z
′
∂
C
∂
y
1
∂
C
∂
z
′
′
=
∂
y
2
∂
z
′
′
∂
C
∂
y
z
\frac{\partial C}{\partial z^{\prime}}=\frac{\partial y_{1}}{\partial z^{\prime}} \frac{\partial C}{\partial y_{1}} \quad \frac{\partial C}{\partial z^{\prime \prime}}=\frac{\partial y_{2}}{\partial z^{\prime \prime}} \frac{\partial C}{\partial y_{z}}
∂z′∂C=∂z′∂y1∂y1∂C∂z′′∂C=∂z′′∂y2∂yz∂C
同理,如果在中间呢?一样可以计算(实际上可以由下一层计算,就还是套用上面公式,只不过把下一层做输入,输出到这层作为这层的输入。。。递推公式啦):
比如求
∂
C
∂
z
′
\frac{\partial C}{\partial z^{\prime}}
∂z′∂C:
这样一直往后推,直到输出层,此时就可以算出来来了,实际上没必要从中间推导,知道原理,从后玩前反向计算就很顺了:
总结
别忘了为什么要拆分:
∂
C
∂
w
=
∂
z
∂
w
∂
C
∂
z
\frac{\partial C}{\partial w}= \quad \frac{\partial z}{\partial w} \frac{\partial C}{\partial z}
∂w∂C=∂w∂z∂z∂C
既然各自都求得,那么乘起来就得到
∂
C
∂
w
\frac{\partial C}{\partial w}
∂w∂C
以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用