如何现场训练和更新NER模型

时间:2019-07-26 12:49:17

标签: python machine-learning spacy named-entity-recognition ner

我想训练一个NER模型。在我的特定用例中,我不断获得新标签的字符串,并且需要不断引入新的字符串来训练模型。

因此,为了节省资源,我想一次又一次地用新数据更新一个初始NER模型,而无需从头开始重新训练模型,理想情况下又不损失旧字符串的精度(很多)。

我已经修补了Spacy。我创建了同时训练有所有数据的模型,并训练了一些模型,这些模型将逐个提供数据。 (请参见下面的代码。)

但是,在后一种方法中,尤其是对于早期输入到训练算法中的训练数据,我永远无法达到相同的精度。尽管第一种方法可以在测试时识别出训练数据中的每个实体,但是第二种方法会遗漏或遗漏几乎与发现的一样多的实体。

在“一次”将100个句子输入到训练算法中:

for itn in range(100):
  random.shuffle(TRAIN_DATA)
  losses = {}
  batches = minibatch(TRAIN_DATA, size=compounding(4.0, 32.0, 1.001))
  for batch in batches:
    texts, annotations = zip(*batch)
    nlp.update(
      texts,
      annotations,
      drop=0.5,
      losses=losses,
    )

一次将相同的100个句子输入到训练算法10中:

for i in range(0, 10):
  T_DATA = TRAIN_DATA[i*10:i*10+10]
  with nlp.disable_pipes(*other_pipes):  # only train NER
    if model is None:
      nlp.begin_training()
    for itn in range(100):
      random.shuffle(T_DATA)
      losses = {}
      batches = minibatch(T_DATA, size=compounding(4.0, 32.0, 1.001))
      for batch in batches:
        texts, annotations = zip(*batch)
        nlp.update(
          texts,
          annotations,
          drop=0.5,
          losses=losses,
        )

我还尝试训练早期批次进行更多迭代,并减少对以后数据的训练量。这样可以提高整体精度,但仍不能同时对所有数据进行良好的训练。

我知道在这种训练中会期望较低的精度,但是有某种方法可以提高精度。目前,我只在他们的documentation中使用Spacy使用的参数。

有没有一种特殊的方法可以做到这一点,例如第一批的多余重量被存储以保持准确性? 是否有其他框架提供此功能,或者至少有一些文章概述了如何获得更好结果的理论方法?

0 个答案:

没有答案