본문 바로가기
필기 노트/Huggingface Transformers

[Huggingface] PreTrainedTokenizer class

by misconstructed 2021. 7. 18.
728x90

모든 Tokenizer들이 상속받는 기본 tokenizer 클래스이다. Tokenizer에 대한 간단한 정리는 여기에서 확인할 수 있다. 


Tokenizer는 모델에 어떠한 입력을 넣어주기 위해서 전처리를 담당한다. Huggingface transformers 라이브러리에서는 크게 두 가지 종류의 tokenizer를 지원하는데, 첫 번째로는 파이썬으로 구현된 일반 tokenizer와 Rust 로 구축된 "Fast" tokenizer로 구분할 수 있다. "Fast" tokenizer에서는 batched tokenization에서 속도를 더 빠르게 해주고, 입력으로 주어진 문장과 token 사이를 mapping 해주는 추가적인 함수를 지원한다. 참고로, "Fast" tokenizer들을 SentencePiece tokenizer(T5, Albert, XLNet 등) 들을 지원하지 않고 있다.

Tokenizer들은 크게 3가지 기능을 제공한다.

1. Tokenizing : 입력 문자열을 token id로 변환(encoding), token id를 다시 문자열로 변환(decoding)의 기능

2. 기존의 구조(BPE, Sentencepiece 등)에 독립적으로 추가적인 token들을 추가하는 기능

3. Special token(mask, BOS, EOS 등) 을 관리하는 기능

PreTrainedTokenizer

기본적인 tokenizer의 기능으로 tokenizing, pretrained tokenizer를 다운로드, 로드, 캐싱하는 기능, vocabulary에 새로운 token을 추가하는 기능 등을 제공한다.

- vocab_files_names : dict 형태로, key 값으로는 vocab file 의 keyword name을 저장하고, value 값으로는 filename 저장

- pretrained_vocab_files_map : dict의 형태로, key 값으로는 vocab file의 keyword name을 저장하고, value 값으로는 또 다른 dict 형태를 저장하는데, 해당 dict의 key로는 모델의 short-cut-name, value로는 해당 모델의 pretrained vocabulary file의 url

- max_model_input_sizes : dict 형태로, key값으로는 모델의 이름, value 값으로는 모델의 입력으로 받을 수 있는 최대 입력 길이

- model_input_names

- padding_ㅑside : padding이 어느 쪽에 추가되어야 하는지 (right 또는 left)

 

파라미터

- model_max_length : Transformer 모델의 입력을 받을 수 있는 최대의 입력 길이

- padding_side : padding을 어느 위치에 추가할 것인지 (right 또는 left) 

- model_input_names : forward pass에서 모델의 입력으로 받을 값들의 key 값 (예를 들어, token_type_ids, attention_mask 등)

- bos_token : 문장의 시작을 나타내는 special token → self.bos_token, self.bos_token_id

- eos_token : 문장의 끝을 나타내는 Special token → self.eos_token, self.eos_token_id

- unk_token : 모르는 단어를 나타내는 special token → self.unk_token, self.unk_token_id

- sep_token : 두 개의 문장이 있는 경우, 두 문장을 구분하는 special token (BERT 등에서 사용) → self.sep_token, self.sep_token_id

- pad_token : 동일한 batch 내에서 입력의 크기를 동일하게 하기 위해서 사용해는 padding token → self.pad_token, self.pad_token_id

- cls_token : 입력의 class를 나타내는 special token (BERT 등에서 사용) → self.cls_token, self.cls_token_id

- mask_token : masked-language modeling 을 할 때 사용되는 mask token → self.mask_token, self.mask_token_id

- additional_special_tokens : 추가적인 Special token의 목록. Tokenizer에 의해서 분리되지 않도록 리스트로 유지한다.

 

__call__ (호출한 경우)

입력

- text : encoding 될 문장 (sequence, batch). str, List[str], List[List[str]] 을 입력으로 받을 수 있고, 이미 tokenize 된 경우(list of tokens) is_split_into_words=True 로 지정해줘야 한다.

- text_pair : text와 동일. 한 개의 문장이 아니라 sentence pair를 입력으로 주는 경우인 듯.

- add_special_tokens (True) : encoding을 할 때 special token을 추가할지 여부 

