C.W.K.
Stream
Lesson 03 of 12 · published

Byte-Pair Encoding (BPE)을 한 스텝씩

~18 min · bpe, algorithm, gpt

Level 0Token
0 XP0/94 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Byte-Pair Encoding은 가장 널리 쓰이는 subword 알고리즘. 원래 1994년 Philip Gage의 데이터 압축 기법이었는데, 2016년 Sennrich/Haddow/Birch가 NMT에 가져와서 지금은 GPT-2/3/4/5(tiktoken 통해), Llama 3, RoBERTa, Qwen이 다 굴리고 있어.

학습(vocab 구축)

  1. 학습 코퍼스에 등장하는 모든 개별 문자(또는 byte-level BPE면 바이트)로 vocab 초기화.
  2. 코퍼스에서 인접 토큰 쌍 전부 세.
  3. 가장 빈번한 쌍을 찾아서 새 토큰 하나로 병합, vocab에 추가.
  4. 새 토큰으로 코퍼스 갱신, 원하는 vocab 크기까지 반복.

bottom-up이야 — 최대 세분(문자 하나 = 토큰 하나)에서 시작해서 점진적으로 합쳐. 모든 병합이 우선순위 순서로 기록되고, 추론 시엔 같은 순서로 적용해서 새 텍스트를 인코딩.

Byte-level BPE (BBPE)

GPT-2가 비튼 게 있어 — Unicode 문자에서 시작하는 대신 raw byte에서 시작. 그래서 상상 가능한 모든 입력(이모지, control character, malformed text)이 표현 가능, OOV 위험 0. 비용: 이모지/CJK 문자가 1토큰이 아니라 여러 토큰. GPT 전부, Llama 3, 그리고 대부분의 모던 서구권 tokenizer가 byte-level BPE.

Code

BPE training — minimal but real·python
from collections import Counter

def get_pairs(words):
    pairs = Counter()
    for word, freq in words.items():
        symbols = word.split()
        for i in range(len(symbols) - 1):
            pairs[(symbols[i], symbols[i+1])] += freq
    return pairs

def merge(pair, words):
    new_words = {}
    bigram = ' '.join(pair)
    replacement = ''.join(pair)
    for word, freq in words.items():
        new_word = word.replace(bigram, replacement)
        new_words[new_word] = freq
    return new_words

# words = {'h e l l o </w>': 5, 'h e l p </w>': 2, ...}
# After merges: 'hel' becomes one token, 'lo</w>' another, etc.
BPE inference — apply learned merges in order·python
def encode_bpe(text, merges):
    # merges: list of (a, b) pairs in priority order
    tokens = list(text)
    for a, b in merges:
        i = 0
        new_tokens = []
        while i < len(tokens):
            if i < len(tokens) - 1 and tokens[i] == a and tokens[i+1] == b:
                new_tokens.append(a + b)
                i += 2
            else:
                new_tokens.append(tokens[i])
                i += 1
        tokens = new_tokens
    return tokens

External links

Exercise

karpathy/minbpe 클론해서, Tiny Shakespeare 첫 1MB에 1024토큰 vocab BPE 학습시켜. 처음 20개 merge 찍어보고 각각이 왜 그럴듯한지 설명해. 그 다음 코퍼스에 없는 문장 인코딩해서, 본인 tokenizer가 문자 단위로 우아하게 fallback하는지 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.