핵심 요약

  • 토큰화는 텍스트를 언어 모델이 처리하는 정수열로 바꾸고, 그 정수열을 다시 텍스트로 복원하는 과정이다. 모델은 글자 자체가 아니라 토큰을 입력받는다.
  • 바이트 쌍 인코딩(BPE)은 자주 붙어 나오는 토큰 쌍을 새 토큰 하나로 반복해서 합친다. 어휘가 커지는 대신 같은 텍스트를 더 짧은 토큰열로 표현할 수 있다.
  • 토크나이저는 언어 모델과 별도로 학습된다. 토크나이저의 학습 자료와 분할 규칙은 언어별 토큰 수, 코드의 공백 처리, 숫자 표현에 영향을 준다.
  • 어휘를 무작정 늘릴 수는 없다. 입력 임베딩 표와 다음 토큰을 예측하는 출력층이 함께 커지고, 드물게 등장하는 토큰은 충분히 학습되지 않을 수 있다.

텍스트에서 바이트로, 바이트에서 토큰으로

안드레이 카파시는 앞선 GPT 구현에서 글자마다 토큰 하나를 부여했다. 설명에는 간단하지만 실제 언어 모델에는 불리한 방식이다. 텍스트가 긴 토큰열이 되면 모델이 한 번에 참고할 수 있는 문맥 안에 담기는 내용이 줄어든다.

영상에서 만드는 토크나이저는 먼저 문자열을 UTF-8 바이트열로 바꾼다. UTF-8은 문자 하나를 1~4바이트로 표현하므로, 바이트를 그대로 토큰으로 쓰면 표현 가능한 종류는 256개여도 토큰열이 길어진다. BPE는 여기서 가장 자주 나란히 나타나는 바이트 또는 토큰 두 개를 찾아 새 토큰으로 합친다. 새 토큰도 다음 병합의 재료가 된다.

카파시의 예제에서는 어휘 크기를 256개에서 276개로 늘리기 위해 병합을 20번 수행한다. 학습을 마치면 병합 순서를 이용해 새 텍스트를 토큰으로 바꾸고, 각 토큰에 대응하는 바이트를 이어 붙여 텍스트로 되돌릴 수 있다. 다만 임의의 토큰열이 항상 올바른 UTF-8 바이트열이 되는 것은 아니다. 영상의 디코더 예제는 이런 경우 대체 문자를 사용한다.

토크나이저의 학습 자료가 중요한 이유

토크나이저 학습은 언어 모델 학습과 별도 단계다. 토크나이저는 자체 학습 자료에서 빈번한 조합을 찾아 어휘를 만들고, 언어 모델은 그 어휘로 변환된 토큰열을 학습할 수 있다. 두 단계에 쓰는 자료가 같을 필요는 없다.

어떤 언어나 코드가 토크나이저 학습 자료에 얼마나 들어가는지에 따라 병합 결과가 달라진다. 카파시는 영어보다 적게 반영된 언어에서는 같은 내용을 표현하는 데 더 많은 토큰이 필요할 수 있다고 설명한다. 영상의 한 비교에서는 영어 문장이 5토큰, 그 번역문이 15토큰이다. 그는 이런 차이가 비영어권 언어에서 모델이 상대적으로 약한 이유 중 하나일 수 있다고 본다. 언어 모델 자체의 학습 자료 차이도 함께 언급한다.

GPT는 병합 전에 텍스트를 나눈다

카파시가 구현한 기본 BPE는 인접한 쌍을 그대로 병합한다. GPT-2 토크나이저에는 그 앞에 정규표현식으로 텍스트를 나누는 단계가 있다. 글자, 숫자, 문장부호, 공백 등을 구분한 뒤 각 조각 안에서 병합하므로, 조각의 경계를 넘어서는 조합은 토큰 하나가 되지 않는다. 영상은 같은 단어에 문장부호만 다르게 붙은 토큰들이 늘어나는 일을 제한하려는 설계를 소개한다.

