我正在(从头开始)训练一组新的实体,并且完全按照spaCy tutorial中的描述进行操作,但是,我的损失是平稳的,并且大量的时期没有帮助。
我的数据:
9个不同的实体,15000个训练数据(句子)。 20个纪元后的损失:
Loaded model 'en'
Losses {'ner': 25461.3508122763}
Losses {'ner': 17003.450728844182}
Losses {'ner': 15725.198527784352}
Losses {'ner': 15315.754479839785}
Losses {'ner': 14980.468680851985}
Losses {'ner': 14716.52629194191}
Losses {'ner': 14346.623731715972}
Losses {'ner': 14463.972966984807}
Losses {'ner': 14195.106732198006}
Losses {'ner': 14058.390174787504}
Losses {'ner': 13875.850727875884}
Losses {'ner': 13859.096326599261}
Losses {'ner': 13614.887464660655}
Losses {'ner': 13512.779816124807}
Losses {'ner': 13388.69595626908}
Losses {'ner': 13496.388241585315}
Losses {'ner': 13530.602194116611}
Losses {'ner': 13245.709490846923}
Losses {'ner': 13219.483523900466}
Losses {'ner': 13189.088232180386}
问题1:
如果单个句子中有多个实体,组织训练数据的最佳方法是什么?我应该将所有实体合并在一个列表中还是最好与一个实体一起训练?
例如:
("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(0, 6, 'ANIMAL'), (11, 15, 'ANIMAL')]})
或者最好拆分:
("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(0, 6, 'ANIMAL')]}),
("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(11, 15, 'ANIMAL')]})
问题2:
我也应该包含空句子(没有实体)吗?
("The new electric cars is great!", {'entities': []})
显然,该模型预测不会太糟(f1〜0.7),但是我想知道有什么最佳方法可以对模型进行微调(除了在此训练好的模型之上使用Prodigy之外)。
答案 0 :(得分:1)
spaCy和Prodigy期望使用不同形式的训练数据:spaCy期望使用“金色”注释,其中对每个实体进行标记。该注释格式在spaCy docs中进行了描述。如果您只是在训练NER模型,则可以简单地从字典中省略依赖项和POS键。以这种方式进行训练很有意义:在预测时,模型将需要为其看到的每个单词产生实体标签。
相比之下,Prodigy可以接受带有单个跨度并带有建议的实体标签的带标签的示例,再加上人工判断该跨度是否为实体标签的实例。这对于训练来说有点棘手,因为该模型只是不知道句子中的其他单词是否为实体。我的直觉是,如果将句子中的所有实体合并到一个训练示例中(问题1),该模型将更好地工作。这为模型提供了有关句子的更多信息,并允许其学习文本中不同实体之间的关系。 (例如,想想一个短语“她去过X和Y”。如果X是一个地方,Y几乎可以肯定是一个地方。如果X是一个人,则Y也很可能是)。不过,凭经验检查,这将是一件非常容易且有趣的事情。
关于问题2,包括没有实体的句子对模型应该非常有帮助。
侧面说明:当我训练NER模型时,性能通常会在大约20个纪元后达到平稳状态,而F1为0.7并不算太差,所以您发现的声音是正确的。