在《深度学习信息论》一书中,有写到:
我们将事件 X = x 的 自信息 (self-information)定义为:

因此,对$I(x)$的定义是以nats为单位的。一个nat的含义是通过观察概率为 1/e 的事件获得的信息量。
我们可以使用熵量化整个概率分布中的不确定性量。

概率分布的熵定义。
但是这个公式是什么含义呢?
对于任何想要学习机器学习的人来说,理解熵的深层含义是至关重要的。熵会衍生出一个函数(交叉熵),它是ML从业者的基础概念 - 交叉熵在分类中经常被用作损失函数,以及广泛用于变分推理的KL散度。
为了理解熵,我们需要开始从“bits”的角度来思考。
bits为0或 1。
因此,使用1bits,我们可以表示2个不同的事件,要么是1或0(或True或False)。假设:你是2022年俄乌战争的指挥官。前线电报员告诉你,如果乌克兰投降,他会给发出一个“1”的信号,如果乌克兰不投降,他会给你发出一个“0”的信号,这个规则作为通讯的暗号。
现在,您当然可以在智能手机上发送完全相同的信息:
"The war is over"(而不是1位,我们使用8 bits* 15个字符= 120bits**)
“The war is not over”(8bits * 19 个字符 = 152 bits)
因此,我们使用超过100位来发送的数据量可以减少到1 bits来代替
假设明天有四种可能的战争结果,而不是两种。
1)乌克兰和欧盟都投降了。
2)乌克兰投降,但欧盟不投降。
3)欧盟投降,但乌克兰没有投降。
4)乌克兰和欧盟都不投降。现在,您的电报员需要 2 bits (00,01,10,11) 来编码此消息。同样,即使有256种不同的场景也只需要8bits。
用数学语言来描述,变量的熵是变量中包含的“信息量”。您可以将变量视为来自前线电报员的news。news可以是任何信息。它不必是4个可能的情况,256个可能的情况等。在现实生活中,新闻可以是数百万个不同的事实。
现在,回到我们的公式3.49:

概率分布的熵定义:
I(x)是X的信息内含
I(x) 本身是一个随机变量。 在我们的例子中,俄乌战争的可能结果。因此,H(x) 是每个可能信息的期望值。
使用期望值的定义,上述等式可以重写为:

等。。。我们为什么要取概率的倒数?
H(X)是整个概率分布中的信息总量。 这意味着1/p(x)应该是每种情况的信息(赢得战争,输掉战争等)。
问题是。。。
为什么1/p(x) 是信息的度量?
假设乌军有50 /50的机会投降(p=1/2)。那么,如果你的电报员告诉你他们确实投降了,你可以消除总共这2个可能事件(投降和不投降)的不确定性,这就是p的倒数(=1/2)。
当您的事件都同样可能发生并且您知道一个事件刚刚发生时,您可以消除所有其他事件(总计1 /p事件)发生的可能性。例如,假设有 4 个事件,它们都同样可能发生 (p = 1/4)。当一个事件发生时,同时其他三个事件没有发生。因此,我们知道总共4个事件中发生了那一个。
那么不太可能发生的事件呢?
假设乌克兰有75%的几率投降,25%的几率不会投降。
“投降”事件有多少信息?
log (1/0.75) = log(1.333) = 0.41 (以后省略log基数 2)
“不投降”事件有多少信息?
log (1/0.25)= log(4) = 2
如您所见,不太可能发生的事件具有更高的熵。
这是关于为什么信息是概率的倒数的直觉。
--------
假设黑点是news。
通过知道黑点,我们就可以同时消除(确定没发生)其他3个白点。
总共 4 个点(总信息)。
现在,通过了解一个黑点,我们可以消除多少个总点?

我们可以消除总的1和1/3 = 1.333点,这是3/4的倒数。
您可以消除的点总数 = 每个news中的信息内容。
因此,每个可能的news中的信息是0.25 * log(4) + 0.75 * log(1.333)= 0.81(香农熵公式)。
现在我们知道1/p从何而来。但是为什么是log呢?香农认为,任何东西的信息含量都可以用$bits$来衡量。要以$bits$为单位写一个数字 N,我们需要取以2为基数的log。
tips
如果我们的 P(win) = 1,则熵为 0。它有0$bits$的不确定性。(-log 1 = 0)
请注意,信息论中的热力学“熵”和“熵”都捕获了增加的随机性。
请注意,在我们的示例中,对于“同样可能”的消息,熵高于“不相等”消息(0.81 位),而不是“同样可能”的消息(2 $bits$)。这是因为“可能性不大”消息的不确定性较小。一个事件比另一个事件更有可能出现。这减少了不确定性。
这里是Python代码。
看看字符数越多,不确定性(熵)越大。
import math
import randomdef H(sentence):
"""
Equation 3.49 (Shannon's Entropy) is implemented.
"""
entropy = 0
# There are 256 possible ASCII characters
for character_i in range(256):
Px = sentence.count(chr(character_i))/len(sentence)
if Px > 0:
entropy += - Px * math.log(Px, 2)
return entropy# The telegrapher creates the "encoded message" with length 10000.
# When he uses only 32 chars
simple_message ="".join([chr(random.randint(0,32)) for i in range(10000)])# When he uses all 255 chars
complex_message ="".join([chr(random.randint(0,255)) for i in range(10000)])
Out[20]: 5.0426649536728 the* *In [21]: H(complex_message)
Out[21]: 7.980385887737537
在下一篇文章中,我将解释我们如何将熵扩展到交叉熵和KL发散。

