信息论中的信息量和信息熵
信息量(自信息)
无论是原始年代还是现代,人每天都会接收和发送很多信息,这是一件及其消耗精力的事情,那么怎么着才能减缓精力的消耗呢?答案就是避轻就重,优先处理重要的信息。问题来了,使用什么方法才能区分哪些是重要的信息,哪些是不重要的信息呢?在信息论发明出来之前,人们是无法精确地用数值衡量一个事件包含的信息量的,例如,我中了一篇顶会这件事情包含了多少信息?这就是信息的量化。==信息论之父香农提出量化一个事件包含的信息量可以基于这样的想法:一个不太可能发生的事件发生了,要比一个非常可能发生的事件提供更多的信息。==例如,还是拿上面的例子说,如果我之前就中过顶会,那么这次中顶会的概率本来就很高,这是在我和老师以及同学的预料之内的,所以没有什么好惊讶的,也不需要有什么信息需要进一步了解;如果我以前一篇论文都没有,三年零产出,所以按照以前的统计经验,我中顶会的概率几乎为0,那这次突然中了一篇顶会就不得了了,这里面一定包含很多未知的信息需要我们研究:我抱上大佬的大腿了?灵感迸发?等等。根据这种逻辑,我们可以使用数学和统计学的方法(函数、概率分布等等)得出事件发生概率和该事件包含信息量之间的量化关系:
I
(
x
)
=
−
l
o
g
(
p
(
x
)
)
I(x) = -log(p(x))
I(x)=−log(p(x))
这便是香农信息量,又称为自信息(self-information),其代表一个事件所能够提供信息的多少(公式中是底数为 2 的对数,信息量用比特(bit)衡量,那么信息的多少就是多少比特)其中p(x)是事件x发生的概率。从
I
(
x
)
I(x)
I(x)的表达式中我们可以看出,在[0, 1]之间,随着p(x)的增大,
I
(
x
)
I(x)
I(x)在变小。
信息熵
然而,自信息只能衡量单个事件的信息量,而整个系统呈现的是一个分布(多个事件的集合)。如何表示整个系统中信息集合的分布呢?即怎么量化系统信息集合的信息量。在信息论中,使用信息熵来对整个系统事件集合包含的信息进行量化,即对系统信息集合的概率分布进行量化,计算公式为:
H
(
X
)
=
E
X
−
p
(
I
(
X
)
)
=
E
X
−
p
(
−
l
o
g
(
p
(
X
)
)
)
=
−
Σ
i
=
1
N
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(X)=E_{X-p(I(X))}=E_{X-p(-log(p(X)))}=-\Sigma_{i=1}^{N}p(x_i)log(p(x_i))
H(X)=EX−p(I(X))=EX−p(−log(p(X)))=−Σi=1Np(xi)log(p(xi))
所以信息熵(整个系统的信息量,即整个系统信息集合的概率分布)是香侬信息量的期望值,也就是各个事件包含信息的加权平均(如上式)。这里不太明白的同学可以去复习一下概率论里离散变量的概率分布。
信息熵的意义:从信息论的角度来说,信息熵就是按照真实分布p,也就是p(X),来衡量识别一个样本的所需要的编码长度(上面提到信息量使用比特衡量,此处的编码长度就是一个数据(事件)至少需要多少个比特进行编码)的期望,即平均最小编码长度。
相对熵(KL散度)和交叉熵
相对熵,顾名思义,是两个不同分布之间相互作用的一种熵。因为信息熵表示的是单个分布里信息集合的期望,所以我们可以尝试使用相对熵对信息熵进行推导。举个例子,含有4个字母(A,B,C,D)的信息集合
S
1
S_1
S1中,它的真实分布P=(
1
2
\frac{1}{2}
21,
1
2
\frac{1}{2}
21, 0, 0),即A和B出现的概率均为
1
2
\frac{1}{2}
21,C和D出现的概率都为0。根据信息熵的计算方式,
S
1
S_1
S1的信息熵为:
H
(
P
)
=
−
(
1
2
l
o
g
(
1
2
)
+
1
2
l
o
g
(
1
2
)
)
=
1
H(P)=-(\frac{1}{2}log(\frac{1}{2})+\frac{1}{2}log(\frac{1}{2}))=1
H(P)=−(21log(21)+21log(21))=1
信息C、D发生的概率为0,所以其自信息也为零,所以不参与计算。
那么我们给集合
S
1
S_1
S1换一个分布呢,换为Q=(
1
4
\frac{1}{4}
41,
1
4
\frac{1}{4}
41,
1
4
\frac{1}{4}
41,
1
4
\frac{1}{4}
41),Q不是集合
S
1
S_1
S1的真实分布。在分布Q下,集合
S
1
S_1
S1的信息熵为:
H
(
P
,
Q
)
=
−
(
1
2
l
o
g
(
1
4
)
+
1
2
l
o
g
(
1
4
)
+
0
l
o
g
(
1
4
)
+
0
l
o
g
(
1
4
)
)
H(P, Q)=-(\frac{1}{2}log(\frac{1}{4})+\frac{1}{2}log(\frac{1}{4})+0log(\frac{1}{4})+0log(\frac{1}{4}))
H(P,Q)=−(21log(41)+21log(41)+0log(41)+0log(41))=2
虽然在分布Q里信息C、D有发生的概率,但是在真实分布P里,是不会发生的。这里联想以下二分类的任务,P就是真实标签,而Q是预测结果,我们用交叉熵计算损失的时候,计算形式为: − Σ i = 1 N P ( x i ) l o g Q ( x i ) -\Sigma_{i=1}^{N}~P(x_i)logQ(x_i) −Σi=1N P(xi)logQ(xi)。
事实上,根据吉布斯不等式(Gibbs ’ inequality)可知,
H
(
p
,
q
)
>
=
H
(
p
)
H(p,q)>=H(p)
H(p,q)>=H(p)恒成立,当Q完全等于真实分布P时,二者相等。我们将由Q得到的平均编码长度与由P得到的平均编码长度的差(额外多出的信息载体)称为相对熵,也称为KL散度:
K
L
(
P
∣
∣
Q
)
=
H
(
P
,
Q
)
−
H
(
P
)
=
−
∑
i
=
1
N
p
i
l
o
g
(
q
i
)
+
−
∑
i
=
1
N
p
i
l
o
g
(
p
i
)
=
∑
i
=
1
N
p
i
l
o
g
(
p
i
q
i
)
KL(P||Q) =H(P, Q)-H(P)=-\sum_{i=1}^Np_ilog(q_i)+-\sum_{i=1}^Np_ilog(p_i)=\sum_{i=1}^Np_ilog(\frac{p_i}{q_i})
KL(P∣∣Q)=H(P,Q)−H(P)=−∑i=1Npilog(qi)+−∑i=1Npilog(pi)=∑i=1Npilog(qipi)
上式中的的 H ( P , Q ) H(P,Q) H(P,Q)便是交叉熵,在信息论编码中,它说明的是使用Q分布对原分布为P的字符集进行编码所需要的平均编码长度(信息量的期望)。
为什么交叉熵可以作为损失函数
通过上边的推导,P为数据的真实概率分布,而Q为机器学习算法预测数据的分布,那么KL散度(相对熵)便可以用来衡量两个分布的差异,即使用分布Q对真实分布Q进行表示产生的损失(差异)。因此可以将KL散度(相对熵)作为机器学习的目标函数,通过训练尽量降低KL散度,就可以降低两个分布的差异,预测模型分布Q就越接近真实分布P。然而,由上面的公式可以看出,交叉熵只是比KL散度少了
H
(
P
)
H(P)
H(P)一项,由于在机器学习中
H
(
P
)
H(P)
H(P)是固定的(数据的真实分布的信息熵),即
H
(
P
)
H(P)
H(P)是可以计算出的一个常数项,所以在优化的时候我们只需要尽量降低
H
(
P
,
Q
)
H(P,Q)
H(P,Q)的值,这便是交叉熵可以作为分类算法损失函数的原因。
在机器学习算法训练中,单个样本
x
i
x_i
xi 带来的交叉熵损失为:
l
o
s
s
(
x
)
=
−
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
loss(x)=-p(x_i)log(q(x_i))
loss(x)=−p(xi)log(q(xi))
其中, p ( x i ) 为 数 据 的 真 实 标 签 , q ( x i ) 为 模 型 对 样 本 x i 的 预 测 结 果 。 p(x_i)为数据的真实标签,q(x_i)为模型对样本x_i的预测结果。 p(xi)为数据的真实标签,q(xi)为模型对样本xi的预测结果。
那么,整个batch或者数据集的交叉熵损失为:
l
o
s
s
(
X
)
=
−
∑
i
=
1
N
p
(
x
i
)
l
o
g
(
q
(
x
i
)
)
loss(X)=-\sum_{i=1}^N~p(x_i)log(q(x_i))
loss(X)=−∑i=1N p(xi)log(q(xi))
其中, p ( x i ) 为 数 据 的 真 实 标 签 , q ( x i ) 为 模 型 对 样 本 x i 的 预 测 结 果 , N 为 数 据 集 的 样 本 总 量 或 者 b a t c h 的 大 小 。 p(x_i)为数据的真实标签,q(x_i)为模型对样本x_i的预测结果,N为数据集的样本总量或者batch的大小。 p(xi)为数据的真实标签,q(xi)为模型对样本xi的预测结果,N为数据集的样本总量或者batch的大小。
在一般的分类任务中,对于二分类, q ( x i ) q(x_i) q(xi)由激活函数sigmoid计算得到;对于多分类, q ( x i ) q(x_i) q(xi)由激活函数softmax计算得到。如果想深入了解,请移步链接: 二分类和多分类任务的激活函数合损失函数.
总结
这篇博客从信息论的角度,解释了什么是信息量(自信息)和信息熵,通过信息量(自信息)和信息熵引申出相对熵(KL散度)和交叉熵,最终从KL散度的意义解释了交叉熵为什么可以作为机器学习领域的损失函数。谨以此记录平时所学,并且希望可以帮助路过的朋友。