WordPieceトークナイゼーション(BERT)(ワードピーストークナイゼーションバート)
GoogleのBERTで採用されたサブワードトークナイゼーション手法。BPEと似た発想だが、最大尤度(Likelihood最大化)でマージを選択するため異なる語彙を構築する。サブワードには「##」プレフィックスを付け語中のピースであることを示す。BERT/RoBERTa/ALBERT/DistilBERTで標準採用。
WordPieceトークナイゼーション(BERT)
WordPieceはGoogleのSchuster & Nakamura(2012年)が音声認識向けに開発し、BERTで採用されて自然言語処理の主要手法となったサブワードトークナイゼーションアルゴリズム。BPEと同じサブワード分割の発想を持つが、マージルールの選択基準に言語モデルの尤度(likelihood)最大化を使用する点が根本的な違いだ。
BPEとの根本的な違い
| 特性 | BPE | WordPiece |
|---|---|---|
| マージ基準 | 頻度(カウントベース) | 尤度増加(確率ベース) |
| 学習方向 | ボトムアップ(結合) | ボトムアップ(結合) |
| 選択式 | count(AB) 最大 | count(AB)/(count(A)*count(B)) 最大 |
| 語中サブワード | 区別なし | ##プレフィックスで明示 |
| 主な採用モデル | GPT系・LLaMA系 | BERT系 |
WordPieceの選択式は相互情報量に相当するlog P(AB) - log P(A) - log P(B)を最大化するペアを選ぶ。これにより単に頻出するだけでなく、結合することで新たな情報をもたらすペアが優先選択される。
##プレフィックスの仕組み
BERTのWordPieceトークナイザーは語中のサブワード(単語の先頭ではない部分)に##プレフィックスを付与する。これによりトークン列から元の単語境界を復元できる。
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 例: "tokenization"
tokens = tokenizer.tokenize("tokenization")
print(tokens) # ['token', '##ization']
# 例: "embeddings"
tokens = tokenizer.tokenize("embeddings")
print(tokens) # ['em', '##bed', '##ding', '##s']
print(tokenizer.vocab_size) # 30,522 (bert-base-uncased)
BERT系モデルでの採用状況
| モデル | vocab size | 言語 |
|---|---|---|
| BERT-base/large | 30,522 | 英語 |
| BERT-multilingual | 119,547 | 104言語 |
| RoBERTa | 50,265 | 英語(GPT-2 BPEに変更) |
| ALBERT | 30,000 | 英語 |
| DistilBERT | 30,522 | 英語(BERT互換) |
| Japanese BERT | 32,000 | 日本語 |
RoBERTaがBPEに切り替えた(Liu et al. 2019年)ことで、エンコーダーモデルでもBPEとWordPieceの優劣が議論されるようになった。実験では明確な優劣はなく、学習データ量とモデル設計の方が性能に大きく影響するとされる。
Whole Word Masking
BERTのMasked Language Modeling(MLM)ではWordPieceで分割されたサブワード単位でマスクが適用されていた。2019年のWhole Word Masking(wwm)では同一単語のすべてのWordPieceサブワードを同時にマスクするよう改良され、事前学習の質が向上した。日本語BERT(cl-tohoku/bert-japanese)ではMeCabとWordPieceを組み合わせたwhole word maskingが採用されている。