Softmax-with-Loss层的计算图
概述
softmax 函数称为softmax 层,交叉熵误差称为Cross Entropy Error 层,两者的组合称为Softmax-with-Loss 层。Softmax-with-Loss 层可以画成所下图所示的计算图。
图A-1 的计算图中假定了一个进行3 类别分类的神经网络。从前面的层输入的是 ( a 1 , a 2 , a 3 ) (a_1, a_2, a_3) (a1,a2,a3),softmax 层输出 ( y 1 , y 2 , y 3 ) (y_1, y_2, y_3) (y1,y2,y3)。此外,教师标签是 ( t 1 , t 2 , t 3 ) (t_1, t_2, t_3) (t1,t2,t3),Cross Entropy Error 层输出损失L。
如图A-1 所示,Softmax-with-Loss 层的反向传播的结果为 ( y 1 − t 1 , y 2 − t 2 , y 3 − t 3 ) (y_1 − t_1, y_2 − t_2, y_3 − t_3) (y1−t1,y2−t2,y3−t3)。
正向传播
图A-1 的计算图中省略了Softmax 层和Cross Entropy Error 层的内容。这里,我们来画出这两个层的内容。
首先是Softmax层。softmax 函数可由下式表示。
y
k
=
e
a
k
∑
i
=
1
n
e
a
i
y_{k}=\frac{e^{a_{k}}}{\sum_{i=1}^{n}e^{a_{i}}}
yk=∑i=1neaieak
因此,用计算图表示Softmax层的话,则如图A-2 所示。图A-2 的计算图中,指数的和(相当于上式的分母)简写为S,最终的输出记为
(
y
1
,
y
2
,
y
3
)
(y_1, y_2, y_3)
(y1,y2,y3)。
接下来是Cross Entropy Error 层。交叉熵误差可由下式表示。
L
=
−
∑
k
t
k
log
y
k
L=-\sum_{k}t_{k}\log y_{k}
L=−k∑tklogyk
根据上式,Cross Entropy Error 层的计算图可以画成图A-3 那样。
图A-3 的计算图很直观地表示出了上式,所以应该没有特别难的地方。下一节,我们将看一下反向传播。
反向传播
首先是Cross Entropy Error 层的反向传播。Cross Entropy Error 层的反向传播可以画成图A-4 那样。
求这个计算图的反向传播时,要注意下面几点。
- 反向传播的初始值(图A-4中最右边的值)是1( 因为 ∂ L ∂ L = 1 \frac{\partial L}{\partial L}=1 ∂L∂L=1 )。
- “ ×”节点的反向传播将正向传播时的输入值翻转,乘以上游传过来的导数后,再传给下游。
- “ +”节点将上游传来的导数原封不动地传给下游。
- “ log”节点的反向传播遵从
y = log x y=\log x y=logx
∂ y ∂ x = 1 x \frac{\partial y}{\partial x}=\frac{1}{x} ∂x∂y=x1
遵从以上几点,就可以轻松求得Cross Entropy Error 的反向传播。结果 ( − t 1 y 1 , − t 2 y 2 , − t 3 y 3 ) (-\frac{t_1}{y_1},-\frac{t_2}{y_2},-\frac{t_3}{y_3}) (−y1t1,−y2t2,−y3t3)是传给Softmax层的反向传播的输入。
下面是Softmax 层的反向传播的步骤。因为Softmax 层有些复杂,所以我们来逐一进行确认。
步骤1
前面的层(Cross Entropy Error 层)的反向传播的值传过来。
步骤2
”ד节点将正向传播的值翻转后相乘。这个过程中会进行下面的计算。
−
t
1
y
1
e
a
1
=
−
t
1
S
e
a
1
e
a
1
=
−
t
1
S
-\frac{t_1}{y_1}e^{a_1} = -t_{1}\frac{S}{e^{a_1}}e^{a_1} = -t_{1}S
−y1t1ea1=−t1ea1Sea1=−t1S
步骤3
正向传播时若有分支流出,则反向传播时它们的反向传播的值会相加。因此,这里分成了三支的反向传播的值 ( − t 1 S , − t 2 S , − t 3 S ) (−t_1S, −t_2S, −t_3S) (−t1S,−t2S,−t3S) 会被求和。然后,还要对这个相加后的值进行“/”节点的反向传播,结果为 1 S ( t 1 + t 2 + t 3 ) \frac{1}{S}(t_1+t_2+t_3) S1(t1+t2+t3)。这里, ( t 1 , t 2 , t 3 ) (t_1,t_2,t_3) (t1,t2,t3) 是教师标签,也是one-hot 向量。one-hot 向量意味着 ( t 1 , t 2 , t 3 ) (t_1,t_2,t_3) (t1,t2,t3)中只有一个元素是1,其余都是0。因此, ( t 1 , t 2 , t 3 ) (t_1,t_2,t_3) (t1,t2,t3)的和为1。
步骤4
“+”节点原封不动地传递上游的值。
步骤5
“×”节点将值翻转后相乘。这里,式子变形时使用了
y
1
=
e
a
1
S
y_1=\frac{e^{a_1}}{S}
y1=Sea1
步骤6
“exp”节点中有下面的关系式成立。
y
=
e
x
y=e^x
y=ex
∂ y ∂ x = e x \frac{\partial y}{\partial x}=e^x ∂x∂y=ex
根据这个式子,向两个分支的输入和乘以 e a 1 e^{a_{1}} ea1后的值就是我们要求的反向传播。用式子写出来的话,就是 ( 1 S − t 1 e a 1 ) e a 1 (\frac{1}{S}-\frac{t_1}{e^{a_1}})e^{a_1} (S1−ea1t1)ea1,整理之后为 y 1 − t 1 y_1 − t_1 y1−t1。综上,我们推导出,正向传播时输入是 a 1 a_1 a1 的节点,它的反向传播是 y 1 − t 1 y_1 − t_1 y1−t1。剩下的 a 2 a_2 a2、 a 3 a_3 a3 也可以按照相同的步骤求出来(结果分别为 y 2 − t 2 y_2 − t_2 y2−t2 和 y 3 − t 3 y_3 − t_3 y3−t3)。此外,除了这里介绍的3 类别分类外,对于n类别分类的情况,也可以推导出同样的结果。
小结
上面,我们画出了Softmax-with-Loss 层的计算图的全部内容,并求了它的反向传播。未做省略的Softmax-with-Loss 层的计算图如图所示。
图A-5 的计算图看上去很复杂,但是使用计算图逐个确认的话,求导(反向传播的步骤)也并没有那么复杂。除了这里介绍的Softmax-with-Loss 层,遇到其他看上去很难的层(如Batch Normalization 层)时,请一定按照这里的步骤思考一下。相信会比只看数学式更容易理解。