跳转到内容

领域继续预训练:何时值得做 CPT/DAPT

模型误读了一份中文病理报告或者协议里的缩写,最省事的解释是“医学知识不够”,接着就要上 CPT/DAPT。先停一下。它也可能是检索版本错了、FHIR mapping 缺字段、工具范围开得太宽,或者训练语料压根不允许使用。

Continued Pretraining(CPT)是在已有模型上继续做语言建模,Domain-Adaptive Pretraining(DAPT)强调目标领域语料。两者学的是领域分布和表达方式,不会直接教模型按 CriterionAssessment 去调工具。在 MedAgent Forge 里,DAPT 是一个候选技术,得先被基线、语料治理和回归证明过,才轮得到它上场。

通用模型对专业术语、文体或低资源语言覆盖不足的时候,领域继续预训练确实可能改善表示。但今天遇到的问题多数来自检索、数据合同或工具,不是模型“不懂医学”。团队一看到领域名词就上 DAPT,代价是数据清洗、算力、灾难性遗忘和服务分叉,而且往往没跟 RAG/SFT 基线比过。

医疗语料尤其敏感。受限数据的许可可能禁止外传,也可能禁止公开衍生物;去标识过的文本仍然可能保留罕见的属性组合。MIMIC 官方对访问和衍生资源的边界写得很明确。S09S10

同时满足这几条才进入 DAPT:冻结评测显示领域语言理解是主要瓶颈;有足量、合法、质量可控的语料;能保留通用能力回归集;预算覆盖得住训练、评测、服务和维护;RAG/SFT 没法以更小的代价解决同一问题。

语料流水线要做许可账本、去重、污染检查、PHI 扫描、质量分层、token 统计、训练/验证的时间切分和 manifest。训练过程里同时盯领域 loss 和通用回归,别把训练 loss 下降当成任务成功。

方法 改变什么 适合 代价
RAG 运行时上下文 知识更新、需引用 检索与延迟
DAPT/CPT 参数中的领域分布 术语/文体长期缺口 数据、算力、遗忘
SFT 输入到动作/格式 工具、schema、流程 标注轨迹
LoRA-DAPT 少量参数 教学/快速试验 能力上限需实测 S16
Terminal window
python3 labs/run_lab.py --lab 14

这个实验不训练模型,它运行的是 DAPT 数据门:检查语料条目的 license、consent、deidentified、split、hash 和来源。只要有 restricted 条目出现在 redistributable 清单里,就会失败。看到失败的时候别删记录让测试变绿–回到数据合同去确认它为什么不该进可发布清单。将来真要训练,也得先过这道门。

假设冻结评测的结论是这样:模型能正确调工具、遵守 schema,却持续误解中文病理和协议里的领域缩写;把原文检索出来喂给它,仍然不稳定;错误集中在语言表示上,而不是数据缺失。这时候团队才有理由提出 DAPT 假设–“在许可明确的中文医学/协议语料上继续预训练,能降低术语理解错误,同时不损害通用工具调用”。

这个假设自带可证伪条件:术语切片指标没改善、TaskPackage 没改善、通用回归下降超过门限、或者成本不值,都停止。如果错误主要来自 FHIR mapping 和协议版本,那 DAPT 就该被否掉,参数训练解决不了数据合同的问题。

语料不是一个 medical.txt。按来源分层记录:public medical text、许可允许的协议、合成病历、内部受控数据,每层写清楚目的、权重、语言、时间、质量和许可。先做 exact/near duplicate 去重,防止同一份文档跨切分出现;检测评测题和协议的污染;过滤模板页、导航栏、OCR 噪声;长文档保留边界和元数据。

医疗去标识不是跑一遍正则就完事。受控数据只在机构环境里处理,经过制度批准的去标识和最小化,加上人工抽检和访问审计;模型 checkpoint 本身也要按敏感衍生物来治理。MIMIC 的许可提醒过这一点:即使数据已经去标识,使用与传播仍然受协议约束。S09S10

CorpusManifest 保存每个 shard 的来源、license、hash、token count、quality tier 和 split。训练配置引用 manifest hash,不引用“latest”。public release 只发布允许的 manifest 元数据和生成脚本,受限 shard 绝不上传。

从小规模 pilot 开始,先锁死基础模型、tokenizer、sequence length、optimizer、学习率、warmup、batch/accumulation、precision、seed 和 checkpoint 间隔,然后监控领域和通用 validation loss、梯度与数值异常、吞吐和硬件占用。LoRA-DAPT 能降低参数存储,但方法选择还是要实测,而且它不会减少语料治理那部分工作量。S16S20

采样混合要防遗忘:可以加通用 replay,把纯领域配方和混合配方对比着看。评测不能只有 perplexity,还要包括协议结构化、术语消歧、工具 schema、引用、拒答和安全。checkpoint 先进离线 registry,不自动部署。

领域词被切成更多 token,不必然说明模型不会理解它;而改 tokenizer 会破坏权重兼容和部署链。先量化 tokenization 跟错误之间的关系,只有收益假设明确、并且承担得起 embedding/LM head 适配的时候才动它。中文医学文本还牵扯中英文缩写、数值单位和全半角,通常先做数据归一化比换 tokenizer 划算。

