[NLP] XLNet 토크나이저 처음부터 학습하기
transformers 라이브러리로 토크나이저를 처음부터 학습시킬 수 있습니다.
다양한 클래스를 블록처럼 쌓아서 간단하게 토크나이저를 완성시킵니다.
이번 포스팅에서는 XLNet 토크나이저(XLNet 논문링크)를 처음부터 학습시켜보겠습니다.
먼저 Unigram 모델을 사용하여 초기화합니다. vocabulary가 있다면 초기 모델에 넣을 수 있습니다.
tokenizer = Tokenizer(models.Unigram())
XLNet에 맞는 normalizer를 설정해줍니다. 이 규칙들은 sentencepiece에서 왔습니다.
from tokenizers import Regex
tokenizer.normalizer = normalizers.Sequence(
[
normalizers.Replace("``", '"'),
normalizers.Replace("''", '"'),
normalizers.NFKD(),
normalizers.StripAccents(),
normalizers.Replace(Regex(" {2,}"), " "),
]
)
sentencepiece의 pre-tokenizer는 Metaspace를 사용합니다.
tokenizer.pre_tokenizer = pre_tokenizers.Metaspace()
XLNet이 필요한 special token들을 추가하고, 모델을 학습시킵니다.
special_tokens = ["<cls>", "<sep>", "<unk>", "<pad>", "<mask>", "<s>", "</s>"]
trainer = trainers.UnigramTrainer(
vocab_size=25000, special_tokens=special_tokens, unk_token="<unk>"
)
tokenizer.train_from_iterator(get_training_corpus(), trainer=trainer)
로컬 텍스트 파일로 학습시킬 수도 있습니다.
tokenizer.model = models.Unigram()
tokenizer.train(["wikitext-2.txt"], trainer=trainer)
XLNet의 post-processing 템플릿은 아래와 같습니다.
tokenizer.post_processor = processors.TemplateProcessing(
single="$A:0 <sep>:0 <cls>:2",
pair="$A:0 <sep>:0 $B:1 <sep>:1 <cls>:2",
special_tokens=[("<sep>", sep_token_id), ("<cls>", cls_token_id)],
)
마지막 디코더도 쌓아줍니다.
tokenizer.decoder = decoders.Metaspace()
추가적으로 fast tokenizer로 만들어줄 수 있습니다. PreTrainedTokenizerFast나 XLNetTokenizerFast 클래스를 이용해서 토크나이저를 감싸주면 됩니다. 한가지 주의할 점은 PreTrainedTokenizerFast는 특수토큰을 지정하고 padding을 왼쪽으로 지정해야합니다.
# 방법1. PreTrainedTokenizerFast 사용
from transformers import PreTrainedTokenizerFast
wrapped_tokenizer = PreTrainedTokenizerFast(
tokenizer_object=tokenizer,
bos_token="<s>",
eos_token="</s>",
unk_token="<unk>",
pad_token="<pad>",
cls_token="<cls>",
sep_token="<sep>",
mask_token="<mask>",
padding_side="left",
)
# 방법2. XLNetTokenizerFast 사용
from transformers import XLNetTokenizerFast
wrapped_tokenizer = XLNetTokenizerFast(tokenizer_object=tokenizer)
본 포스팅은 Hugging Face NLP course를 참고하여 작성하였습니다.
Building a tokenizer, block by block - Hugging Face NLP Course
The 🤗 Tokenizers library has been built to provide several options for each of those steps, which you can mix and match together. In this section we’ll see how we can build a tokenizer from scratch, as opposed to training a new tokenizer from an old o
huggingface.co