BPE 토크나이저 직접 만들기
BPE(Byte Pair Encoding)로 가장 빈번한 문자 쌍을 반복 병합하여 서브워드를 만든다.
GPT는 '단어' 단위가 아니라 '서브워드' 단위로 읽는다. 영어 'unhappiness'를 통째로 외우면 비효율적이다. 'un' + 'happi' + 'ness'로 쪼개면 다른 단어에도 재활용할 수 있다. BPE 알고리즘 — 가장 자주 붙어 다니는 쌍을 반복적으로 합치는 방법이다.
BPE는 글자부터 시작해서 자주 나오는 쌍을 반복 병합합니다
| 용어 | 설명 |
|---|---|
| BPE | 빈번한 문자 쌍을 반복 병합하여 서브워드를 만드는 알고리즘 |
| 토큰 | 텍스트를 모델이 처리할 수 있는 최소 단위로 쪼갠 조각 |
BPE (Byte Pair Encoding) 알고리즘 ① 모든 단어를 글자 단위로 분리 ② 가장 빈번한 연속 쌍(pair)을 찾는다 ③ 그 쌍을 하나의 새 토큰으로 병합 ④ 원하는 어휘 크기가 될 때까지 ②~③ 반복
GPT-4는 약 10만 개의 BPE 토큰을 사용합니다. 처음엔 256개 바이트로 시작해서 수만 번 병합한 결과입니다.
글자들이 하나씩 합쳐져서 서브워드가 되는 과정입니다
예시: "low lower lowest" 초기: [l, o, w, e, r, s, t] 병합1: (l, o) → lo ← 가장 빈번한 쌍 병합2: (lo, w) → low 병합3: (e, r) → er 병합4: (e, s) → es 결과: [low, er, es, t] — 4개 서브워드로 3단어를 표현!
BPE의 핵심인 쌍 빈도 계산과 병합 과정을 추적합니다
코드 추적: tokens에서 연속 쌍을 모두 세면 (l,o):2, (o,w):2 등이 나온다. 가장 빈번한 쌍 (l,o)가 best로 선택된다.
BPE 알고리즘을 직접 구현해봅시다!
get_pairs()로 연속 쌍 빈도를 세고, merge()로 가장 빈번한 쌍을 병합하는 과정을 5회 반복한다.
병합을 많이 할수록 어휘 사전 크기는 커지고 토큰 수는 줄어듭니다
GPT-2: 50,257개 토큰 (약 50,000번 병합) GPT-4: ~100,000개 토큰 어휘가 크면: 한 토큰이 더 많은 의미를 담아 효율적 어휘가 작으면: 메모리 절약, 하지만 문장이 길어짐
BPE 병합 과정을 한 단계씩 추적하며 어휘가 어떻게 만들어지는지 관찰합니다
문자 시퀀스에서 BPE를 3라운드 실행하여 어휘가 점차 커지는 과정을 관찰한다.
텍스트 → 토큰 → 숫자, LLM 파이프라인의 2단계 완료!
전처리: split, join, replace로 텍스트 정제 어휘 사전: 딕셔너리로 단어 → 정수 매핑 BPE: 서브워드 단위 토큰화 — GPT의 핵심 다음 챕터: 숫자가 된 토큰을 벡터(임베딩)로 변환합니다!
| BPE 알고리즘 단계 | 설명 |
|---|---|
| 1단계 | 모든 단어를 글자 단위로 분리 (초기 어휘 = 개별 문자) |
| 2단계 | 가장 빈번한 연속 쌍을 찾는다 (예: l+o → lo) |
| 3단계 | 해당 쌍을 하나의 새 토큰으로 병합 |
| 4단계 | 원하는 어휘 크기까지 2~3단계 반복 |
| 어휘 크기와 트레이드오프 | 설명 |
|---|---|
| 어휘가 크면 | 한 토큰이 더 많은 의미를 담아 효율적 (GPT-4: ~10만 개) |
| 어휘가 작으면 | 메모리 절약, 하지만 문장이 더 많은 토큰으로 쪼개짐 |
| 서브워드의 장점 | 처음 보는 단어도 부분적으로 표현 가능 (OOV 해결) |
GPT-2는 약 5만 번, GPT-4는 약 10만 번 병합하여 어휘 사전을 구축합니다!
토큰: [a, b, a, b, c, a, b]에서 가장 먼저 병합될 쌍은?
BPE에서 병합 횟수를 늘리면 하나의 토큰이 표현하는 의미가 커진다
BPE는 왜 단어 단위가 아닌 서브워드 단위로 토큰화하나요?
BPE에서 어휘 사전(vocabulary) 크기가 커지면 어떤 트레이드오프가 있나요?
GPT-4의 토크나이저는 약 10만 개의 어휘 사전을 사용한다.