无损压缩算法会减少熵吗?


35

根据维基百科

香农的熵衡量的是消息中包含的信息,而不是确定的(或可预测的)消息部分。后者的示例包括语言结构的冗余或与字母或单词对,三胞胎等的出现频率有关的统计属性。

因此,熵是对消息中包含的信息量的度量。熵编码器用于将此类消息无损压缩到表示该消息所需的最小位数(熵)。对我来说,这似乎是一个完美的熵编码器,它是尽可能无损压缩消息所需的全部。

然而,许多压缩算法在熵编码之前使用步骤以减少消息的熵。

根据德国维基百科

Entropiekodierer werdenhäufigmit anderen Kodierern kombiniert。大律师,大律师,大律师和大律师。

用英语:

熵编码器经常与其他编码器结合使用。前面的步骤用于减少数据的熵。

即bzip2在应用熵编码(在这种情况下为霍夫曼编码)之前先使用Burrows-Wheeler-Transform,然后再进行Move-To-Front-Transform。

这些步骤是否真的减少了消息的熵,这意味着减少了消息中包含的信息量?这在我看来是矛盾的,因为那将意味着在压缩过程中信息丢失,从而阻止了无损解压缩。还是仅转换消息以提高熵编码算法的效率?还是熵不直接对应于消息中的信息量?


1
可能是估计熵的一种方法。
管道

Answers:


39

许多熵的随意描述以这种方式使人迷惑,因为熵并不像有时所呈现的那样干净利落。尤其是,香农熵的标准定义规定,仅当如Wikipedia所说,“由于独立事件引起的信息是可加和的”时,它才适用。

换句话说,独立事件必须在统计上是独立的。如果不是,那么您必须找到定义事件的数据表示形式,以使其真正独立。否则,您将高估熵。

换句话说,香农熵仅适用于真实的概率分布,不适用于一般的随机过程。对于不符合香农熵假设的过程的具体示例,请考虑...

马尔可夫过程

马尔可夫过程会生成一系列事件,其中最近的事件是从依赖于一个或多个先前事件的分布中采样的。显然,比起离散的独立概率分布,将大量的现实世界现象更好地建模为马尔可夫过程。例如:您正在阅读的文本!

马尔可夫过程的天真的香农熵率将始终大于或等于该过程的真实熵率。为了获得过程的真实熵,您需要考虑事件之间的统计依赖性。在简单的情况下,其公式如下所示

H(S)=ipij pi(j)logpi(j)

这也可以表示像这样

H(Y)=ijμiPijlogPij

再次引用维基百科,这里“μi是链的渐近分布 ”,即给定事件在很长一段时间内发生的总体概率。

这是一种复杂的说法,即使您可以计算给定事件的总体概率,某些事件序列也比其他事件序列更有可能通过马尔可夫过程生成。因此,例如,以下三个英语单词字符串的可能性越来越小:

  • 他们跑到树上
  • 树跑向他们
  • 他们要跑的树

但是,香农熵将评估所有三个字符串的可能性相同。马尔可夫过程的熵考虑了差异,因此,它为过程分配了较低的熵率。

熵率取决于模型

如果您将其缩小,则可以看到一幅大图:来自未知源的给定事件序列的熵率与模型有关。您将为特定的一系列事件分配不同的熵率,具体取决于如何对生成事件的过程进行建模。

而且,通常情况下,您的流程模型不太正确。这不是一个简单或容易解决的问题。实际上,通常,如果您不知道真正的潜在过程是什么,就不可能为足够长且复杂的事件序列分配真实的熵率。这是算法信息论的核心成果。

实际上,这意味着在给定事件序列的来源未知的情况下,不同的模型将产生不同的熵,从长远来看,不可能知道哪个是正确的-尽管分配最低熵的模型可能是最好的。


2
非常感谢你!这完美地解释了我推理中的错误。
罗伯特

如果将数据,图像和音频解压缩器作为建模过程的示例,您的答案会更好。例如,在LZ数据压缩中,模型假定一台机器(解码器)将以下命令作为输入命令:(D,L):“从相对于当前输出位置的偏移D复制到输出L个连续符号”,或(c):“将符号c复制到当前输出位置”。LZ编码器将其输入符号流转换为解码器的命令语言,并且命令符号流具有与编码流不同的熵(和长度)。其他类型的压缩具有不同的机器。
piiperi

