Re Reference AI

技術

Byte Pair Encodingとは

BPE / バイトペアエンコーディング

頻出する文字・部分文字列のペアを繰り返し統合し、語彙を構築するサブワード分割アルゴリズム

トークナイゼーション自然言語処理

ひとことで言うと

知らない単語も、よく出る文字のかたまりに分けて扱えるようにする、AIの文章の区切り方の仕組み。

概要

Byte Pair Encoding(BPE)は、テキストを単語より小さい「サブワード」単位に分割するためのトークナイゼーション手法で、コーパス中で最も頻繁に隣接して出現する文字(もしくは部分文字列)のペアを、新しい1つのトークンとして繰り返し統合していくことで語彙を構築する。 この手法により、頻出する単語はそのまま1つのトークンとして扱われる一方、未知語や複合語も既知のサブワードの組み合わせとして表現できるため、語彙に存在しない単語(未知語)の問題を実用上ほぼ解消できる。 GPTシリーズをはじめとする多くのLLMのトークナイザーはBPE、またはそれをバイト単位に拡張したByte-level BPEを採用しており、多言語や特殊記号を含むテキストも語彙サイズを抑えつつ扱える。 SentencePieceやWordPiece(BERTが採用)も類似の目的を持つ手法で、いずれもサブワード単位のトークン化によって語彙サイズと表現力のバランスを取っている。

背景

単語単位のトークン化では、学習データに存在しなかった単語(未知語)を扱えず、また語彙数が膨大になりやすいという課題があった。 BPEは、頻出する文字列パターンを段階的に統合することで、語彙サイズを一定に抑えつつ、未知の単語もサブワードの組み合わせとして表現できるようにする。

歴史

1994年: Philip Gageがデータ圧縮アルゴリズムとしてBPEを考案。 2016年: SennrichらがBPEをニューラル機械翻訳のサブワード分割手法として応用する論文を発表し、NLP分野で広く採用されるきっかけに。 2019年: GPT-2がByte-level BPEを採用し、以降多くのLLMのトークナイザーの標準的な選択肢に。

ワークフロー

コーパス中の全単語を文字単位に分解し、初期語彙とする → コーパス全体で最も頻繁に隣接して出現する文字(トークン)ペアを見つける → そのペアを1つの新しいトークンとして語彙に追加し、コーパス中の該当箇所をすべて統合 → あらかじめ指定した語彙サイズに達するまでこの統合処理を繰り返す。

コード例

Hugging Face tokenizersでのBPE学習

from tokenizers import Tokenizer, models, trainers, pre_tokenizers

tokenizer = Tokenizer(models.BPE())
tokenizer.pre_tokenizer = pre_tokenizers.Whitespace()
trainer = trainers.BpeTrainer(vocab_size=1000, special_tokens=["[UNK]"])
tokenizer.train_from_iterator(["low lower lowest newer newest"], trainer)

output = tokenizer.encode("lower newest")
print(output.tokens)

利点

  • 未知語であっても既知のサブワードの組み合わせとして表現でき、語彙外(OOV)の問題をほぼ解消できる
  • 語彙サイズを事前に指定でき、モデルの入力層・出力層のサイズを制御しやすい
  • 言語やドメインを問わず、コーパスの統計に基づいて機械的に語彙を構築できる

欠点

  • 統合の過程は頻度統計に基づくため、言語学的にみて不自然な単位でトークンが分割される場合もある
  • 同じ単語でも文脈によって異なる分割のされ方をする場合があり、モデルの学習に影響することがある
  • 数字の桁区切りなど、特定のパターンでは非効率なトークン化が起きやすいと知られている

比較

  • トークンBPEはトークンの区切り方(トークナイザー)を決定する具体的なアルゴリズムの1つ
  • N-gramN-gramは連続するN個の単位で文章を区切る表現手法で、頻度に基づいて語彙を構築するBPEとは目的とアプローチが異なる

関連用語

トークンLLMNLPGPT

よくある質問

BPEとWordPieceの違いは?

どちらも頻出パターンを統合してサブワード語彙を構築する点は共通するが、WordPieceは統合候補の選択に尤度ベースのスコアを使う点が異なる。BERTはWordPieceを採用している。

Byte-level BPEとは?

文字ではなくUTF-8のバイト単位を最小単位として扱うBPEの拡張版。どんな文字・絵文字・多言語テキストも未知語なしで扱えるため、GPT-2以降の多くのLLMで採用されている。

参考文献

関連Zenn記事