大模型中文化时,扩充词表后全参训练
P2 · llm_training
🏷 标签:vocabulary-expansion, chinese-llm, full-parameter-training, tokenization
1️⃣ 考察意图
面试官想看你是否真正动手做过大模型中文适配,而非只背过论文。考察类型是工程取舍 + 系统设计。刁钻点在于:扩充词表看似简单(加几个中文字),但涉及 tokenizer 对齐、embedding 初始化、训练稳定性、以及全参训练 vs 参数高效微调的成本权衡。答好了能展示你对预训练全流程的掌控力,包括数据配比、学习率调度、以及如何避免灾难性遗忘。核心是:你能否在资源有限下,给出一个可落地的训练方案,并预判坑在哪里。
2️⃣ 标准答
核心问题:大模型中文化时,扩充词表后是否应该全参训练?答案是:视资源而定,但全参训练是效果上限最高的方案,前提是处理好初始化与训练稳定性。
1. 为什么需要扩充词表?
- 原始 tokenizer(如 LLaMA 的 SentencePiece)对中文编码效率低:一个汉字常被拆成 2-3 个 token(如“中” -> “且),导致序列长度膨胀 30%-50%,推理速度下降。
- 扩充词表(如从 32K 到 50K,加入高频中文字/词)可压缩序列长度,提升推理吞吐。例如,Qwen 和 Baichuan 都做了类似操作。
2. 全参训练的策略与步骤
- 步骤一:合并 tokenizer。将原词表与新词表(如基于中文语料训练的 BPE 词表)合并,去重后得到新词表。注意:新词表大小需与模型 embedding 层维度对齐(如 4096 维)。
- 步骤二:初始化新 embedding。新词(不在原词表中的)的 embedding 不能随机初始化,否则梯度爆炸。常用方法:平均初始化:用原词表中语义相近 token 的 embedding 平均(如基于 token 的 n-gram 匹配)。
- 零初始化 + 小学习率:直接设为零向量,配合 1e-5 级学习率,让模型自己学。
- 论文参考:
NeurIPS 2020的“How to Train Your Embedding”建议用原 embedding 矩阵的 SVD 分解来初始化新词。 步骤三:全参训练。加载原版权重(冻结或微调),对整个模型(包括 attention、FFN、layer norm)进行继续预训练。关键取舍:全参训练 vs 仅训练新 embedding 层。全参训练能充分适配中文分布,但成本高(如 LLaMA-7B 全参训练 100B token 需 8×A100 跑 2 周);仅训练新 embedding 层则快 10 倍,但效果差 5-10%(在 CLUE 上验证)。步骤四:训练稳定性。必须用 warmup(前 1000 步学习率从 0 线性升到 1e-4),否则新 embedding 的梯度会冲乱原权重。建议用 AdamW + cosine 衰减,batch size 128。
3. 实际落地的坑 + 解法
- 坑 1:新词 embedding 与原有分布不匹配。例如,新词“深度学习”的 embedding 初始值可能接近“deep learning”的均值,但训练初期梯度会剧烈震荡。解法:先用 10K 步只训练新 embedding 层(冻结其他层),再解冻全参训练。这叫
“embedding warmup”,能降低 30% 的 loss 波动。 - 坑 2:灾难性遗忘。全参训练在中文数据上跑太久(如 >50B token),模型会遗忘英文能力。解法:数据配比保持 70% 中文 + 30% 英文(或原语种),并在训练中监控英文 benchmark(如 MMLU)的 perplexity。
- 坑 3:词表大小选择。扩充到 50K 还是 100K?取舍:词表越大,序列越短,但 embedding 层参数量线性增长(50K × 4096 ≈ 200M 参数),训练和推理显存增加。经验值:中文场景 50K 足够覆盖 99% 常用字词,再大收益递减。
4. 对比其他方案
- 仅训练新 embedding:快,但模型无法学习中文语法和语义,效果差(CLUE 上低 5-8 分)。
- Adapter / LoRA:参数高效,但 adapter 层会引入额外推理延迟(约 5%),且效果不如全参(低 2-3 分)。适合资源受限场景。
- 全参训练:效果上限最高,但需要 10 倍以上算力。总结:资源充足(>8×A100,>100B token 数据)选全参;资源有限选 LoRA + 新 embedding 训练。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,扩充词表的必要性——解决中文 token 效率低,压缩序列长度;第二,全参训练的策略——先合并 tokenizer,用平均或零初始化新 embedding,配合 warmup 和 70/30 数据配比,避免灾难性遗忘;第三,工程取舍——全参效果最好但成本高,资源有限时可用 LoRA 替代。总结一句:全参训练是效果上限最高的方案,但必须处理好初始化与训练稳定性。”
4️⃣ 高频追问 & 应对
追问 1:你提到用平均初始化新 embedding,具体怎么算?如果新词是“人工智能”,原词表里没有,怎么办?
用 n-gram 匹配:将“人工智能”拆成“人工”和“智能”,在原词表中找这两个子词的 embedding,取平均。如果子词也不存在,则用原 embedding 矩阵的全局均值(如 0 均值向量)。更鲁棒的做法:用 BERT 或 word2vec 预训练的中文 embedding 作为初始化,但需要对齐维度(如线性投影到 4096 维)。注意:平均初始化只是起点,后续训练会调整。
追问 2:全参训练时,学习率怎么设?为什么不能直接用原模型的学习率?
原模型(如 LLaMA)预训练时学习率是 3e-4,但扩充词表后,新 embedding 的梯度量级可能比原权重高 10 倍。建议用 1e-5 初始学习率,配合 warmup 到 1e-4。如果直接用 3e-4,新 embedding 的更新会冲乱 attention 层,导致 loss 飙升。经验值:学习率设为原模型的 1/10 到 1/3,并监控梯度范数(保持 <1)。
追问 3:如果我只想用 1 张 A100 做中文适配,你推荐什么方案?
1 张 A100(40G)跑 LLaMA-7B 全参训练会 OOM。推荐方案:用 LoRA(rank=16)只训练 attention 层的 Q 和 V,同时训练新 embedding 层。batch size 设为 1,梯度累积 8 步,数据用 10B token 的中文语料。效果比全参低约 5%,但能在 2 天内完成。注意:LoRA 的 alpha 设为 32,学习率 2e-4,避免过拟合。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“扩充词表后直接全参训练,用原学习率就行” → ✅ 正确做法:必须降低学习率(1/10 到 1/3),并加 warmup,否则新 embedding 梯度爆炸导致 loss 发散。
- ❌ 说“词表越大越好,扩充到 100K 能覆盖所有中文” → ✅ 正确做法:词表大小需权衡,50K 足够覆盖 99% 常用字词,再大增加参数量和显存,收益递减。
- ❌ 说“全参训练会丢失英文能力,所以只用中文数据” → ✅ 正确做法:数据配比保持 70% 中文 + 30% 英文,并在训练中监控英文 benchmark,避免灾难性遗忘。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“词表扩充对 tokenizer 效率的影响”切入,结合你项目中处理中文长文档时 token 数爆炸的问题,说明扩充词表后序列长度减少 30%,推理速度提升。
- 如果你只做过传统 NLP:用“词嵌入初始化”类比迁移,比如你在 BERT 微调时处理过 OOV 词,用平均初始化解决,现在扩展到大模型全参训练。
- 如果你是校招无项目:聚焦论文复现,比如读过 LLaMA 和 Qwen 的技术报告,指出 Qwen 扩充词表到 152K 并全参训练,对比 LLaMA 的 32K 词表在中文上的效率差异。
7️⃣ 延伸阅读
- 《LLaMA: Open and Efficient Foundation Language Models》—— 原始 tokenizer 设计
- 《Qwen Technical Report》—— 中文词表扩充与全参训练实践
- 《How to Train Your Embedding》NeurIPS 2020 —— 新词初始化方法
- 《LoRA: Low-Rank Adaptation of Large Language Models》—— 参数高效微调替代方案
- 《Scaling Laws for Neural Language Models》—— 数据量与模型大小的权衡