BERTリポジトリのサンプル実行の流れ|言語処理へのDeepLearningの導入の研究トレンドを俯瞰する #6

f:id:lib-arts:20190501180404p:plain

 

近年猛威を振るっているDeepLearningの言語処理への応用についてまとめていければと思います。
#4,#5ではBERTで用いられているモジュールであるTransformerに関してまとめました。

#6以降ではBERTのリポジトリのサンプル実行と実装の確認について行っていければと思います。#6ではまずサンプル実行までということで、下記のリポジトリを元に実際に手元での動作の流れを追えればと思います。

GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT
以下目次になります。

1. リポジトリの概要とサンプル実行にあたっての準備
2. サンプル(run_classifier.py)の実行
3. 動かしたサンプルコードに関しての補足
4. まとめ

 

1. リポジトリの概要とサンプル実行にあたっての準備

GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT
1節ではBERTのリポジトリの概要の解説とサンプル実行にあたっての準備を行います。

f:id:lib-arts:20190507152141p:plain
リポジトリは全て英語なので、概要の解説も兼ねまして重要な所だけ訳しておきます。

## Introduction

BERT, or Bidirectional Encoder Representations from Transformers, is a new method of pre-training language representations which obtains state-of-the-art results on a wide array of Natural Language Processing (NLP) tasks.
Our academic paper which describes BERT in detail and provides full results on a number of tasks can be found here: 

https://arxiv.org/abs/1810.04805.

和訳:『Transformerに基づく双方向符号化表現(BERT; Bidirectional Encoder Representations from Transformers)は、多くの自然言語処理NLP)のタスクでSOTAを実現した事前学習言語表現の手法である。BERTの詳細を記述し、多くのタスクにおける全ての実験結果を提示している我々の学術論文は"https://arxiv.org/abs/1810.04805"で確認できる。』

## What is BERT?

BERT is a method of pre-training language representations, meaning that we train a general-purpose "language understanding" model on a large text corpus (like Wikipedia), and then use that model for downstream NLP tasks that we care about (like question answering). BERT outperforms previous methods because it is the first unsupervised, deeply bidirectional system for pre-training NLP.

和訳:『BERTは事前学習の言語表現を獲得する手法であり、それはWikipediaのような多くの大きな文書コーパスにおける汎用的な"言語理解"のモデルを学習し学習したモデルをNLPタスクに適用できるということを意味している。BERTは言語処理の事前学習のための深層双方向性システムとしては最初のモデルとなったため、従来の手法を上回る成果を出した』

## What has been released in this repository?

We are releasing the following:
・TensorFlow code for the BERT model architecture (which is mostly a standard Transformer architecture).
・Pre-trained checkpoints for both the lowercase and cased version of BERT-Base and BERT-Large from the paper.
・TensorFlow code for push-button replication of the most important fine-tuning experiments from the paper, including SQuAD, MultiNLI, and MRPC. 

和訳:『我々は下記をリリースした。1.BERTモデル構造のTensorFlow実装、2.論文で言及しているBERT-BaseとBERT-Largeの二つの事前学習済みのcheckpoints、3.SQuADやMultiNLI、MRPCなどの論文で言及されている非常に重要なfine-tuningの実験の複製のためのTensorFlow実装』

## Pre-trained models

We are releasing the BERT-Base and BERT-Large models from the paper. Uncased means that the text has been lowercased before WordPiece tokenization, e.g., John Smith becomes john smith. The Uncased model also strips out any accent markers.

和訳:『論文からBERT-BaseとBERT-Largeの二つのモデルをリリースした。Uncasedはlowercasedの意味で、"John Smith"を"john smith"に変換する。Uncasedモデルは同様にアクセントのマーカーも消去する』
上記までの和訳でBERTリポジトリの概要は掴めたかと思いますので、2節では実際に実行を行ってみます。

 

2. サンプル(run_classifier.py)の実行
1節ではリポジトリの概要について触れたので、2節ではサンプル実行にあたっての準備をまとめて行きます。

f:id:lib-arts:20190507161045p:plain
上記を動かすことを目標とします。
まず、GitHubからリポジトリをダウンロードし、bertディレクトリに移動します。

$ git clone https://github.com/google-research/bert.git
$ cd bert

次に学習済みモデルをダウンロードします。(400MB前後あるので注意してください)

https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip
上記から落とし、./bert/以下に展開します(後ほどPATHを設定するのでカレントに置くのはマストではありませんが簡易化のためです)。
また、GLUE(General Language Understanding Evaluation benchmark)データセットをダウンロードします。

Script for downloading data of the GLUE benchmark (gluebenchmark.com) · GitHub
上記を実行し、ダウンロードしたディレクトリにglue_dataと名付けます。
最後に学習済みモデルとGLUEデータセット用のディレクトリ用のパスを設定したら準備完了です。

$ export BERT_BASE_DIR=./uncased_L-12_H-768_A-12
$ export GLUE_DIR=./glue_data

パスの指定に関してはそのままコピペできるように本家から修正しました。上記のやり方がマストなわけではないので自由に設定いただけたらと思います。

上記までの実行で準備は揃ったので、以下でサンプルコードを実行します。

python run_classifier.py \
    --task_name=MRPC \
    --do_train=true \
    --do_eval=true \
    --data_dir=$GLUE_DIR/MRPC \
    --vocab_file=$BERT_BASE_DIR/vocab.txt \
    --bert_config_file=$BERT_BASE_DIR/bert_config.json \
    --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
    --max_seq_length=128 \
    --train_batch_size=32 \
    --learning_rate=2e-5 \
    --num_train_epochs=3.0 \
    --output_dir=/tmp/mrpc_output/

実行時にPCのスペックなどに問題があるようでしたら、max_seq_lengthとtrain_batch_sizeの値を下げて実行すると良いと思います。一旦動作確認を優先したかったので、max_seq_lengthを32、train_batch_sizeを2で設定して実行すると実行結果は以下のようになりました。

f:id:lib-arts:20190507161310p:plain

若干lossが落ちきっていないですが、一旦動いたのでOKとします。

3. 動かしたサンプルコードに関しての補足
3節では2節で動かしたサンプルコードに関して簡単な補足を行っておきます。詳細の解説は#7以降で行うとして、ここではtask_nameで引数を与えたMRPC(Microsoft Research Paraphrase Corpus)について解説します。

f:id:lib-arts:20190508172429p:plain
BERTの論文ではMRPCについて4.1のGLUE Datasetsで上記のように記述されています。要するにオンラインのニュース記事から抽出した二つの文が一致しているかどうかを人手でアノテーション(教師ラベル)をつけたものとされています。

f:id:lib-arts:20190508172453p:plain
実際に2節で落としたデータセットのtrain.tsv中身を見てみると上記のようになります。1/0がフラグになっていて、1の場合に同じ文ということを表しています。
2節のサンプルコードを実行することでこのMRPCのタスクに最適化する形でfine-tuningを行ってくれます。


4. まとめ
#6ではサンプルコードの動作確認を行いました。
#7では実際にrun_classifier.pyの中身を確認していければと思います。

 

↓また、当記事のシリーズの内容を元に再構成と少しだけ加筆を行い電子書籍化を行いました!pdf版が欲しいなどありましたら下記をご購入いただけたら大変嬉しいです!!