Tokenizer 이해하기
Transformer에 문장을 넣기 전, 텍스트를 어떻게 숫자로 바꾸는지 tokenizer를 정리한다.
왜 필요한가#
Transformer에 넣을 입력이 numeric 데이터가 아니라면 그대로 넣을 수 없다. 텍스트를 숫자로 바꾸는 과정이 필요한데, 그게 tokenizer가 하는 일이다.
큰 그림은 이렇다. 입력 문장(예: unbelievable)을 BPE(BPE), WordPiece 같은 방법으로 잘게 분해하고(['un', 'believe', '##able']), 미리 만들어 둔 사전(vocab)을 참고해 각 조각을 번호로 바꾼다. 여기에 스페셜 토큰을 추가하면 Transformer가 먹을 수 있는 입력이 된다. 핵심 흐름은 tokenize 다음 encode다.
스페셜 토큰#
사전에는 일반 단어 말고도 특수한 역할의 토큰이 들어 있다.
- eos: 문장의 끝을 표시한다.
- pad: 길이를 맞추기 위해 채우는 토큰이다.
- vocab size: 사전의 크기다.
▁ 기호의 의미#
토크나이저 결과에서 ▁ 기호를 자주 본다. 이건 문장을 토큰화할 때 맨 앞이거나 앞에 띄어쓰기가 있는 경우를 표시하려고 토큰 앞에 붙이는 것이다. 그래서 decoder가 다시 문장을 생성할 때도 이 ▁를 보고 띄어쓰기를 복원해 출력한다.
padding=True의 동작#
tokenizer(src_texts, padding=True)에서 src_texts는 배치 단위로 (batch, Length) 형태로 들어온다. 여기서 padding=True가 주어지면, 배치 안에서 가장 긴 문장의 길이를 기준으로 그보다 짧은 문장들을 pad 토큰으로 채운다. 따라서 결과는 (batch, 배치 내 최대 길이)가 된다.
실제 input_ids를 보면 이렇게 나온다.
src.input_ids
# tensor([[1001, 901, 8836, 603, 168, 333, 7787, 25181, 7, 0]])
맨 뒤의 0이 pad 토큰이다.
max_length / truncation / return_tensors#
tokenizer(src_texts, padding=True, max_length=..., truncation=True, return_tensors='pt')
- max_length: 문장 길이의 상한을 정한다. 이 길이를 넘는 문장은 truncation 대상이 된다.
- truncation: True이면 max_length를 초과하는 부분을 잘라버린다. 잘린 부분은 소실된다.
- return_tensors='pt': 결과를 PyTorch 텐서로 반환한다. 'tf'면 TensorFlow 텐서로 반환한다.
정리#
- tokenizer는 텍스트를 숫자로 바꾼다. tokenize(BPE/WordPiece로 분해) 다음 encode(vocab 번호로 매기고 스페셜 토큰 추가).
- eos와 pad, vocab size 같은 스페셜 토큰이 있고, ▁는 띄어쓰기를 표시한다.
- padding=True는 배치 내 최대 길이에 맞춰 pad로 채우고, max_length와 truncation은 초과분을 잘라낸다. return_tensors='pt'로 PyTorch 텐서를 받는다.
댓글