工程师 Nathan 用纯 Python 标准库实现 gzipt:不训练任何参数,靠 gzip 压缩后的长度给候选续写打分,用集束搜索代替逐字节贪心,生成出人意料的连贯文本。
工程师 Nathan(博客 nathan.rs)用一篇文章验证了一个想法:不用神经网络、不用任何训练参数,操作系统自带的 gzip 压缩工具能不能做语言模型?他给出的答案是"某种程度上可以",并开源了实现 gzipt。
思路来自论文《Language Modeling is Compression》提出的等价关系:每个预测模型本质上都是压缩器,每个压缩算法背后也都藏着一个预测模型。原因在于信息论:编码一个符号所需的比特数是 −log₂p,p 是模型赋予它的概率——概率越高,占用字节越少。gzip 用的 DEFLATE 算法通过在 32KB 滑动窗口内寻找匹配来压缩数据:如果接下来的文本与窗口里已有内容相似,就能编码成低成本的"回指",否则要老实地按字节存储。据此可以定义一个打分公式:score(候选续写) = len(gzip(上下文 + 候选续写)),压缩后越短,说明这段续写越像 gzip"见过"的内容。
作者最初尝试逐字节贪心选择,但很快失败:gzip 只给出整数字节长度,加一个字节往往根本不改变压缩后的长度,信号被"量化噪声"淹没。gzipt 改用集束搜索(beam search):每一步向前看一整段候选续写(而非单字节),把当前语料窗口加最近生成文本的尾部作为上下文,为每个候选打分,保留得分最好的若干条,逐步扩展到指定长度后提交最优结果。
只保留"最近尾部"作为上下文而非全部历史,也是刻意设计:DEFLATE 对邻近匹配的编码成本低于远处匹配,如果 gzip 能看到全部历史,最便宜的选择往往是不断逐字复制刚生成过的内容,陷入逐字循环。
用小莎士比亚语料(tiny Shakespeare)做引子后,gzipt 生成的续写虽不连贯,但明显"知道"一些关于文本结构的东西——比原作者预期的多。整个实现是一份纯 Python 标准库代码(实际调用 zlib 而非另起进程调 gzip,二者底层都是 DEFLATE 算法),代码已在 GitHub 开源。
作者提到,《Language Modeling is Compression》论文也尝试过用压缩直接做生成,但效果不佳;论文提到集束搜索是可能的改进方向,本文把这个方向具体实现并开源验证。这仍是一个演示性质的玩具项目,作者未给出与神经网络语言模型的定量对比。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断