第一组是无训练的 RAG baseline,说明知识注入的上限在哪;第二组是 SFT,判断问题是不是主要在任务和格式的学习上;第三组是 DAPT 加同样的 SFT,把领域继续预训练的增量隔离出来。要是只比较“原模型”和“DAPT 之后又 SFT 的模型”,收益来自哪一步就说不清了。

每组都报数据、训练 token、硬件时长、失败的 run、任务指标和成本。别只挑最好的 checkpoint,把学习曲线和选择规则一起放出来。真实结果还没跑的时候,仓库里只提供配置 schema、数据门和命令占位,状态写 not-run

通用回归要覆盖结构化输出、工具选择、阅读理解和安全拒绝。领域能力涨了但工具调用明显退步,不能用平均总分盖过去。基础模型和 adapter 的组合都保留,deployment registry 支持一键回滚;训练数据、配置、代码、权重的 hash 串起来就是完整 lineage。

语料少而且重复、许可含糊、错误能被 RAG 或规则修掉、服务方不愿意维护新模型、没有合格的评测、纯粹为了简历上好看–任何一条都足以暂停。该拒绝的训练就拒绝掉,没必要把每种方法都跑一遍。

Phase A 只构建约 100 万至 500 万 token 的公开或合成小语料,配 tiny model 和小步数,目的是把 tokenizer、packing、checkpoint、恢复和评测链上的错误暴露出来,报告标题就写 pipeline smoke。Phase B 在还负担得起的模型上比较两种语料混合和学习率,得到方法趋势,但不往大模型上外推。Phase C 才按批准的预算跑目标模型,多 seed,或者至少把关键设置重复一遍,再做全量的任务和安全回归。

每个 phase 都有退出条件。A 不能稳定重放就不进 B;B 看不到可信增量、或者遗忘不可接受,就不进 C;C 要等模型 registry、评测和回滚都齐了才谈候选部署。失败的 checkpoint 和日志保留最小的诊断元数据,敏感训练文本不写日志。

对 corpus 和评测用的协议、患者文本做 exact hash、minhash 或 embedding 近似重复、实体模板比较;时间上只允许训练 cutoff 之前的来源。公开网页里如果含 benchmark 答案,标 contamination risk 并单独报告。医疗文本里相同模板很常见,去重的时候既要避免泄漏,也不能把真实但不同的患者合并掉。受控环境里只导出统计量。

DAPT 之后指标变好,先查是不是只因为 tokenizer 或格式变了、是不是只来自某一类文档、有没有评测污染,然后用 error slice 和 ablation 对比领域/通用混合。指标退化,就区分是学习率和步数的问题、数据噪声、遗忘,还是推理模板。别在几十个配置里挑一个最好的,再把偶然波动写成结论。

从错误清单里挑十例,逐例标上 knowledge/terminologyretrievaltoolschemapolicy。只有当多数关键错误落在领域表示上,而且 RAG/SFT 对照确实不够,才起草 DAPT 的 ADR。ADR 里“可能有用”这种话要改成可证伪的指标和停止阈值。

DAPT 之后,模型卡要加上语料时间范围、语言与领域、许可分层、训练 token、基础模型、硬件、能耗与时长(真实可得的话)、领域与通用评测、污染风险和限制。checkpoint 不能公开也没关系,配置、manifest 统计和评测方法只要不泄露数据就可以公开;权重私有不是不报告失败的理由。

数据删除也要算上衍生 checkpoint。机构要求撤回某个来源的时候,先判断许可或政策是否要求重训,registry 里标出受影响的 run。provenance 在这里是模型生命周期里要用到的能力,不是论文附录。

训练前做容量估算,但别拿估算当承诺:参数、optimizer、activation、sequence、batch、checkpoint 和临时磁盘都算一遍,再用 smoke 实测峰值来修正。M3 和 CUDA 两套配方各自锁依赖,一个平台上成功不能外推到另一个。训练被系统中断之后从 checkpoint 恢复,样本顺序和 step 的记录要能解释得清。

这一章的停止条件很朴素:说不清语料从哪来、评测和训练怎么隔离、退化之后怎么回滚,就不进入训练。训练 loss 下降替代不了这几道门。

  • 数据“可访问”不等于“可训练/可发布”。
  • loss 改善不证明 trial matching 改善。
  • 小规模 smoke run 只验证流水线,不说明方法有效。
  • 若训练导致引用、拒答或通用能力退化,应回滚而不是选择性报告。

以下参考资料用于核对数据和方法边界。它们能帮你设计实验,但不为任何具体训练结果背书。

  • S09 MIMIC-IV:需要了解受控医疗数据的访问与衍生资源边界时先读官方数据页。
  • S10 PhysioNet DUA:把语料能否训练、能否发布、能否交给第三方服务拆开核对的许可依据。
  • S16 LoRA:比较全参数继续预训练与参数高效路径时回看原始方法。
  • S20 PEFT:把实验配置落成 adapter 前,核对实现接口、版本与支持范围。