주제: TK-1 BPE (Byte Pair Encoding Tokenization)

분류: llm

타입: concept

난이도: 입문

선수지식: 없음

BPE는 "자주 같이 나오는 글자 조각을 하나의 토큰으로 합쳐서, 어휘 크기와 표현력을 동시에 맞추는 방법"이다.

토크나이저는 겉보기에는 전처리처럼 보이지만, 실제로는 모델이 텍스트를 어떻게 읽는지를 결정하는 핵심 설계다. 너무 잘게 자르면 시퀀스가 길어져 비효율적이고, 너무 크게 자르면 새로운 단어를 처리하기 어려워진다.

BPE는 이 두 극단 사이의 균형을 잡으려는 방법이다. 처음에는 문자 단위로 시작해 어떤 단어도 표현 가능하게 만들고, 그다음 자주 반복되는 조각을 점점 합쳐 효율적인 subword 사전을 만든다.

BPE는 "자주 함께 나오는 글자 조각을 하나의 토큰으로 합쳐서, 어휘 크기와 표현력을 동시에 맞추는 방식"이라고 이해하면 된다.

토크나이저를 처음 배우면 단어를 자르는 규칙처럼 보이지만, 실제로는 모델이 텍스트를 얼마나 효율적으로 읽을 수 있는지를 결정하는 핵심 설계다. 너무 잘게 자르면 시퀀스가 길어지고, 너무 크게 자르면 희귀 단어를 처리하기 어렵다. BPE는 그 중간 균형을 찾으려는 방법이다.

문제 설정

LLM은 텍스트를 직접 처리하지 않고 토큰(token) 단위로 처리합니다. 하지만 단어를 그대로 토큰으로 사용하면 다음 문제가 발생합니다.

이 문제를 해결하기 위해 사용하는 방법이 subword tokenization이며, 대표적인 방식이 BPE(Byte Pair Encoding)입니다.

즉 BPE는 단어 전체를 고정 단위로 보는 대신, 자주 반복되는 부분 문자열을 학습해서 subword 사전을 만든다. 그래서 처음 보는 단어도 완전히 모르는 기호가 아니라 이미 학습한 조각들의 조합으로 처리할 수 있다.

즉 BPE는 단어 전체를 고정 단위로 보는 대신, 자주 반복되는 부분 문자열을 학습해서 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

핵심 규칙

merge=argmaxcount(pair)

기호 의미

왜 필요한가

자주 등장하는 패턴을 하나의 토큰으로 압축합니다.

3. BPE 알고리즘

1. 모든 단어를 문자로 분해
2. 가장 빈도가 높은 pair 찾기
3. pair를 하나의 token으로 merge
4. vocabulary 업데이트
5. 반복

수식 표현

pair*=argmaxcount(pair)

merge:

tokennew=concat(tokeni,tokenj)

주의점

merge 횟수는 vocabulary 크기를 결정합니다.

4. Subword 분해 예

단어:

unhappiness

BPE 토큰:

un happi ness

장점

5. Tokenization 과정

텍스트 입력:

Transformers are powerful

토큰화:

Trans form ers are power ful

이 토큰들은 정수 ID로 변환됩니다.

x=[t1,t2,...,tn]

기호 의미

6. BPE 장점

문제 BPE 해결
OOV 문제 subword 분해
큰 vocabulary merge 압축
긴 시퀀스 빈도 기반 토큰 생성

코드-수식 연결

개념 라이브러리 코드 설명
BPE tokenizer tokenizers.ByteLevelBPETokenizer BPE 구현
tokenize tokenizer.encode(text) 텍스트 -> 토큰
vocab tokenizer.get_vocab() 토큰 사전

자주 하는 오해 5개

체크리스트 (스스로 설명 가능해야 하는 질문)