You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:06