- padding (False) : True로 지정한 경우 batch 내에서 가장 긴 길이에 맞춰서 padding을 한다. False인 경우 padding을 하지 않고 encoding을 한다. 'max_length'로 지정하면 모델이 입력으로 받을 수 있는 최대의 길이에 맞춰서 padding을 한다. 

- truncation (False): True 인 경우 모델이 입력으로 받을 수 있는 최대의 길이에 맞춰서 Truncation을 한다. "only_first"인 경우 sentence pair로 입력이 주어지는 경우, 첫 번째 문장만 Truncate 한다. 반대로, "only_second"인 경우 두 번째 문장만 truncate 한다. False로 지정한 경우 trauncate을 하지 않는다.

- max_length : 모델이 입력으로 받을 최대의 입력 길이. 별도로 지정하지 않은 경우 모델의 config에 맞게 지정된다.

- is_split_into_words (False) : 입력이 이미 tokenize가 되었는지 여부. True로 지정한 경우, 입력이 이미 tokenize가 되었다고 가정하고 별도의 Tokenize를 수행하지 않는다. 

- return_tensors : "tf" 면 tf.constant, "pt" 면 torch.Tensor, "np" 면 np.ndarray 로 결과를 리턴한다. 

- return_token_type_ids : token type id를 제공할지 여부. 기본적으로 제공함.

- Token type id 란? (segment id 라고도 부름)
BERT와 같은 모델에서는 입력으로 2개의 문장이 주어지는 경우가 있다. 입력으로 문장이 2개가 주어진 경우, 두 문장을 구분할 수 있도록 별도의 id를 부여한다. 2개의 문장이 입력으로 주어지면, 첫 번째 문장에 해당하는 token들의 인덱스에는 모두 0을, 두 번째 문장에 해당하는 token들의 인덱스에는 모두 1을 부여한다. 

 

- return_attention_mask : attention mask를 제공할지 여부. 기본적으로 제공함.

- Attention mask 란?
동일한 batch 내에서 2개의 서로 다른 입력이 주어졌을 때, batch 단위로 처리하기 위해서는 입력으로 주어지는 문장의 길이가 동일해야한다. 짧은 문장을 긴 문장의 길이와 같게 하기 위해서 padding token을 추가하게되는데, 이렇게 추가된 Padding token을 self-attention 단계에서 접근하는 것을 막기 위해서 실제 의미있는 데이터 (padding token을 제외한 token) 의 인덱스에만 1을 주고 나미지에는 0을 주는 attention mask 를 사용한다. 

 

- return_special_tokens_mask (False) : special token mask를 리턴할지 여부

- return_length (False) : encode된 결과의 길이를 리턴할지 여부

- verbose (True) : 추가적인 출력이나 warning 등을 출력할지 여부

리턴 → BachEncoding

- input_ids : token is 의 리스트

- token_type_ids : token type id의 리스트

- attention_mask : 모델에 의해서 attention이 수행되어야 하는 인덱스

- num_truncated_tokens : truncate된 token의 개수 

- special_token_mask : 0인 경우 일반 Token, 1인 경우 Special token

- length : return_length=True 인 경우, encoding 된 출력의 길이

 

기타 함수

- batch_decode() : token id로 구성된 입력을 하나의 연결된 string으로 출력한다. (decode() 함수 호룩)

- convert_ids_to_tokens() : 한 개의 token id 또는 token id 의 리스트를 token으로 변환한다. skip_special_tokens=True로 하면 decoding할 때 special token들을 제거한다. 

- convert_tokens_to_ids() : token string 또는 token string의 리스트를 token id 또는 Token id의 리스트로 변환한다. 

- convert_tokens_to_string() : token의 리스트를 하나의 연결된 String으로 변환한다. (" ".join(tokens) 와 동일한 연산)

- decode() : tokenizer 와 vocabulary를 이용해서 token id를 string으로 변환한다. skip_special_token=True로 지정하면 speical token들을 제외한다.

- encode() : token string을 token id 의 리스트로 변환한다. add_special_tokens=False로 지정하면 token id로 변환할 때 special token들을 제외한다. padding을 통해서 padding token을 어떻게 추가할지조 지정할 수 있다. (True, "max_length", False)

- truncation() : trauncation을 수행 (True, "only_first", "only_second", False) 

- get_added_vocab() : token to index에 해당하는 dict를 리턴한다.

- tokenize() : tokenizer를 이용해서 string을 token id의 리스트로 변환한다.  

728x90

댓글