주제: TK-1 BPE (Byte Pair Encoding Tokenization)
토크나이저는 겉보기에는 전처리처럼 보이지만, 실제로는 모델이 텍스트를 어떻게 읽는지를 결정하는 핵심 설계다. 너무 잘게 자르면 시퀀스가 길어져 비효율적이고, 너무 크게 자르면 새로운 단어를 처리하기 어려워진다.
BPE는 이 두 극단 사이의 균형을 잡으려는 방법이다. 처음에는 문자 단위로 시작해 어떤 단어도 표현 가능하게 만들고, 그다음 자주 반복되는 조각을 점점 합쳐 효율적인 subword 사전을 만든다.
토크나이저를 처음 배우면 단어를 자르는 규칙처럼 보이지만, 실제로는 모델이 텍스트를 얼마나 효율적으로 읽을 수 있는지를 결정하는 핵심 설계다. 너무 잘게 자르면 시퀀스가 길어지고, 너무 크게 자르면 희귀 단어를 처리하기 어렵다. BPE는 그 중간 균형을 찾으려는 방법이다.
문제 설정
LLM은 텍스트를 직접 처리하지 않고 토큰(token) 단위로 처리합니다. 하지만 단어를 그대로 토큰으로 사용하면 다음 문제가 발생합니다.
- 어휘 크기(vocabulary)가 너무 커짐
- 새로운 단어(out-of-vocabulary) 처리 어려움
이 문제를 해결하기 위해 사용하는 방법이 subword tokenization이며, 대표적인 방식이 BPE(Byte Pair Encoding)입니다.
즉 BPE는 단어 전체를 고정 단위로 보는 대신, 자주 반복되는 부분 문자열을 학습해서 subword 사전을 만든다. 그래서 처음 보는 단어도 완전히 모르는 기호가 아니라 이미 학습한 조각들의 조합으로 처리할 수 있다.
즉 BPE는 단어 전체를 고정 단위로 보는 대신, 자주 반복되는 부분 문자열을 학습해서 subword 사전을 만든다. 그래서 새로운 단어를 만나도 완전히 모르는 토큰으로 깨지지 않고, 이미 배운 조각들의 조합으로 처리할 수 있다.
직관 비유
- 단어 -> 블록
- 자주 함께 나타나는 글자 -> 하나의 블록으로 합침
- 결과 -> 효율적인 조각(subword)
즉 BPE는 자주 등장하는 문자 쌍을 반복적으로 합치는 방식입니다.
1. 기본 아이디어
초기에는 모든 단어를 문자 단위로 분해합니다.
예:
low lower newest widest
초기 토큰:
l o w l o w e r n e w e s t w i d e s t
왜 필요한가
문자 단위로 시작하면 어떤 단어도 표현할 수 있습니다.
주의점
문자 단위는 너무 길어질 수 있습니다.
2. Merge 규칙
BPE는 가장 자주 등장하는 문자 쌍을 찾아 합칩니다.
예:
(l, o) -> lo
새 토큰:
lo w lo w e r
다음 merge:
(lo, w) -> low
결과:
low low e r
핵심 규칙
기호 의미
- pair : 문자 쌍
- count(pair) : 등장 횟수
왜 필요한가
자주 등장하는 패턴을 하나의 토큰으로 압축합니다.
3. BPE 알고리즘
1. 모든 단어를 문자로 분해
2. 가장 빈도가 높은 pair 찾기
3. pair를 하나의 token으로 merge
4. vocabulary 업데이트
5. 반복
수식 표현
merge:
주의점
merge 횟수는 vocabulary 크기를 결정합니다.
4. Subword 분해 예
단어:
unhappiness
BPE 토큰:
un happi ness
장점
- 새 단어도 표현 가능
- vocabulary 크기 감소
5. Tokenization 과정
텍스트 입력:
Transformers are powerful
토큰화:
Trans form ers are power ful
이 토큰들은 정수 ID로 변환됩니다.
기호 의미
- t_i : token id
- n : 토큰 길이
6. BPE 장점
| 문제 | BPE 해결 |
|---|---|
| OOV 문제 | subword 분해 |
| 큰 vocabulary | merge 압축 |
| 긴 시퀀스 | 빈도 기반 토큰 생성 |
코드-수식 연결
| 개념 | 라이브러리 코드 | 설명 |
|---|---|---|
| BPE tokenizer | tokenizers.ByteLevelBPETokenizer |
BPE 구현 |
| tokenize | tokenizer.encode(text) |
텍스트 -> 토큰 |
| vocab | tokenizer.get_vocab() |
토큰 사전 |
자주 하는 오해 5개
- BPE는 단어 기반 tokenizer라고 생각한다
- 모든 토큰이 단어라고 생각한다
- BPE는 언어별로 완전히 다른 알고리즘이라고 생각한다
- subword는 의미 단위라고 생각한다
- BPE는 항상 최적 토큰 분해를 만든다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- BPE tokenization의 기본 아이디어는 무엇인가?
- merge 규칙은 어떻게 결정되는가?
- 왜 문자 단위로 시작하는가?
- BPE가 OOV 문제를 어떻게 해결하는가?
- BPE와 word-level tokenizer의 차이는 무엇인가?