代理压缩用于语言建模 Proxy Compression for Language Modeling
通过混合压缩和原始字节表示训练,实现高效语言建模并保持字节级推理接口
前置知识
Tokenization(分词)
将原始文本分割成离散符号序列的过程。现代语言模型几乎都依赖外部tokenizer(如BPE、WordPiece)将UTF-8字节流压缩成更短的token序列,以提高计算效率。Tokenizer是固定的、手工设计的压缩器,其输出作为模型的输入接口。
理解tokenizer的局限性(如耦合问题、artifact等)是理解本文动机的关键,因为代理压缩正是为了解决这些问题而提出的。
字节级语言模型
直接在原始UTF-8字节序列上操作的语言模型,不依赖外部分词器。这类模型具有通用性、鲁棒性等优点,但面临计算成本高的挑战,因为字节序列比token序列长得多。
代理压缩的目标就是在保持字节级推理接口的同时,获得压缩训练的效率优势,因此理解字节级模型的特点和挑战很重要。字节级模型的优势在于通用性(任何文本都可以表示为UTF-8字节)和鲁棒性(避免tokenizer引入的artifact),但其核心挑战是计算效率:字节序列比token序列长得多,导致训练和推理成本增加。代理压缩正是为了解决这一矛盾而提出的,它通过混合表示训练,让模型既能从压缩数据中学习效率,又能在原始字节上推理。
算术编码(Arithmetic Coding)
一种无损数据压缩方法,利用概率模型将符号序列编码为比特流。在语言模型中,可以使用神经网络作为概率估计器,通过算术编码实现神经压缩。与tokenizer不同,神经压缩是上下文相关的、非可逆的。
本文探索的神经代理压缩器就是基于算术编码实现的,理解其工作原理有助于理解神经压缩的特性和优势。算术编码将符号序列编码为比特流,编码长度与信息熵成正比,因此能够实现接近理论极限的压缩效率。在代理压缩框架中,神经压缩器使用一个小型字节级语言模型(约40M参数)作为概率估计器,通过算术编码将原始字节序列压缩为更短的比特流。这种压缩方式与tokenizer的关键区别在于它是上下文相关的:同一个字节在不同上下文中可能被编码为不同的比特模式,从而产生'结构化模糊性',这种特性被认为有助于模型学习更鲁棒的表示。
跨表示迁移(Cross-representation Transfer)
模型在一种输入表示(如压缩序列)上训练后,在另一种表示(如原始字节)上表现良好的能力。这种迁移能力是代理压缩成功的关键,它允许模型主要在压缩数据上训练,却在原始字节上推理。
本文的核心发现就是跨表示迁移现象:尽管90%的训练数据是压缩格式,模型在原始字节推理上仍表现良好。理解这一现象是理解整个方法的基础。
研究动机
现代语言模型几乎完全依赖固定tokenizer进行训练,这种设计将整个建模栈耦合到外部压缩器上。Tokenizer作为手工设计的压缩器,引入了多种已知问题:提示边界问题(prompt boundary artifacts),微小的空白或格式变化会改变tokenization决策,导致模型行为剧烈变化;重tokenization漂移(retokenization drift),不同API返回的token ID不一致;欠训练token或故障token(under-trained or glitch tokens),某些token在训练数据中出现极少导致模型处理不当;数据混合泄漏(data mixture leakage),tokenizer可能泄露训练数据组成信息;对低资源语言的偏见(biases against low-resource languages),tokenizer对不同语言的压缩效率差异导致不公平;以及对抗性输入的敏感性增加。这些问题的根源在于tokenizer作为硬连接的外部组件,限制了模型的端到端学习能力。
本文的目标是本文提出代理压缩(proxy compression)训练方案,旨在保持压缩输入的训练效率优势,同时在推理时提供端到端的原始字节接口。这一目标的重要性在于,它试图解决语言模型领域的一个根本矛盾:压缩数据训练高效但限制了模型的接口灵活性,而原始字节训练虽然通用但计算成本高昂。具体目标包括:第一,在固定计算预算下显著优于纯字节级基线,实验证明在14B参数规模下,代理压缩模型在HumanEval-Plus上达到30.5% pass@1,相比字节级基线的24.4%提升25.0%。第二,随着模型规模增加,最终匹配或超越基于tokenizer的方法,在MBPP-Plus上,14B代理压缩模型达到49.5%,超越tokenizer基线的48.1%。第三,保留字节级建模固有的鲁棒性优势,在ReCode鲁棒性评估中,7B神经代理模型达到19.8%鲁棒pass@1,超过tokenizer模型的14.9%。第四,无需修改模型架构,所有修改仅限于数据预处理管道,这使得代理压缩可以无缝集成到现有训练流程中。第五,通过混合表示训练,模型学会内部对齐压缩序列和原始字节,实现强大的跨表示迁移,即使90%的训练数据是压缩格式,模型在原始字节推理上仍表现良好。
与已有工作不同的是,与已有工作相比,本文的独特视角在于将外部压缩器视为训练时的代理(proxy)而非永久接口组件。已有工作要么完全依赖tokenizer(传统方法),要么直接使用字节级模型(但计算成本高),或者尝试在模型架构内部进行压缩(如降采样)。代理压缩则采取了一种折中方案:训练时使用压缩视图提高效率,但推理时完全丢弃压缩器,仅使用原始字节。这种设计抓住了被忽视的关键点:压缩数据可以作为训练时的高效代理,而不需要硬连接到模型接口中。通过混合表示训练,模型学会内部对齐压缩序列和原始字节,实现强大的跨表示迁移。
核心方法
代理压缩的核心思想可以类比为'用拐杖学走路':训练时使用压缩数据作为'拐杖'提供支撑(效率),但最终目标是让模型能独立在原始字节上'行走'(推理)。技术路线分为三个阶段:首先,在数据准备阶段,对训练语料应用外部压缩器(如tokenizer、神经压缩器)生成压缩视图,然后将压缩序列与原始UTF-8字节混合,通过特殊的哨兵标记(如⟨comp⟩、⟨raw⟩)区分不同表示格式。其次,在训练阶段,一个标准的自回归语言模型同时在压缩和原始序列上进行下一符号预测,学习在两种表示之间建立内部对齐。最后,在推理阶段,完全丢弃压缩器,模型仅在原始字节上运行。整个过程不需要修改模型架构,所有修改仅限于数据预处理管道。
代理压缩最本质的创新在于将外部压缩器从模型接口中解耦,使其成为训练时的效率工具而非永久组件。与传统tokenizer-based语言模型相比,传统模型几乎从未见过原始字节,完全在token空间中操作;而代理压缩模型在训练时同时接触压缩和原始两种表示,学习它们之间的内在映射。这种设计使得模型能够从压缩数据中获得效率优势,同时保持对原始字节的理解能力。从编码角度看,语言模型通过其预测分布定义了一个压缩器;代理压缩可以视为将部分压缩工作委托给外部代理,同时训练模型在原始字节上保持有效压缩能力。这导航了一个基本权衡:纯压缩数据训练高效但限制了模型只能看到压缩器暴露的模式,而纯原始字节训练能捕获所有结构但计算成本高昂。
方法步骤详情
代理压缩方法包含以下具体步骤:1. 数据准备:对每个原始输入样本$x_{raw}$,以概率$r$(默认0.9)决定是否压缩。压缩样本通过外部压缩器$f$生成$x_{comp} = f(x_{raw})$,压缩器可以是tokenizer(压缩率约2.9×)、神经压缩器(约2.6×)或gzip(约2.5×)。2. 格式标记:使用特殊哨兵标记包装不同表示的序列,原始序列为$\langle raw\rangle \circ x_{raw} \circ \langle /raw\rangle$,压缩序列为$\langle comp\rangle \circ x_{comp} \circ \langle /comp\rangle$,其中$\circ$表示连接。3. 混合训练:将不同表示的样本打包成固定长度的上下文,一个标准的自回归语言模型同时在两种表示上进行下一符号预测。4. 上下文翻译配对:在训练初始阶段(前10k步),可选地将同一文档的原始和压缩视图连接在同一上下文中,鼓励模型学习显式的跨表示翻译。5. 推理:完全丢弃压缩器,模型仅在原始UTF-8字节上运行。
技术新颖性
代理压缩的技术新颖性体现在多个方面:首先,它是第一个提出将外部压缩器作为训练时代理而非永久接口组件的训练方案,这从根本上改变了tokenizer在语言模型中的角色定位。其次,它发现了强大的跨表示迁移现象:尽管90%的训练数据是压缩格式,模型在原始字节推理上仍表现良好,且这种迁移能力随模型规模增强。第三,它系统研究了不同代理压缩器的特性,发现tokenizer和神经压缩器支持强迁移,而通用压缩(gzip)迁移失败,揭示了结构化、语义有意义的压缩对有效代理训练的关键作用。第四,神经压缩引入的'结构化模糊性'(structured fuzziness)概念——将格式噪声抽象掉同时保留语义内容——这是一种有益的归纳偏置。
实验结果
本文在代码语言建模上进行了广泛实验,得出以下核心发现:1. 跨表示迁移随模型规模增强:在HumanEval-Plus上,14B参数的代理压缩模型(tokenizer代理)达到30.5% pass@1,超过tokenizer基线的29.3%和字节级基线的24.4%(Table 1)。在MBPP-Plus上,代理压缩模型达到49.5%,超过tokenizer基线的48.1%和字节级基线的42.1%。2. 训练效率优势:代理压缩模型在固定计算预算下显著优于纯字节级基线,同时保留字节级建模的数据效率优势。在14B规模下,代理压缩能够捕获两种体制的最佳特性:在匹配FLOPs下与tokenizer基线相当,在匹配数据下显著超越tokenizer基线。3. 鲁棒性优势:代理压缩模型继承并放大了字节级模型的鲁棒性优势。在ReCode鲁棒性评估中,7B神经代理模型达到19.8%鲁棒pass@1,超过字节级模型的18.7%和tokenizer模型的14.9%(Table 4)。特别是在格式扰动下,tokenizer模型严重退化,而代理模型保持稳定。4. 代理压缩器特性:tokenizer和神经压缩器支持强迁移,而gzip压缩器迁移失败(Figure 5)。压缩器稳定性分析(Figure 4)显示tokenizer高度稳定,gzip极不稳定,神经压缩器介于两者之间。5. 上下文翻译能力:代理训练的模型能够近乎完美地从上下文中恢复原始输入(表3,Always-on配对下翻译准确率>95%)。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| HumanEval-Plus (14B模型) | Pass@1 | 30.5 (Neural Proxy), 30.5 (Tokenizer Proxy) | 29.3 (Tokenizer-based), 24.4 (Byte-level) | 相对字节级基线提升25.0%,相对tokenizer基线提升4.1% |
| MBPP-Plus (14B模型) | Pass@1 | 49.2 (Neural Proxy), 49.5 (Tokenizer Proxy) | 48.1 (Tokenizer-based), 42.1 (Byte-level) | 相对字节级基线提升17.6%,相对tokenizer基线提升2.9% |
| 鲁棒Pass@1 (7B模型,ReCode) | Robust Pass@1 | 19.8 (Neural Proxy), 19.1 (Tokenizer Proxy) | 18.7 (Byte-level), 14.9 (Tokenizer-based) | 相对tokenizer基线提升32.9%,相对字节级基线提升5.9% |
局限与改进
本文存在以下局限性:1. 评估范围主要集中在代码语言建模领域,虽然附录中提供了自然语言实验的初步证据(1.5B参数下平均准确率50.3 vs 字节级48.2),但更大规模的自然语言、多语言和多领域验证仍是未来工作。2. 由于推理在原始字节上进行,部署效率取决于底层字节级模型架构;虽然EvaByte架构缓解了这一成本,但代理压缩本身并未消除高效字节级解码的普遍挑战。3. 压缩率、迁移强度和计算效率之间的权衡尚未完全表征,例如更激进的压缩可能放大效率增益但可能降低迁移质量。4. 神经压缩器的训练需要额外的计算资源(约40M参数的小模型),增加了整体流程的复杂性。5. 代理压缩作为纯数据预处理步骤,未直接整合到模型架构设计中,可能限制了进一步的性能或效率提升空间。
独立分析的弱点
本文存在以下弱点及改进方向:1. 压缩器选择依赖经验:当前主要探索tokenizer和神经压缩器,但未提供系统化的压缩器设计准则。改进方向是研究压缩器的哪些特性(如稳定性、语义保持性)对迁移最关键,从而指导更优压缩器设计。2. 混合比例固定:默认使用$r=0.9$的压缩比例,但不同任务和模型规模可能需要不同的最优比例。改进方向是开发自适应混合比例调整策略,根据训练动态自动优化压缩-原始数据比例。3. 上下文翻译配对效果有限:虽然配对能提升翻译准确率,但Warmup-only策略在下游性能上优于Always-on,说明配对可能引入不必要的归纳偏置。改进方向是探索更精细的配对策略,如课程学习式配对或基于模型置信度的选择性配对。4. 神经压缩的模糊性未充分利用:当前将神经压缩的'结构化模糊性'视为有益特性,但未深入探索如何显式利用这种模糊性进行正则化或数据增强。改进方向是设计利用模糊性进行对比学习或一致性训练的方法。
未来方向
基于本文成果,未来研究方向包括:1. 将代理压缩扩展到更广泛的任务领域,包括自然语言理解、多模态学习等,验证跨表示迁移的普适性。2. 探索代理压缩与模型架构设计的深度整合,例如设计专门处理混合表示的新型注意力机制或层结构。3. 研究代理压缩在持续学习或领域适应中的应用,利用压缩表示作为知识迁移的桥梁。4. 开发更高效的神经压缩器,通过改进熵估计、并行化策略等降低代理压缩的预处理成本。5. 探索代理压缩与其他训练技术(如课程学习、多任务学习)的结合,进一步提升训练效率和模型性能。6. 研究代理压缩在边缘设备或资源受限环境中的应用,利用其字节级接口的通用性优势。
复现评估
本文的复现性较好:1. 开源代码:作者提供了完整的代码库(https://github.com/LZhengisme/proxy-compression),包括数据准备、训练和评估流程。2. 数据集:使用公开的RefineCode语料库(约270GB Python代码)和完整GitHub分割(约3.3TB代码),数据获取相对容易。3. 算力需求:训练规模从0.5B到14B参数,需要大量GPU资源,但作者提供了详细的训练配置和超参数设置。4. 复现难度:中等,需要实现EvaByte架构、代理压缩器训练(特别是神经压缩器需要训练40M参数的小模型)和混合表示训练流程。5. 评估基准:使用标准的HumanEval、MBPP及其EvalPlus变体,评估协议明确。总体而言,有经验的团队在充足计算资源下应该能够复现主要结果。
论文图表