gzip 能成为语言模型吗?
gzip 能成为语言模型吗?
不久前我写了篇关于无神经网络的语言建模的文章,其中我用一个无界 n-gram 模型生成了莎士比亚风格的文本:没有权重、没有训练,只有计数。巧的是,我后来读到了论文《语言模型就是压缩》(Language Modeling is Compression),其中提到了压缩-预测等价性(compression–prediction equivalence):每个预测模型本质上都是一个压缩器,而所有压缩算法都是预测模型。这自然引出一个问题:gzip 能做语言建模(language modeling)吗?[1] 没有神经网络,没有学习参数,什么都没有。只有你操作系统自带的那个压缩器。你用语料库“启动”它,给它一个正常的文本提示,然后它通过搜索压缩效果最好的字节序列来续写提示。以下是在小型莎士比亚文本上启动后的一些真实、未经编辑的输出:
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 G
again; and after it ag .
结果呢,好像有点意思?虽然算不上连贯的文本,但它显然对文本有所了解——比我对 gzip 预期的要多得多。[2] 那么,一个压缩器是如何生成这些内容的呢?
压缩就是预测
想一想压缩器做了什么。对于它“预期”到的数据,它使用很少的字节;对于它没预料到的数据,则使用很多字节。如果我给你一个文件,里面有一百万次重复的字母 A,你可以用一句话描述它。而一百万个随机字节则没什么结构可以利用,几乎无法压缩。
这并非巧合;这是信息论的核心。编码一个符号所需的比特数等于 $-\log_2 p$,其中 $p$ 是模型赋予该符号的概率。概率高意味着比特数少。所以任何压缩器内部都隐藏着一个概率模型,无论它是否意识到这一点。