如何修改Spacy的config.cfg实现自定义NER模型增量训练?
解决Spacy NER增量训练丢失旧数据识别能力的问题
要让模型在新增数据训练后保留旧数据的识别能力,核心是基于已训练好的model-best做增量训练,而非从头初始化模型。以下是具体修改和操作步骤:
1. 合并新旧训练数据(关键)
只使用新数据训练会导致模型遗忘旧实体,必须先合并新旧数据集:
import spacy from spacy.tokens import DocBin # 加载旧训练数据 db_old = DocBin().from_disk("./one.spacy") # 加载新训练数据 db_new = DocBin().from_disk("./training_data.spacy") # 合并两个数据集 db_combined = DocBin() # 用任意空的Spacy vocab来读取DocBin内容 vocab = spacy.load("en_core_web_sm").vocab for doc in db_old.get_docs(vocab): db_combined.add(doc) for doc in db_new.get_docs(vocab): db_combined.add(doc) # 保存合并后的数据 db_combined.to_disk("./combined_data.spacy")
2. 修改config.cfg配置
不要重新用spacy init fill-config生成新配置,直接修改现有config.cfg的以下部分:
(1) 指定从已有模型加载组件权重
找到[components]区块下的tok2vec和ner配置,添加source参数指向你的model-best路径:
[components] [components.tok2vec] source = ./model-best # 指向已训练好的模型目录 # 保留原有的model等其他配置 [components.ner] source = ./model-best # 指向已训练好的模型目录 # 保留原有的model、moves等其他配置
(2) 调整训练参数(可选,缓解遗忘)
- 降低学习率:找到
[training]下的optimizer.learn_rate,从默认的0.001调低至0.0001,避免新训练过快覆盖旧权重。 - 冻结词向量层(可选):如果不需要更新tok2vec的词向量,可以在
[components.tok2vec]下添加:
[components.tok2vec] source = ./model-best frozen = true # 冻结tok2vec,仅训练NER组件
3. 执行增量训练
使用修改后的配置和合并数据启动训练:
! python -m spacy train config.cfg --output ./ --paths.train ./combined_data.spacy --paths.dev ./combined_data.spacy
注意事项
- 禁止每次训练都重新生成config.cfg,否则会覆盖
source配置,回到从头训练状态。 - 如果新旧数据的实体标签有新增,Spacy会自动从合并数据中识别并更新组件的标签集合。
内容的提问来源于stack exchange,提问作者Tharun Kumar
相关产品推荐
相关产品推荐

