微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flair 训练德国 NER 模型:Dev,f1 得分接近 0.0,为什么模型不学习?

如何解决Flair 训练德国 NER 模型:Dev,f1 得分接近 0.0,为什么模型不学习?

我首先使用 Spacy 训练了我的 NER 模型,微型 F1 分数为 64.7%(8 类)。下一步我想训练Flair,希望得到更好的结果。 当然,spacy 格式的数据会通过一些自定义代码转换为适当的 Flair 语料库。

关于输入数据的信息: 语料库:“语料库:4037 个训练 + 840 个开发 + 448 个测试句子”

在训练集中: '文化' (1512)、'Erreger' (1376)、'Mittel' (1083)、'Auftreten' (583)、 '时代'(285)、'Witterung'(238)、'BBCH_Stadium'(214)、'Ort'(161)

在测试集中: 'Erreger' (390)、'Mittel' (311)、'Kultur' (221)、'BBCH_Stadium' (148)、 'Aufreten' (54),'Witterung' (54),'Ort' (53),'Zeit' (40)

语料库看起来像这样:

Der O
Schwerpunkt O
der O
Unkrautbekämpfung O
in O
Kartoffeln S-Kultur
liegt O
im O
Vorauflauf S-BBCH_Stadium
. O

Sind O
die O
mechanischen O
Maßnahmen O
abgeschlossen O,O
kann O
die O
erste O
Herbizidbehandlung O
auf O
gut O
abgesetzten O
Dämmen O,O
je O
nach O
Produkt O
bis O
kurz B-BBCH_Stadium
vor I-BBCH_Stadium
dem I-BBCH_Stadium
Durchstoßen E-BBCH_Stadium
der O
Kartoffeln S-Kultur
( O
kvD O
) O,O
erfolgen O
. O

训练代码

from flair.datasets import ColumnCorpus
from flair.embeddings import TokenEmbeddings,WordEmbeddings,StackedEmbeddings,FlairEmbeddings
from flair.models import SequenceTagger
from flair.trainers import ModelTrainer
from typing import List
import time
start_time = time.time()

columns = {0: 'text',1: 'ner'}

 data_path = "path/to/data"

 # initializing the corpus
 corpus: Corpus = ColumnCorpus(data_path,columns,train_file = 'bb_train.txt',#   dev_file = 'bb_test_sm_sm.txt',test_file = 'bb_test_sm_sm.txt',)

 # tag to predict
 tag_type = 'ner'

 tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type)

 word_vectors = gensim.models.KeyedVectors.load_word2vec_format('german.model',binary=True)
 word_vectors.save('german.model.gensim')

 german_embedding = WordEmbeddings('german.model.gensim')

# init forward embedding for German
 flair_embedding_forward = FlairEmbeddings('de-forward')
 flair_embedding_backward = FlairEmbeddings('de-backward')

embedding_types: List[TokenEmbeddings] = [
     german_embedding,flair_embedding_forward,flair_embedding_backward,]

embeddings: StackedEmbeddings = StackedEmbeddings(embeddings=embedding_types)

tagger: SequenceTagger = SequenceTagger(hidden_size=256,embeddings=embeddings,tag_dictionary=tag_dictionary,tag_type=tag_type,use_crf=True)


trainer : ModelTrainer = ModelTrainer(tagger,corpus)

trainer.train('resources/taggers/ner_bb',learning_rate=0.01,mini_batch_size=64,max_epochs=5,)

print(f"It took {time.time() - start_time}")

丢失日志是:

EPOCH   TIMESTAMP   BAD_EPOCHS  LEARNING_RATE   TRAIN_LOSS  DEV_LOSS    DEV_PRECISION   DEV_RECALL  DEV_F1
1   10:42:23    0   0.0100  42.28642028570175   28.403223037719727  0.0197  0.0748  0.0312
2   10:43:48    0   0.0100  17.928552985191345  14.348283767700195  0.3089  0.0312  0.0567
3   10:45:10    0   0.0100  10.604630261659622  13.98863697052002   0.3089  0.0312  0.0567
4   10:46:36    1   0.0100  10.26459190249443   13.614569664001465  0.3579  0.0279  0.0518
5   10:47:55    2   0.0100  9.987788125872612   13.339178085327148  0.3333  0.0164  0.0313

为什么分数这么低?该模型没有学到任何东西。 我一直尝试到 10 个 epoch 并且结果相同。

我需要调整一些参数吗?我的语料库有问题吗?

如果你有这方面的经验,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。