@piiperi听起来确实很有帮助,但我不知道其中的任何细节。(从机器学习的角度来看,我是一个问题。)
senderle

@senderle我的意思是用一些具体的过程示例扩展“熵率取决于模型”一章。您谈论的是一个生成事件的过程,以及数据,图像,视频,音频等。压缩器的处理组件可以看作是这样的过程。纯熵编码器是数据压缩流水线的最后一步。没有一个流水线步骤真正地“减少熵”。相反,它们每个都为可重现原始符号流的机器创建指令。每个指令流具有不同的熵,并且通常具有不同(即较短)的长度。
piiperi

12

不,如果算法是无损的,则压缩序列中的任何步骤都无法降低其熵-否则将无法对其进行解压缩/解码。但是,可以将附加熵存储在“带外”信息中,例如为了解码前移变换而需要维护的列表。


那么,在熵编码之前的压缩算法中使用的其他步骤是否仅用于允许熵编码器更接近熵呢?当将熵编码器应用于任意消息时,它自身不会接近熵吗?
罗伯特

实际上,它不是(嗯,取决于“关闭”的确切含义)。
Grimmy

额外的步骤允许熵编码器在保持原始消息的熵的同时,比如果要单独应用多余的信息更有效地减少多余的信息。无论您是否进行预处理,都将保留熵,但是压缩效果会较差(最终会导致编码效率降低)。
Luke Schwartzkopff

不,前移转换不会输出必须传输到解码器的单独列表。除非您的意思是初始清单。
user253751

Aah,您是对的,那不是最好的例子:)
Luke Schwartzkopff

6

它们减少了原始消息结构中固有的表观熵。或者换句话说,他们调整消息以利用压缩的下一阶段的优势。

一个简单的示例是用特殊符号替换xml结束标记中的名称。您可以从中完美地重新创建原始xml,但压缩器不必在该位置再次包含全名。

一个更真实的示例是png压缩。它的熵压缩器是DEFLATE,它是Lempel-Ziff和Huffman的组合。这意味着它最适合经常重复的值和模式。大多数相邻像素往往是相似的颜色。因此,为每一行分配了一个滤波器,该滤波器将原始像素值转换为差分编码。这样,最终由DEFLATE编码的值几乎接近0。在极端情况下,这将使整个LZ部分或DEFLATE可以非常快速地处理的行中所有不同值的平滑梯度变成单个值。


这是否意味着表观熵与消息的实际信息内容不同?这与消息的实际熵有何关系?
罗伯特

“表观熵”是指熵编码可以压缩到的熵。不同的编码器将寻找不同的模式。霍夫曼做得最好时相同的几个符号被重用经常经常使用的Lempel-ZIFF做得最好的当块被重复,等等
棘轮怪胎

但是Lempel-Ziv算法不是熵编码算法,对吗?我不明白的是为什么它们会在例如LZMA的熵编码器之前使用,而据推测熵编码器本身已经可以将消息压缩到最小。
罗伯特

1
@kutschkem这是否意味着熵不是消息信息内容的绝对度量,而是相对于定义为符号的内容(例如,单个字符被视为符号,而1位被视为符号)?我认为这可以解释我的假设错误的地方。
罗伯特

1
@robert ...不过,这是一个折衷,这是Luke在他的回答中提到的“带外”信息,通常是通过这些步骤(查找表,以便能够解码编码的信息)添加的。因此,将整个内容定义为一个符号并将其编码为0是没有意义的,因为必须在某个地方存储该0编码的信息。
kutschkem

6

熵编码器不会将消息压缩到表示消息所需的最小位数。我知道这很诱人,但这不是他们的工作。他们不是魔术,也无法达到目标。

取而代之的是,它们做了一些不太神奇的事情-但仍然有用。假设暂时,我们知道消息的每个字符都是从某种分发中独立选择的。然后,有可能构建一种无损压缩算法,以最佳方式压缩消息。这些算法称为熵编码器。

现在,真实消息通常不具有该独立性属性。例如,如果看到Q,则下一个字母很可能是U。依此类推。仍然可以将熵编码器算法应用于真实消息,其中每个字符并非独立于其余字符进行选择。该算法将仍然是无损的,它仍然可以用于压缩,并且在实践中,它仍然经常会缩短消息的长度。但是,它不会将其缩短到最小可能的长度。它不会将消息压缩为长度等于消息熵的东西。它的压缩程度不及此。

