1. 交叉熵
交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。从数学角度上看,假设有两个概率分布,其中p表示真实分布,q表示非真实分布,在相同的一组事件中,交叉熵是用非真实分布q来表示某个事件发生所需要的平均比特数。
E
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
E = -\sum_xp(x)logq(x)
E=−x∑p(x)logq(x) 假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布,上式表示采用非真实分布q来表示真实分布p所需要的编码长度的期望。可见,交叉熵越小,两个分布差异性越小,因此交叉熵可以用来作为机器学习中的损失函数。
2. Sigmoid
我们知道交叉熵是衡量两个分布之间的差异性,那么这个分布怎么来的呢?先看个用于二分类的Sigmoid函数(关于Sigmoid参见博客)。
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac{1}{1+e^{-x}}
f(x)=1+e−x1 前面我们说过,Sigmoid与概率有着天然的联系,因此Sigmoid可以表示将样本预测为正例的概率,显然这可以用来作为二分类的评判指标。
2.1 Sigmoid 交叉熵损失函数 1
这种形式下假设真实样本的标签为 +1 和 0,分别表示正类和负类。
Sigmoid 函数的输出表征了当前样本预测标签为 1 的概率(关键:可以将二分类的结果转换为预测标签为1的概率):
y
^
=
P
(
y
=
1
∣
x
)
\hat{y} = P(y=1| x)
y^=P(y=1∣x)
那么当前样本预测标签为 0 的概率就可以表达成:
1
−
y
^
=
P
(
y
=
0
∣
x
)
1−\hat{y} = P(y=0|x)
1−y^=P(y=0∣x)
如果我们从极大似然性的角度出发,把上面两种情况整合到一起:
P
(
y
∣
x
)
=
y
^
y
⋅
(
1
−
y
^
)
1
−
y
P(y|x)=\hat{y}^y⋅(1−\hat{y})^{1−y}
P(y∣x)=y^y⋅(1−y^)1−y
显然,我们希望的是概率 P(y|x) 越大越好。首先,我们对 P(y|x) 引入 log 函数,因为 log 运算并不会影响函数本身的单调性:
l
o
g
P
(
y
∣
x
)
=
l
o
g
(
y
^
y
⋅
(
1
−
y
^
)
1
−
y
)
=
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
logP(y|x)=log(\hat{y}^y⋅(1−\hat{y})^{1−y}) = ylog\hat{y} + (1-y)log(1−\hat{y})
logP(y∣x)=log(y^y⋅(1−y^)1−y)=ylogy^+(1−y)log(1−y^)
根据凸优化理论,只要 log P(y|x) 取负值 - logP(y|x) 即为凸函数了,此时要求 - logP(y|x) 越小越好。那我们就可以引入损失函数Loss:
L
o
s
s
=
−
l
o
g
P
(
y
∣
x
)
=
−
[
y
l
o
g
y
^
+
(
1
−
y
)
l
o
g
(
1
−
y
^
)
]
Loss = - logP(y|x) = - [ylog\hat{y} + (1-y)log(1−\hat{y})]
Loss=−logP(y∣x)=−[ylogy^+(1−y)log(1−y^)]
2.2 Sigmoid 交叉熵损失函数 2
这种形式下假设真实样本的标签为 +1 和 -1,分别表示正类和负类。
Sigmoid函数一个性质:
1
−
g
(
s
)
=
g
(
−
s
)
1−g(s)=g(−s)
1−g(s)=g(−s)
前面说了 y = +1 时,下列等式成立:
P
(
y
=
+
1
∣
x
)
=
g
(
s
)
P(y=+1|x)=g(s)
P(y=+1∣x)=g(s)
如果 y = -1 时,并引入 Sigmoid 函数的性质,下列等式成立:
P
(
y
=
−
1
∣
x
)
=
1
−
g
(
s
)
=
g
(
−
s
)
P(y=−1|x)=1−g(s)=g(−s)
P(y=−1∣x)=1−g(s)=g(−s)
因为 y 取值为 +1 或 -1,可以把 y 值带入,将上面两个式子整合到一起:
P
(
y
∣
x
)
=
g
(
y
s
)
P(y|x)=g(ys)
P(y∣x)=g(ys)
与2.1节一样转化为Loss:
L
o
s
s
=
−
l
o
g
P
(
y
∣
x
)
=
−
l
o
g
g
(
y
s
)
=
−
l
o
g
1
1
+
e
−
y
s
=
l
o
g
(
1
+
e
−
y
s
)
Loss = - logP(y|x) = - logg(ys) = - log\frac{1}{1+e^{-ys}}= log(1+e^{-ys})
Loss=−logP(y∣x)=−logg(ys)=−log1+e−ys1=log(1+e−ys)
如果是 N 个样本,其交叉熵损失函数为:
L
=
∑
n
=
1
N
l
o
g
(
1
+
e
−
y
s
)
L= \sum_{n=1}^Nlog (1+e^{−ys})
L=n=1∑Nlog(1+e−ys)
思考一个问题,Sigmoid可以表示预测为正例的概率,那么多分类问题Sigmoid是否可以表达呢?可以转化为多个二分类问题,但是我们有个简洁的方式,继续往下看。
3. Softmax
根据2节我们知道Sigmoid可以用来进行二分类,那么Softmax是用于多分类一个很好的选择。
y
k
=
e
a
k
∑
i
=
1
n
e
a
i
y_k = \frac{e^{a_k}}{\sum_{i=1}^ne^{a_i}}
yk=∑i=1neaieak 其中,ai 为神经网络输出,n 为输出个数(即分类类别数)。
注:这一步其实就是对神经网络输出进行 归一化。
那么交叉熵损失函数为:
E
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
E = -\sum_xp(x)logq(x)
E=−x∑p(x)logq(x) 其中 x 表示各个分量,注意 p 与 q 分别表示真实分布与预测分布,E(p,q) != E(q,p)。
举个例子,假设有一个3分类问题,某个样例的正确答案是(1,0,0),这个模型经过softmax回归之后的预测答案是(0.5,0.4,0.1),那么预测和正确答案之间的交叉熵为:
E
(
(
1
,
0
,
0
)
,
(
0.5
,
0.4
,
0.1
)
)
=
−
[
1
×
l
o
g
(
0.5
)
+
0
×
l
o
g
(
0.4
)
+
0
×
l
o
g
(
0.1
)
]
≈
0.3
E((1,0,0),(0.5,0.4,0.1))=-[1×log(0.5) + 0×log(0.4)+0×log(0.1)]≈0.3
E((1,0,0),(0.5,0.4,0.1))=−[1×log(0.5)+0×log(0.4)+0×log(0.1)]≈0.3
如果另一个模型的预测是(0.8,0.1,0.1),那么这个预测值和真实值之间的交叉熵是:
E
(
(
1
,
0
,
0
)
,
(
0.8
,
0.1
,
0.1
)
)
=
−
[
1
×
l
o
g
(
0.8
)
+
0
×
l
o
g
(
0.1
)
+
0
×
l
o
g
(
0.1
)
]
≈
0.1
E((1,0,0),(0.8,0.1,0.1))=-[1×log(0.8) + 0×log(0.1)+0×log(0.1)]≈0.1
E((1,0,0),(0.8,0.1,0.1))=−[1×log(0.8)+0×log(0.1)+0×log(0.1)]≈0.1
显然我们看到第二个预测要优于第一个。这里的(1,0,0)就是正确答案p,(0.5,0.4,0.1)和(0.8,0.1,0.1)就是预测值q,显然用(0.8,0.1,0.1)表达(1,0,0)的困难程度更小。
思考一个问题:分类时,为什么不使用均方误差MSE而是使用交叉熵作为损失函数?
- MSE梯度消失问题(请比较两种 loss 对 weights 求导结果形式即可理解)。
- 交叉熵的损失函数只和分类正确的预测结果有关系,而MSE的损失函数还和错误分类有关系,该分类函数除了让正确的分类尽量变大,还会让错误的分类变得平均,但实际在分类问题中这个调整是没有必要的。