前言
深度学习中的损失函数的选择,需要注意一点是直接衡量问题成功的指标不一定总可行。损失函数需要在只有小批量数据时即可计算,而且还必须可微。下表列出常见问题类型的最后一层以及损失函数的选择,仅供参考。
问题类型 | 最后一层激活 | 损失函数 |
---|---|---|
二分类问题 | sigmoid | binary_crossentropy |
多分类、单标签 | softmax | categorical_crossentropy |
多分类、多标签问题 | sigmoid | binary_crossentropy |
回归到任意值 | 无 | mse |
回归到0~1范围内的值 | sigmoid | mse或binary_crossentropy |
- 二分类问题
二分类:表示分类任务中有两个类别,比如我们想识别一幅图片是不是猫。也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y=0或1表示。二类分类是假设每个样本都被设置了一个且仅有一个标签 0 或者 1。 - 多分类问题
多类分类(Multiclass classification): 表示分类任务中有多个类别, 比如对一堆水果图片分类, 它们可能是橘子、苹果、梨等. 多类分类是假设每个样本都被设置了一个且仅有一个标签: 一个水果可以是苹果或者梨, 但是同时不可能是两者。 - 多标签分类
多标签分类(Multilabel classification): 给每个样本一系列的目标标签. 可以想象成一个数据点的各属性不是相互排斥的(一个水果既是苹果又是梨就是相互排斥的), 比如一个文档相关的话题. 一个文本可能被同时认为是宗教、政治、金融或者教育相关话题。
接下来我们从信息熵出发介绍交叉熵损失函数。
交叉熵损失函数
信息量
香农提出“信息是用来消除随机不确定的东西”。设一个事件发生的概率为 P ( x ) P(x) P(x),其信息量表示为: I ( x ) = − log ( P ( x ) ) I(x)=-\log(P(x)) I(x)=−log(P(x))
信息熵
信息熵描述所有信息量的期望,公式是 H ( X ) = − ∑ i = 1 n P ( x i ) log ( P ( x i ) ) , X = x 1 , x 2 , x 3 , . . . x n H(X)=-\sum^n_{i=1}P(x_i)\log(P(x_i)), X=x_1, x_2, x_3,... x_n H(X)=−i=1∑nP(xi)log(P(xi)),X=x1,x2,x3,...xn。以下用一个例子说明,假设明天周末,有三个活动:打球,逛街以及爬山,他们的概率以及对应的信息量如下表所示:
event | P | signal |
---|---|---|
打球 | 0.2 | − log ( 0.2 ) -\log(0.2) −log(0.2) |
逛街 | 0.3 | − log ( 0.3 ) -\log(0.3) −log(0.3) |
爬山 | 0.5 | − log ( 0.5 ) -\log(0.5) −log(0.5) |
那么信息熵 H ( X ) H(X) H(X)则为: H ( X ) = − ( 0.2 ∗ log ( 0.2 ) + 0.3 ∗ log ( 0.3 ) + 0.5 ∗ log ( 0.5 ) ) H(X)=-(0.2*\log(0.2)+0.3*\log(0.3)+0.5*\log(0.5)) H(X)=−(0.2∗log(0.2)+0.3∗log(0.3)+0.5∗log(0.5))
交叉熵
KL散度描述两个分布之间的差异:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
log
(
p
(
x
i
)
q
(
x
i
)
)
=
∑
i
=
1
n
p
(
x
i
)
log
(
p
(
x
i
)
)
)
−
∑
i
=
1
n
p
(
x
i
)
log
(
q
(
x
i
)
)
)
=
−
H
(
p
(
x
)
)
+
[
−
∑
i
=
1
n
p
(
x
i
)
log
(
q
(
x
i
)
)
)
]
D_{KL}(p||q)=\sum^n_{i=1}p(x_i)\log(\frac{p(x_i)}{q(x_i)}) \\=\sum^n_{i=1}p(x_i)\log(p(x_i)))-\sum^n_{i=1}p(x_i)\log(q(x_i)))\\=-H(p(x))+[-\sum^n_{i=1}p(x_i)\log(q(x_i)))]
DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=i=1∑np(xi)log(p(xi)))−i=1∑np(xi)log(q(xi)))=−H(p(x))+[−i=1∑np(xi)log(q(xi)))],其中
H
(
p
(
x
)
)
H(p(x))
H(p(x))表示信息熵,后者则为交叉熵:
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
log
(
q
(
x
i
)
)
)
H(p, q)=-\sum^n_{i=1}p(x_i)\log(q(x_i)))
H(p,q)=−i=1∑np(xi)log(q(xi)))
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
求导过程
交叉熵的公式是
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
log
(
q
(
x
i
)
)
)
H(p, q)=-\sum^n_{i=1}p(x_i)\log(q(x_i)))
H(p,q)=−i=1∑np(xi)log(q(xi))),为了好看,我们令
p
(
x
i
)
=
y
i
p(x_i)=y_i
p(xi)=yi,其中
y
i
y_i
yi表示真实label标签;
q
(
x
i
)
=
a
i
q(x_i)=a_i
q(xi)=ai,
a
i
a_i
ai表示神经元的输出。则交叉熵损失函数可以表示成:
C
o
s
t
=
−
∑
i
=
1
n
y
i
log
(
a
i
)
Cost=-\sum^n_{i=1}y_i\log(a_i)
Cost=−i=1∑nyilog(ai)。Softmax公式为:
S
i
=
e
z
i
∑
k
e
z
k
S_i=\frac{e^{z_i}}{\sum_ke^{z_k}}
Si=∑kezkezi。一个神经元的输出如下图所示:
假设神经元的输出为:
z
i
=
∑
j
w
x
j
x
x
j
+
b
z_i=\sum_jw_{xj}x_{xj}+b
zi=j∑wxjxxj+b,其中
w
i
j
w_{ij}
wij表示第
i
i
i个神经元第
j
j
j个权重。
z
i
z_i
zi通过softmax输出则是:
a
i
=
e
z
i
∑
k
e
z
k
a_i=\frac{e^{z_i}}{\sum_ke^{z_k}}
ai=∑kezkezi一切准备就绪,开始我们的反向推导。
-
求导公式 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ∂zi∂C根据复合函数求导法则: ∂ C ∂ z i = ∂ C ∂ a j ∂ a j ∂ z i \frac{\partial C}{\partial z_i}=\frac{\partial C}{\partial a_j}\frac{\partial a_j}{\partial z_i} ∂zi∂C=∂aj∂C∂zi∂aj这里可能有个疑问:对 z i z_i zi求导怎么会出现 a j a_j aj?这是因为
softmax
公式里面分母包含了所有神经元参数,这里需要分情况进行讨论。 -
对 ∂ C ∂ a j \frac{\partial C}{\partial a_j} ∂aj∂C求导: ∂ C ∂ a j = ∂ ( − ∑ j y j ln a j ) ∂ a j = − ∑ j y j 1 a j \frac{\partial C}{\partial a_j}=\frac{\partial(-\sum_jy_j\ln a_j)}{\partial a_j}=-\sum_jy_j\frac{1}{a_j} ∂aj∂C=∂aj∂(−∑jyjlnaj)=−j∑yjaj1
-
对 ∂ a j ∂ z i \frac{\partial a_j}{\partial z_i} ∂zi∂aj求导,需要分情况。
-
最后合在一起:
∑ j y j = 1 \sum_j y_j=1 ∑jyj=1,于是有: ∂ C ∂ z i = a i − y i \frac{\partial C}{\partial z_i}=a_i-y_i ∂zi∂C=ai−yi
应用
- 为什么用交叉熵,而不用均方差作为损失函数?
扩展
Binary_Crossentropy
二值交叉熵损失函数很好理解,就是取值只有0或者1的分类,他的公式是: H p ( q ) = − 1 N ∑ i = 1 N y i log ( p ( y i ) ) + ( 1 − y i ) log ( 1 − p ( y i ) ) H_p(q)=-\frac{1}{N}\sum_{i=1}^Ny_i\log(p(y_i))+(1-y_i)\log(1-p(y_i)) Hp(q)=−N1i=1∑Nyilog(p(yi))+(1−yi)log(1−p(yi))
均方差损失函数(MSE)
该损失函数通过计算真实值与预测值的欧式距离直观反馈了预测值与真实值得误差。预测值与真实值越接近,则两者的均方差越小。公式如下: l o s s = 1 2 ( z − y ) 2 ( 单 样 本 ) loss = \frac{1}{2}(z-y)^2 (单样本) loss=21(z−y)2(单样本), J = 1 2 m ∑ i = 1 m ( z i − y i ) 2 ( 多 样 本 ) J=\frac{1}{2m}\sum^m_{i=1}(z_i-y_i)^2 (多样本) J=2m1i=1∑m(zi−yi)2(多样本)具体案例可以参考:均方差损失函数
19个损失函数汇总:https://zhuanlan.zhihu.com/p/258395701