GPT는 왜 바이트부터 시작할까? 유니코드 기반 토크나이저와의 비교

Bean·2025년 7월 9일
0

인공지능

목록 보기
82/123

들어가며

자연어처리(NLP)에서 문장을 토큰 단위로 쪼개는 토크나이저(tokenizer)는 모델 성능에 직접적인 영향을 줍니다.
특히 BPE(Byte Pair Encoding) 방식의 토크나이저는 두 가지 주요 전략이 존재합니다:

  1. 유니코드 문자 기반 BPE
  2. 바이트 레벨 BPE(Byte-Level BPE)

두 방식은 같은 "병합 중심 구조"를 가졌지만 시작 단위와 적용 방식이 다르며,
GPT 같은 최신 모델에서는 바이트 레벨 BPE를 선호합니다.
아래에서 차이점과 예시, 장단점을 살펴보겠습니다.


1. 유니코드 문자 기반 BPE

  • 텍스트를 유니코드 문자 단위로 분리한 후 자주 나오는 문자쌍을 병합
  • 예: "행복"['행', '복'] → 병합 후 ['행복']

장점

  • 사람이 읽기 쉬운 단위로 분리됨
  • 언어별 특성(음절, 단어 등)을 반영하기 쉬움

단점

  • 유니코드 전체가 13만 개 이상 → 초기 토큰 수가 많음
  • OOV(Out-of-Vocabulary) 문제 가능성 있음

대표 사용 예

  • Google SentencePiece (BERT 등)

2. 바이트 레벨 BPE (Byte-Level BPE)

  • 입력을 먼저 UTF-8 바이트 시퀀스로 변환
  • 각 바이트를 개별 토큰으로 취급하고, 자주 등장하는 바이트 쌍을 병합
  • 예: "hello"[0x68, 0x65, 0x6C, 0x6C, 0x6F]["h", "e", "l", "l", "o"]

장점

  • 모든 문자를 동일한 방식으로 처리 가능 (한글, 이모지 포함)
  • OOV 없음 — 새로운 단어도 바이트 단위로 다 표현 가능

단점

  • 사람에게 익숙하지 않은 단위로 나뉘기 때문에 직관성 낮음
  • 처리 속도 측면에서 약간 손해 있을 수 있음

대표 사용 예

  • OpenAI GPT-2, GPT-3

예시로 이해하는 바이트 BPE

입력: "hello hello"

  1. UTF-8 바이트 변환
["h", "e", "l", "l", "o", " ", "h", "e", "l", "l", "o"]
→ [0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x68, 0x65, 0x6C, 0x6C, 0x6F]
  1. 자주 등장하는 바이트쌍 병합 예
  • 'l' + 'l''ll'
  • 'll' + 'o''llo'
  • 'e' + 'll''ell'
  • 'h' + 'ell''hell'

점차 "hello"라는 하나의 단어가 하나의 토큰으로 압축됩니다.


한글과 바이트 BPE

예: "가"

  1. "가" = U+AC00 → UTF-8: [0xEA, 0xB0, 0x80]

  2. 초기 토큰: ["0xEA", "0xB0", "0x80"]

  3. 병합 순서 예:

→ 병합 1: ["0xEAB0", "0x80"]
→ 병합 2: ["0xEAB080"] (최종 토큰: "가")

한글, 이모지 등도 많이 등장하면 하나의 토큰으로 병합됨
→ 다국어 처리에 매우 유리!


비교 정리

구분유니코드 문자 기반 BPE바이트 레벨 BPE
시작 단위유니코드 문자UTF-8 바이트
장점직관적, 언어 특화 가능범용성, 모든 문자 처리 가능
단점OOV 문제, 사전 큼덜 직관적, 해석 어려움
대표 예Google BERT, SentencePieceOpenAI GPT-2/3

마무리 요약

유니코드 문자 기반 BPE는 사람이 이해하기 쉽고,
바이트 레벨 BPE는 기계가 어떤 문자든 다룰 수 있게 도와줍니다.
GPT처럼 다국어와 특수문자까지 전부 다뤄야 하는 모델에서는 바이트 레벨 BPE가 핵심 전략입니다.

profile
AI developer

0개의 댓글