从本质上理解什么是信息熵,交叉熵和KL散度
信息熵的基本概念之前学习信息熵碰到的问题信息熵的起源对一本书的编码引出信息熵的定义信息熵的编码方式为最短编码的完备证明
交叉熵KL散度结尾
信息熵的基本概念
之前学习信息熵碰到的问题
在学习深度学习相关知识的时候,不可避免的会遇到交叉熵loss,当时为了弄懂什么是信息熵,什么是交叉熵,查了很多资料,但都感觉讲解的很模糊,大部分的讲解是给出一个公式,然后直接解释公式的各部分含义,给的例子都是诸如“中国足球队赢巴西”是小概率事件,包含的信息就多,“巴西队赢中国队”是大概率事件,信息量就小,虽然听着是这么回事,但总有似是而非的感觉,没有讲到根本,这也导致每次学习,当时记住了公式,过了一阵再碰到交叉熵loss还是会忘记到底是咋回事,按照我学习的经验,这种情况往往是没有学习到本质。所以最近查了很多资料,想要彻底搞懂什么是信息熵,交叉熵、KL散度又是怎么回事,最后发现只有从最初信息熵的起源来理解,才能真的搞懂什么是信息熵。 在我查到的所有资料中,感觉一个视频讲解“如何理解信息熵”讲的最清楚,大家也可以参考一下。
信息熵的起源
20 世纪初,电报、电话等电子通信技术的普及,由于当时信息传递的成本很高,如何用数学方法量化 “信息” 的多少成为了关键。1948 年,美国贝尔实验室的数学家克劳德・香农(Claude Shannon)发表了划时代论文《通信的数学理论》(A Mathematical Theory of Communication),首次明确提出 “信息熵” 的概念,标志着信息论的诞生。 我们只要搞清楚什么是信息,信息是如何传递的,如何对信息编码我们才能达到效率最高的方式传递信息,所有关于信息熵的抽象概念,我们就可以很清晰的了解了。下面将用一个具体的示例来讲解上述的问题。 “信息”的概念有些抽象,现在我们假设一个具体的场景,我们要把某一本书通过“0”、“1”这种电信号,发送给其他人,这本书就是我们要传递的“信息”。而将一本书的每个文字转为“0”、“1”电信号的编码,相信能来读这篇文章的小伙伴已经很熟悉了,而现在的难点是,我们具体如何对这本书进行编码,可以使用最少的bit数(一位0/1的电信号为1bit),将这本书完整的发送出去,且对方在解码的时候没有歧义。这种对一本书,一段文字的编码、量化问题,就是信息熵问题的起源。
对一本书的编码引出信息熵的定义
继续上面的例子,假设这本书共有
N
N
N个字符,字符类别有
n
n
n个,每个类别的字符在这本书中的数量为
N
i
N_i
Ni,
i
∈
[
1
,
n
]
i \in [1,n]
i∈[1,n],我们如何对
n
n
n个字符进行0/1编码,才能使得整本书的总bit数最小呢? 这里面首先要说明一点,这本书的信息在传递时,是一个连续的0/1序列,我们是不知道哪里可以中断的,比如某个字符
x
1
x_1
x1编码为“01”,则不能有字符
x
2
x_2
x2再编码为“011”,因为在发送字符"011"时,无法区分发送的是
x
1
x_1
x1和一个编码为“1”的字符,还是发送的是
x
2
x_2
x2。 令
n
n
n个字符分别为
x
1
x_1
x1,
x
2
x_2
x2,
…
\ldots
…,
x
n
x_n
xn,其所占字符总数的比重
p
i
=
N
i
N
p_i=\frac{N_i}{N}
pi=NNi,
i
∈
[
1
,
n
]
i \in [1,n]
i∈[1,n],其中
N
i
N_i
Ni为第
i
i
i个字符在这本书中的数量,则有
0
<
p
i
≤
1
0\lt p_i\leq 1
0 1 p i = 2 k \frac{1}{p_i}=2^k pi1=2k, k k k为非负整数。则根据信息熵中的定义,不同字符的编码长度 l i l_i li符合以下公式时,整本书可以最小bit数发送,并且解码时无歧义。 l i = log ( 1 p i ) (1) l_i=\log(\frac{1}{p_i})\tag1 li=log(pi1)(1) 本文中所有的 log \log log都表示以2为底的对数。从直观上看这个公式是很好理解的,因为一个字符所占的比重越高,我们就给它分配更短的编码位数,占的比重越低,就只能分配更长的编码(因为更短的编码已经被其他比重更大的字符占据满了),后边会给出这样设置编码长度可以使整本书的bit数最小的证明,目前我们可以从一些具体的例子来增进对这个例子的理解。 假设一本书包括 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, x 4 x_4 x4四个字符,所占比例分别为 1 2 \frac{1}{2} 21, 1 4 \frac{1}{4} 41, 1 8 \frac{1}{8} 81, 1 8 \frac{1}{8} 81,则根据公式(1),他们对应的编码长度分别为1位,2位,3位和3位,则我们可以对他们进行编码: x 1 x_1 x1:“0”, x 2 x_2 x2:“10”, x 3 x_3 x3:“110”, x 4 x_4 x4:“111” 如果我们想给 x 2 x_2 x2更短的编码1位编码,例如给它的编码为“1”,则 x 1 x_1 x1和 x 2 x_2 x2已经将第一位的编码“0”和“1”全部占据了,后边其他字符给任何其他编码,在解码的时候由于没有中断符号,都无法避免引起歧义导致解码失败,因为信息中所有的“0”和“1”都会被解码成 x 1 x_1 x1和 x 2 x_2 x2,而导致 x 3 x_3 x3和 x 4 x_4 x4无法被传输,除非将 x 1 x_1 x1赋予更长的2位编码,但这样很显然会使整体的bit数更长,因为我们给了占比更大的字符更长的编码。同样的道理, x 3 x_3 x3和 x 4 x_4 x4也没有办法使用更短的编码而使bit总数更短或保持不变。 则整本书的bit数为 N b i t = ∑ i = 1 n N i ∗ log ( 1 p i ) (2) N_{bit}=\sum_{i=1}^{n}N_i*\log(\frac{1}{p_i})\tag2 Nbit=i=1∑nNi∗log(pi1)(2) 不同的书籍包含的字符数不一样,传递需要的bit数当然会有不同,但当我们想忽略两本书字符数量上的差异,仅比较两本数携带信息的复杂程度,例如某一本书仅包含2个字符,不断重复,但是字数特别多,另一本书仅有一句话,但是用到了很多字符,后者也可能传递了更丰富的信息,但是总bit数却更少,因此我们可以计算出一本书的单个字符的平均编码长度来表示信息的复杂程度 L = ( ∑ i = 1 n N i ∗ log ( 1 p i ) ) / N = ∑ i = 1 n N i N ∗ log ( 1 p i ) = − ∑ i = 1 n p i ∗ log ( p i ) (3) \begin{aligned} L&=(\sum_{i=1}^{n}N_i*\log(\frac{1}{p_i}))/N \\ &=\sum_{i=1}^{n}\frac{N_i}{N}*\log(\frac{1}{p_i})\tag3 \\ &=-\sum_{i=1}^{n}p_i*\log(p_i) \end{aligned} L=(i=1∑nNi∗log(pi1))/N=i=1∑nNNi∗log(pi1)=−i=1∑npi∗log(pi)(3) 我们可以看到,这本书的平均编码长度,和信息熵的公式是完全一样的,也就是说,信息熵的定义,其实就是我们对一段信息的最小平均编码长度,即 H ( x ) = − ∑ i = 1 n p ( x i ) ∗ log ( p ( x i ) ) (4) H(x)=-\sum_{i=1}^{n}p(x_i)*\log(p(x_i))\tag4 H(x)=−i=1∑np(xi)∗log(p(xi))(4) 但是在信息熵的定义中,并没有规定 1 p ( x i ) \frac{1}{p(x_i)} p(xi)1一定是2的整数指数,即某个信息对应的编码有可能是小数,这是不符合我们的直觉的,也许我们只能生硬的去理解这种扩展,即对一个符号可以用类似2.7位编码这种情况,虽然实际技术达不到,但这种现象也很常见,例如我们人类只能接触并感知到3维空间,但是对于夹角、距离等这些直观定义,我们也都直接向更高维度的空间进行了扩展并解决了很多问题。 之前很多其他文章讲解信息熵时,提到的“概率更低的事情包含了更多的信息”这种说法,我个人觉得是不够准确的,应该是我们为了使信息整体的bit数最小,要给低概率信息更长的编码,以便把更短的编码留给那些更高概率的事件,而不是低概率事件天然的具备更大的信息量。事实上,我们当然可以给低概率事件一个很短的编码,只不过我们在传输完整的信息时,需要更大的成本,而研究信息熵问题时,因为要计算的是“最短平均编码长度”,因为有了“最短”的限制,则将一个可以人为设定的问题,转为了一个客观的学术问题。 信息熵的编码方式为最短编码的完备证明 对信息进行编码的平均码长为 L = ∑ i = 1 n p i l i (5) L=\sum_{i=1}^{n}p_il_i\tag5 L=i=1∑npili(5) 字符码长需满足需Kraft不等式 ∑ i = 1 n 2 − l i ≤ 1 (6) \sum_{i=1}^{n}2^{-l_i}\leq 1\tag6 i=1∑n2−li≤1(6) 才能确保符合前缀码要求(即无任何码字是另一码字的前缀)。 为了计算出在不等式(6)约束下的最短编码方式,构造拉格朗日函数 L ( l i , λ ) = ∑ p i l i + λ ( ∑ 2 − l i − 1 ) (7) L(l_i,\lambda)=\sum p_il_i+\lambda(\sum2^{-l_i}-1)\tag7 L(li,λ)=∑pili+λ(∑2−li−1)(7) 对 l i l_i li求偏导并令其为零: ∂ L ∂ l i = p i − λ ∗ 2 − l i ln 2 = 0 \frac{\partial L}{\partial l_i}=p_i-\lambda * 2^{-l_i}\ln 2=0 ∂li∂L=pi−λ∗2−liln2=0 解得: 2 − l i = p i λ ln 2 ⟹ l i = − log p i + log ( λ ln 2 ) (8) 2^{-l_i}=\frac{p_i}{\lambda\ln2}\implies l_i=-\log p_i+\log (\lambda\ln2)\tag8 2−li=λln2pi⟹li=−logpi+log(λln2)(8) 带入Kraft不等式(6): ∑ p i λ ln 2 ≤ 1 ⟹ λ ≥ 1 ln 2 ( 因 ∑ p i = 1 ) \sum \frac{p_i}{\lambda \ln 2}\leq 1\implies \lambda \geq\frac{1}{\ln2}(因\sum p_i=1) ∑λln2pi≤1⟹λ≥ln21(因∑pi=1) 当 λ = 1 ln 2 \lambda=\frac{1}{\ln2} λ=ln21时约束取等号,根据式(8)有 l i = − log p i l_i=-\log p_i li=−logpi,此时平均码长 L = − ∑ i = 1 n p i log p i = H ( X ) L=-\sum_{i=1}^{n}p_i\log p_i=H(X) L=−i=1∑npilogpi=H(X) 交叉熵 有了前边的铺垫,交叉熵的概念就很好理解了。我们还是要传递一本书的信息,书中各字符的真实比例为 p ( x i ) p(x_i) p(xi),但是由于各字符数量不方便统计,我们根据常识或抽样统计,设定各字符的比例为 q ( x i ) q(x_i) q(xi),并且根据这个比例去设计编码长度并进行信息传输,则传输的平局码长即为交叉熵 H ( p , q ) = − ∑ i = 1 n p i log q i (9) H(p,q)=-\sum_{i=1}^{n}p_i\log q_i\tag9 H(p,q)=−i=1∑npilogqi(9) 其中 p i = p ( x i ) p_i=p(x_i) pi=p(xi), q i = q ( x i ) q_i=q(x_i) qi=q(xi)。 前边已经证明,信息熵为最短编码,交叉熵的值一定大于信息熵,就像我们前边给出的4个字符的例子中,将占比 1 4 \frac{1}{4} 41的字符给1个编码长度,占比 1 2 \frac{1}{2} 21的字符给2个编码长度,平均编码长度一定更长。当交叉熵的结果越小,说明 q ( x i ) q(x_i) q(xi)的分布越接近 p ( x i ) p(x_i) p(xi),这也是我们深度学习中使用交叉熵作为loss函数的理论依据。 KL散度 有了前边交叉熵的讲解,KL散度就更好理解了,实际就是我按照 q ( x i ) q(x_i) q(xi)的比例为 ( p i ) (p_i) (pi)分布的信息设计编码,和最优编码之间的差值,即平均多用了多少编码,其定义如下 D K L ( P ∥ Q ) = ∑ i = 1 n p i log p i q i = − ∑ i = 1 n p i log q i − ( − ∑ i = 1 n p i log p i ) = H ( p , q ) − H ( p ) (10) \begin{aligned} D_{KL}(P∥Q)&=\sum_{i=1}^{n}p_i\log \frac{p_i}{q_i}\\ &=-\sum_{i=1}^{n}p_i\log q_i-(-\sum_{i=1}^{n}p_i\log p_i)\tag{10}\\ &=H(p,q)-H(p) \end{aligned} DKL(P∥Q)=i=1∑npilogqipi=−i=1∑npilogqi−(−i=1∑npilogpi)=H(p,q)−H(p)(10) 所以KL散度就是反应用另一种分布对同一信息进行编码,和最优编码相比,多了多少平均编码位数。 结尾 如果哪里写的不清楚或者不准确,可以私信给我,感谢。