download.shのみを実行するため) まず、データを準備します。 Donwload Squad Data and Glove and NLTK Corpus(〜850 MB、これによりファイルは$HOME/dataにダウンロードされます):
chmod +x download.sh; ./download.sh
第二に、プリプロセスのスタンフォードQAデータセット(グローブベクトルとともに)を保存し、 $PWD/data/squad (〜5分)で保存します。
python -m squad.prepro
モデルには約2.5mのパラメーターがあります。このモデルは、Nvidia Titan Xで訓練されました(Pascal Architecture、2016)。このモデルには、少なくとも12GBのGPU RAMが必要です。 GPU RAMが12GB未満の場合、バッチサイズを減らす(パフォーマンスが低下する可能性がある)か、マルチGPUを使用できます(以下を参照)。トレーニングは〜18kステップで収束し、ステップあたり約4秒(つまり〜20時間)かかりました。
トレーニングの前に、最初に次のコードを試して、すべてが問題なく、メモリで十分であることを確認することをお勧めします。
python -m basic.cli --mode train --noload --debug
その後、完全にトレーニングするには、実行してください。
python -m basic.cli --mode train --noload
最適化フラグを使用して、トレーニングプロセスをスピードアップできます。
python -m basic.cli --mode train --noload --len_opt --cluster
それでも省略できますが、トレーニングははるかに遅くなります。
トレーニング中、時折評価のEMとF1のスコアは、公式の分隊評価スクリプトのスコアでは同じではないことに注意してください。印刷されたスコアは公式ではありません(スコアリングスキームは少し厳しいです)。公式番号を取得するには、公式の評価者を使用します( squad Folder、 squad/evaluate-v1.1.py )。詳細については、3.Testを参照してください。
テストするには、実行してください:
python -m basic.cli
トレーニングと同様に、最適化フラグを提供してテストを高速化できます(開発データで5分)。
python -m basic.cli --len_opt --cluster
このコマンドは、トレーニング中に最近保存されたモデルをロードし、テストデータのテストを開始します。プロセスが終了すると、F1とEMスコアを印刷し、JSONファイル( $PWD/out/basic/00/answer/test-####.jsonも出力します。ここで、 ####はモデルが保存されたステップ#です)。印刷されたスコアは公式ではないことに注意してください(スコアリングスキームは少し厳しいです)。公式番号を取得するには、公式評価者( squadフォルダーにコピー)と出力JSONファイルを使用します。
python squad/evaluate-v1.1.py $HOME/data/squad/dev-v1.1.json out/basic/00/answer/test-####.json
自分でモデルをトレーニングする代わりに、分隊リーダーボードの提出に使用された事前に訓練された重量を使用することを選択できます。結果を再現するには、Codalabのこのワークシートを参照してください。 Codalabに不慣れな場合は、これらの簡単な手順に従ってください(上記のすべての前提条件を満たしていることを考えると):
save.zipをダウンロードして、現在のディレクトリに解凍します。glove.6B.100d.txt現在のディレクトリにGlove Data Folder( $HOME/data/glove/ )からコピーします。 basic/run_single.sh $HOME/data/squad/dev-v1.1.json single.json
これにより、現在のディレクトリにsingle.jsonへの回答が記載されています。その後、公式の評価者を使用して、EMおよびF1スコアを取得できます。 GPU(〜5分)で実行する場合は、シェルファイルのbatch_sizeフラグの値をより高い数(12GB GPU RAMの場合は60)に変更します。 4.同様に、アンサンブル方法を再現するには:
basic/run_ensemble.sh $HOME/data/squad/dev-v1.1.json ensemble.json
GPUで実行する場合は、Forloopで「&」を削除してスクリプトを順番に実行する必要があります。または、forループの実行ごとに異なるGPUを指定する必要があります。
これらのスコアは、公式の評価者からのものです( squad Folder、 squad/evaluate-v1.1.pyにコピー)。詳細については、3.Testを参照してください。トレーニング中に表示されるスコアは、公式の評価者のスコアよりも低くなる可能性があります。
| em(%) | F1(%) | |
|---|---|---|
| シングル | 67.7 | 77.3 |
| アンサンブル | 72.6 | 80.7 |
| em(%) | F1(%) | |
|---|---|---|
| シングル | 68.0 | 77.3 |
| アンサンブル | 73.3 | 81.1 |
詳細については、私たちの論文を参照してください。他のモデルと比較するには、分隊リーダーボードを参照してください。
モデルはマルチGPUトレーニングをサポートしています。 Tensorflowチュートリアルで説明されている並列化パラダイムに従います。要するに、バッチサイズは60(デフォルト)を使用するが、4GBのRAMを含む3つのGPUがある場合、各GPUを20のバッチサイズで初期化し、CPUの勾配を組み合わせます。これは、実行することで簡単に実行できます。
python -m basic.cli --mode train --noload --num_gpus 3 --batch_size 20
同様に、テストを次のように高速化できます。
python -m basic.cli --num_gpus 3 --batch_size 20
とりあえず、このリポジトリのdemoブランチを参照してください。