모델은 텍스트를 직접 읽지 못한다. 숫자 시퀀스로 변환해야 한다. 토크나이저(tokenizer)는 텍스트를 토큰으로 쪼개고, 각 토큰에 정수 ID를 부여한다.
어떻게 쪼개느냐가 모델 성능에 직접 영향을 준다.
단어 단위 토크나이징의 문제
공백 기준으로 단어를 나누는 가장 단순한 방법이다.
"나는 사과를 먹었다" → ["나는", "사과를", "먹었다"]
두 가지 문제가 있다.
어휘 크기 폭발: 영어만 해도 단어 변형이 수십만 가지다. “run”, “runs”, “running”, “ran"이 모두 다른 토큰이 된다. 어휘 크기가 커질수록 임베딩 테이블이 커지고 메모리가 늘어난다.
미등록 단어(OOV): 학습 데이터에 없는 단어가 추론 시 등장하면 [UNK] 토큰으로 처리한다. 고유명사, 신조어, 오타가 모두 같은 토큰이 된다.
문자 단위 토크나이징의 문제
반대로 모든 문자를 개별 토큰으로 쪼개면 OOV 문제는 없어진다. 어휘 크기도 수백 개로 작다.
그러나 “나는 사과를 먹었다"가 17개 토큰이 된다. 시퀀스가 길어질수록 어텐션 연산량이 O(n²)으로 증가하고, 의미 있는 단위를 학습하기 어렵다.
서브워드 토크나이징
두 극단의 중간이다. 자주 등장하는 단어는 통째로, 희귀한 단어는 더 작은 단위로 쪼갠다.
"unhappiness" → ["un", "##happiness"]
"tokenization" → ["token", "##ization"]
"GPT4" → ["G", "PT", "4"] ← 처음 보는 단어도 처리 가능
BPE (Byte Pair Encoding)
OpenAI GPT 계열이 사용한다. 원래 데이터 압축 알고리즘에서 가져왔다.
학습 과정
- 모든 단어를 문자 단위로 분리한다
- 가장 자주 등장하는 인접 토큰 쌍을 찾아 병합한다
- 어휘 크기가 목표에 도달할 때까지 반복한다
초기: l o w e r → 5토큰
병합 1: lo w e r (lo가 가장 빈번)
병합 2: low e r
병합 3: lower (어휘에 추가)
어휘 크기를 하이퍼파라미터로 설정한다. GPT-2는 50,257개, GPT-4는 100,277개를 사용한다.
WordPiece
Google BERT가 사용한다. BPE와 유사하지만 병합 기준이 다르다. 단순 빈도 대신 **언어 모델 우도(likelihood)**를 최대화하는 쌍을 병합한다.
두 토큰 A, B를 병합했을 때 언어 모델 우도가 가장 많이 오르는 쌍 선택
score(A, B) = freq(AB) / (freq(A) × freq(B))
BPE와 달리 서브워드 접두사에 ##를 붙여 단어 내부 토큰을 표시한다.
"playing" → ["play", "##ing"]
"##ing"은 단어 시작이 아님을 표시
SentencePiece
Google이 개발한 언어 독립적 토크나이저다. 공백을 특수 문자(▁)로 처리해 언어에 관계없이 동작한다. 한국어처럼 공백 기준 단어 분리가 맞지 않는 언어에 유리하다.
BPE 또는 Unigram 언어 모델 두 가지 알고리즘을 지원한다. T5, LLaMA, Gemma 등이 사용한다.
"나는 사과를" → ["▁나는", "▁사과를"]
공백이 토큰 시작 마커가 된다
Byte-level BPE
GPT-2부터 도입됐다. 문자 대신 바이트(0~255)를 기본 단위로 시작한다. 어떤 언어든, 어떤 특수문자든, 이모지든 256개 기본 단위로 처리할 수 있다. 진정한 의미의 OOV가 없다.
특수 토큰
모델마다 다르지만 공통적으로 쓰이는 특수 토큰이 있다.
| 토큰 | 용도 |
|---|---|
[CLS] | BERT 문장 시작, 분류 태스크에 사용 |
[SEP] | BERT 문장 구분자 |
[PAD] | 배치 내 시퀀스 길이 맞추기 |
[UNK] | 미등록 단어 |
<s> / </s> | 문장 시작/끝 (GPT 계열) |
<|endoftext|> | GPT 문서 구분 |
토큰 수와 비용
LLM API는 토큰 수 기준으로 과금한다. 같은 텍스트라도 언어마다 토큰 수가 크게 다르다.
영어 “Hello, how are you?” = 6토큰
한국어 “안녕하세요, 잘 지내세요?” = 11토큰
영어 기반 BPE 모델은 한국어에서 토큰 효율이 낮다. 한 글자가 여러 바이트로 인코딩되거나 의미 있는 서브워드 단위로 병합이 덜 일어나기 때문이다. 다국어 모델(GPT-4o, Claude 등)은 한국어 토큰 효율을 높이도록 어휘를 구성한다.
트레이드오프
어휘 크기가 클수록 토큰당 더 많은 정보를 담아 시퀀스가 짧아진다. 그러나 임베딩 테이블과 출력 레이어 크기가 커진다. 50K 어휘와 100K 어휘의 모델은 임베딩 레이어 크기만 2배 차이 난다.
토크나이저는 모델 아키텍처와 함께 고정된다. 같은 모델이라도 다른 토크나이저를 쓰면 임베딩이 맞지 않아 재학습이 필요하다. 파인튜닝 시 원래 모델의 토크나이저를 그대로 사용해야 하는 이유다.