假设
假设有三个分类,模型输出值为 output = model(input)
,得到如下输出向量
[
o
1
,
o
2
,
o
3
]
[o_1,o_2,o_3]
[o1,o2,o3]
表示每个类别的概率值,然后将该向量进行 softmax 操作,得到
[
S
1
,
S
2
,
S
3
]
[S_1,S_2,S_3]
[S1,S2,S3],
S
i
S_i
Si 的计算公式为:
S
i
=
e
o
i
∑
e
o
k
=
e
o
i
e
o
0
+
e
o
1
+
e
o
2
S_i = \frac{e^{o_i}}{\sum e^{o_k}} = \frac{e^{o_i}}{e^{o_0}+e^{o_1}+e^{o_2}}
Si=∑eokeoi=eo0+eo1+eo2eoi
导数的除法规则
( u v ) ′ = u ′ v − u v ′ v 2 \left(\frac{u}{v}\right)'=\frac{u'v-uv'}{v^2} (vu)′=v2u′v−uv′
求导
使用链式法则反向传播误差,例如
∂
L
∂
ω
=
∂
L
∂
S
∂
S
∂
o
∂
o
∂
ω
\frac{\partial L}{\partial \omega} = \frac{\partial L}{\partial S} \frac{\partial S}{\partial o} \frac{\partial o}{\partial \omega}
∂ω∂L=∂S∂L∂o∂S∂ω∂o
需要求得
S
i
S_i
Si (
S
i
S_i
Si 是经过 argmax 或者其他方式选出来的
[
S
1
,
S
2
,
S
3
]
[S_1,S_2,S_3]
[S1,S2,S3] 中的某个值)与每个输出值
o
i
o_i
oi 的偏微分,即
∂
S
i
∂
o
j
\frac{\partial S_i}{\partial o_j}
∂oj∂Si
这里分两种情况,当
i
=
j
i = j
i=j 时 ,根据导数的除法规则
∂
S
i
∂
o
i
=
∂
∂
o
j
(
e
o
i
∑
e
o
k
)
=
e
o
i
∑
e
o
k
−
e
o
i
e
o
i
(
∑
e
o
k
)
2
=
S
i
−
S
i
2
=
S
i
(
1
−
S
i
)
\begin{aligned} \frac{\partial S_i}{\partial o_i}&=\frac{\partial}{\partial o_j}\left( \frac{e^{o_i}}{\sum e^{o_k}}\right)\\&=\frac{e^{o_i}\sum e^{o_k} - e^{o_i}e^{o_i}}{(\sum e^{o_k})^2} \\ &=S_i-S_i^2 \\&=S_i(1-S_i) \end{aligned}
∂oi∂Si=∂oj∂(∑eokeoi)=(∑eok)2eoi∑eok−eoieoi=Si−Si2=Si(1−Si)
当
i
≠
j
i \neq j
i=j 时,
∂
S
i
∂
o
j
=
∂
∂
o
j
(
e
o
i
∑
e
o
k
)
=
0
−
e
o
i
e
o
j
(
∑
e
o
k
)
2
=
−
S
i
S
j
\begin{aligned} \frac{\partial S_i}{\partial o_j}&=\frac{\partial}{\partial o_j}\left( \frac{e^{o_i}}{\sum e^{o_k}}\right)\\&=\frac{0- e^{o_i}e^{o_j}}{(\sum e^{o_k})^2} \\ &=-S_iS_j \end{aligned}
∂oj∂Si=∂oj∂(∑eokeoi)=(∑eok)20−eoieoj=−SiSj
CE + Softmax
CE 公式:
L
=
−
∑
y
i
log
S
i
L = -\sum{y_i \log{S_i}}
L=−∑yilogSi
所以
∂
L
∂
S
i
=
−
∑
y
i
1
S
i
\frac{\partial L}{\partial S_i} = -\sum y_i \frac{1}{S_i}
∂Si∂L=−∑yiSi1
所以
∂
L
∂
o
j
=
∂
L
∂
S
i
∂
S
i
∂
o
j
=
−
∑
i
=
j
y
i
1
S
i
(
S
i
(
1
−
S
i
)
)
+
∑
i
≠
j
y
i
1
S
i
(
S
i
S
j
)
=
−
∑
i
=
j
y
i
(
1
−
S
i
)
+
∑
i
≠
j
y
i
S
j
=
−
y
j
+
y
j
S
j
+
∑
i
≠
j
y
i
S
j
=
−
y
j
+
S
j
∑
y
i
\begin{aligned} \frac{\partial L}{\partial o_j} = \frac{\partial L}{\partial S_i}\frac{\partial S_i}{\partial o_j} &= -\sum_{i=j} y_i \frac{1}{S_i}(S_i(1-S_i))+\sum_{i \neq j}y_i \frac{1}{S_i}(S_iS_j) \\ &= -\sum_{i=j} y_i (1-S_i) + \sum_{i \neq j} y_iS_j \\ &=-y_j+y_jS_j + \sum_{i\neq j}y_iS_j \\ &=-y_j+S_j \sum y_i \end{aligned}
∂oj∂L=∂Si∂L∂oj∂Si=−i=j∑yiSi1(Si(1−Si))+i=j∑yiSi1(SiSj)=−i=j∑yi(1−Si)+i=j∑yiSj=−yj+yjSj+i=j∑yiSj=−yj+Sj∑yi
因为 y i y_i yi 是 one hot 编码,或者 label smooth 后的值,所以其求和 ∑ y i = 1 \sum y_i =1 ∑yi=1
所以
∂
L
∂
o
j
=
S
j
−
y
j
\frac{\partial L}{\partial o_j} = S_j-y_j
∂oj∂L=Sj−yj
其中 S j S_j Sj 表示预测为第 j j j 类的概率值。
总结
使用 CE + Softmax ,在反向传播时,可以直接用 S j − y j S_j - y_j Sj−yj 作为反向传播的值 进行学习