跳转至

第 4 章 继续预训练与领域适配

开场问题:手上有十亿 token 的医学文献,它们不是问答。应该先把它们全部改写成指令数据吗?

4.1 CPT 与 SFT 的目标不同

继续预训练(Continued Pre-Training, CPT)直接在领域原始文本上继续 next-token prediction,通常对所有 token计算 loss。它改变模型内部的语言与知识分布:术语、文体、代码库、领域共现关系。

SFT 学的是“看到指令后怎样回答”。把医学文献强行改成问答会丢掉大量细节和文本结构;只做 CPT 又不会自动让模型成为合格问诊助手。常见流程是:领域 CPT 扩充知识与表示 → 通用和领域 SFT 教会使用这些知识。

TAPT(Task-Adaptive Pre-Training)是更窄的一种:在目标任务的无标注输入上继续预训练。例如有大量未标注工单,先让模型适应这类语言,再用少量标注做 SFT。

4.2 数据混合与灾难性遗忘

只喂领域语料,模型会逐渐把概率质量移向领域分布,通用能力、其他语言和指令遵循可能下降。解决办法不是一个固定比例,而是混入高质量通用 replay 数据,并同时监控领域和通用基准。

领域比例越高、学习率越大、训练 token 越多,适配越深,遗忘风险越高。这三个量共同决定“走多远”。因此 CPT 项目必须画出一条 Pareto 曲线:领域能力提高多少,通用能力损失多少。

4.3 知识注入不等于可可靠召回

模型在 CPT 中见过某个事实,不代表在任意问法下都能准确答出。参数化知识受表达形式、频率和冲突事实影响,也无法给出可靠来源。

所以:

  • 稳定、广泛、构成领域语言基础的知识适合 CPT。
  • 频繁更新、要求引用、涉及权限的数据适合 RAG。
  • 常用的关键事实可以两者并用:CPT 改善理解,RAG 提供当前证据。

4.4 词表和 tokenizer 要不要改

领域文本若被切得极碎(特殊代码、化学式、小语种),扩词表可能缩短序列。但这不是免费的:新增 embedding 没有预训练,需要单独初始化和充分训练;部署端 tokenizer 也要同步升级;旧模型与缓存协议全部失效。

多数项目应先量化问题:统计每字符 token 数、序列长度和高频碎片。只有碎片化严重且领域数据足够多时才值得改词表。

4.5 如何判断 CPT 有效

不能只看领域验证集 perplexity。至少测三层:

  1. 领域文本建模是否改善。
  2. 领域下游任务在少量 SFT 后是否更容易学会。
  3. 通用能力、多语言、指令遵循是否回退。

第二层最关键:CPT 的价值经常不是“直接会回答”,而是让后续 SFT 用更少样本达到更高上限。

核心问答

Q:领域文档应该做 CPT 还是 RAG? 稳定的领域语言和基础知识做 CPT;更新快、需引用和权限控制的内容做 RAG。两者解决不同问题,常常组合。

Q:CPT 之后为什么还需要 SFT? CPT 教模型续写领域文本,不会自动教它遵循用户指令、拒绝越权或按格式回答。

Q:怎么减轻灾难性遗忘? 混入通用 replay 数据、降低学习率和训练量,并把通用回归集作为停止条件。

Q:什么时候值得改 tokenizer? 只有领域文本被严重碎片化、收益能抵消重新训练 embedding 和全链路升级成本时。