我有一个已经存在的spaCy模型,我想在运行时通过其他训练数据进行完善。
例如,训练模型中的训练数据集如下所示:
let matchesSelector = () => { ... };
在我的实现中,在开始新的培训之前,我会从现有模型中选择ner:
text="Anna lives in Munich and works at BMW"
entity: name=Anna
entity: city=Munich
entity: company=BMW
然后我用新的TrainingData训练现有模型:
nlp = spacy.load(modelPath)
ner = nlp.get_pipe('ner')
现在我有以下问题: 我现有的ner模型已经包含三个带有标签的实体
# batch up the examples using spaCy's minibatch which is much faster than
batches = minibatch(trainingData, size=compounding(4.0, 32.0, 1.001))
for batch in batches:
texts, annotations = zip(*batch)
nlp.update(
texts, # batch of texts
annotations, # batch of annotations
#drop=0.5, # dropout - make it harder to memorise data
losses=losses,
)
但是我新的训练数据集只有实体“ city”和“ name”(没有实体“ company”)。喜欢
city, name, company
因为我的句子中只有“城市”和“名称”。
现在,我的印象是,如果我使用包含当前模型所知道的较少实体的训练数据集来重新训练模型,则会降低模型质量。
在开始训练之前,仅用当前训练数据集中包含的实体标签(重新)设置模型中的ner聪明吗?
类似这样的东西:
text="Bob lives in London"
entity: name=Bob
entity: city=London
还是没有道理?
答案 0 :(得分:1)
现在,我的印象是,如果我使用包含当前模型所知道的较少实体的训练数据集来重新训练模型,则会降低模型质量。
是的。这称为catastrophic forgetting
。
在开始训练之前,仅用当前训练数据集中包含的实体标签(重新)设置模型中的ner聪明吗?
我认为是的。如果您当前的培训数据中没有公司名称,则在您继续培训时该模型将变得有偏差,并说将来您决定使用相同的模型来检测公司名称,它将检测城市或名称作为公司,因为它忘记了公司名称。