はじめに
「彼と出会った瞬間、私の人生が変わったの。(略) 世界が輝きだしたの」 (『四月は君の嘘』より)
えぬえるぴーや1のnikkieです。
いやー、BERTは自然言語処理の世界を変えてしまいましたねー!
「そんなBERTをもっと知りたい!」と、この週末『Transformerによる自然言語処理』の写経に取り組みました2。
目次
- はじめに
- 目次
- 『Transformerによる自然言語処理』
- 3章 RoBERTaモデルのゼロからの事前訓練
- RoBERTa事前訓練を写経
- 「考えながら写経」5のメモ
- 終わりに
- 補足: この記事を書いた時点のnikkieの認識
『Transformerによる自然言語処理』
この4月に朝倉書店さんから出版された翻訳書です。
自然言語処理の世界に革命をもたらし,BERTやGPTなどさまざまな言語処理モデルに用いられている深層学習モデル・Transformer。Transformerの仕組みや理論の解説のほか,テキスト生成や要約,ニュース分析など自然言語処理のさまざまなタスクへの利用法を,Pythonのコード付きで解説。実践的な1冊。(「編集部から」)
ソースコードはこちら:
「Transformerの訓練にはGPUが必要なのです!」ということで、Google Colabを徹底活用しています。
3章 RoBERTaモデルのゼロからの事前訓練
この章ではRoBERTa 3(改良されたBERT)を事前訓練(pre-train)します。
といっても、何日もかけて訓練するわけではなく、1エポックだけ の訓練です。
公開されているTransformerモデルをそのまま利用4したり、手元のタスクに合わせてfine-tuningしたりという経験はあるのですが、そもそも事前訓練ってどうやっているのかよく分かっていませんでした。
目次を見て「え!RoBERTa事前訓練するの!? 仕組みを知りたい、写経したい!」🤩とこの章に食指が動きました。
イマニュエル・カントの著作のテキストデータ(原著者が用意)を訓練に使います。
RoBERTa事前訓練を写経
コードはこちら(ColabからGitHubに保存):
動作環境
- Colab (Python 3.7系)
- transformers 4.18.0
- tokenizers 0.12.1
RoBERTa事前訓練の流れ
- トークナイザの訓練・保存(tokenizersを使用)
- RoBERTaの事前訓練(transformersを使用)
2のRoBERTaの事前訓練、登場人物はこちら!
- config: RobertaConfig
- tokenizer: RobertaTokenizer
- 1で保存したファイル(vocab_file, merges_file)からロード
- model: RobertaForMaskedLM
- fill-maskタスク用のRoBERTa
- dataset: LineByLineTextDataset
- カントの著作のテキストを読み込んでdatasetを作成
- data-collator: DataCollatorForLanguageModeling
- 事前訓練で使うマスクされたテキストを作る
- trainer: Trainer
- model,
TrainingArguments
, data-collator, datasetを渡す - 訓練とモデルの保存を呼び出す
- model,
fill-maskタスクで事前訓練の確認
事前訓練(1エポックだけ)が終わったら、transformersのpipelineを使ってfill-maskタスクを解かせます。
Human thinking involves<mask>.
訓練は1エポックだけですが、reasonのように、カントの著作っぽい埋め方をしており、さらなる訓練の可能性を感じさせます!
このモデルはエクスポートもできました。
Googleドライブをマウントして、Colabのノートブックからドライブに保存。
それをダウンロードして、別の環境でもfill-maskパイプラインで同様の結果に!
以上で、Colabを使った事前訓練のやり方は体験できたことになります(長時間どう動かすかといった工夫はTODOです)。
「考えながら写経」5のメモ
- datasetは、🤗的にはdatasetsを使ってロードする方法に置き換えたいようです
LineByLineTextDataset
はdeprecatedっぽい雰囲気なので、datasetsでの読み込みの仕方を調べたい
- configの
max_position_embeddings=514
、Transformerでよく見る数字は512だと思うのですが、+2しているのはどういう意味なんでしょう? vocab_size=52_000
ですが、tokenizerを確認すると19296
。20000くらいまで小さくしても結果は変わらない?- tokenizersは今回初めて知ったライブラリ。
ByteLevelBPETokenizer
とTokenizer(models.BPE())
はどこまで同じか確認してみたい
終わりに
事前訓練はブラックボックスでしたが、写経して体験して全体感がつかめました。
中でもdata-collatorは今回初めて知りました。
訓練データのマスクを担当していて、なるほどーという感想です。
青空文庫からテキストを取得して、事前訓練を素振りしてみてもよさそうですね。
『Transformerによる自然言語処理』は他にも興味深いトピックで満ちています!
引き続き読み進め、必要に応じて写経していきます。
補足: この記事を書いた時点のnikkieの認識
※正確性には自信がありません
- 転移学習の枠組み
- 事前訓練(pre-train)
- fine-tuning
- 事前訓練済みのTransformerモデルは(Hugging Face Hubなどで)公開されている
- BERTのTはtransformerのT(Bidirectional Encoder Representations from
Transformers)
- 事前訓練済みのBERTやその進化系は公開されている(誰でも利用できる)
- BERTの事前訓練は2つ
- 文中のマスクされた語が何か予測
- 与えられた2文が、次の文かどうかを予測
- RoBERTaは「次の文かどうかの予測」をやめ(簡単だから)、マスクされた語の割合を増やした訓練をするとして提案された
-
↩電波受信!
— nikkie にっきー シオンv0.0.1開発中⚒ (@ftnext) 2021年7月11日
自然言語処理(NLP)に従事する者の呼称、
NLPer(えぬえるぴーや)
SIerと同じ読み方なら、えぬえるぴあー、でも「ぴーや」もそんなに変わらないのでは?
試しに今後のLTなどで名乗って見よう -
↩えー、本日はお休みということで、ですね、
— nikkie にっきー シオンv0.0.1開発中⚒ (@ftnext) 2022年4月23日
BERT(RoBERTa)の訓練を!
やっていきたいと思います!
『Transformerによる自然言語処理』3章https://t.co/bUNnAleWSK https://t.co/4A2Bv7BClU -
RoBERTaは「ロベルタ」と読まれるようです(NLP2022の発表でいくつか聞きました)。私の中では「ローダンセ(Rhodanthe*)」みたく「ローベルタ」と読みたい気持ち(👈たぶん通じません)↩
-
イベントレポート | Pythonで自然言語処理ハンズオン #はんなりPython - nikkie-ftnextの日記↩
-
先日のみんなのPython勉強会でも共有しましたが、「書き写しながら(略)考えることが大事です」 from『エンジニアの知的生産術』↩