python - 使用 spaCy 训练 NER 时损失平稳

标签 python spacy

我正在(从头开始)训练一组新实体,并完全按照 spaCy tutorial 中的描述进行操作。 ,然而,我的损失是平稳的,大量的纪元无济于事。

我的资料:

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}

问题一:

如果一个句子中有多个实体,组织训练数据的最佳方法是什么?我应该将所有实体组合在一个列表中,还是最好使用单个实体进行训练?

例如:
("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 之外)。

最佳答案

spaCy 和 Prodigy 需要不同形式的训练数据:spaCy 需要“黄金”注释,其中每个实体都被标记。该注释格式在 spaCy docs 中有所描述。 .如果您只是在训练 NER 模型,则可以简单地从字典中省略依赖项和 POS 键。以这种方式进行训练是有意义的:在预测时,模型需要为它看到的每个单词生成实体标签。

相比之下,Prodigy 可以接受只有单个跨度和提议的实体标签的标记示例,以及该跨度是否是实体标签的实例的人工决定。这对于训练来说有点棘手,因为模型只是不知道句子中的其他单词是否是实体。

我的预感是,如果您将一个句子中的所有实体合并到一个训练示例中(问题 1),该模型会更好地工作。这为模型提供了更多关于句子的信息,并允许它学习文本中不同实体之间的关系。 (例如,“她访问了 X 和 Y”这个短语。如果 X 是一个地方,Y 几乎肯定是一个地方。如果 X 是一个人,Y 也很可能是)。不过,从经验上检查这将是一件非常容易和有趣的事情。

关于问题 2,包括没有实体的句子应该对模型非常有帮助。

旁注:当我训练 NER 模型时,性能通常在大约 20 个 epoch 后趋于稳定,并且 F1 为 0.7 还不错,所以你发现的听起来是对的。

关于python - 使用 spaCy 训练 NER 时损失平稳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54689162/

相关文章:

python : list index out of range error while iteratively popping elements

python - 在不同的包中编译具有依赖关系的pyx文件

python - PyQt5 QML 调试已启用,qmljsdebugger 选项不执行任何操作

python - 带有 Jupyter Notebook 的 Textacy : How to suppress multiple error warnings?

metrics - 使用 spacy 的 NER 模型进行评估时,为什么 'las' 、 'uas' 和 'tags_acc' 等于 0?

python - 如何正确更新 spaCy 中的模型?

python - 获取扩展的 spaCy 形态信息

python - 计算复杂 numpy ndarray 的 abs()**2 的最节省内存的方法

python - 重置索引后无法过滤索引列中包含特定值的行

Python spaCy - 参数 'string' 的类型不正确(预期为 str,得到 DataFrame)