BPE 모델

BPE 모델

BPE(Byte-Pair Encoding)는 가장 널리 쓰이는 서브워드 토크나이제이션 알고리즘 중 하나예요. 문자로 시작해서, 말뭉치에서 가장 자주 함께 나타나는 문자(또는 토큰) 쌍을 반복적으로 병합해 새 토큰을 만들어요. 이 과정을 반복해 원하는 어휘 크기에 도달하면 멈춰요. BPE는 본 적 없는 단어도 여러 서브워드 토큰의 조합으로 만들어낼 수 있어서 unk(unknown) 토큰이 덜 생기고, 어휘를 작게 유지할 수 있는 장점이 있어요.

tokenizers에서 BPE 모델을 쓰는 방법을 살펴볼게요.

출처: https://huggingface.co/docs/tokenizers/main/en/bpe

BPE 모델 생성

Tokenizer를 BPE 모델로 만드는 기본 형태예요. unk_token을 지정할 수 있어요.

from tokenizers import Tokenizer
from tokenizers.models import BPE

tokenizer = Tokenizer(BPE(unk_token="[UNK]"))

BPE로 토크나이저 훈련

BPE 어휘를 만들려면 BpeTrainer를 쓰고 special_tokens를 지정해요. 훈련 인자로 vocab_size(기본 30,000), min_frequency(기본 0) 등을 조절할 수 있어요.

from tokenizers.trainers import BpeTrainer

trainer = BpeTrainer(
    special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"]
)

files = ["data/wikitext-103-raw/wiki.train.raw"]
tokenizer.train(files, trainer)

special token 순서가 ID를 결정해요. 훈련 전에 사전 토큰화를 넣으면 토큰이 여러 단어를 걸치지 않도록 보장할 수 있어요.

BPE의 동작

  1. 훈련 말뭉치에 있는 모든 문자를 토큰으로 시작해요.
  2. 가장 흔한 토큰 쌍을 식별하고 하나의 토큰으로 병합해요.
  3. 어휘(토큰 수)가 원하는 크기에 도달할 때까지 반복해요.

이 때문에 BPE는 서브워드 단위로 새 단어를 만들 수 있어요. 예를 들어 한 번도 본 적 없는 단어도 익숙한 서브워드 조각들의 조합으로 표현돼요.

어휘 파일에서 BPE 생성

기존 어휘 파일(vocab.json, merges.txt)이 있다면 BPE::from_file(러스트) 또는 파이썬에서 직접 구성해 만들 수 있어요. dropout(0.1), unk_token("[UNK]") 같은 설정을 조합해 커스텀 BPE를 만들 수 있어요.

더 알아보기