본문 바로가기
AI

Byte Pair Encoding (BPE) 토크나이저 완전 정복

by markbyun 2025. 5. 28.

Byte Pair Encoding (BPE)는 자연어 처리에서 널리 사용되는 서브워드 토크나이저 알고리즘으로, 특히 희귀 단어 처리와 어휘 확장성 측면에서 강력한 성능을 보여줍니다. 이 문서에서는 BPE의 작동 원리, 구현 방법, 다른 토크나이저와의 비교, 그리고 실제 LLM 개발에의 적용 방법을 상세히 다룹니다.

** You can find the English version of this content at this page (https://markbyun.blogspot.com/2025/05/mastering-byte-pair-encoding-bpe.html)

 


1. BPE의 개요

BPE는 원래 1994년에 데이터 압축을 위해 제안된 알고리즘으로, 가장 자주 나타나는 문자 쌍을 반복적으로 병합하여 데이터를 압축합니다. 이후 2015년, Sennrich et al.는 이 알고리즘을 자연어 처리에 적용하여 희귀 단어 문제를 해결하고자 하였습니다.


2. BPE의 작동 원리

BPE는 다음과 같은 단계로 작동합니다:

  1. 모든 단어를 문자 단위로 분해합니다.
  2. 가장 자주 나타나는 문자 쌍을 찾아 병합합니다.
  3. 이 과정을 원하는 어휘 크기에 도달할 때까지 반복합니다.

예를 들어, 단어 "low", "lower", "newest", "widest"가 있을 때, 초기에는 각 문자를 토큰으로 간주합니다. 이후 "l"과 "o"가 자주 함께 나타나면 "lo"로 병합하고, 이러한 병합을 반복하여 최종 어휘를 구성합니다.


3. BPE의 파이썬 구현

BPE의 간단한 파이썬 구현은 다음과 같습니다:

import re, collections

def get_stats(vocab):
	pairs = collections.defaultdict(int)
	
    for word, freq in vocab.items():
		symbols = word.split()
	
    for i in range(len(symbols)-1):
		pairs[symbols[i],symbols[i+1]] += freq
	
	return pairs

def merge_vocab(pair, v_in):
	v_out = {}
	bigram = re.escape(' '.join(pair))
	p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
	
    for word in v_in:
		w_out = p.sub(''.join(pair), word)
		v_out[w_out] = v_in[word]

	return v_out

vocab = {'l o w </w>' : 5, 'l o w e r </w>' : 2,
'n e w e s t </w>':6, 'w i d e s t </w>':3}
num_merges = 10
for i in range(num_merges):
	pairs = get_stats(vocab)
	best = max(pairs, key=pairs.get)
	vocab = merge_vocab(best, vocab)
	print(best)

이 코드는 어휘에서 가장 자주 나타나는 문자 쌍을 찾아 병합하는 과정을 반복합니다.


4. 다른 토크나이저와의 비교

토크나이저 특징 장점 단점
BPE 자주 나타나는 문자 쌍 병합 간단하고 효율적 문자 기반으로 의미 단위 파악 어려움
WordPiece 확률 기반 병합 의미 단위 보존 복잡한 구현
SentencePiece 공백 없는 문장 처리 언어 독립적 학습 시간 증가

5. BPE의 장단점

  • 장점: 희귀 단어 처리에 효과적, 어휘 크기 조절 가능, 간단한 구현
  • 단점: 의미 단위 파악 어려움, 언어 특성 반영 부족

6. LLM 개발에서의 BPE 활용

BPE는 GPT 시리즈와 같은 대규모 언어 모델에서 널리 사용됩니다. 특히, 희귀 단어 처리와 어휘 확장성 측면에서 강력한 성능을 보여주며, 모델의 학습 효율성을 높이는 데 기여합니다.


7. 참고자료