AI/Models

HuggingFace 모델 A to Z (2) - Tokenizer

hundredeuk2 2023. 1. 19. 20:26
728x90

HuggingFace

 우리가 우리 입맛에 맞게 변동 시킬 수 있는 부분 3가지 중 가장 처음으로 고려해야할 Tokenizer를 알아보려고 한다.

  1. Tokenizer
  2. Embedding
  3. 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에서 만들어놨다(역시 갓깅페이스;).

 다음과 같이 짤린 갯수만큼 줄줄이 소세지로 반환받는 것을 확인할 수 있다.