2024-12-26 2024-12-27

SentencePieceベースのトークナイザの学習設定を抽出する

はじめに

言語適応のための語彙拡張では、まず対象言語データで補助トークナイザを学習するのが一般的です。

その際、効果的な語彙拡張のためには、拡張元のトークナイザと同じ(近しい)学習設定を補助トークナイザに適用することが重要です。

しかし、SentencePieceのドキュメントや先行研究の論文には、トークナイザの学習設定をどのように抽出できるかは明確には説明されていません。1

そこで本記事では、トークナイザの学習設定を抽出し、補助トークナイザに適用する方法を簡単に説明します。

なお、本記事は、Gemma 2の語彙拡張例を元に執筆しました。

SentencePieceモデルの学習設定の抽出

まず、元のトークナイザのモデルファイルを読み込みます。

import sentencepiece as spm
sp_model = spm.SentencePieceProcessor()
sp_model.load(
    "/path/to/models--google--gemma-2-9b/snapshots/33c193028431c2fde6c6e51f29e6f17b60cbfac6/tokenizer.model"
)

なお、上記では拡張元のトークナイザとしてGemma 2tokenizer.modelを使用することを想定しています。

次に、SentencePieceモデルプロトをロードし、各種パラメタを取得します。2

from sentencepiece import sentencepiece_model_pb2 as sp_pb2_model
spm = sp_pb2_model.ModelProto()
spm.ParseFromString(sp_model.serialized_model_proto())

最後に、以下の手順で学習設定を抽出します。

from google.protobuf.json_format import MessageToDict
training_configs = MessageToDict(spm)['trainerSpec']

ここで、training_configsは、元のトークナイザの学習設定を含む辞書型変数です。

{'modelPrefix': '',
 'modelType': 'BPE',
 'vocabSize': 256000,
 'selfTestSampleSize': 0,
 'inputFormat': '',
 'characterCoverage': 0.0,
 'inputSentenceSize': '0',
 'seedSentencepieceSize': 0,
 'shrinkingFactor': 0.0,
 'numThreads': 0,
 'numSubIterations': 0,
 'maxSentenceLength': 0,
 'shuffleInputSentence': True,
 'maxSentencepieceLength': 16,
 'splitByUnicodeScript': True,
 'splitByWhitespace': True,
 'splitByNumber': True,
 'treatWhitespaceAsSuffix': False,
 'splitDigits': True,
 'allowWhitespaceOnlyPieces': True,
 'userDefinedSymbols': ['<mask>',
  '<2mass>',
  '[@BOS@]',
  ...
  '</sup>',
  '</code>'],
 'vocabularyOutputPieceScore': True,
 'hardVocabLimit': True,
 'useAllVocab': False,
 'byteFallback': True,
 'requiredChars': '',
 'unkId': 3,
 'bosId': 2,
 'eosId': 1,
 'padId': 0,
 'unkSurface': ' ⁇ ',
 'unkPiece': '<unk>',
 'bosPiece': '<bos>',
 'eosPiece': '<eos>',
 'padPiece': '<pad>',
 'trainExtremelyLargeCorpus': True,
 'enableDifferentialPrivacy': False,
 'differentialPrivacyNoiseLevel': 0.0,
 'differentialPrivacyClippingThreshold': '0'}

上記の学習設定を用いることで、先述のGemma 2の語彙拡張例に示したようにGemma 2の補助トークナイザを学習することができます。

まとめ

本記事では、元のトークナイザの学習設定を抽出し、補助トークナイザに適用する方法を簡単に説明しました。参考になれば幸いです。

  1. 公式には非推奨であったと記憶しているので、当然のことかもしれません。しかしながら、語彙拡張が広く用いられている中で、メモとして残しておいた方が有益であろうという観点から、本記事の執筆に至りました。 

  2. 詳細は、SentencePieceリポジトリを参照されたい。