一、前向传播
在前向传播过程中,要保留神经元的输出。
二、梯度下降
首先定义残差,设有 L 层,损失为 c ∂ c ∂ z j L = ∂ c ∂ a j L ⋅ ∂ a j L ∂ z j L = δ j L \frac{\partial c}{\partial z_j^L}=\frac{\partial c}{\partial a_j^L}\cdot \frac{\partial a_j^L}{\partial z_j^L}=\delta_j^L ∂zjL∂c=∂ajL∂c⋅∂zjL∂ajL=δjL 对于网络中,任意一层 l ∂ c ∂ z j l = ∑ k ∂ c ∂ z k l + 1 ⋅ ∂ z k l + 1 ∂ a j l ⋅ ∂ a j l ∂ z j l = ∑ k δ j l + 1 ⋅ w j k l + 1 ⋅ ∂ a j l ∂ z j l = δ j l \begin{aligned} \frac{\partial c}{\partial z_j^l} &= \sum_k \frac{\partial c}{\partial z_k^{l+1}}\cdot \frac{\partial z_k^{l+1}}{\partial a_j^l} \cdot \frac{\partial a_j^{l}}{\partial z_j^l}\\ &=\sum_k \delta_j^{l+1} \cdot w_{jk}^{l+1} \cdot \frac{\partial a_j^{l}}{\partial z_j^l} \\ &= \delta_j^l \end{aligned} ∂zjl∂c=k∑∂zkl+1∂c⋅∂ajl∂zkl+1⋅∂zjl∂ajl=k∑δjl+1⋅wjkl+1⋅∂zjl∂ajl=δjl 然后计算参数的梯度 ∂ c ∂ w k j c = ∂ c ∂ z j l ⋅ ∂ z j l ∂ w k j l = δ l l ⋅ a k l − 1 \frac{\partial c}{\partial w_{kj}^c}=\frac{\partial c}{\partial z_j^l}\cdot \frac{\partial z_j^l}{\partial w_{kj}^l}=\delta_l^l \cdot a_k^{l-1} ∂wkjc∂c=∂zjl∂c⋅∂wkjl∂zjl=δll⋅akl−1 w k j ← w k j − l r ⋅ ∂ c ∂ w i j w_{kj} \leftarrow w_{kj}-lr \cdot \frac{\partial c}{\partial w_{ij}} wkj←wkj−lr⋅∂wij∂c
三、交叉熵反向传播
损失函数 L = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] , y = σ ( h θ ( x ) ) L=-[ylog\hat{y}+(1-y)log(1-\hat{y})], y=\sigma(h_\theta(x)) L=−[ylogy^+(1−y)log(1−y^)],y=σ(hθ(x)) 所以其导数为 ∂ L ∂ θ j = − [ y ⋅ 1 y ^ ⋅ ∂ y ^ ∂ θ j + ( 1 − y ) ⋅ 1 1 − y ^ ⋅ ( − 1 ) ⋅ ∂ y ^ ∂ θ j ] = − [ y ⋅ 1 σ ⋅ σ ⋅ ( 1 − σ ) ⋅ ∂ h θ ( x ) ∂ θ j + ( 1 − y ) ⋅ σ ⋅ ( 1 − σ ) 1 − σ ⋅ ( − 1 ) ∂ h θ ( x ) ∂ θ j ] = ( σ − y ) ∂ h θ ( x ) ∂ θ j \begin{aligned} \frac{\partial L}{\partial \theta_j} &= -[y\cdot \frac{1}{\hat y}\cdot \frac{\partial \hat y}{\partial \theta_j} +(1-y)\cdot \frac{1}{1-\hat y} \cdot (-1) \cdot \frac{\partial \hat y}{\partial\theta_j}]\\ &=-[y\cdot \frac{1}{\sigma}\cdot\sigma \cdot(1-\sigma)\cdot \frac{\partial h_\theta(x)}{\partial \theta_j}+(1-y)\cdot\frac{\sigma\cdot(1-\sigma)}{1-\sigma}\cdot(-1)\frac{\partial h_\theta(x)}{\partial \theta_j}] \\ &= (\sigma -y)\frac{\partial h_\theta(x)}{\partial \theta_j}\end{aligned} ∂θj∂L=−[y⋅y^1⋅∂θj∂y^+(1−y)⋅1−y^1⋅(−1)⋅∂θj∂y^]=−[y⋅σ1⋅σ⋅(1−σ)⋅∂θj∂hθ(x)+(1−y)⋅1−σσ⋅(1−σ)⋅(−1)∂θj∂hθ(x)]=(σ−y)∂θj∂hθ(x)
四、softmax+交叉熵损失求梯度
softmax函数为
p
=
e
z
k
∑
k
e
z
k
p = \frac{e^{z_k}}{\sum_k e^{z_k}}
p=∑kezkezk
令前一层的输出是
a
p
a_p
ap,输入参数为
w
p
k
w_{pk}
wpk ,激活函数前的输出
z
k
=
∑
p
w
p
k
a
p
z_k =\sum_p w_{pk}a_p
zk=∑pwpkap,输出
a
k
=
e
z
k
∑
k
e
z
k
a_k= \frac{e^{z_k}}{\sum_k e^{z_k}}
ak=∑kezkezk,
那么损失为
L
=
∑
k
y
k
log
a
k
L=\sum_k y_k\log a_k
L=k∑yklogak 因为最后的预测为其中一类,设预测为第 j 类,那么
L
=
y
j
log
a
j
L = y_j\log a_j
L=yjlogaj,
y
j
y_j
yj 为 1,
L
=
log
a
j
L=\log a_j
L=logaj
∂
L
∂
w
p
k
=
∂
L
∂
a
j
⋅
∂
a
j
∂
z
i
⋅
∂
z
i
∂
w
p
k
=
∂
L
∂
a
j
⋅
∂
a
j
∂
z
i
⋅
a
p
\frac{\partial L}{\partial w_{pk}}=\frac{\partial L}{\partial a_j}\cdot \frac{\partial a_j}{\partial z_i}\cdot \frac{\partial z_i}{\partial w_{pk}}=\frac{\partial L}{\partial a_j}\cdot \frac{\partial a_j}{\partial z_i}\cdot a_p
∂wpk∂L=∂aj∂L⋅∂zi∂aj⋅∂wpk∂zi=∂aj∂L⋅∂zi∂aj⋅ap
当
i
=
j
i=j
i=j 时,也就是第 i 类的
z
i
z_i
zi 求偏导
∂
a
j
∂
z
i
=
∂
(
e
z
j
∑
k
e
z
k
)
∂
z
i
=
∂
(
e
z
j
∑
k
e
z
k
)
∂
z
j
=
e
z
j
∑
k
e
z
k
−
e
z
j
e
z
j
[
∑
k
e
z
k
]
2
=
e
z
j
∑
k
e
z
k
(
1
−
e
z
j
∑
k
e
z
k
)
=
a
j
(
1
−
a
j
)
\begin{aligned} \frac{\partial a_j}{\partial z_i} &= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_i}\\&= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_j} \\ &= \frac{e^{z_j}}{\sum_ke^{z_k}}-\frac{e^{z_j}e^{z_j}}{[\sum_ke^{z_k}]^2} \\ &= \frac{e^{z_j}}{\sum_ke^{z_k}}(1- \frac{e^{z_j}}{\sum_ke^{z_k}})\\&=a_j(1-a_j)\end{aligned}
∂zi∂aj=∂zi∂(∑kezkezj)=∂zj∂(∑kezkezj)=∑kezkezj−[∑kezk]2ezjezj=∑kezkezj(1−∑kezkezj)=aj(1−aj) 当
i
≠
j
i\neq j
i=j 时,
∂
a
j
∂
z
i
=
∂
(
e
z
j
∑
k
e
z
k
)
∂
z
i
=
0
∑
k
e
z
k
−
e
z
j
e
z
i
[
∑
k
e
z
k
]
2
=
−
a
j
a
i
\begin{aligned} \frac{\partial a_j}{\partial z_i} &= \frac{\partial(\frac{e^{z_j}}{\sum_ke^{z_k}})}{\partial z_i}\\&=\frac{0}{\sum_ke^{z_k}}-\frac{e^{z_j}e^{z_i}}{[\sum_ke^{z_k}]^2} \\ &=-a_ja_i \end{aligned}
∂zi∂aj=∂zi∂(∑kezkezj)=∑kezk0−[∑kezk]2ezjezi=−ajai 所以,当
i
=
j
i=j
i=j 时,
∂
L
∂
z
i
=
−
1
a
j
⋅
(
−
a
j
a
i
)
=
a
i
\frac{\partial L}{\partial z_i}=-\frac{1}{a_j}\cdot (-a_ja_i)=a_i
∂zi∂L=−aj1⋅(−ajai)=ai 当
i
≠
j
i\neq j
i=j 时,
∂
L
∂
z
i
=
−
1
a
j
⋅
a
j
(
1
−
a
j
)
=
a
j
−
1
\frac{\partial L}{\partial z_i}=-\frac{1}{a_j}\cdot a_j(1-a_j)=a_j-1
∂zi∂L=−aj1⋅aj(1−aj)=aj−1
五、梯度消失和爆炸
5.1 梯度爆炸
5.1.1 什么是梯度爆炸
梯度爆炸指的是神经网络在训练过程中大的误差梯度不断累积,导致模型权重出现重大更新,造成模型的不稳定,无法利用训练数据进行学习。
误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。在深层网络或者循环神经网络中,误差梯度可以再更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定,在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值。
5.1.2 梯度爆炸解决办法
- 重新设计网络模型
在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。同时使用更新小的batch也有好处。 - 使用ReLU激活函数
在深度多层感知机神经网络,梯度爆炸的发生可能是因为激活函数。 - 梯度裁剪
- 权重正则化
5.2 梯度消失
- 更换激活函数,使用 relu 等
- Batch Normalization
- 更换网络,使用 resnet 或者 LSTM
- 使用预训练的网络加fine-tuning