我正在训练(从头开始)一组新的实体,并完全按照spaCy 教程中的描述进行操作,但是,我的损失趋于稳定,大量的 epoch 也无济于事。
我的数据:
9个不同的实体,15000个训练数据(句子)。20个epoch后的损失:
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}
Run Code Online (Sandbox Code Playgroud)
问题一:
如果单个句子中有多个实体,那么组织训练数据的最佳方法是什么?我应该将所有实体合并到一个列表中,还是最好使用单个实体进行训练?
例如:
("Horses and dogs are too tall and they pretend to care about your feelings", {'entities': [(0, 6, 'ANIMAL'), (11, 15, 'ANIMAL')]})
Run Code Online (Sandbox Code Playgroud)
或者最好分开:
("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')]})
Run Code Online (Sandbox Code Playgroud)
问题2:
我是否也应该包含空句子(没有实体)?
("The new electric cars is great!", {'entities': []})
Run Code Online (Sandbox Code Playgroud)
显然,该模型的预测还不错(f1~0.7),但是我想知道微调模型的最佳实践是什么(除了在此训练模型之上使用 Prodigy 之外)。
小智 5
spaCy 和 Prodigy 期望不同形式的训练数据:spaCy 期望一个“黄金”注释,其中每个实体都被标记。spaCy 文档中描述了该注释格式。如果您只是训练 NER 模型,则可以简单地从字典中省略依赖项和 POS 键。以这种方式进行训练是有意义的:在预测时,模型需要为其看到的每个单词生成实体标签。
相比之下,Prodigy 可以接受仅具有带有提议的实体标签的单个跨度的带标签示例,以及该跨度是否是实体标签的实例的人工决定。这对于训练来说有点棘手,因为模型不知道句子中的其他单词是否是实体。
我的预感是,如果将句子中的所有实体合并到一个训练示例中(问题 1),该模型将会运行得更好。这为模型提供了有关句子的更多信息,并允许其学习文本中不同实体之间的关系。(例如,考虑一个短语“她访问了 X 和 Y”。如果 X 是一个地方,那么 Y 几乎肯定是一个地方。如果 X 是一个人,那么 Y 也可能是)。不过,根据经验检查这将是非常简单且有趣的事情。
关于问题2,包含没有实体的句子应该对模型非常有帮助。
旁注:当我训练 NER 模型时,性能通常在大约 20 个 epoch 后趋于稳定,F1 为 0.7 也不算太糟糕,所以你发现的听起来是正确的。
| 归档时间: |
|
| 查看次数: |
1819 次 |
| 最近记录: |