PyTorchKR
- 최근 OpenAI를 다시 퇴사하면서 행보가 궁금해지는 안드레이 카파시
갓파시가 새롭게 minibpe라는 저장소를 만들고 공개했습니다. GPT-2를 비롯하여 LLM에서 흔히 사용하는 토크나이징 방법인 BPE(Byte Pair Encoding)에 대해서 살펴볼 수 있습니다. - 이 글은 GPT 모델로 정리한 것으로, 잘못된 부분이 있을 수 있으니 글 아래쪽의 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
BPE 소개
BPE 알고리즘은 GPT-2 논문 및 이 논문과 관련한 OpenAI의 GPT-2 코드 공개 이후 여러 LLM에서 흔히 사용 중입니다. Sennrich et al. 2015 논문은 NLP 애플리케이션에서 BPE를 사용하기 위한 최초의 참고 문헌으로 인용되고 있습니다. 오늘날 대부분의 LLM들(예: GPT, Llama, Mistral)은 이 알고리즘을 사용하여 tokenizder를 학습합니다.
minibpe 저장소 소개
minibpe 저장소에는 LLM 토큰화(tokenizing)에 일반적으로 사용되는 (byte-level) BPE(Byte Pair Encoding) 알고리즘을 위한 작고, 깔끔한, 교육용 코드가 공개되어 있습니다. BPE 알고리즘은 UTF-8로 인코딩된 문자열에서 실행되므로 "바이트 수준"입니다.
minibpe 저장소에는 두 가지 tokenizer가 있으며, 세 가지 주요 기능을 수행할 수 있습니다:
- 주어진 텍스트에 대해 tokenizer 어휘(vocabulary) 및 병합(merge) 학습
- 텍스트에서 토큰으로 인코딩 (text -> token encoding)
- 토큰에서 텍스트로 디코딩 (token -> text decoding)
BPE 기본 토크나이저
텍스트에서 직접 실행되는 가장 간단한 BPE 알고리즘 구현인 BasicTokenizer
입니다.
bpe_basic.py
파일을 참고하세요:
BPE 정규식 패턴 분할 토크나이저
GPT-2 논문에 처음 소개되어 GPT-4를 비롯한 현재에도 계속 사용 중인 RegexTokenizer
입니다. 이는 텍스트를 토큰으로 만들기 전, 입력 텍스트를 범주(예: 문자, 숫자, 구두점 등)로 분할하는 전처리 단계가 포함되어 있습니다. 이렇게 범주를 나눠두면, 범주를 넘어선 병합이 일어나지 않습니다.
bpe_regex.py
파일을 참고하세요:
GPT-4 토크나이저
위 RegexTokenizer
의 가벼운 래퍼(wrapper)인 GPT4Tokenizer
입니다. tiktoken 라이브러리의 GPT-4 토크나이저를 재현하고 있으며, 몇 가지 세부 사항들이 포함되어 있습니다. 하지만 아직 특수 토큰을 처리하지 않기 때문에 패리티가 완전히 완성되어 있지는 않습니다.
bpe_gpt4.py
파일을 참고하세요:
사용법
위 소개된 토크나이저들의 구현 파일들은 매우 짧고, 상세히 설명되어 있으며, 파일 하단에 사용 예제가 포함되어 있습니다. 일례로, BPE에 대한 Wikipedia 문서에 나온 예시를 다음과 같이 재현해볼 수 있습니다:
from bpe_basic import BasicTokenizer
tokenizer = BasicTokenizer()
text = "aaabdaaabac"
tokenizer.train(text, 256 + 3) # 256 are the byte tokens, then do 3 merges
print(tokenizer.encode(text))
# [258, 100, 258, 97, 99]
print(tokenizer.decode([258, 100, 258, 97, 99]))
# aaabdaaabac
예상했던 대로 결과가 나오며, 자세한 내용은 bpe_basic.py
파일 아래쪽을 참고하세요.
GPT4Tokenizer
에 대해서는 아래 간단한 예제를 사용하여 tiktoken 라이브러리와 비교해볼 수 있습니다.
(아래 코드 실행을 위해서는 pip install tiktoken
으로 tiktoken 설치가 먼저 되어 있어야 합니다.)
text = "hello123!!!? (안녕하세요!) 😉"
# tiktoken
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
print(enc.encode(text))
# [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037]
# ours
from bpe_gpt4 import GPT4Tokenizer
tokenizer = GPT4Tokenizer()
print(tokenizer.encode(text))
# [15339, 4513, 12340, 30, 320, 31495, 230, 75265, 243, 92245, 16715, 57037]
minibpe GitHub 저장소
파이토치 한국 사용자 모임이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래쪽에 좋아요를 눌러주시면 뉴스 발행에 힘이 됩니다~