이 규칙도 모델마다 다르다. 영상에서 GPT-2는 파이썬 들여쓰기에 쓰인 공백을 낱개 토큰으로 처리하는 반면, GPT-4 토크나이저는 여러 공백을 묶어 처리한다. 같은 코드가 차지하는 토큰 수가 줄면 정해진 문맥 길이 안에 더 많은 코드를 넣을 수 있다. 다만 카파시는 코딩 성능 차이를 토크나이저 하나만의 결과로 돌리지 않고, 모델과 학습 자료의 영향도 함께 인정한다. GPT-4의 분할 규칙에는 숫자를 최대 세 자리씩 묶는 방식도 나타난다.

일반 텍스트와 다른 특수 토큰

토크나이저에는 BPE 병합으로 만들어지지 않는 특수 토큰도 있다. 영상에 따르면 GPT-2의 어휘 50,257개는 원시 바이트 256개, 병합으로 추가한 50,000개, 문서의 끝을 표시하는 특수 토큰 1개로 구성된다. 문서 사이에 이 토큰을 넣으면 모델은 뒤에 이어지는 내용이 앞 문서와 별개라는 신호를 학습할 수 있다.

대화형 모델에서는 메시지의 시작과 끝, 화자 등 구조를 표시하는 토큰도 쓰인다. 기존 모델에 새 특수 토큰을 추가하려면 토큰 ID만 만드는 것으로 끝나지 않는다. 입력 임베딩 표와 다음 토큰 예측을 담당하는 출력층에도 새 토큰에 해당하는 매개변수를 추가하고 학습해야 한다.

어휘 크기와 구현 방식의 선택

어휘가 커지면 같은 텍스트를 더 적은 토큰으로 표현할 가능성이 높아진다. 영상의 예시 문자열은 GPT-2 토크나이저에서 300토큰, GPT-4 토크나이저에서 185토큰으로 분할됐다. 반면 어휘가 커질수록 입력 임베딩 표와 출력층의 비용도 늘어난다. 카파시는 드문 토큰의 학습량이 부족해질 가능성과, 너무 긴 조각을 토큰 하나에 담을 때 생길 수 있는 처리상의 부담도 고려해야 한다고 설명한다.

구현 방식에도 차이가 있다. 영상에서 소개한 OpenAI의 tiktoken은 이미 만들어진 어휘로 텍스트를 인코딩하고 디코딩하는 데 쓰인다. SentencePiece는 어휘 학습도 지원하며, 카파시의 설명에서는 UTF-8 바이트보다 유니코드 코드 포인트를 중심으로 병합한다. 학습 때 보지 못한 문자에 대비해 바이트로 되돌아가는 설정을 사용할 수도 있다. 설정에 따라 알 수 없는 문자가 별도의 미지 토큰으로 바뀔 수 있어, 그는 그 동작을 확인해야 한다고 강조한다.

토큰 경계에서 드러나는 이상 동작

토큰은 글자와 일치하지 않는다. 같은 단어도 앞의 공백, 대소문자, 문장 내 위치에 따라 다른 토큰열이 될 수 있다. 카파시는 이것이 철자 세기나 문자열 뒤집기 같은 글자 단위 작업을 어렵게 만들 수 있다고 보고, 긴 문자열을 먼저 글자별로 띄어 쓴 뒤 뒤집었을 때는 자신의 실험에서 결과가 나아졌다고 보여준다. 숫자도 자릿수별로 일관되게 나뉘지 않으면 자리값을 다루는 산술에 부담이 될 수 있다.

영상은 프롬프트 끝의 공백처럼 다음 토큰의 일부가 될 문자를 따로 입력했을 때 완성 결과가 달라질 수 있다는 사례도 다룬다. 또 ‘SolidGoldMagikarp’ 같은 문자열에 대한 과거 모델의 이상 반응을 소개한다. 카파시는 토크나이저 학습 자료에는 있던 문자열이 언어 모델 학습 자료에는 거의 없어 해당 토큰의 표현이 충분히 학습되지 않았을 가능성을 설명하지만, 그 경위가 확정적으로 밝혀진 것은 아니라고 선을 긋는다.

카파시의 구현과 사례가 보여주는 범위는 분명하다. 토큰화는 텍스트를 정수로 바꾸는 준비 단계이면서, 모델이 한정된 문맥 안에서 어떤 글자와 구조를 어떤 단위로 접하는지 결정하는 단계다.