XLMRobertaTokenizer を日本語で学習させて動かす
メモ書きしないと忘れるので。
モチベーション
encoder model の多言語モデルは、2024年06月時点でいまだにXLMRobertaが一強
multilingual-e5 / bge-m3 / microsoft mMiniLMv2 など、どれも XLMRoberta
そのため、実運用では推論サーバで高速に動かすことを考慮すると、色々な推論環境でサポートされているXLMRobertaを使うと間違いない
ただ、XLMRobertaTokenizer の大元はマルチリンガルなので、日本語を適切に学習させた Tokenizer を使いたいんじゃ〜〜
というわけで学習スクリプト
XLMRobertaTokenizerはsentencepieceを使う必要がある
なのでsentencepieceで学習させる
スクリプト例では、wikipedia ja のパラグラフで学習させている
変にpythonでの処理を入れると、tokenizers.json 的なものを読んで動かしているpython以外(rust, javaなど)でtokenize結果が変わるので、その辺はいじらない
sentencepiece で学習させた後、XLMRobertaTokenizerで動くようにする
XLMRobertaTokenizerでは、tokenizers.json を出力できない
XLMRobertaTokenizerFast は rust を使った実装で、こいつはtokenizers.json を出力できる
ので、XLMRobertaTokenizerFastで保存する
おまけ
既存の学習済みマルチリンガルモデルのtokenizerを、日本語のものへ差し替えたい
なぜ?
継続学習するためのモデルに使いたい
XLM-R-Large の大元の Tokenizer はvocab_size が250002と大きいので、embedding layer が大きくなり、結果モデルサイズも大きくなる。embedding layer を freeze しないと学習に時間もかかる。
しかしtokenizerを小さなvocab_sizeのもの(というか別のtokenizer)に差し替えると、modelのembeddding layer周りの再学習が必要、できる限りいい感じにもとのembeddings layer を使ってほしい
ので、同じtokenはもとのembeddingを、なければsubwords分割してmeanを、それでもなければHeの初期化をするスクリプトを書いた(書いたのは大体claude 3.5 sonnetだが)
もっとちゃんやる方法はあるが、雑に高速にやる
32000vocab中、まんまtokenが同じものが 1万強ぐらい、subwords分割してmeanできたものが2万強ぐらい、残り数百が初期化
この方法で tokenizer を日本語学習のものに差し替えて継続学習させてみたら、良い感じに学習ができた。やるじゃん。