nikkie-ftnextの日記

イベントレポートや読書メモを発信

data2vecのSOTAを見せて(data2vec NLP Baseを動かしてみたログ)

はじめに

見守っていたんだよ、ずっと🎵 nikkieです。

この週末、data2vecというモデルを動かしてみました。
そのログを残します。

目次

data2vecとは

1/20にMeta AI(旧称Facebook AI)から1本のブログが公開されました。

タイトルは「The first high-performance self-supervised algorithm that works for speech, vision, and text(音声にも画像にもテキストにも有効な、初の高性能な自己教師ありアルゴリズム)」であり、data2vec という手法について紹介しています。
音声・画像・テキストというモーダルの違いによらず、データの表現を推論する点が強調されています。

同日にdata2vecの論文も公開されています。

論文のAbstractには以下のようにあります。

Models and code are available at www.github.com/pytorch/fairseq/tree/master/examples/data2vec.

「この論文、なんだかすごそう!」と気になった私は、理解の一歩目として、公開されているモデルとコードを動かしてみました。

TL; DR(この記事のサマリ)

  • fairseqのRoBERTaのドキュメントを参考に、テキスト向けのdata2vecの学習済みモデルを動かした
  • GLUEのQNLIタスクでfinetuningした
  • trainとdevデータに対する、Accuracyは67.1%, 62.4%(論文ほど高くない)

おことわり

data2vecの論文の内容については立ち入りません。
テキスト向けdata2vecのモデルを「こうやったら動かせた」というログです。

自分にとって一番とっかかりやすそうな「コードを動かす」アプローチを取っています。
誤りに気づいた場合は、コメントやTwitter @ftnext 宛にお知らせいただけますと大変ありがたいです。

fairseqとは

Facebook AI Research Sequence-to-Sequence Toolkit written in Python.

Facebook AI リサーチ1が公開している、シーケンス(=系列データ)のモデリングツールキットだそうです(READMEより)。

2/4のちゅらデータさんのイベント2でもニューラルネットワークによる校正でfairseqが紹介されていて、この週末はfairseqづくしとなりました。

fairseqのコードは実装がなかなか興味深いです(継承を使ったモデルの定義や、訓練スクリプトの引数の扱い)。

https://github.com/pytorch/fairseq#requirements-and-installation に沿って、リポジトリをcloneしてeditable installしました。

data2vecのモデルを動かすには

モデル自体はdata2vecのREADMEに記載のリンクからダウンロードできます。
今回はnlp_base.ptNLP用のベースモデル)を動かしていきます。

https://github.com/pytorch/fairseq/tree/main/examples/data2vec#training-a-new-nlp-model-with-the-cli-tools を参照すると

Please follow the RoBERTa instructions to preprocess your data.

とありました。
そこで、RoBERTa(Facebook AI リサーチによるBERTの再実装)のREADME.md https://github.com/pytorch/fairseq/blob/main/examples/roberta/README.md を参考にしています3

モデルのロードは https://github.com/pytorch/fairseq/blob/main/examples/roberta/README.md#example-usage にならいました。

>>> from fairseq.models.roberta import RobertaModel
>>> model = RobertaModel.from_pretrained(".", "nlp_base.pt")

nlp_base.ptと同じディレクトリにdict.txtが必要でした(FileNotFoundErrorが送出される)。
preprocess_GLUE_tasks.shwgetしているのを見つけ、実行してdict.txtを配置したところ、モデルがロードできました。

$ wget -N 'https://dl.fbaipublicfiles.com/fairseq/gpt2_bpe/dict.txt'

encode + extract_features で、ベクトルに変換できるようです。

>>> model.eval()
>>> tokens = model.encode('Hello world!')
>>> last_layer_features = model.extract_features(tokens)
>>> last_layer_features.size()
torch.Size([1, 5, 768])

Hello world!は<s>, hello, world, !, </s>に分かれて、それぞれベクトル表現になったようです。
得られたものをどう使うか、私の知識不足で、よく分かっていません(BERTのように先頭を抜き出す??)。

QNLIでfinetuning

もう少し動かしたいと、GLUE4のQNLI5というデータセットで試しました。
data2vecのモデルはタスクごとにfinetuningする必要があるという理解です。
https://github.com/pytorch/fairseq/blob/main/examples/roberta/README.glue.md を参照しています。

「1) Download the data from GLUE website」は案内されたスクリプトに記載されたリンクが403 Forbiddenとなるため、以下に置き換えました6

$ wget https://raw.githubusercontent.com/nyu-mll/GLUE-baselines/b1c82396d960fd9725517089822d15e31b9882f5/download_glue_data.py
$ python download_glue_data.py --data_dir glue_data --tasks QNLI

「2. Preprocess GLUE task data」はエラーなく終了、「3. Fine-tuning on GLUE task」は以下のコマンドで実行しています(GPUが使える環境が必要です)。

$ # pwdはfairseqリポジトリのルート
$ python fairseq_cli/hydra_train.py -m \
    --config-dir examples/roberta/config/finetuning \
    --config-name qnli \
    task.data=$PWD/QNLI-bin \
    checkpoint.restore_file=examples/data2vec/nlp_base.pt

hydraが成果物配置用ディレクトリでカレントディレクトリを上書きするという挙動のために、task.data絶対パスで指定しています。

モデルの訓練後、https://github.com/pytorch/fairseq/blob/main/examples/roberta/README.glue.md#inference-on-glue-task にあるようなスクリプトでaccuracyを求めたところ

  • train: 67.1%
  • dev: 62.4%

でした。
testはラベルが手元にないようで、accuracyは求められていません。

終わりに

Facebook AI リサーチが公開したdata2vecのモデルを動かし、finetuningしてみました。
論文の結果が再現させられませんでしたが、私の技量不足(扱うデータセットやモデルのアーキテクチャへの理解不足)が原因だと思います。
とはいえ、薄いドキュメントを辿って動かすことができたのは成果だと思っています。
ここのログを足がかりにもう少し見ていこうと思います(アップデートは追記または補足記事予定)。


  1. FacebookはMetaに社名を変えましたね。ただリポジトリやパッケージにはFacebookの名が残っていくんだろうなと思いました(いきなりmairseqには変えづらそう)

  2. 【初心者向け】Pythonで手軽に始める文章校正 - connpass YouTubehttps://youtu.be/p4w3tVE3Pg8

  3. こちらのプルリクエストでrobertaのモデルを拡張しているのも見つけたのも、RoBERTaを参考にした理由です。

  4. https://huggingface.co/datasets/glue (論文内のarXivへのリンク -> PaperWithCodeへのリンク -> データセットとスムーズにアクセスできて、高速道路感やばかったです!)

  5. 「ペアの文が質問に対する回答を含むかどうか」 ref: 2018年の言語モデル概要 - LINE ENGINEERING

  6. ref: https://github.com/pytorch/fairseq/issues/3840#issuecomment-913078184