继续预训练 CPT 与领域适配

CPT(Continued Pre-training,继续预训练)在无标注领域语料上继续做因果语言建模,向基座注入术语与知识;SFT 再教任务格式。若任务依赖大量领域概念(酶名、法规、内部缩写),仅 SFT 往往不够,需先 CPT 或 CPT+SFT 混合。

段末注释:领域自适应(domain adaptation)泛指让模型分布贴近目标领域;CPT 是最常见的实现手段之一。

系列索引:微调技术路线导读


一、CPT 在流水线中的位置

1
2
3
4
5
6
7
预训练基座

├─[可选] CPT(无标注 text,全序列 CE loss)
│ └─ 领域 PPL 下降、术语理解提升

└─ SFT(标注 prompt-completion)
└─ LoRA 常见 → [03 SFTTrainer](./03.微调工具-SFTTrainer详解.md)

顺序:几乎总是 CPT → SFT(先知识后格式)。SFT 后再 CPT 易破坏指令能力(灾难性遗忘)。


二、何时需要 CPT

信号 说明
基座不懂领域术语 生成中胡编酶名、法规条号
SFT 数据少但领域文多 先用大量 CPT 再少量 SFT
开放生成需领域事实 医学、法律、科研文献
纯格式任务 不需要 CPT(如情绪分类)

酶/蛋白场景可参考 酶功能大模型ML 辅助蛋白工程


三、数据要求

建议
形态 纯文本 {"text": "..."} 或文档拼接
规模 通常 百万–数十亿 token 才有明显收益;小 corpus 收益有限
质量 去重、去噪、去 HTML;01-02 清洗
泄漏 勿把下游 test 原文放进 CPT

四、训练配置要点

CPT 使用标准 Causal LM 目标(全序列 token CE),工具可用 SFTTrainertext 字段)或 Trainer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from trl import SFTTrainer, SFTConfig

trainer = SFTTrainer(
model=model_id,
train_dataset=cpt_ds, # 列 "text"
args=SFTConfig(
output_dir="./cpt-out",
learning_rate=2e-5, # 低于 LoRA SFT,防遗忘
num_train_epochs=1,
max_length=2048,
bf16=True,
gradient_checkpointing=True,
# CPT 不对 completion 掩码:全序列 loss
),
)
超参 CPT 典型 SFT 典型
lr (10^{-5})–(2\times10^{-5}) LoRA (10^{-4})
epoch 1 或少 1–3
PEFT 可 LoRA 或全参(有算力时) 多 LoRA

监控:领域 hold-out PPL04-02 Perplexity);同时抽测通用 benchmark 防遗忘。


五、CPT + SFT 组合策略

策略 做法
串行 CPT checkpoint → 同一权重上 LoRA SFT
混合 batch 同一训练流按比例混合 CPT text 与 SFT 对话(需自定义 collator)
仅 adapter CPT 全参、SFT LoRA(省 SFT 阶段显存)

小团队推荐:串行 + SFT 阶段 LoRA


六、评估

指标 用途
领域 PPL CPT 是否拟合领域语料
下游 SFT 任务 F1/EM 最终业务目标
通用能力抽检 MMLU 子集、简单推理,看遗忘

七、常见踩坑

现象 原因 对策
CPT 后 SFT 格式差 CPT lr 过大 / epoch 过多 降 lr;CPT 权重作起点而非过度训练
通用能力掉 领域 corpus 占比 100% 混入 5–20% 通用语料
PPL 降、任务不涨 CPT 数据噪声或域不对 清洗;检查域匹配
显存 OOM 长 context 全参 CPT LoRA CPT 或 ZeRO

八、小结

CPT = 无标注领域语料 + 低 lr CE;适合「懂行话」再「会答题」。窄格式任务可跳过,直接 01→02→03 SFT 链路

下一步:05-03 SFT 与指令微调

-------------本文结束感谢您的阅读-------------