HuggingFace 모델 A to Z (2) - Tokenizer
우리가 우리 입맛에 맞게 변동 시킬 수 있는 부분 3가지 중 가장 처음으로 고려해야할 Tokenizer를 알아보려고 한다.
- Tokenizer
- Embedding
- Classifier Layer
Bert base모델의 tokenizer를 불러와서 그냥 깡으로 확인을 해보면 다음과 같다.
tokenizer
#PreTrainedTokenizerFast(name_or_path='bert-base-cased', vocab_size=28996, model_max_len=512,
#is_fast=True, padding_side='right', truncation_side='right',
#special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]',
# 'cls_token': '[CLS]', 'mask_token': '[MASK]'})
custom을 하기 전에 BERT만 보고서는 알 수 없는 단어들이 있다. padding과 truncation이다.
Padding
우선 패딩을 실험해서 결과를 보자면 다음과 같다.
#CLS token은 : 101, PAD token은 : 0, MASK token은:103
Tokenizer에 문장을 Feeding했을 경우 CLS, MASK 토큰이 자동적으로 치환이 되며, max_length가 문장보다 더 길 경우 PAD 토큰인 0으로 20만큼 채워주는 것으로 확인할 수 있다.
기본 Tokenizer에서 출력된 값을 확인했을 땐, right이란 뜻은 padding이 되었을 때 문장끝의 오른쪽에 패딩토큰을 넣는 것으로도 확인이 된다.
Truncation
Truncation같은 경우 해석을 하자면 문장이 짤리는 것이다. 즉, max_length보다 클 경우 자동적으로 잘라 준다는 것이다. 이번 실험엔 max_length를 5로 주면 다음과 같이 출력된다.
계산대로라면 "France" 단어만 짤려야하는데 the부터 짤린 이유는 padding에서와 같이 cls과 sep토큰을 자동적으로 치환해주기 때문이다. 따라서 max_length-2개만큼 고려를 했다는 뜻이다.
그렇다면 "padding은 데이터 손실이 없지만 truncation은 데이터 손실이 일어나지 않는가?"라는 질문이 있을 수 있다. 그걸 고려하여 overflowing_token이라는 함수를 HuggingFace에서 만들어놨다(역시 갓깅페이스;).
다음과 같이 짤린 갯수만큼 줄줄이 소세지로 반환받는 것을 확인할 수 있다.