HeadlinesBriefing favicon HeadlinesBriefing.com

gzip 能成为语言模型吗?压缩与预测的等价性

Hacker News •
×

不久前我写过关于无需神经网络的语言建模:我用无限 n-gram 模型生成了莎士比亚的作品——没有权重,没有训练,只是计数。幸运的是,我遇到了论文《语言建模即压缩》,其中提到了压缩-预测等价性:每个预测模型本质上都是一个压缩器,而所有压缩算法都是预测模型。这引出了一个自然的问题:gzip 能做语言建模吗?没有神经网络,没有学习到的参数,什么也没有。只是操作系统自带的那个压缩器。你用一个语料库来预热它,给它一个普通的文本提示,然后它通过搜索能压缩得最好的字节序列来延续这个提示。以下是我在预热后对 tiny Shakespeare 进行的真实、未编辑的输出:

gzipt --corpus data/tinyshakespeare.txt --prompt $'MENENIUS:\n' --length 200

MENENIUS:'Though all at once canq MARCIUS: Pray now, nocamest thou to a morsel .LARTIUS: Hence, and I' the end admire, where Gagain; and after it ag .结果如何?它并不完全连贯,但它显然知道一些关于文本的东西。比我预期的 gzip 所知道的多得多。

那么,压缩器如何生成这个?压缩就是预测。想想压缩器做什么。它在它“预期”的数据上花费很少的字节,而在它不“预期”的数据上花费很多字节。如果我给你一个文件,里面是一百万次重复的字母 A,你可以用一句话来描述它。而一百万个随机字节,另一方面,没有可利用的结构,几乎无法压缩。这不是巧合;这是信息论的核心。编码一个符号所需的位数是 $-\log_2 p$,其中 $p$ 是模型分配给它的概率。高概率意味着少量位。因此,任何压缩器都内在地隐藏着一个概率模型,无论是否有人写下来。gzip 使用 DEFLATE,它通过在 32 KiB 滑动窗口中的最近文本中查找匹配来压缩接下来的字节。如果一个延续在窗口中已经存在的内容中回响,DEFLATE 会将其编码为廉价的后向引用,而不是字面字节。因此:一个 gzip“预期”的延续,因为它回响了其窗口中已有的文本,会被压缩到几乎没有字节。这给我们提供了一个得分。如果我有一些上下文,我想知道一个候选延续有多好,我只需测量:score(candidate) = len(gzip(context + candidate))。压缩后的长度越小,该候选就越“被预测”。为了预热模型,我将一个语料库包含在 gzip 的窗口中。任何看起来像语料库的延续会被压缩得很小,而任何不像语料库的延续会被压缩得很大。通过束搜索生成。评分是一回事;生成是另一回事。 naive 方法——挑选单个字节中压缩最好的那个——效果很差,原因很微妙:gzip 只给出整数字节长度(没有小数)。添加一个字节通常不会改变压缩长度,所以许多候选者会打平,信号被量化噪声掩盖。解决办法是:在承诺之前先看 ahead 一整段。gzipt 在字节序列上运行束搜索。每一步,当前上下文是:语料库窗口 + (prompt + 生成字节) 的最近尾部。然后 gzipt 尝试可能的下一个字节。每个候选延续通过压缩 context + candidate 并检查压缩结果占用多少字节来评分。循环是:

提示。从用户的提示作为初始待续文本开始。没有开始标记;提示字节只是 gzip 看到的上下文的一部分。

上下文。向 gzip 展示语料库窗口以及 prompt/生成文本的最近尾部。

搜索。保留 beam_width 个最易压缩的部分续串。用语料库中出现的每个字节扩展每个候选,按压缩长度评分所有候选,然后再剪裁回最佳的 beam_width。

重复 horizon 次。

提交。取最易压缩的完整跨度(如果温度为正,则在决赛选手中抽样),追加它,然后继续。

...

FAQ Q: gzip 能用作语言模型吗?

FAQ A: 是的,gzip 可以通过基于压缩的预测充当语言模型。通过用语料库预热它并使用束搜索来查找压缩最有效的字节序列,gzip 有效地识别模式并生成文本续串。这有效是因为压缩算法本质上构建了概率模型——当文本回响之前见过的模式时,它会压缩得更高效,表明更高的可预测性。