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 텐서를 받는다.

댓글