我想训练一个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使用的参数。
有没有一种特殊的方法可以做到这一点,例如第一批的多余重量被存储以保持准确性? 是否有其他框架提供此功能,或者至少有一些文章概述了如何获得更好结果的理论方法?