자연어 처리(NLP)와 대규모 언어 모델(LLM)의 비약적인 발전 속에서, 모델의 성능을 결정짓는 가장 기본적이면서도 핵심적인 역할을 수행하는 것이 바로 '토크나이저(Tokenizer)'입니다. 인공지능 모델이 인간의 언어를 이해하고 생성하기 위해서는 텍스트를 기계가 처리할 수 있는 숫자로 변환하는 과정이 필수적인데, 이 과정을 담당하는 알고리즘이 바로 토크나이저이기 때문입니다. 특히 최근에는 단순히 띄어쓰기나 단어 단위로 쪼개는 것이 아니라, 서브워드(Sub-word) 단위의 토크나이징 기술이 업계의 표준으로 자리 잡았습니다. 오늘 포스트에서는 토크나이저 종류 비교를 통해 가장 대표적인 알고리즘인 BPE, WordPiece, SentencePiece의 작동 원리와 성능 차이, 그리고 각기 다른 모델에서 어떻게 활용되는지 심층적으로 다뤄보겠습니다.
1. 서브워드 토크나이저의 등장 배경과 중요성
과거의 NLP 모델들은 주로 띄어쓰기 단위나 형태소 단위로 단어를 분리했습니다. 하지만 이 방식은 'Out-Of-Vocabulary (OOV)' 문제, 즉 학습 데이터에 없는 단어가 등장했을 때 모델이 이를 전혀 처리하지 못하는 치명적인 단점이 있었습니다. 예를 들어 모델이 'smart'와 'phone'이라는 단어는 학습했지만, 'smartphone'이라는 합성어가 등장했을 때 이를 완전히 새로운 단어(Unknown Token)로 처리하여 정보를 잃어버리는 식입니다.
이를 해결하기 위해 등장한 것이 바로 서브워드 토크나이저(Subword Tokenizer)입니다. 이는 단어를 더 작은 의미 단위로 쪼개어, 처음 보는 단어라도 기존에 알고 있는 서브워드의 조합으로 이해하려는 시도입니다. 이를 통해 어휘 집합(Vocabulary)의 크기를 효율적으로 관리하면서도, 희귀 단어(Rare Word)에 대한 처리 능력을 비약적으로 향상시켰습니다. 이제 본격적으로 토크나이저 종류 비교를 시작해 보겠습니다.
2. BPE (Byte Pair Encoding): 빈도 기반의 병합 알고리즘
BPE의 작동 원리
BPE(Byte Pair Encoding)는 가장 기본적이고 널리 사용되는 서브워드 알고리즘입니다. 본래 데이터 압축 알고리즘으로 개발되었으나, NLP에 적용되면서 큰 성과를 거두었습니다. BPE의 핵심은 '가장 자주 등장하는 문자 쌍(Byte Pair)을 하나로 병합'하는 것입니다. 구체적인 작동 방식은 다음과 같습니다.
- 초기화: 모든 단어를 글자(Character) 단위로 분리하여 초기 어휘 집합을 구성합니다.
- 빈도 계산: 코퍼스 내에서 인접한 두 글자(쌍)의 등장 빈도수를 계산합니다.
- 병합(Merge): 가장 빈도수가 높은 글자 쌍을 찾아 하나의 토큰으로 병합합니다. 예를 들어 'e'와 's'가 자주 붙어 나온다면 'es'라는 새로운 토큰을 만듭니다.
- 반복: 이 과정을 미리 정해둔 어휘 집합의 크기(Vocab Size)에 도달할 때까지 반복합니다.
BPE의 장점과 활용
- 직관적인 알고리즘: 빈도수라는 명확하고 단순한 기준을 사용하므로 구현이 간단하고 이해하기 쉽습니다.
- GPT 시리즈의 선택: OpenAI의 GPT-2, GPT-3, 그리고 최신 모델들까지 BPE(또는 그 변형)를 기반으로 학습되었습니다. 이는 생성형 모델에서 BPE가 얼마나 안정적인 성능을 보여주는지 증명합니다.
- 미등록 단어 처리: 빈도가 높은 하위 단위들이 병합되어 사전에 등록되므로, 새로운 단어가 나와도 글자 단위까지 쪼개어 해석이 가능합니다. 즉, OOV 문제를 효과적으로 해결합니다.
하지만 BPE는 단순히 빈도수에만 의존하기 때문에, 문맥적인 의미나 언어학적 결합 가능성을 고려하지 않는다는 한계가 존재합니다. 단순히 자주 나온다는 이유로 의미적으로 관련 없는 글자들이 뭉칠 수도 있습니다.
3. WordPiece: 우도(Likelihood) 기반의 최적화
WordPiece의 작동 원리
WordPiece는 구글이 개발하여 BERT 모델 학습에 사용하면서 유명해진 알고리즘입니다. BPE와 매우 유사하게 병합 방식을 사용하지만, 병합의 기준이 다릅니다. BPE가 단순히 '빈도수'가 높은 쌍을 합쳤다면, WordPiece는 '병합했을 때 언어 모델의 우도(Likelihood)를 가장 높이는 쌍'을 선택합니다.
- 즉, 두 토큰을 합쳤을 때 잃어버리는 정보량이 가장 적은(혹은 얻는 이득이 가장 큰) 조합을 찾습니다.
- 수식적으로는
Count(x, y) / (Count(x) * Count(y))값이 큰 쌍을 병합하는 방식과 유사합니다. 이는 두 토큰이 독립적으로 등장할 때보다 함께 등장할 확률이 얼마나 높은지를 보는 것입니다. 단순히 빈도만 높은 'a', 'the' 같은 단어와의 결합보다는, 의미적으로 강하게 결합된 쌍을 우선시하게 됩니다.
WordPiece의 특징
- 접두어 표시: WordPiece는 단어의 중간에 오는 서브워드를 표시하기 위해
##과 같은 특수 기호를 사용합니다. (예:playing->play,##ing) 이는 해당 토큰이 단어의 시작인지 중간인지를 구분하여 문맥 정보를 보존하는 데 도움을 줍니다. - BERT와 DistilBERT의 표준: 구글의 BERT 계열 모델들은 대부분 WordPiece를 사용하여 높은 성능을 입증했습니다. 이해(Understanding) 중심의 모델에서 강점을 보입니다.
- BPE 대비 성능: 일반적으로 데이터가 충분히 많을 때, 단순 빈도 기반인 BPE보다 조금 더 효율적이고 의미론적인 토큰화를 수행한다고 알려져 있습니다.
4. SentencePiece: 언어 종속성을 탈피한 통합 솔루션
Pre-tokenization의 문제점 해결
BPE와 WordPiece는 입력 텍스트를 서브워드로 나누기 전에, 먼저 띄어쓰기 등을 기준으로 단어를 구분하는 사전 토큰화(Pre-tokenization) 과정이 필요합니다. 하지만 한국어나 일본어, 중국어처럼 띄어쓰기가 없거나 문법적 역할이 복잡한 언어에서는 이 과정이 매우 까다롭습니다. 띄어쓰기 규칙이 언어마다 다르기 때문에 범용적인 모델을 만들기에 제약이 따릅니다.
SentencePiece는 이러한 문제를 해결하기 위해 구글에서 공개한 오픈소스 라이브러리이자 알고리즘입니다. SentencePiece의 가장 큰 특징은 입력 텍스트를 단어 단위가 아닌, 있는 그대로의 문장(Raw Stream)으로 간주한다는 점입니다.
SentencePiece의 핵심 기능
- 공백(Space)을 문자로 취급: 공백을
_(U+2581, Lower One Eighth Block)와 같은 특수 문자로 치환하여 처리합니다. 따라서 띄어쓰기가 엉망인 문장이나 띄어쓰기가 없는 언어에서도 일관된 토큰화가 가능합니다. 예를 들어 "Hello World"는_Hello,_World로 처리됩니다. - Unigram Language Model: SentencePiece는 내부적으로 BPE뿐만 아니라 Unigram 방식을 지원합니다. Unigram 방식은 가능한 모든 서브워드 조합을 만든 뒤, 확률적으로 가장 불필요한 토큰을 제거해 나가는 방식(Top-down)을 사용합니다. 이는 BPE의 병합(Bottom-up) 방식과는 반대되는 접근입니다.
- Lossless Tokenization: 디코딩 시 단순히 토큰을 연결하고
_를 공백으로 바꾸기만 하면 원문을 완벽하게 복원할 수 있습니다. 이는 생성형 모델에서 매우 중요한 특징으로, 전처리와 후처리의 복잡성을 크게 낮춰줍니다.
5. 토크나이저 종류 비교: 성능 차이와 선택 가이드
이제 앞서 살펴본 세 가지 토크나이저 종류 비교를 통해 성능 차이를 정리해 보겠습니다. 각 알고리즘은 고유한 장단점을 가지고 있어 상황에 맞는 선택이 필요합니다.
1) 어휘 집합 효율성 (Vocabulary Efficiency)
- BPE: 빈도 기반이므로 데이터에 자주 등장하는 패턴을 빠르게 학습합니다. 하지만 의미적으로 분리되지 않고 단순히 자주 나오는 철자끼리 뭉치는 경향이 있어, 비영어권 언어에서는 효율이 떨어질 수 있습니다.
- WordPiece: 우도 기반이므로 BPE보다 통계적으로 더 의미 있는 단위로 쪼개질 확률이 높습니다. 실험적으로 영어권 데이터에서 BPE보다 약간 더 나은 압축률을 보이기도 합니다.
- SentencePiece (Unigram): 다양한 길이의 서브워드를 확률적으로 고려하므로, 텍스트 압축률이 매우 우수합니다. 특히 한국어와 같은 교착어에서 형태소 분석기 없이도 형태소와 유사한 단위로 토큰을 잘 분리해내는 성능을 보여줍니다.
2) 다국어 처리 및 범용성
- SentencePiece가 압도적 우위: 띄어쓰기에 의존하지 않기 때문에 다국어 모델(Multilingual Model) 학습 시 가장 선호됩니다. T5, ALBERT, XLM-R 등 최신 대형 모델들은 대부분 SentencePiece를 채택하고 있습니다. 언어별로 다른 전처리 로직을 짤 필요가 없다는 것은 엔지니어링 관점에서 엄청난 이점입니다.
- BPE/WordPiece: 영어와 같이 띄어쓰기가 명확한 언어에서는 강력하지만, 사전 토큰화 규칙에 따라 성능이 좌우되므로 언어별 튜닝이 필요합니다.
3) 학습 속도와 추론 속도
- BPE: 알고리즘이 단순하여 학습 속도가 빠릅니다. 대규모 코퍼스를 빠르게 처리해야 할 때 유리합니다.
- WordPiece: 매 단계마다 우도를 계산해야 하므로 BPE보다 학습 시간이 더 걸릴 수 있습니다.
- SentencePiece: 구현체(C++ 기반)가 매우 최적화되어 있어, 실제 적용 시 토큰화 속도는 매우 빠릅니다. 또한 파이썬 래퍼(Wrapper)를 통해 쉽게 사용할 수 있어 접근성이 좋습니다.
6. 한국어 NLP에서의 시사점
한국어 자연어 처리를 진행할 때 토크나이저 종류 비교는 더욱 중요합니다. 한국어는 조사가 발달한 교착어이기 때문에, 단순히 띄어쓰기 기준으로 BPE를 적용하면 '사과를', '사과가', '사과는'이 모두 다른 단어로 인식되어 어휘 집합이 불필요하게 커지는 문제가 발생합니다. 이는 모델의 학습 효율을 떨어뜨리는 주원인이 됩니다.
따라서 한국어 모델링 시에는 다음과 같은 전략이 유효합니다: 1. Mecab 등 형태소 분석기를 통한 사전 토큰화 후 BPE/WordPiece 적용: 문법적 정확도가 높으나 전처리 과정이 복잡해지고, 형태소 분석기의 성능에 의존하게 됩니다. 또한 신조어 처리에 약할 수 있습니다. 2. SentencePiece 사용: 형태소 분석기 없이도 대량의 코퍼스만 있다면 의미 있는 서브워드를 잘 학습합니다. 특히 Unigram 방식을 사용할 때 한국어의 조사와 어미 분리 성능이 뛰어난 것으로 알려져 있습니다. 최근의 한국어 LLM 연구들은 대부분 이 방식을 채택하여 전처리의 복잡도를 낮추고 성능을 확보하고 있습니다.
7. 결론: 어떤 토크나이저를 사용해야 할까?
결론적으로 토크나이저 종류 비교에 있어 절대적인 승자는 없습니다. 사용 목적과 데이터의 특성에 따라 최적의 선택이 달라집니다.
- GPT 계열의 생성 모델을 만들거나 파인튜닝한다면: 표준으로 자리 잡은 BPE를 사용하는 것이 안전하고 호환성이 좋습니다. 많은 라이브러리들이 BPE에 최적화되어 있습니다.
- BERT 계열의 이해(Understanding) 모델을 사용한다면: WordPiece가 문맥 파악에 미세하게 유리할 수 있습니다.
- 한국어를 포함한 다국어 모델을 구축하거나, 전처리의 간편함을 원한다면: SentencePiece가 가장 강력하고 현대적인 선택입니다. 특히 LLaMA, T5 등 최신 LLM 트렌드는 SentencePiece(BPE 모드 또는 Unigram 모드)를 채택하는 추세입니다.
토크나이저는 모델 성능의 천장을 결정짓는 기초 공사입니다. 아무리 좋은 모델 구조를 가져도 토크나이저가 언어의 특성을 제대로 반영하지 못하면 성능 향상에 한계가 있습니다. 각 알고리즘의 장단점을 명확히 이해하고 프로젝트의 성격에 맞는 토크나이저를 선택한다면, 모델의 성능을 한 단계 더 끌어올릴 수 있을 것입니다.