一旦意识到了熵编码器的这种特性,悖论就会消失。

通常,任何无损步骤都不会降低消息的熵。但是,它可能会将消息放入某种形式,使某些其他压缩算法更有效,因此在实践中(平均而言)它可能仍然有用。


2

“熵”一词如果经常被宽松地使用,是指两种不同的事物:

  • 消息或系统中的“信息总量”

  • 信息“密度”或信息的紧紧程度。

OP对Wikipedia的https://en.wikipedia.org/wiki/Entropy_(information_theory)条目的引用是指第一个:

Shannon's entropy measures the information contained in a message

但是(至少当我写这篇文章时)同一篇文章开头是:

Information entropy is the average rate at which information is produced by a stochastic source of data.

所以一个是数量,一个是速率(类似于距离与速度的关系)。这些有时称为“广泛”和“密集”属性(请参阅https://en.wikipedia.org/wiki/Intensive_and_extensive_properties#Extensive_properties)。

区别的经典例子是保罗·里维尔(Paul Revere)著名的灯笼信号:“一个是陆地,另一个是海上”。总信息的1位(如果我们忽略“如果我还没有到达北教堂,那么就没有”)。如果保罗在建筑物的每个窗户上增加了另一套灯笼,那将是“冗余”。但消息长度更长,“密集”熵也更低。

如果他以这种方式开始但改变为只使用一组灯笼,那将是“无损压缩”,就像OP的问题一样。“广泛的”熵是相同的,但“强烈的”熵是不同的:由于第二个窗口中的灯笼数量与您在第一个窗口中看到的数量高度相关,因此冗余消息更容易预测,或者随机性较低,因此强度熵要低得多。

还有两件事要记住:

  • 首先,我们通常都不知道两种意义上的系统的“真实”熵。天真的旁观者不知道“ 3个灯笼”是否是不同的消息,或者不同窗口中的信号是否冗余。如果保罗养成骑行的习惯,我们可以数一数,看看窗户是否总是彼此匹配。但是也许我们只是没有足够长的时间来观看罕见的(也许很重要!)异常。

  • 第二,衡量方式很重要。考虑尝试估计每个连续的文本字母传达了多少信息(这是一个比率,因此“密集”熵,有时也称为“相对熵”):

    • 如果您只是注意到人们以8位为单位发送文本,则第一个“估计”可能是每个字母8位。
    • 如果计算使用的不同字母的数量,则估计为log2(26),即每个字母4.7位(如果考虑空格,大小写等,则要高一些)。
    • 如果您认为“ e”比“ z”更适合“下一个字母”,那么您将测量字母频率并达到4.14(请参阅http://people.seas.harvard.edu/~jones/cscie129/) papers / stanford_info_paper / entropy_of_english_9.htm)。
    • 如果您计算字母对,您将获得诸如“ qu”,“ th”等模式,并且大约为3.56。
    • 如果您计算最多约5个字母的序列,则会得到较低的值,此外,您还可以可靠地区分文本所使用的人类语言。
    • 如果您在《英语印刷统计结构中的长距离约束》(美国心理学杂志68(1955))中像NG Burton和JCR Licklider一样坚强而又聪明,则可以得到10个序列,连续0000个字母,然后找到另一个熵值。

但是,当然,消息可以(并且确实)具有许多这种n-gram方法无法建模的模式,因此“真实”熵仍然较低。

如果用令牌的完全随机Zipfian分布对理论上无限的源进行建模,则可以计算出它具有的广泛和密集的熵,事实证明,熵仅取决于可能的不同令牌的数量。[ http://www.derose.net/steve/writings/dissertation/Diss.0.html]中的图表显示了每种熵随着数字的增加而呈现的样子。两者的行为截然不同:

希望有帮助或至少有趣...


1

我怀疑德语维基百科中的措词是错误的。压缩器增加熵。也就是说,不是整体熵,而是每位熵:信息密度。例如,应用一些行程编码和字典方案来压缩数据。现在,相同的信息被打包为更少的位,因此每个位携带更多的信息。后续的Huffman编码做了更多相同的工作;这只是另一层压缩。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.