深度学习——误差计算与梯度推导
1、均方误差(MSE)
1.1 均方误差(MSE)概述
均方误差是一种常见的损失函数,一般在回归问题中比较常见,其基本公式为:
M
S
E
=
1
C
∑
i
=
1
L
(
y
r
i
−
y
i
)
2
MSE=\frac{1}{C}∑_{i=1}^L(y_{ri}-y_i)^2
MSE=C1i=1∑L(yri−yi)2
其中,C是一个超参数,为了便于求导,一般情况下取C=2。
y
r
i
y_{ri}
yri是真实的标签值的第i个属性值,
y
i
y_i
yi表示预测值的第i个属性值。
1.2 均方误差的梯度
下面假设:
J
=
M
S
E
=
1
C
∑
i
=
1
L
(
y
r
i
−
y
i
)
2
J=MSE=\frac{1}{C}∑_{i=1}^L(y_{ri}-y_i)^2
J=MSE=C1i=1∑L(yri−yi)2
则有:
2
J
∂
y
i
=
∂
1
C
∑
i
=
1
L
(
y
r
i
−
y
i
)
2
∂
y
i
=
2
C
(
y
r
i
−
y
i
)
∗
(
−
1
)
=
2
C
(
y
i
−
y
r
i
)
\frac{2J}{∂y_i}=\frac{∂\frac{1}{C}∑_{i=1}^L(y_{ri}-y_i)^2}{∂y_i}=\frac{2}{C}(y_{ri}-y_i)*(-1)=\frac{2}{C}(y_i-y_{ri})
∂yi2J=∂yi∂C1∑i=1L(yri−yi)2=C2(yri−yi)∗(−1)=C2(yi−yri)
整理成向量的形式有:
2
J
∂
y
=
2
C
∗
y
1
−
y
r
1
y
2
−
y
r
2
…
…
y
L
−
y
r
L
\frac{2J}{∂y}=\frac{2}{C}* \begin{matrix} y_1 - y_{r1} \\ y_2 - y_{r2}\\ ……\\ y_L - y_{rL} \end{matrix}
∂y2J=C2∗y1−yr1y2−yr2……yL−yrL
2 sotfmax + 交叉熵
2.1 简单介绍
sotfmax和交叉熵通常被用于分类任务中,其中,softmax的定义为:
y
i
=
e
o
i
∑
j
=
1
L
e
o
j
y_i = \frac{e^{o_i}}{∑_{j=1}^Le^{o_j}}
yi=∑j=1Leojeoi
其中,
o
i
o_i
oi表示输出单元输出的第i个属性值,一般情况下,
y
i
y_i
yi表示属于第i类的概率。
交叉熵的损失函数定义为:
J
=
−
∑
i
=
1
L
y
r
i
l
n
(
y
i
)
J = - ∑_{i=1}^Ly_{ri}ln(y_i)
J=−i=1∑Lyriln(yi)
其中
y
r
i
y_{ri}
yri表示真实的第i类的概率值。
一般情况下,softmax产生的是一个L维的概率分布Y。而真实向量 Y r Y_r Yr是一个01向量,1表示对应的分类。0表示不是该分类。
2.2 梯度计算
现在,我们假设在真实的分类向量 Y r Y_r Yr中,对应的是第s个分类。则有 y s = 1 , y i ≠ s = 0 y_s=1,y_{i≠s}=0 ys=1,yi=s=0。
我们分成两种情况:
-
当i=s的时候,有:
J = − y r s l n ( y s ) J = - y_{rs}ln(y_s) J=−yrsln(ys)
y s = e o s ∑ j = 1 L e o j y_s = \frac{e^{o_s}}{∑_{j=1}^Le^{o_j}} ys=∑j=1Leojeos
则有:
∂ J ∂ o s = ∂ J ∂ y s ∗ ∂ y s ∂ o s = ∂ ( − y r s l n ( y s ) ) ∂ y s ∗ ∂ e o s ∑ j = 1 L e o j ∂ o s \frac{∂J}{∂o_s}=\frac{∂J}{∂y_s}*\frac{∂y_s}{∂o_s}=\frac{∂( - y_{rs}ln(y_s))}{∂y_s}*\frac{∂\frac{e^{o_s}}{∑_{j=1}^Le^{o_j}}}{∂o_s} ∂os∂J=∂ys∂J∗∂os∂ys=∂ys∂(−yrsln(ys))∗∂os∂∑j=1Leojeos
根据 J 和 y s J和y_s J和ys进一步化简有:
∂ ( − y r s l n ( y s ) ) ∂ y s = − y r s ∗ 1 y s \frac{∂( - y_{rs}ln(y_s))}{∂y_s}=-y_{rs}*\frac{1}{y_s} ∂ys∂(−yrsln(ys))=−yrs∗ys1
∂ e o s ∑ j = 1 L e o j ∂ o s = e o s ∗ ( ∑ j = 1 L e o j − e o s ) ( ∑ j = 1 L e o j ) 2 \frac{∂\frac{e^{o_s}}{∑_{j=1}^Le^{o_j}}}{∂o_s}=\frac{e^{o_s}*(∑_{j=1}^Le^{o_j}-e^{o_s})}{(∑_{j=1}^Le^{o_j})^2} ∂os∂∑j=1Leojeos=(∑j=1Leoj)2eos∗(∑j=1Leoj−eos)
将上式带入到原始的式子中,有:
∂ J ∂ o s = − y r s ∗ ∑ j = 1 L e o j e o s ∗ e o s ∗ ( ∑ j = 1 L e o j − e o s ) ( ∑ j = 1 L e o j ) 2 = − y r s ∗ ( 1 − y s ) \frac{∂J}{∂o_s}=-y_{rs}*\frac{∑_{j=1}^Le^{o_j}}{e^{o_s}}*\frac{e^{o_s}*(∑_{j=1}^Le^{o_j}-e^{o_s})}{(∑_{j=1}^Le^{o_j})^2}=-y_{rs}*(1-y_s) ∂os∂J=−yrs∗eos∑j=1Leoj∗(∑j=1Leoj)2eos∗(∑j=1Leoj−eos)=−yrs∗(1−ys) -
当i≠s的时候,有:
J = − y r s l n ( y s ) J = - y_{rs}ln(y_s) J=−yrsln(ys)
y i = e o i ∑ j = 1 L e o j y_i = \frac{e^{o_i}}{∑_{j=1}^Le^{o_j}} yi=∑j=1Leojeoi
则有:
∂ J ∂ o i = ∂ J ∂ y s ∗ ∂ y s ∂ o i = − y r s ∗ 1 y s ∗ ∂ y s ∂ o i \frac{∂J}{∂o_i}=\frac{∂J}{∂y_s}*\frac{∂y_s}{∂o_i}=-y_{rs}*\frac{1}{y_s}*\frac{∂y_s}{∂o_i} ∂oi∂J=∂ys∂J∗∂oi∂ys=−yrs∗ys1∗∂oi∂ys
其中:
∂ y s ∂ o i = − e o s ∗ e o i ( ∑ j = 1 L e o j ) 2 \frac{∂y_s}{∂o_i}=\frac{-e^{o_s}*e^{o_i}}{(∑_{j=1}^Le^{o_j})^2} ∂oi∂ys=(∑j=1Leoj)2−eos∗eoi
带入到原式子之后:
∂ J ∂ o i = − y r s ∗ ∑ j = 1 L e o j e o s ∗ − e o s ∗ e o i ( ∑ j = 1 L e o j ) 2 = y r s ∗ y i \frac{∂J}{∂o_i}=-y_{rs}*\frac{∑_{j=1}^Le^{o_j}}{e^{o_s}}*\frac{-e^{o_s}*e^{o_i}}{(∑_{j=1}^Le^{o_j})^2}=y_{rs}*y_i ∂oi∂J=−yrs∗eos∑j=1Leoj∗(∑j=1Leoj)2−eos∗eoi=yrs∗yi -
最后,我们能够发现:根据 y r s = 1 y_{rs}=1 yrs=1,上面两种情况的计算结果可以化简为:
当i=s的时候,导数为:
y
s
−
1
=
y
s
−
y
r
s
y_s -1=y_s - y_{rs}
ys−1=ys−yrs
当i≠s的时候,导数为:
y
i
−
0
=
y
i
−
y
r
i
y_i - 0=y_i-y_{ri}
yi−0=yi−yri
由此可以总结出:
∂
J
∂
o
i
=
y
i
−
y
r
i
\frac{∂J}{∂o_i}=y_{i} - y_{ri}
∂oi∂J=yi−yri