一、前言
在机器学习的论文里,KL散度是一个很常见的概念,但自己对这一概念总是很模糊,因此遍查资料做一总结。
二、信息熵
一条信息的信息量与其不确定性有直接关系。可以认为,信息量就等于不确定性的多少。如何量化信息量的度量呢?
如果要你猜一个我心中所想的0到9的数字,假设他们的出现是等概率的,那么为了减少猜测次数,我们总是对半猜,则可能的顺序可能为4(小了),7(大了),6(正确)。因此3~4次就能得到结果。所以,信息量的比特数和所有可能情况的对数函数log(以2为底)有关。log10=0.301。
则将0到9出现的概率分别标记为 p1,p2,……p10,则准确的信息量应该是
H = -(p1logp1+p2logp2+……p10logp10)
称为“信息熵”(Entropy)。因此,对于任意一个随机变量X,它的熵定义如下
H
(
X
)
=
−
∑
P
(
x
)
l
o
g
P
(
x
)
H(X) = -\sum P(x)logP(x)
H(X)=−∑P(x)logP(x)
三、相对熵与交叉熵
相对熵,KL散度是同一个东西。它是用来衡量两个取值为正数的函数的相似性
,定义如下
K
L
(
f
(
x
)
∣
∣
g
(
x
)
)
=
∑
f
(
x
)
l
o
g
f
(
x
)
g
(
x
)
KL(f(x) || g(x)) = \sum f(x)log\frac{f(x)}{g(x)}
KL(f(x)∣∣g(x))=∑f(x)logg(x)f(x)
对于此公式本身,只要知道以下三条结论即可
- 对于两个完全相同的函数,它们的相对熵等于零
- 相对熵越大,两个函数的差异越大;反之,相对熵越小则两个函数的差异越小
- 对于概率分布或者概率密度函数,如果取值均大于零,相对熵可以度量两个随机分布的差异性。
上面的公式拆开即为
K
L
(
f
(
x
)
∣
∣
g
(
x
)
)
=
∑
f
(
x
)
l
o
g
f
(
x
)
g
(
x
)
=
∑
f
(
x
)
l
o
g
(
f
(
x
)
)
−
∑
f
(
x
)
)
l
o
g
(
g
(
x
)
)
=
(
−
∑
f
(
x
)
)
l
o
g
(
g
(
x
)
)
)
−
(
−
∑
f
(
x
)
l
o
g
(
f
(
x
)
)
)
=
(
−
∑
f
(
x
)
l
o
g
(
g
(
x
)
)
)
−
H
(
x
)
=
交
叉
熵
−
信
息
熵
\begin{aligned} KL(f(x) || g(x)) & = \sum f(x)log\frac{f(x)}{g(x)} \\ & = \sum f(x)log(f(x)) - \sum f(x))log(g(x)) \\ & = (- \sum f(x))log(g(x))) - (-\sum f(x)log(f(x))) \\ & = (-\sum f(x)log(g(x))) - H(x) \\ & = {\color{Red} 交叉熵 - 信息熵} \\ \end{aligned}
KL(f(x)∣∣g(x))=∑f(x)logg(x)f(x)=∑f(x)log(f(x))−∑f(x))log(g(x))=(−∑f(x))log(g(x)))−(−∑f(x)log(f(x)))=(−∑f(x)log(g(x)))−H(x)=交叉熵−信息熵
但是需要注意的是相对熵是不对称的,即
K
L
(
f
(
x
)
∣
∣
g
(
x
)
)
≠
K
L
(
g
(
x
)
∣
∣
f
(
x
)
)
KL(f(x) || g(x)) \neq KL(g(x)||f(x))
KL(f(x)∣∣g(x))=KL(g(x)∣∣f(x))
这样使用起来不是很方便,为了让它对称就有了一种新的相对熵的计算方法
J
S
(
f
(
x
)
∣
∣
g
(
x
)
)
=
1
2
[
K
L
(
f
(
x
)
∣
∣
g
(
x
)
)
+
K
L
(
g
(
x
)
∣
∣
f
(
x
)
)
]
JS(f(x)||g(x)) = \frac{1}{2}[KL(f(x)||g(x)) + KL(g(x)||f(x))]
JS(f(x)∣∣g(x))=21[KL(f(x)∣∣g(x))+KL(g(x)∣∣f(x))]
KL散度可以用在对原图像的编码解码中的。
四、交叉熵在分类中的应用
通过上一部分我们得知交叉熵的数学表达式为
H
(
f
,
g
)
=
−
∑
f
(
x
)
l
o
g
(
g
(
x
)
)
H(f,g) = -\sum f(x)log(g(x))
H(f,g)=−∑f(x)log(g(x))
则对于二分类问题的交叉熵数学表达式为
H
(
f
,
g
)
=
−
(
g
(
x
)
l
o
g
(
f
(
x
)
)
+
(
1
−
g
(
x
)
)
l
o
g
(
1
−
f
(
x
)
)
)
H(f,g) = -(g(x)log(f(x)) + (1 - g(x))log(1 - f(x)))
H(f,g)=−(g(x)log(f(x))+(1−g(x))log(1−f(x)))
在全连接层的最后接的激函数softmax
或sigmoid
后接入交叉熵成本函数。
将f(x)设置为真实样本
,而将g(x)设置为预测值
例如我们要根据某个人的身高,体重,容貌,学识来判断他是一名小学生(0),中学生(1)还是大学生(2)。使用softmax
得到它的概率最大值(同时预测三个)。
预测值 | 目标值 |
---|---|
0.6 0.6 0.4 | 0 1 2 |
0.4 0.3 0.3 | 1 0 0 |
0.3 0.4 0.3 | 0 1 0 |
损失:这里计算的log是以自然对数算的,知道是怎么算的就行了,没有必要纠结于常数
以第一个batch样本为例计算
loss = -(0 * log(0.6) + 1 * log(0.6) + 2 * (log0.4)) = 2.343
则平均损失为
loss = loss / 3 = 0.781