gzip无神经网络语言建模可行性探索

gzip无需神经网络即可实现语言建模。实验显示,基于DEFLATE算法的压缩长度评分结合光束搜索,能在小型莎士比亚语料库上生成具特征文本,验证了预测与压缩在信息论层面的等价性。

gzip 作为语言模型的可行性探索

此前一项关于无神经网络语言建模的研究指出,通过无限 n-gram 模型即可生成莎士比亚风格文本,该过程无需权重或训练,仅依赖计算。这一发现源于对“语言建模即压缩”相关论文的探讨,其中强调了预测与压缩的等价性:

压缩长度越短预测越准

每个预测模型本质上都是一个压缩机,所有压缩算法都是预测模型。

基于此逻辑,一个自然的问题随之产生:gzip 能否执行语言建模任务?在不使用神经网络、不学习任何参数的情况下,仅依靠操作系统自带的压缩工具,是否可以通过搜索最佳压缩字节序列来延续提示文本?实验结果显示,在小型莎士比亚语料库基础上,gzip 确实能生成具有一定特征但非连贯的文本,其对文本结构的理解程度超出预期。

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 .

压缩机制与信息论视角下的预测

压缩的核心在于对数据的“预期”。对于高度可预测的数据(如重复百万次的字母 A),编码所需比特数极少;而对于无结构的随机数据,几乎无法压缩。这符合信息理论的基本原理:编码一个符号所需的比特数为 $-\log_2 p$,其中 $p$ 为模型赋予该符号的概率。高概率对应低比特消耗。因此,任何压缩算法内部都隐含着一个概率模型。

以 DEFLATE 算法为例,其通过在 32 KiB 滑动窗口内匹配最近文本来压缩后续字节。若新输入与窗口中已有内容呼应,DEFLATE 将其编码为廉价的反向引用而非字面字节。例如,“我会说的,我会说的”这类重复结构因已在窗口中存在,压缩后占用空间极小。

由此可建立评分机制:给定上下文,评估候选延续文本的可预测性,只需测量其压缩长度:

$$\text{score}(\text{candidate}) = \texttt{len(gzip(context + candidate))}$$

压缩长度越短,表明候选文本越符合 gzip 窗口的统计规律,即更具“可预测性”。反之,压缩长度较长则意味着文本结构与已知模式偏离较大。

基于光束搜索的生成策略

单纯选择下一个最易压缩字节的方法存在缺陷。由于 gzip 输出整数字节长度,缺乏细粒度分数,添加单个字节往往不会改变压缩长度,导致大量候选项得分相同,有效信号被量化噪声掩盖。

解决方案是引入前瞻性的光束搜索(Beam Search)。在每一步生成中,系统构建包含语料库窗口及当前生成尾部的上下文,并尝试可能的下一个字节序列。通过压缩“上下文+候选序列”并比较结果长度进行评分,保留压缩效果最佳的若干候选路径。

具体生成循环如下:

  1. 初始化:以用户提示作为初始文本,无需特殊启动令牌,提示字节直接作为 gzip 的上下文输入。
  2. 上下文构建:将 gzip 文本窗口与提示/已生成文本的最新尾部结合。
  3. 搜索与评分:保持光束宽度内的最优延续序列,按压缩长度排序并修剪至最佳候选集,随后扩展地平线字节。
  4. 确定输出:选取全跨度中最可压缩的序列(或在正温度下从最终候选中采样),将其加入输出并重启循环。

关键细节在于,评分时仅保留生成的输出尾部字节作为上下文。若允许 gzip 访问完整历史,模型倾向于陷入字面循环,简单复制刚生成的文本。



上述解码与评分过程完全由标准 Python 库(仅使用 zlib)实现,代码开源托管于 GitHub。值得注意的是,早期类似尝试表现不佳,而引入光束搜索显著提升了生成质量。尽管实际代码调用的是 zlib 库而非外部 gzip 进程,但两者均基于相同的 DEFLATE 算法,项目命名为 gzipt 旨在突出其与 gzip 的关联。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读