토크나이저의 종류와 비교

안녕하세요, 개발자 여러분! 오늘은 자연어 처리에서 많이 사용되는 두 가지 토크나이저인 워드피스(WordPiece)센텐스피스(SentencePiece)에 대해 알아보고, 이들의 공통점과 차이점을 비교해 보겠습니다.

1. 토크나이저 알고리즘의 종류

워드피스(WordPiece)와 센텐스피스(SentencePiece) 외에도 다양한 토크나이저(Tokenizer)들이 있습니다. 각 토크나이저마다 고유한 특징과 장단점이 있으며, 최근에는 언어 모델의 성능 향상을 위해 새로운 토크나이저들이 제안되고 있습니다. 아래에서 몇 가지 토크나이저와 그 특징에 대해 설명하겠습니다.

1.1 Byte Pair Encoding (BPE):

  • BPE는 빈도수가 높은 바이트 쌍을 병합하여 단어를 분리하는 방식입니다.
  • 어휘 크기를 제한할 수 있으며, 미등록 단어(OOV, Out-of-Vocabulary)에 대한 처리가 가능합니다.
  • GPT-2, RoBERTa 등의 모델에서 사용되었습니다.

1.2 Unigram Language Model

  • Unigram Language Model은 각 문자나 하위 단어(subword)의 출현 빈도를 기반으로 토큰을 생성합니다.
  • 빈도수가 높은 문자나 하위 단어일수록 독립적인 토큰으로 분리되는 경향이 있습니다.
  • ALBERT 모델에서 사용되었습니다.

1.3 Byte-level BPE

  • Byte-level BPE는 BPE를 바이트 단위로 적용한 토크나이저입니다.
  • Unicode 문자를 직접 처리할 수 있어 다국어 환경에서 유용합니다.
  • GPT-3, mT5 등의 모델에서 사용되었습니다.

1.4 CharBERT Tokenizer

  • CharBERT는 문자 단위로 토큰을 분리하는 토크나이저입니다.
  • 각 문자를 독립적인 토큰으로 취급하여 모델이 문자 수준의 정보를 학습할 수 있도록 합니다.
  • 중국어, 일본어 등 표의문자 기반 언어에서 좋은 성능을 보입니다.

최근 동향을 살펴보면, 다국어 및 특수 도메인에 대한 토크나이저 연구가 활발히 진행되고 있습니다. 또한, 토크나이저의 성능이 언어 모델의 품질에 미치는 영향을 분석하고, 최적의 토크나이저를 찾기 위한 노력도 이루어지고 있습니다. 앞으로는 언어의 특성과 도메인에 맞는 토크나이저 개발이 더욱 중요해질 것으로 예상됩니다.

2. 토크나이저 라이브러리

SentencePiece와 WordPiece는 위에서 설명한 토크나이저 알고리즘을 기반으로 개발된 대표적인 라이브러리입니다.

2.1 SentencePiece

센텐스피스구글에서 오픈 소스로 공개한 토크나이저로, 워드피스와 유사한 서브워드 단위 토큰화 방식을 사용합니다. 그러나 센텐스피스는 언어에 독립적인 방식으로 동작하며, 사전 학습된 모델 없이도 토크나이저를 생성할 수 있습니다. 센텐스피스는 BPE(Byte Pair Encoding), Unigram, Character 등 다양한 토크나이저 모델을 지원합니다. ALBERT, XLNet, mBART, T5 등의 모델에서 SentencePiece를 사용하였습니다.

import sentencepiece as spm

# 센텐스피스 모델 학습
spm.SentencePieceTrainer.Train('--input=data.txt --model_prefix=sentencepiece --vocab_size=10000')

# 센텐스피스 모델 로드
sp = spm.SentencePieceProcessor()
sp.Load('sentencepiece.model')

# 토큰화 수행
tokens = sp.EncodeAsPieces('I love natural language processing!')

print(tokens)
# ['▁I', '▁love', '▁natural', '▁language', '▁process', 'ing', '!']

2.2 WordPiece

워드피스구글에서 개발한 서브워드 토크나이저로(오픈소스로는 비공개), BERT(Bidirectional Encoder Representations from Transformers) 모델에서 사용되었습니다. 워드피스는 단어를 더 작은 의미 있는 단위로 분할하여 처리하는 방식을 사용합니다. 이를 통해 어휘 크기를 줄이고 미등록 단어 문제를 해결할 수 있습니다. BERT, DistilBERT, ELECTRA 등의 모델에서 WordPiece를 사용하였습니다. WordPiece는 BPE(Byte Pair Encoding) 알고리즘을 기반으로 하는 토크나이저 모델을 사용합니다. BPE는 데이터에서 가장 빈번하게 등장하는 바이트 쌍을 찾아 병합하는 과정을 반복하여 단어를 분리하는 방식입니다.

WordPiece토크나이제이션 과정은 다음과 같습니다:

  1. 단어를 문자 단위로 분리합니다.
  2. 가장 빈번하게 등장하는 문자 쌍을 찾아 하나의 토큰으로 병합합니다.
  3. 병합된 토큰을 기존 단어 목록에 추가하고, 빈도수를 업데이트합니다.
  4. 미리 정의된 어휘 크기에 도달할 때까지 2-3 단계를 반복합니다.
  5. 최종적으로 단어는 하위 단어(subword) 단위로 분리됩니다.

