토크나이제이션 알고리즘
토크나이제이션 알고리즘 (Tokenization algorithms)
Transformers는 세 가지 서브워드 토크나이제이션 알고리즘(Byte pair encoding(BPE), Unigram, WordPiece)을 지원해요. 이 알고리즘들은 텍스트를 단어와 문자 사이의 단위로 나눠, 어휘를 컴팩트하게 유지하면서도 의미 있는 조각을 잡아내요. 흔한 단어는 단일 토큰으로 온전히 남고, 드물거나 모르는 단어는 서브워드로 분해돼요.
예를 들어 annoyingly는 어휘에 따라 ["annoying", "ly"] 또는 ["annoy", "ing", "ly"]로 나눠질 수 있어요. 서브워드 분할 덕분에 모델이 아는 서브워드로 모르는 단어를 표현할 수 있어요.
[!TIP] 서브워드 토크나이제이션은 터키어처럼 서브워드를 이어 붙여 길고 복잡한 단어를 만들 수 있는 언어에서 특히 유용해요.
Byte pair encoding (BPE)
Byte pair encoding(BPE)은 Transformers에서 가장 인기 있는 토크나이제이션 알고리즘으로, Llama, Gemma, Qwen2 같은 모델이 써요.
- 사전 토크나이저(pre-tokenizer)가 공백이나 다른 규칙으로 텍스트를 나눠, 고유한 단어들과 그 빈도를 만들어요.
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
- BPE 알고리즘이 모든 문자에서 기본 어휘
["b", "g", "h", "n", "p", "s", "u"]를 만들어요.
("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5)
- BPE는 개별 문자로 시작해 가장 빈도가 높은 인접 쌍을 반복적으로 병합해요.
"u"와"g"는"hug","pug","hugs"에서 가장 자주 함께 나타나므로, BPE는 이들을"ug"로 병합하고 어휘에 추가해요.
("h" "ug", 10), ("p" "ug", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "ug" "s", 5)
- 다음으로 가장 흔한 쌍은
"u"와"n"으로,"pun"과"bun"에 나타나므로"un"으로 병합돼요.
("h" "ug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("h" "ug" "s", 5)
- 이제 어휘는
["b", "g", "h", "n", "p", "s", "u", "ug", "un"]이에요. BPE는 목표 어휘 크기(기본 어휘 크기 + 병합 수)에 도달할 때까지 병합 규칙을 계속 학습해요. GPT는 어휘 크기 40,478(기본 토큰 478개 + 병합 40,000개)로 BPE를 사용해요.
기본 어휘에 없는 문자는 "<unk>" 같은 미지 토큰으로 매핑돼요. 실제로는 기본 어휘가 훈련 중 본 모든 문자를 포함하므로 미지 토큰은 드물어요.
바이트 레벨 BPE (Byte-level BPE)
모든 유니코드 문자를 포함하면 기본 어휘가 엄청나게 커져요. 바이트 레벨 BPE는 대신 256개 바이트 값을 기본 어휘로 사용해서, "<unk>" 토큰 없이도 모든 단어를 토큰화할 수 있게 해요. GPT-2는 어휘 크기 50,257(바이트 토큰 256개 + 병합 50,000개 + 특수 종료 토큰)로 바이트 레벨 BPE를 사용해요.
Unigram
Unigram은 Transformers에서 두 번째로 인기 있는 토크나이제이션 알고리즘으로, T5, BigBird, Pegasus 같은 모델이 써요.
- Unigram은 큰 후보 서브워드 집합으로 시작하고, 각 후보는 나타나는 빈도에 따라 확률 점수를 받아요.
("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
["b", "g", "h", "n", "p", "s", "u", "hu", "ug", "un", "pu", "bu", "gs", "hug", "pug", "pun", "bun", "ugs", "hugs"]
-
Unigram은 각 단계에서 현재 어휘가 훈련 데이터를 얼마나 잘 토큰화하는지 점수를 매겨요.
-
각 토큰에 대해, Unigram은 그 토큰을 제거하면 전체 손실이 얼마나 늘어날지 측정해요. 예를 들어
"pu"를 제거해도"pug"와"pun"이 여전히["p", "ug"],["p", "un"]으로 토큰화될 수 있으므로 손실에 거의 영향을 주지 않아요.하지만
"ug"를 제거하면"hug","pug","hugs"모두가 그것에 의존하므로 손실이 크게 늘어나요. -
Unigram은 손실 증가가 가장 적은 토큰(보통 하위 10-20%)을 제거해요. 기본 문자는 항상 남아 있어 어떤 단어든 토큰화할 수 있어요.
"bu","pu","gs","pug","bun"같은 토큰은 전체 가능도에 기여가 가장 적어 제거돼요.
["b", "g", "h", "n", "p", "s", "u", "hu", "ug", "un", "hug", "pun", "ugs", "hugs"]
- 어휘가 목표 크기에 도달할 때까지 2~4단계를 반복해요.
추론 중에 Unigram은 단어를 여러 방식으로 토큰화할 수 있어요. "hugs"는 ["hug", "s"], ["h", "ug", "s"], 또는 ["h", "u", "g", "s"]가 될 수 있어요. Unigram은 확률이 가장 높은 토큰화를 선택해요. 병합 규칙을 기반으로 결정적이고 확정적인 BPE와 달리, Unigram은 확률적이며 훈련 중에 다른 토큰화를 샘플링할 수 있어요.
SentencePiece
SentencePiece는 원시 텍스트에 직접 BPE나 Unigram을 적용하는 토크나이제이션 라이브러리예요. 표준 BPE와 Unigram은 공백이 단어를 구분한다고 가정하는데, 이는 공백을 쓰지 않는 중국어·일본어 같은 언어에 맞지 않아요.
- SentencePiece는 입력 텍스트를 원시 바이트 또는 문자 스트림으로 취급하고,
"▁"로 표현되는 공백 문자를 어휘에 포함해요.
("▁hug", 10), ("▁pug", 5), ("▁pun", 12), ("▁bun", 4), ("▁hugs", 5)
- 그런 다음 SentencePiece는 텍스트에 BPE 또는 Unigram을 적용해요.
디코딩 시 SentencePiece는 모든 토큰을 연결하고 "▁"를 공백으로 바꿔요.
WordPiece
WordPiece는 DistilBERT, Electra 같은 BERT 계열 모델의 토크나이제이션 알고리즘이에요.
BPE와 비슷하며 아래에서 위로 쌍을 반복 병합하지만, 쌍을 선택하는 방식이 달라요.
("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5)
WordPiece는 훈련 데이터의 가능도를 최대화하는 쌍을 병합해요.
score("u", "g") = frequency("ug") / (frequency("u") × frequency("g"))
| pair | frequency | score |
|---|---|---|
"u" + "g" |
20 | 20 / (36 × 20) = 0.028 |
"u" + "n" |
16 | 16 / (36 × 16) = 0.028 |
"h" + "u" |
15 | 15 / (15 × 36) = 0.028 |
"g" + "s" |
5 | 5 / (20 × 5) = 0.050 |
이 점수는 결합된 토큰이 개별 토큰 빈도에서 기대되는 것보다 더 자주 나타나는 "g"와 "s"의 병합을 선호해요. BPE는 그냥 가장 많이 나타나는 쌍을 병합해요. WordPiece는 각 병합이 얼마나 정보적인지 측정해요. 우연이 예측하는 것보다 훨씬 더 자주 함께 나타나는 두 토큰이 먼저 병합돼요.
단어 레벨 토크나이제이션 (Word-level tokenization)
단어 레벨 토크나이제이션은 공백, 구두점, 또는 언어별 규칙으로 텍스트를 토큰으로 나눠요.
["Do", "n't", "you", "love", "🤗", "Transformers", "?", "We", "sure", "do", "."]
모든 변형("love", "loving", "loved", "lovingly")을 포함해 모든 고유 단어가 자신만의 토큰을 필요로 하므로 어휘 크기가 극도로 커져요. 결과 임베딩 행렬이 거대해져 메모리와 계산이 늘어나요. 어휘에 없는 단어는 "<unk>" 토큰으로 매핑되므로 모델이 새 단어를 처리할 수 없어요.
문자 레벨 토크나이제이션 (Character-level tokenization)
문자 레벨 토크나이제이션은 텍스트를 개별 문자로 나눠요.
["D", "o", "n", "'", "t", "y", "o", "u", "l", "o", "v", "e"]
어휘가 작고 모든 단어를 표현할 수 있어 "<unk>" 문제가 없어요. 하지만 시퀀스가 훨씬 길어져요. "l" 같은 문자는 "love"보다 훨씬 적은 의미를 지니므로 성능이 떨어져요.
리소스 (Resources)
- LLM 코스 6장은 토크나이저를 처음부터 훈련하는 법을 가르치고, BPE·Unigram·WordPiece 알고리즘의 차이를 설명해요.
더 알아보기 (Learn more)
- Fast tokenizers — 빠른 토크나이저 사용
- Custom tokenizers — 커스텀 토크나이저
- LLM 코스 — 토크나이저 훈련과 알고리즘 비교