🔢

Google Colabでトークナイザーを学習する(10/27日勉強会用)

2024/10/27に公開

はじめに

この記事の内容は、以下の勉強会で報告したものになります。
開催日時:2024年10月27日(日)17:00 - 19:00
テーマ小型LlamaモデルのMegatron-LMを用いた事前学習と継続事前学習
この勉強会では、トークナイザー学習に加えて、事前学習や継続事前学習についても報告を行っています。本記事と合わせてご活用ください。

本記事の概要

本記事では、Tanukiモデルと同様の方法で、トークナイザー学習を行う方法を解説します。
なお、トークナイザーの理論などについては、

ディレクトリ構成

Tanuki_pretraining
|
|-- learning_tokenizer
     |
     |-- config # 設定ファイルの置き場
     |    |
     |    |-- config.yaml # トークナイザー学習(sentencepiece)に使う設定ファイル
     |    |
     |    |-- special_token_list.py # 特別な意味を持つトークンの定義
     |
     |-- learning_corpus # トークナイザー学習に使うファイルの置き場
     |
     |-- preprocess_data # 作業用のファイルが置かれるディレクトリ
     |
     |-- train_sentencepiece_tokenizer_mecab.ipynb # トークナイザー学習コード

実行環境

Google Colabの場合

  • GPU不要(ハイメモリ)
    (ただし、今回の設定では、1GB程度のデータセットしか処理できません。)

追加でインストールが必要なライブラリ

  • mecab
  • libmecab-dev
  • mecab-ipadic-utf8

松尾研の提供環境(GCP)での構築の場合

事前学習の方法(10/27日勉強会公開用)で詳しく説明していますので、そちらをご覧ください。

Tanuki_tokenizer学習パイプライン

https://github.com/team-hatakeyama-phase2/Tanuki_pretraining/blob/main/learning_tokenizer/train_sentencepiece_tokenizer_mecab.ipynb

Tokenizer作成手順書

データの準備

(Tanuki Tokenizerは非公開となっています。)

より多くの語彙を網羅したコーパスを使用するとよいでしょう。

llm-jpでの「Tokenizer学習用データの作成方法」などが参考になります。

jsonlをtxtに変換(コーパスがjsonlである場合)

sentencepieceでの学習の場合、txtファイルを使用することになるので、事前に変換しておきます。

わかちがき

言語間の単語区切りを統一するため、MeCabで日本語を形態素で分割し、'||||'という滅多にでないであろう文字で分割しています。 MeCabとsentencepieceの作者の投稿Sentencepiece の分割を MeCab っぽくするが参考になります。 1行が非常に長いデータがあるため -bオプションを使用して、入力バッファを多めに取っておくとよいでしょう。

-b, --input-buffer-size=INT

set input buffer size (default BUF_SIZE)

(MeCabのリファレンスより)

トークナイザー学習

トークナイザー学習には、sentencepieceを用いています。
主な設定は以下のとおりです。

# config.yamlで設定
vocab_size: 65000
character_coverage: 0.9995
model_type: unigram
# コード中の設定
split_digits=True
allow_whitespace_only_pieces=True
remove_extra_whitespaces=False
pretokenization_delimiter="||||"
  • vocab_size:語彙数。モデルのパラメータ数に大きく影響します。
  • character_coverage:文字のカバー率。英語のみの場合は1で大丈夫。
  • model_type:サブワード分割の方法。英語ではBPEがよく用いられている。
  • split_digits:数字(0-9)をそれぞれ区切るか?
  • allow_whitespace_only_pieces:空白のみのトークンを許すか?
  • remove_extra_whitespaces:行の最初や最後の空白を削除するか?
  • pretokenization_delimiter="||||":区切りとして使用する文字。今回は、MeCabでわかちがきをした時に使った"||||"を設定しています。わかちがきをしない場合には、設定不要です。
東大松尾・岩澤研究室 | LLM開発 プロジェクト[GENIAC]

Discussion