모델 훈련하기

모델 훈련하기

Flair로 NER 모델을 훈련하려면 말뭉치(corpus), 라벨 사전, 임베딩, 태거, 트레이너를 순서대로 준비해요.

최신 NER 시스템을 만들려면 트랜스포머 임베딩을 파인튜닝하고 전체 문서 컨텍스트를 쓰는 걸 권장해요(FLERT 논문).

from flair.datasets import CONLL_03
from flair.embeddings import TransformerWordEmbeddings
from flair.models import SequenceTagger
from flair.trainers import ModelTrainer

corpus = CONLL_03()
label_type = 'ner'
label_dict = corpus.make_label_dictionary(label_type=label_type, add_unk=False)

embeddings = TransformerWordEmbeddings(
    model='xlm-roberta-large',
    layers="-1",
    subtoken_pooling="first",
    fine_tune=True,
    use_context=True,
)

tagger = SequenceTagger(
    hidden_size=256,
    embeddings=embeddings,
    tag_dictionary=label_dict,
    tag_type='ner',
    use_crf=False,
    use_rnn=False,
    reproject_embeddings=False,
)

trainer = ModelTrainer(tagger, corpus)
trainer.fine_tune('resources/taggers/sota-ner-flert',
                  learning_rate=5.0e-6,
                  mini_batch_size=4,
                  mini_batch_chunk_size=1,
                  )

트랜스포머가 워낙 강력해서 RNN·CRF·reprojection을 꺼도 되고, 아주 작은 학습률로 파인튜닝해요. 파인튜닝 없이 LSTM-CRF를 학습할 수도 있고, 말뭉치와 라벨 타입만 바꾸면 품사 태거도 같은 방식으로 훈련할 수 있어요. ModelTrainertrain()은 스케줄링된 학습률 감소와 안정화를 제공해요.

더 알아보기