更多实时更新的个人学习笔记分享,请关注:
知乎:https://www.zhihu.com/people/yuquanle/columns
微信订阅号:AI小白入门
ID: StudyForAI
Flair工具使用教程之如何训练自己的Flair Embeddings
- 教程地址:https://github.com/zalandoresearch/flair/blob/master/resources/docs/TUTORIAL_9_TRAINING_LM_EMBEDDINGS.md
- 本教程将向您展示如何训练自己的Flair嵌入,如果您想将Flair应用于新语言或域,这可能会派上用场。
准备文本语料库
- 语言模型使用纯文本进行训练。 在字符LM的情况下,我们训练它们预测字符序列中的下一个字符。
- 要训练自己的模型,首先需要一个适当大的语料库。 在作者的实验中,使用了大约10亿字的语料库。
- 您需要将语料库拆分为训练,验证和测试部分。 我们的trainer假设语料库中有一个文件夹,其中有一个’test.txt’和一个带有测试和验证数据的’valid.txt’。 重要的是,还有一个名为“train”的文件夹,其中包含拆分中的训练数据。 例如,十亿字的语料库被分成100个部分。 如果所有数据不能一次性载入内存,则必须进行拆分,在这种情况下,trainer会随机迭代所有拆分。
- 因此,文件夹结构必须如下所示:
corpus/
corpus/train/
corpus/train/train_split_1
corpus/train/train_split_2
corpus/train/...
corpus/train/train_split_X
corpus/test.txt
corpus/valid.txt
训练语言模型
- 获得此文件夹结构后,只需将LanguageModelTrainer类指向它即可开始学习模型。
- 此脚本中的参数非常小。 作者设置隐藏的大小为1024或2048,序列长度为250,batch大小为100,得到了良好的结果。根据您的资源,您可以尝试训练大型模型,但要注意您需要一个非常强大的GPU和 很多时间训练模型(作者训练> 1周)。
from flair.data import Dictionary
from flair.models import LanguageModel
from flair.trainers.language_model_trainer import LanguageModelTrainer, TextCorpus
# are you training a forward or backward LM?
is_forward_lm = True
# load the default character dictionary
dictionary: Dictionary = Dictionary.load('chars')
# get your corpus, process forward and at the character level
corpus = TextCorpus('/path/to/your/corpus',
dictionary,
is_forward_lm,
character_level=True)
# instantiate your language model, set hidden size and number of layers
language_model = LanguageModel(dictionary,
is_forward_lm,
hidden_size=128,
nlayers=1)
# train your language model
trainer = LanguageModelTrainer(language_model, corpus)
trainer.train('resources/taggers/language_model',
sequence_length=10,
mini_batch_size=10,
max_epochs=10)
使用LM作为嵌入
一旦你训练了LM,使用它作为嵌入很容易。 只需将模型加载到CharLMEmbeddings类中,就像使用Flair中的任何其他嵌入一样使用:
sentence = Sentence('I love Berlin')
# init embeddings from your trained LM
char_lm_embeddings = FlairEmbeddings('resources/taggers/language_model/best-lm.pt')
# embed sentence
char_lm_embeddings.embed(sentence)