WordPiece는 단어를 더 작은 의미 단위로 분리할 수 있어 미등록 단어(OOV)에 대한 처리가 가능하며, 단어의 형태학적 특성을 반영할 수 있습니다. 또한, 어휘 크기를 제한할 수 있어 모델의 복잡도를 줄일 수 있습니다. WordPiece는 BERT(Bidirectional Encoder Representations from Transformers) 모델에서 처음 도입되었으며, 이후 BERT 계열의 모델(DistilBERT, ELECTRA 등)에서 널리 사용되고 있습니다. WordPiece를 사용한 토큰화는 BERT 모델의 성능 향상에 크게 기여한 것으로 알려져 있습니다.

2.3 SentencePiece와 WordPiece 비교

워드피스와 센텐스피스는 모두 서브워드 단위로 텍스트를 토큰화하여 어휘 크기를 줄이고 미등록 단어 문제를 해결한다는 공통점이 있습니다. 그러나 워드피스는 특정 언어에 최적화된 사전 학습 모델을 필요로 하는 반면, 센텐스피스는 학습 데이터로부터 언어에 독립적인 토크나이저를 생성할 수 있다는 점에서 차이가 있습니다. 또한, 센텐스피스는 BPE, Unigram, Character 등 다양한 토크나이저 모델을 지원하여 유연성이 높다는 장점이 있습니다. SentencePiece와 WordPiece는 모두 BPE(Byte Pair Encoding) 알고리즘을 기반으로 하고 있습니다. 하지만 SentencePiece는 BPE 외에도 Unigram Language Model을 지원한다는 점에서 차이가 있습니다. SentencePiece와 WordPiece의 공통적인 토크나이저 알고리즘은 BPE입니다. SentencePiece와 WordPiece는 BPE 알고리즘을 기반으로 하면서도 구현 세부 사항에는 약간의 차이가 있습니다. 예를 들어, WordPiece는 단어 시작 부분에 “##” 기호를 추가하여 하위 단어를 표시하는 반면, SentencePiece는 “_” 기호를 사용합니다. 또한, SentencePiece는 BPE 외에도 Unigram Language Model을 지원하여 사용자에게 더 다양한 토크나이제이션 옵션을 제공합니다. Unigram Language Model은 각 문자나 하위 단어의 출현 확률을 기반으로 토큰을 생성하는 방식으로, BPE와는 다른 접근 방식을 취합니다. 요약하면, SentencePiece와 WordPiece는 BPE 알고리즘을 공통적으로 사용하지만, 구현 세부 사항과 추가적인 토크나이제이션 옵션 제공 여부에 있어 차이가 있습니다. 구현간의 차이는 아래 표에서 확인 할 수 있습니다.

Feature SentencePiece subword-nmt WordPiece
Supported algorithm BPE, unigram, char, word BPE BPE*
OSS? Yes Yes Google internal
Subword regularization Yes No No
Python Library (pip) Yes No N/A
C++ Library Yes No N/A
Pre-segmentation required? No Yes Yes
Customizable normalization (e.g., NFKC) Yes No N/A
Direct id generation Yes No N/A

BPE(Byte Pair Encoding)와 BPE*는 모두 서브워드 기반 토크나이저이지만, 약간의 차이점이 있습니다.

  • BPE:

    • 기본적인 BPE 알고리즘은 가장 빈번하게 등장하는 바이트 페어(byte pair)를 반복적으로 병합하여 서브워드 단위를 생성합니다.

    • 병합 과정에서 빈도수를 기준으로 하므로, 빈도가 높은 바이트 페어가 우선적으로 병합됩니다.

    • 병합 작업은 미리 정의된 어휘 크기에 도달할 때까지 반복됩니다.

  • BPE*

    • BPE*는 BPE 알고리즘을 개선한 변형 버전입니다.

    • 기본적인 병합 과정은 BPE와 유사하지만, 빈도수 대신 우도(likelihood)를 기준으로 병합을 수행합니다.

    • 우도는 언어 모델을 사용하여 계산되며, 이는 단순히 빈도수 기반으로 병합하는 것보다 더 나은 서브워드 단위를 생성할 수 있습니다.

    • BPE*는 언어 모델의 성능을 활용하여 더 의미 있는 서브워드를 생성하는 데 초점을 둡니다.

간단히 말해, BPE는 빈도수 기반으로 바이트 페어를 병합하는 반면, BPE는 언어 모델의 우도를 활용하여 병합을 수행한다는 점에서 차이가 있습니다. BPE는 BPE의 개선된 버전으로 볼 수 있으며, 언어 모델의 성능을 활용하여 더 나은 서브워드 단위를 생성할 수 있습니다. 워드피스와 센텐스피스에 대해 더 자세히 알아보고 싶다면 아래 영상을 참고해 보시기 바랍니다.

2.4 Hugging Face의 Tokenizers 라이브러리

Hugging Face의 Tokenizers 라이브러리는 다양한 토크나이저 알고리즘을 통합적으로 제공하며, Byte-level BPE, WordPiece, SentencePiece 등을 지원합니다. 이를 통해 사용자는 필요에 따라 적절한 토크나이저를 선택하고 활용할 수 있습니다.

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
tokens = tokenizer.tokenize("I love natural language processing!")

print(tokens)
# ['i', 'love', 'natural', 'language', 'process', '##ing', '!']

3. 결론

대부분의 최신 언어모델들이 BPE(Byte Pair Encoding)나 WordPiece, SentencePiece 등의 서브워드 기반 토크나이저를 활용하고 있습니다. 자연어 처리 작업에서 토크나이저의 선택은 중요한 역할을 합니다. 워드피스와 센텐스피스는 서브워드 토큰화를 통해 효과적인 자연어 처리를 가능하게 하는 강력한 도구입니다. 각 토크나이저의 특징과 장단점을 이해하고, 태스크와 데이터의 특성에 맞는 토크나이저를 선택하여 사용한다면 보다 높은 성능의 자연어 처리 모델을 개발할 수 있을 것입니다.