前馈运算
假设现在网络的参数收敛到 ω 1 , … , ω L − 1 \omega^{1}, \ldots, \omega^{L-1} ω1,…,ωL−1,进行feed- forward,将输入 x 1 x_1 x1送入网络,之后经过第一层操作 ω 1 \omega^1 ω1得到 x 2 x_2 x2,依次类推……直到得到输出 x L x_L xL,
反馈运算
深度学习模型通常采用随机梯度下降法(SGD)和误差反向传播(error back propogation)进行模型参数更新。
每层操作主要对应两部分:
1.用于参数更新的
∂
z
∂
ω
i
\frac{\partial z}{\partial \boldsymbol{\omega}^{i}}
∂ωi∂z,是误差关于参数
ω
i
{\omega}^{i}
ωi的导数
ω
i
←
ω
i
−
η
∂
z
∂
ω
i
(1)
\omega ^ { i } \leftarrow \omega ^ { i } - \eta \frac { \partial z } { \partial \omega^ { i } } \tag{1}
ωi←ωi−η∂ωi∂z(1)
η
\eta
η是每次SGD的步长(一般随epoch的增大而减小)
2.用于误差向前层的反向传播 ∂ z ∂ x i \frac{\partial z}{\partial \boldsymbol{x}^{i}} ∂xi∂z,是误差关于输入 x i x^i xi的导数。
下面,我们以第
i
i
i层参数更新为例,需要计算
∂
z
∂
ω
i
\frac{\partial z}{\partial \boldsymbol{\omega}^{i}}
∂ωi∂z和
∂
z
∂
x
i
\frac{\partial z}{\partial \boldsymbol{x}^{i}}
∂xi∂z,根据链式法则:
∂
z
∂
(
vec
(
ω
i
)
⊤
)
=
∂
z
∂
(
vec
(
x
i
+
1
)
⊤
)
⋅
∂
vec
(
x
i
+
1
)
∂
(
vec
(
ω
i
)
⊤
)
(2)
\frac{\partial z}{\partial\left(\operatorname{vec}\left(\boldsymbol{\omega}^{i}\right)^{\top}\right)}=\frac{\partial z}{\partial\left(\operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)^{\top}\right)} \cdot \frac{\partial \operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)}{\partial\left(\operatorname{vec}\left(\boldsymbol{\omega}^{i}\right)^{\top}\right)} \tag{2}
∂(vec(ωi)⊤)∂z=∂(vec(xi+1)⊤)∂z⋅∂(vec(ωi)⊤)∂vec(xi+1)(2)
∂ z ∂ ( vec ( x i ) ⊤ ) = ∂ z ∂ ( vec ( x i + 1 ) ⊤ ) ⋅ ∂ vec ( x i + 1 ) ∂ ( vec ( x i ) ⊤ ) (3) \frac{\partial z}{\partial\left(\operatorname{vec}\left(\boldsymbol{x}^{i}\right)^{\top}\right)}=\frac{\partial z}{\partial\left(\operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)^{\top}\right)} \cdot \frac{\partial \operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)}{\partial\left(\operatorname{vec}\left(\boldsymbol{x}^{i}\right)^{\top}\right)} \tag{3} ∂(vec(xi)⊤)∂z=∂(vec(xi+1)⊤)∂z⋅∂(vec(xi)⊤)∂vec(xi+1)(3)
对于(2)和(3)式右侧所需要的数,由第
i
+
1
i+1
i+1层的(3)式已经得到的有
∂
z
∂
x
i
+
1
\frac{\partial z}{\partial \boldsymbol{x}^{i+1}}
∂xi+1∂z,即两式+号左边的式子。同时,在前馈运算时的第
i
i
i层,
x
i
x^i
xi经
w
i
w^i
wi的作用得到
x
i
+
1
x^{i+1}
xi+1,反向求导可以直接得到
∂
vec
(
x
i
+
1
)
∂
(
vec
(
ω
i
)
⊤
)
\frac{\partial \operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)}{\partial\left(\operatorname{vec}\left(\boldsymbol{\omega}^{i}\right)^{\top}\right)}
∂(vec(ωi)⊤)∂vec(xi+1)和
∂
vec
(
x
i
+
1
)
∂
(
vec
(
x
i
)
⊤
)
\frac{\partial \operatorname{vec}\left(\boldsymbol{x}^{i+1}\right)}{\partial\left(\operatorname{vec}\left(\boldsymbol{x}^{i}\right)^{\top}\right)}
∂(vec(xi)⊤)∂vec(xi+1),即两式+号右边的式子。
再根据(1)式更新
i
i
i层的参数,并将
∂
z
∂
x
i
+
1
\frac{\partial z}{\partial \boldsymbol{x}^{i+1}}
∂xi+1∂z作为误差传到
i
−
1
i-1
i−1层。不断循环直到第1层,完成一个mini-batch的参数更新。
魏秀参《解析卷积神经网络——深度学习实践手册》