Proxy Compression for Language Modeling¶
会议: ICML 2026
arXiv: 2602.04289
代码: https://github.com/LZhengisme/proxy-compression (有)
领域: LLM 效率 / 字节级建模 / 分词替代
关键词: byte-level LM, tokenizer-free inference, mixed-representation training, arithmetic coding, neural compressor
一句话总结¶
作者提出「proxy compression」——训练时把 90% 数据喂成 tokenizer / 神经压缩器产出的短序列、10% 喂原始 UTF-8 字节,配合 sentinel token 与短暂的 in-context translation warm-up;推理时丢掉所有压缩器,模型只看原始字节,却能在固定 compute 下显著超过纯字节模型,且在大规模下追平甚至超过 tokenizer baseline。
研究背景与动机¶
领域现状:现代 LM 几乎全部建立在「外部固定 tokenizer」之上 —— BPE / SentencePiece 把 UTF-8 字节压缩成 token,让训练长度可控;arithmetic coding 配合小型 byte LM 也属于同类压缩。Tokenizer 把训练效率拉满,但 token 永久焊死在 model interface 里。
现有痛点:硬连 tokenizer 带来大量已被详细记录的副作用 —— prompt-boundary 问题、retokenization drift、glitch token("SolidGoldMagikarp")、低资源语言偏置、对抗鲁棒性差等等;更根本的是模型只学到 token 空间的统计,并非真正端到端的字节建模器。纯字节训练能解决所有这些问题,但 sequence 长度被拉到几倍,同样 compute 预算下数据量大减、收敛远不如 tokenizer 模型。
核心矛盾:训练效率(短序列)↔ 推理灵活性(字节级接口)↔ 鲁棒性 —— 现有方案只能三选二。Tokenizer 模型拿前两者,纯字节模型拿后两者,没有一种方案能三者全要。
本文目标:保留训练侧的"压缩短序列"效率优势,同时让推理侧完全运行在 raw UTF-8 上,不引入任何架构修改(不变体不变 tokenizer 不变 attention 不变),并希望随着模型增大效益放大。
切入角度:把外部压缩器视为「训练期 proxy」而非永久接口 —— 训练时同一个模型同时学习两种表示并自动建立内部映射;推理时丢掉压缩器只剩字节。关键观察是大模型有能力把这种 cross-representation 对齐塞进 weights 里。
核心 idea:用一个共享词表、加 <comp>/<raw> sentinel、做 mixed-representation next-token prediction,并在前 10k 步做 in-context translation 配对 warm-up;推理纯字节。
方法详解¶
整体框架¶
核心想法是让同一个模型在训练期同时吃「压缩短序列」和「原始字节」两种表示,并在权重里建立两者的内部映射,这样推理时就能把压缩器整个扔掉、只在原始 UTF-8 上运行。具体管线是:对每条样本 \(x_{\text{raw}}\) 以概率 \(r\)(默认 0.9)替换成压缩流 \(x_{\text{comp}}=f(x_{\text{raw}})\)、否则保留原始字节,每段都用 <raw>/<comp> sentinel 包裹标明表示类型;训练前 10k 步是 warm-up,把同一样本的两种视角串进同一上下文做 in-context pairing 并把 \(r\) 从 0.4 线性升到 0.9,warm-up 后关掉 pairing、固定 \(r=0.9\) 跑到底;推理只喂 raw 字节。三者共享一张词表:前 64 索引留给 sentinel、接着 256 给 UTF-8 字节、剩余给压缩符号(tokenizer 用 OpenCoder 96,640 词表,neural 用 16-bit pack 共 65,536 符号,gzip 用 256 字节)。下图把这条管线画出来:上半部「代理压缩器」对应设计 1、2 的两种实例化,下半部「混合表示训练」对应设计 3,最后两步(损失与推理)是脚手架。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400, 'subGraphTitleMargin': {'top': 8, 'bottom': 16}}}}%%
flowchart TD
X["原始样本(UTF-8 字节)"]
X -->|"概率 r=0.9:压缩(二选一)"| PC
X -->|"概率 1−r=0.1:保留原始字节"| PACK
subgraph PC["代理压缩器 f(训练期产出,推理时整个丢弃)"]
direction TB
T["Tokenizer proxy<br/>OpenCoder BPE,压缩率 ~2.9×"]
N["Neural proxy<br/>40M byte LM + 算术编码 + 熵分段并行,~2.6×"]
end
subgraph MR["混合表示训练(sentinel + warm-up 配对)"]
direction TB
PACK["sentinel 包裹打包<br/>raw/comp 标明段类型,共享词表"]
WARM["warm-up 前 10k 步<br/>两视角 in-context 配对,r 0.4→0.9"]
PACK --> WARM
end
PC --> PACK
MR --> LM["单一 LM:next-token CE<br/>raw 与 comp 段一视同仁"]
LM --> INF["推理:丢弃压缩器,仅原始字节输入"]
关键设计¶
1. Tokenizer-based proxy:把现成 BPE 当成最简单的训练期压缩器
要兑现「训练享 tokenizer 效率、推理丢 tokenizer」,最直接的实例化就是拿一个现成 tokenizer 把原始字节离线压成 token 索引序列当作 \(x_{\text{comp}}\)。这里直接调用 OpenCoder BPE,平均压缩率约 \(2.9\times\),token 仍按词表索引喂进模型,与普通 tokenizer 模型唯一的区别是它出现在带 <comp> 标签的序列里、且训练时有 10% 概率被换成原始字节。之所以选 tokenizer 打头阵,是因为它输出极其稳定——对 10% 字符删除这种扰动,Levenshtein 距离几乎不动,这种稳定性让 LM 最容易学到 "comp ↔ raw" 的映射;同时它可以全离线预处理,没有任何额外训练成本。论文也试过把 token id 重新编码成定长字节序列,但效果不如直接用 id 表示好。
2. Neural proxy + 熵分段并行:用神经压缩器换更优的熵编码,靠熵分段让它工程可行
tokenizer 终究是手工 BPE 的产物,理论上神经压缩器能做得更优,于是第二种 proxy 改用一个 40M byte-level LM 配 arithmetic coding 给字节流做近最优熵编码,压缩率约 \(2.6\times\)。做法是先训小 byte LM 给出每个位置的 \(p(\cdot|\text{ctx})\),再以 equal-information windows 做 arithmetic coding,每 16 bits pack 成一个符号。逐字节串行编码会慢到跑不动 3.3 TB 语料,所以引入「熵分段」——用 LM 算出 per-byte entropy,把高熵位置当作切片边界,每段独立并行压缩,这是让整套方案落地的关键。值得注意的是这个映射对 raw 是确定性单射、但反向并非单射:不同的原始字节可能映到同一 comp 段(即所谓 "fuzzy"),不过发生碰撞的 raw chunk 里 90%+ 都共享 \(\text{LCP}\geq 0.8\),差异只落在 whitespace / newline / indent 这类低熵尾部。这种「结构化模糊」反而成了好事——它帮模型把格式噪声抽象掉,鲁棒性不降反升。
3. In-context pairing + sentinel + 高 \(r\) warm-up:让对齐进权重,却不让推理依赖压缩器
前两个设计提供了压缩表示,但真正的难点是怎么让模型把 comp ↔ raw 的对齐内化到权重里、又不至于推理时非看到 comp 才能工作。三件事配合解决:一是用 <raw>/<comp> sentinel 显式告诉模型当前段的表示类型,让 next-token prediction 能条件于表示类型;二是 warm-up 阶段把 \([\langle\text{raw}\rangle x_{\text{raw}}\langle/\text{raw}\rangle\langle\text{comp}\rangle x_{\text{comp}}\langle/\text{comp}\rangle]\)(顺序随机)拼进同一上下文,强迫模型同时看到两种视角;三是 warm-up 一结束就立刻关掉 pairing,避免模型养成「推理时必须有 comp 在前」的依赖。\(r\) 从 0.4 渐升到 0.9 同样是为了防止训练早期 raw 见得太少、对齐学不起来。这个折中是被消融逼出来的:no-pairs 训练时 oracle-translation pass@1 只能到 30–46%,always-on pairing 能冲到 95%+ 但模型变得依赖 pairing、下游 raw-byte pass@1 反而略降;只有 warm-up-only 既保证了早期对齐、又不养出依赖(Table 3 验证),是经验上的最优解。
损失函数 / 训练策略¶
唯一损失就是普通的 next-token CE,对 raw 与 comp 两种 segment 一视同仁。架构用 EvaByte(高效字节级 multi-byte prediction),训练 50K 步 / batch 2M symbols,覆盖 0.5B / 1.5B / 4B / 7B / 14B 五个尺寸。
实验关键数据¶
主实验¶
固定 100B symbols 训练预算(compute 大致匹配),在 HumanEval-Plus / MBPP-Plus 上 pass@1:
| 任务 | 模型 | 0.5B | 1.5B | 4B | 7B | 14B |
|---|---|---|---|---|---|---|
| HumanEval-Plus | Tokenizer | 17.7 | 18.3 | 28.0 | 28.7 | 29.3 |
| Byte-level | 15.9 | 18.3 | 22.0 | 23.8 | 24.4 | |
| Proxy (Neural) | 13.4 | 18.3 | 22.6 | 26.8 | 29.9 | |
| Proxy (Tokenizer) | 12.2 | 20.7 | 24.4 | 26.2 | 30.5 | |
| MBPP-Plus | Tokenizer | 29.4 | 41.0 | 46.3 | 45.2 | 48.1 |
| Byte-level | 25.9 | 33.6 | 41.8 | 41.3 | 42.1 | |
| Proxy (Neural) | 22.0 | 29.6 | 41.8 | 41.8 | 49.2 | |
| Proxy (Tokenizer) | 25.4 | 38.4 | 44.4 | 45.5 | 49.5 |
Proxy 在 ≥1.5B 反超纯字节,在 14B 反超 tokenizer 基线 —— transfer 随规模放大。
消融实验¶
| 配置 | HumanEval-Plus pass@1 (1.5B) | 备注 |
|---|---|---|
| Always-on pairing | 17.0 | oracle-translation 96%,但 ordinary 反而低 |
| Warmup-only (默认) | 20.7 | 既保对齐又不养依赖 |
| No pairs | 17.0 | 无显式 cross-rep 信号 |
| Gzip proxy(任意比例) | < 纯字节 | unstable 流,无法 transfer |
| Tokenizer / Neural proxy | 显著超字节 | 稳定 + 结构化 |
关键发现¶
- Proxy gain 与 model size 强正相关:0.5B 时弱甚至负迁移,14B 时同时碾压字节和 tokenizer 基线。
- 「压缩器稳定性」是 transfer 关键:tokenizer Levenshtein 距离最低、neural 居中、gzip 最大;前两者 transfer 成功,gzip 完全失败。
- 鲁棒性继承字节模型优势:在 ReCode 扰动(function rewrite / format / syntax / docstring)上,7B proxy 模型 Robust Pass@1 19.1(neural)vs tokenizer baseline 14.9 vs byte baseline 18.7,在 format / docstring 上几乎无衰减。
- Always-on pairing 把 oracle-translation 拉到 95%+ 但 ordinary pass@1 反而略降 —— 说明模型「在 context 翻译」与「在 weights 内化」是两条不同路径,后者才决定纯字节下游表现。
亮点与洞察¶
- 「外部压缩器只是训练 proxy,推理时全部丢掉」是一个极漂亮的解耦思路 —— 同一招可推广到 latent diffusion 的 VAE、音频领域的 codec 等所有「外部编码器 + 内部建模」结构。
- 用 sentinel token 把不同 representation 显式标记给模型,让单一模型在多 representation 上做 next-token,比设计多分支 / 多 decoder 简洁太多,对未来 multi-modal 训练有方法学借鉴。
- 「结构化模糊」是个反直觉发现:neural compressor 不可逆反而成了正则化,把格式噪声抹掉,鲁棒性甚至超过 lossless tokenizer。
局限与展望¶
- 实验主要在代码语料上(RefineCode),自然语言只在 1.5B 上做了补充验证;多语言、低资源语言下的 transfer 是否仍随尺度放大值得追问。
- 总 vocabulary 包含 byte(256)+ tokenizer(96K)+ sentinel,对 embedding 表的内存开销略大;neural proxy 还要额外训练并维护一个 40M byte LM。
- 没有给出推理速度对比:纯字节推理虽然丢了 tokenizer,但序列长度变长(\(\sim 2.9\times\)),EvaByte 的 multi-byte prediction 抵消多少需要更细的量化。
- 训练时模型见到的总字节数其实比纯字节模型少 —— 文章用 fixed FLOPs 比较是公允的,但实际部署里数据量与 FLOPs 都受限时是否仍领先,值得做。
相关工作与启发¶
- vs Lester 2024(neural arithmetic coding LM):他们把 neural compressed stream 作为最终训练 + 推理表示;本文反过来,仅用作训练 proxy,推理仍走原始字节。
- vs EvaByte / ByT5 / MegaByte:纯字节方向的延伸;本文同享字节级推理但训练效率与之相比有数量级提升。
- vs Tokenizer + 偶尔 mix raw:表面像 token-byte 混合训练,但 sentinel + warm-up pairing + 高 \(r\) 是关键差异,缺一会显著掉点。
评分¶
- 新颖性: ⭐⭐⭐⭐ "压缩器只做训练 proxy" 这一视角清新且实际可用
- 实验充分度: ⭐⭐⭐⭐ 横跨 5 个 scale + 3 类 proxy + 多个 robust / in-context probe
- 写作质量: ⭐⭐⭐⭐ 故事线清楚,scaling 曲线讲得直观
- 价值: ⭐⭐⭐⭐ 给「字节级推理」这条长期被效率压制的方向打开实际可行路径