续训 Continual Pre-training:为模型注入领域知识
续训 Continual Pre-training:为模型注入领域知识
一、问题的起源:为什么 SFT 不够用?
假设你在某金融机构工作,公司积累了十年来所有内部研究报告、风控文档和交易日志。你拿 llama-3-8b 做 SFT(指令微调)后让模型回答专业问题,结果发现模型把"次级贷款"解释成了"次要的贷款",把"压力测试"理解成"服务器压力测试"。这不是模型笨——这是它在预训练阶段从未见过这些领域的语料。
这里涉及一个关键认知:SFT 主要教模型"怎么说",而 CPT(Continual Pre-training,续训)教模型"知道什么"。SFT 改变的是模型的输出分布和指令跟随能力,但对于完全陌生的概念和知识体系,它在 SFT 数据中看到的那几百条样本就像往大海里扔石子——波纹消失得很快。CPT 的核心思路是在基座模型的预训练权重之上,用大量领域文本做二次预训练,让模型真正"学会"这个领域的知识结构和术语体系。
我在实际项目中遇到过这样一个例子:为一家医疗科技公司做病历结构化抽取,直接用 GPT-4 的 few-shot 提示效果平平,F1 只有 0.62。做一轮 SFT 后提升到 0.73,但瓶颈非常明显——模型对医学缩写(如 “CR” 到底是 “complete response” 还是 “creatinine”)频繁误判。后来用 8 万份脱敏电子病历做了两轮 CPT 再叠加 SFT,F1 直接冲到了 0.89。这 16 个点的差距就是领域知识注入的力量。
二、CPT 的核心原理
2.1 CPT 与 SFT 的本质区别
| 维度 | SFT(指令微调) | CPT(续训) |
|---|---|---|
| 目标 | 改变行为模式(对话/指令跟随) | 注入领域知识(术语/逻辑/常识) |
| 数据量 | 千级~万级 | 万级~百万级 |
| 数据格式 | instruction-input-output 对 | 原始文本 / 自回归语料 |
| 训练方式 | 仅对输出部分计算 loss | 全文本自回归 loss(next-token prediction) |
| 学习率 | 1e-5 ~ 5e-5 | 1e-5 ~ 5e-5(但需 warmup + cosine decay) |
| 参数量 | 常用 LoRA / QLoRA | 推荐全参或高秩 LoRA(r≥64) |
| 风险 | 过拟合 / 灾难性遗忘 | 灾难性遗忘(更严重) |
CPT 延续了预训练阶段的训练范式——因果语言建模(Causal Language Modeling, CLM),即给定前文x<tx_{<t}x<t预测当前 tokenxtx_txt,损失函数为标准的交叉熵:
LCPT=−1∣D∣∑x∈D∑t=1∣x∣logPθ(xt∣x<t) \mathcal{L}_{\text{CPT}} = -\frac{1}{|\mathcal{D}|} \sum_{x \in \mathcal{D}} \sum_{t=1}^{|x|} \log P_\theta(x_t \mid x_{<t})LCPT=−∣D∣1
