当词表只剩下字母:极限裁剪的分词,会把大模型变成什么样?
我愿意把复杂问题讲到“能落地决策”的程度:如果你的目标是稳态性能与性价比,请不要在推理时对分词器做极限裁剪;如果你对字节/字符建模的统一性与鲁棒性感兴趣,请在训练期系统性地引入相应的设计。你怎么看?你是否在真实系统里尝试过改变切分策略?效果如何?对于中文,你更看好“字节统一”还是“字/词片段并用”的折衷?如果要做一个“可逆/可学习”的前端分词器,你会用什么架构?欢迎在评论区聊聊你的实践经验与疑问。
当词表只剩下字母:极限裁剪的分词,会把大模型变成什么样?
“如果把英文都拆成一个个字母,把中文拆成 UTF‑8 字节,大模型还懂我们吗?”
作为一名长期做语言与模型科普的作者,我想把这个看似“奇技淫巧”的问题,认真讲清楚:它并非只是效率问题,而是一个“训练分解方式”与“推理分解方式”彻底错位后的系统性风险。
关键结论一览
- 分词器不是可随意更换的“前端皮肤”,而是模型参数与训练分布共同定义的“协议”。训练和推理的词表/切分如果不一致,最轻是性能重挫,最重是根本无法运行。
- 在技术上,仅当“极限裁剪”仍输出训练词表里存在的基础符号(如字母、空格、字节)时,模型才能跑;否则词嵌入矩阵维度就对不上,直接报错。
- 即便能跑,输入序列会显著变长(英文通常从“词片段”退化到“逐字母”;中文从“单字/常用片段”退化到“3 个字节/字”),注意力计算呈平方增长,吞吐与可用上下文急剧缩水。
- 切分分布会发生剧烈偏移:模型训练中频繁出现的“the、的、##tion、常用汉字”等子词不再出现,取而代之的是高度稀疏的字母/字节序列。模型在这种“前所未见”的切分上会语义失真、预测不稳。
- 语言差异明显:英文退化为字母序列,损失常见词缀/词形信息;中文退化为 UTF‑8 字节序列,单字被拆成 3 个无语义的字节,打击更重。
- 这并不代表“字节级/字符级”语言建模不可行。相反,若从头按字节/字符训练(如 ByT5、CANINE、Charformer 等路线),可以达到不错效果。但“训练用子词、推理用字节”这种错配,是另一回事。
- 如果必须提升鲁棒性,正确做法是:在训练阶段就引入多样切分(如 BPE-dropout)、提供字节回退通道并频繁曝光,或设计桥接模块,而不是在推理时直接“砍词表”。
1. 先把“分词器”摆正位置
- 分词器(tokenizer)定义了字符串到 token 序列的映射,以及 token 到字符串的反向映射。
- 模型的输入嵌入矩阵、输出词表分布,都是围绕这个映射训练出来的。它既决定了“看世界的粒度”,也塑造了“模型学到的统计规律”。
- 主流做法是子词化(BPE、Unigram、WordPiece),在“词”和“字符”之间找一个兼顾效率与表达的单位。例如英文把 internationalization 拆成 internatio + nal + ization 或更粗的几段;中文多为“单字即 token”,高频词组也可能合并为更长片段。
当你在推理时突然把词表“瘦身”为仅 a–z/A–Z、少量符号和数字,非 ASCII 文本只保留 128–255 的原始字节,本质上是在把“切分协议”换成一种更粗暴的做法:英文按字母、中文按字节。问题是,模型从没在这种协议上学过“怎么理解世界”。
2. 极限裁剪到底意味着什么
我们明确两种不同情形:
-
直接换词表(改变词表大小与映射)
这在工程上不可行。模型的输入嵌入矩阵和输出头大小与训练时词表维度严格绑定,推理时擅自缩减或重排,将导致维度不匹配,根本跑不起来。 -
不改词表大小,但“禁用”大部分合并规则,只用训练词表中存在的“基础符号”编码(例如字母、空格、字节),把所有复杂子词都拆成基础符号序列
这在某些分词器上技术上可行(前提是训练词表确实包含这些基础符号,如 GPT 风格的字节级 BPE 基符号,或英文 26 个字母等)。但这会带来极端的分布偏移与长度膨胀,性能与效率都会受到巨大影响。
下文讨论的“影响”,指的是第二种“技术上可跑但切分退化”的场景。
3. 第一重打击:序列长度膨胀与算力成本激增
- 英文:从“子词”退化到“字符”
现实中英文平均约 3–5 个字符/子词。改为逐字符后,token 数量约增加 3–5 倍。 - 中文:从“单字/高频片段”退化到“UTF‑8 字节”
常见汉字在 UTF‑8 下占 3 个字节。原本一个 token 的语素,现在要用 3 个“无语义字节 token”来传达,序列长度增加约 3 倍;若训练时常把多字词合成更长子词,退化后的倍数更高。
Transformer 的单层注意力复杂度近似 O(n^2)。当序列长度放大 r 倍,单步计算与显存开销可放大至 r^2。举例:
- 原本 1k token 的提示,退化后变 3k–5k token;同等上下文上限下,可容纳的“语义内容”锐减。
- 长度变长会触发更多截断,导致任务信息丢失。即使不截断,也会逼近位置编码的有效分辨率边界,进一步影响稳定性。
简单说:你会花更多钱、更多时间,得到更差的结果。
4. 第二重打击:分布偏移与语义表示的“解体”
模型在训练中学到的,是“在子词序列上”预测下一个子词的分布。极限裁剪等于把它推到一个几乎没见过的输入分布上:
- 高频语义单位消失
“the、and、的、了、tion、##ing、常用汉字单字”等在训练中频繁出现、被学得很“扎实”,现在完全不出现;转而出现“t‑h‑e”“3 个字节构成一个汉字”的稀疏模式。 - 局部统计规律被打乱
训练时模型可能强依赖“空格+the”或“##tion”这样的相邻模式;改为逐字符后,它要跨多个位置才能重建同一语义。这在未专门训练下往往做得很差。 - 罕见基础符号被“异常放大”
训练里单个字母/字节更多只是构成子词的“底座”,自身语义不强;推理时它们却成为主要观察对象,模型的表征与预测会“漂移”。
这会表现为:读不懂长词、抓不住实体、对成语/惯用搭配失明、回答“飘忽”、同一句话前后用词风格摇摆等。
5. 第三重打击:不同语言受害程度不同
- 英文与拼音文字
退化为字符级后,词形、词缀的紧凑表达消失(如 un‑, re‑, ‑tion, ‑ity),句法线索被稀释。模型不得不在更长的跨度上重构词语,容易丢失精确含义和词性判断。 - 中文与表意文字
单个汉字被拆成 3 个字节后,单字语义在输入层面“解体”。训练时很少见到这种“三字节组合=一个字”的切分,因此位置信号和语义对齐都会漂。对成语、专名、术语的理解会大幅退化。 - 黏着语/屈折语(如土耳其语、芬兰语、俄语等)
子词化本为应对丰富词形而生。退化后,模型难以在字符序列上稳定捕捉词形规则,影响更显著。 - 代码与结构化文本
相对好一些,因为标识符和符号本就带强结构性,字符级模式较多;但长度、计算和分布偏移问题仍然存在。
6. 第四重打击:任务层面连锁反应
- 指令遵循与格式敏感任务
训练中模型习惯用特定标记、换行、空白分隔来解析指令与段落。极限裁剪后,标记颗粒度变细、相对位置漂移,容易破坏“对齐习惯”,出现跑题、格式崩坏。 - 检索、长文理解、工具调用
长度膨胀导致有效上下文缩短,检索证据更容易被挤出窗口;API/代码调用的标记也被拆散,解析更脆弱。 - 推理链
“逐步推理”依赖模型在固定格式上维持一致的符号流。切分退化后,局部统计规律被打散,易出现逻辑链断裂或自相矛盾。
7. 一个容易被忽略的工程真相
- 不是所有分词器都“自带字节回退”。如果训练时的词表没有完备的字节/字符基符号,推理阶段根本无法用“极限裁剪”重编码任意输入。
- 即使存在字节基符号,你也必须使用与训练一致的 token→id→向量映射。任何“换 id、换词表大小”的尝试,都会与嵌入矩阵/输出头形状冲突。
- 换言之,所谓“裁剪”若不严格受限于原训练词表,连模型都起不来;若受限可起步,又必然面临前述长度与分布灾难。
8. 反例不是没有:从头按字节/字符训练,真能行
学界和工业界已有多条路线证明:如果从训练阶段就采用字节或字符为基本单位,配合合适的架构与正则化,性能可以相当可观。
- 字节级 T5(如 ByT5):摆脱复杂词表,解决跨语言统一、鲁棒性更好,但训练成本更高。
- CANINE、Charformer:在字符输入上通过卷积、下采样、软分块等方式,构造高效表示,再接入 Transformer。
- BPE-dropout:在训练中扰动子词合并,让模型见过多种切分,增强推理时对切分变化的容忍度。
关键在于:这些方法把“字符/字节粒度”当作训练假设,从头端到端地学;而不是在推理时临时把“子词模型”硬掰回“字符模型”。
9. 量化直觉:到底会慢多少、差多少?
不给武断数字,只给可复用的估算框架:
- 长度膨胀比 r
英文从子词到字符,r ≈ 3–5;中文从单字到 UTF‑8 字节,r ≥ 3(若原本常合并多字词,r 还要更大)。 - 计算与显存
自注意力近似 O(n^2)。总计算与显存开销按 r^2 放大。r=4 时,单层注意力代价可达原来的 16 倍。 - 上下文有效容量
固定 4k token 窗口,原能容纳约 12–16k 英文字符,如今只能容纳 3–5k;中文更糟,因为每字 3 字节。 - 质量退化
取决于训练时基础符号曝光度、任务类型、语言和提示构造。通常表现为困惑度上升、事实召回下降、格式错误增多、长链推理不稳等。除非训练时特意做过切分扰动或字节回退训练,否则下降往往显著。
10. 真的一点好处都没有吗?
- 有限的鲁棒性场景
如果训练分词器原生支持“字节回退”,并且模型在训练数据中确实见过相当比例的“低级别切分”,极限裁剪可能在个别场景下“勉强可用”,例如处理稀有外来词、表情、噪声文本。 - 跨语言一致性
从工程哲学看,“全部用字节”能让系统不依赖复杂词表。但这要靠“字节优先的训练方案”来兜底,而不是推理时硬切。
总体评价仍然是:在不改训练策略的前提下,推理阶段极限裁剪更像自废武功。
11. 如果你仍想在实践中更稳一点
- 训练期引入切分多样性
使用 BPE-dropout 或在数据管线中注入多种切分视图,让模型学习“同一句话的多种拆法”。 - 确保字节回退被充分训练
若分词器支持字节基符号,训练中要让模型经常见到字节序列(而不是只在长尾里偶尔见见)。 - 设计桥接层
在推理侧把字符/字节序列送入一个小型前端(如字符卷积或轻量 Transformer),将其映射到“子词嵌入空间”,再喂给大模型。相当于学一个“可逆分词器”。 - 更务实的目标
与其一刀切极限裁剪,不如做保守裁剪:保留高频子词,减少超长、超稀疏的尾部 token,兼顾效率与稳定。
12. 思考实验:直观感受一下
- 英文句子 “internationalization matters.”
子词化可能是 “international” + “ization” + “Ġmatters” + “.”(约 4 个 token);
逐字符后变成 28 个左右的字符 token。序列长度约 7 倍,语义单位被拆散。 - 中文句子 “模型需要稳定的输入协议。”
常规切分约等于 10 个左右 token(以字为单位,少量合并);
字节级变成约 30 个 token,即每字 3 个。每个汉字的含义被拆成 3 份无语义的数字。
想象把整篇技术文档这样处理——你会很快掉进“上下文不够”“算力不够”“理解不稳”的三重陷阱。
13. 小结:把协议定在训练期,而非推理期
- 分词是协议,模型参数是对协议的最优响应。
- 极限裁剪=协议突变。哪怕能勉强编码,代价是长度爆炸、分布错位、语义崩塌、算力失衡。
- 想要字节/字符的好处,应在训练期拥抱它,而不是在推理期“临时改制”。
结语与互动
我愿意把复杂问题讲到“能落地决策”的程度:如果你的目标是稳态性能与性价比,请不要在推理时对分词器做极限裁剪;如果你对字节/字符建模的统一性与鲁棒性感兴趣,请在训练期系统性地引入相应的设计。
你怎么看?
- 你是否在真实系统里尝试过改变切分策略?效果如何?
- 对于中文,你更看好“字节统一”还是“字/词片段并用”的折衷?
- 如果要做一个“可逆/可学习”的前端分词器,你会用什么架构?
欢迎在评论区聊聊你的实践经验与疑问。
更多推荐
所有评论(0)