一句话定义:词表扩充(Vocabulary Expansion)是在一个已经训练好的分词器(tokenizer)词表里加入新的 token——新字、新词、新子词或特殊符号——并同步放大模型的嵌入矩阵(embedding matrix)和输出层,让模型能“认识”原本被切碎或根本没有对应编号的内容。
打个比方:原词表像一本印好的字典,每个词条后面都写满了这个词的“含义”(一个向量)。这些含义不是谁手写的,是模型在海量语料上反复读、反复改,慢慢磨出来的——所以“猫”和“狗”的向量才会挨得近,“银行”和“河岸”才会共享某些方向。现在你要往字典里插一百个新词条,纸可以加,但词条后面的释义是空白的。随手填一串随机数,等于给新词写了一段谁也不认识的乱码释义。
所以“加几行 embedding”这件事,真正麻烦的是三件事:
第一,切分变了,老文本的形态也跟着变。 原来 “Transformer” 被切成 Trans+form+er 三个 token,加入整词后是一个。同一句话的 token 数、位置关系、注意力看到的距离全变了,而模型此前学的所有统计规律都是基于旧切分的。
第二,新向量是“陌生人”。 随机初始化的向量落在向量空间的随机位置,可能恰好夹在“法律”和“甜点”中间。它出现次数又远少于老词,训练时梯度信号很弱,结果往往是新词学不动,或者学习率调大后把老词的向量一起搅乱。
第三,输出层必须一起扩。 只扩输入不扩输出,模型永远“认得出、写不出”这个词。
工程上常见这样安排:
- 初始化用“子词均值”:把新词原本被切成的若干部件的向量取平均(可按词频加权),作为新向量的起点。这样新词一出生就落在语义上大致合理的位置,比随机初始化好得多。
- 分层学习率:新词给较大学习率尽快学会,老词给极小学习率甚至先冻结(freeze),避免旧知识被冲掉。
- 数据配比:专门构造富含新词的语料,同时混入原始分布的通用语料,防止AI 词典:灾难性遗忘">灾难性遗忘(catastrophic forgetting)。
- 全链路统一:扩充后数据预处理、缓存、评测必须都用同一版 tokenizer,否则同一句话切分不同,训练和推理对不上。
和相邻概念的区别:
| 词表扩充 | 继续预训练 | 微调">指令微调 | |
|---|---|---|---|
| 是否改模型结构 | 是,嵌入矩阵和输出层变大 | 否 | 否 |
| 主要目的 | 认识新词、新语言、新领域符号 | 补领域知识 | 学会按指令作答 |
| 典型风险 | 新词训不动、旧词被扰动 | 通用能力退化 | 过拟合、模板化 |
它也和“重训 tokenizer”不同:后者是换一整套词表,旧 embedding 基本作废;扩充是保留旧词、只加新词。
对从业者的意义:要不要扩,先看“切碎率”——目标内容在原词表下平均一个词被切成几个 token。中文、日文、化学式、基因序列、代码标识符这类内容往往切得极碎,扩充收益明显;如果只是少量新名词,让模型多花几个 token 反而更省事。多模态里插入图像占位符、工具调用标记,也是同一套操作。
对普通人的意义:同样一段中文,词表覆盖得好,token 数就少,模型更快、上下文能装更多内容,按 token 计费也更便宜。反过来,如果某个模型“升级词表”后老任务偶尔变差,常见原因就是新 embedding 没训透——这是结构改动后需要额外训练来补的账。
