PyTorch : AllenNLP チュートリアル : Getting Started – モデルの訓練と評価 (翻訳)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/26/2018 (v0.6.1)
* 本ページは、github 上の allenai/allennlp の Tutorials : Getting Started – Training and Evaluating Models を
動作確認・翻訳した上で適宜、補足説明したものです:
- https://github.com/allenai/allennlp/blob/v0.6.1/tutorials/getting_started/training_and_evaluating.md
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
このチュートリアルでは AllenNLP を使用して単純な品詞タガーを訓練します。モデルは allennlp/models/simple_tagger.py で定義されます。それは LSTM が続く単語埋め込み層から成ります。
データセットは Brown Corpus のサブセットです。特に、 4000 のランダムに選択されたセンテンス (sentences.small.train) 上でモデルを訓練して検証セット (sentences.small.dev) として異なる ~1000 のランダムに選択されたセンテンスを使用します。
AllenNLP の背後の主要なデザイン原理の一つは JSON ファイル (より具体的には、Jsonnet ファイル) を使用して実験を configure することです。
私達のタグ付け実験は tutorials/getting_started/simple_tagger.json で定義されます。望むのであればそれを今一瞥できます ; 次のチュートリアルで詳細にそれを通り抜けます。今この瞬間には trainer セクションについて注意すると良いでしょう、これは私達のモデルをどのように訓練するかを指定します :
"trainer": { "num_epochs": 40, "patience": 10, "cuda_device": -1 }
ここで num_epochs パラメータは訓練データセットを通じて 40 訓練パスを行なうことを望むことを指定します。最近の Macbook でこのデータセット上このモデルの各エポックは約 1 分かかりますので、この訓練は (それが早期に停止しないのであれば) 約 40 分かかるはずです。patience は early stopping を制御します — 検証メトリックがこの多くのエポックのために改良されないのであれば、訓練は停止します。そして GPU を持つのであればそれを使用するために cuda_device を 0 に変更できます。
望むのであればそれらのどれでも変更してください (例えば、訓練により少ない時間をかけることを望むのであれば epochs を 5 に減じることができます)、そして次を実行します :
$ allennlp train tutorials/getting_started/simple_tagger.json --serialization-dir /tmp/tutorials/getting_started
serialization-dir 引数は、モデルの語彙とチェックポイントされた重みがセーブされるディレクトリを指定します。
このコマンドはデータセットをダウンロードしてそれらをローカルにキャッシュし、使用するパラメータの総てをロギングし、そして進捗と各エポックの結果を表示します :
2017-08-23 18:07:14,700 - INFO - allennlp.training.trainer - Epoch 2/40 accuracy: 0.51, loss: 2.06, accuracy3: 0.67 ||: 100%|##########| 125/125 [01:08<00:00, 2.03it/s] accuracy: 0.61, loss: 1.65, accuracy3: 0.75 ||: 100%|##########| 32/32 [00:06<00:00, 4.96it/s] 2017-08-23 18:08:29,397 - INFO - allennlp.training.trainer - Training accuracy : 0.506099 Validation accuracy : 0.606811 2017-08-23 18:08:29,398 - INFO - allennlp.training.trainer - Training loss : 2.061412 Validation loss : 1.646712 2017-08-23 18:08:29,398 - INFO - allennlp.training.trainer - Training accuracy3 : 0.672000 Validation accuracy3 : 0.753761 2017-08-23 18:08:29,423 - INFO - allennlp.training.trainer - Best validation performance so far. Copying weights to /tmp/tutorials/getting_started/best.th'.
ここで accracy はどのくらいの頻度でモデルが「正しい」品詞タグを最も可能性の高いものとして予測したかを測ります、その一方で accuracy3 はどのくらいの頻度で正しいタグが 3 つの最も可能性あるもののうちの一つであったかを測ります。loss は交差エントロピーを測りモデルを訓練するために使用される目的です。貴方は大抵はそれが訓練の間に減少することを確かなものとしたいでしょう。
30 エポック後に検証セット上のパフォーマンスは頂点に達するようです :
2017-08-23 18:40:46,632 - INFO - allennlp.training.trainer - Epoch 30/40 accuracy: 0.97, loss: 0.10, accuracy3: 1.00 ||: 100%|##########| 125/125 [01:04<00:00, 1.86it/s] accuracy: 0.92, loss: 0.40, accuracy3: 0.97 ||: 100%|##########| 32/32 [00:05<00:00, 5.58it/s] 2017-08-23 18:41:57,236 - INFO - allennlp.training.trainer - Training accuracy : 0.966363 Validation accuracy : 0.916993 2017-08-23 18:41:57,236 - INFO - allennlp.training.trainer - Training loss : 0.098178 Validation loss : 0.401380 2017-08-23 18:41:57,237 - INFO - allennlp.training.trainer - Training accuracy3 : 0.995176 Validation accuracy3 : 0.973490
これは時間の 92% において検証データセット上で正しいタグを予測し、97% において正しいタグがモデルの "top 3" にあったことを意味します。革新的なパフォーマンスではありませんが、これは非常に単純なモデルで、データを見れば多くの異なるタグがあるでしょう!
モデルが訓練された今、serialization ディレクトリには多くのファイルがあるはずです。vocabulary ディレクトリはモデルの語彙を含み、それの各々は文字列の整数としての (個別の) エンコーディングです。私達のケースでは、トークン (i.e. 単語) のために一つとタグのためにもう一つを持つでしょう。個々の training_state_epoch_XX.th (.th はシリアライズされた torch tensor のための suffix です) ファイルは各エポック後の trainer の状態を含み、望むならば、中止したところから訓練を再開できるでしょう。同様に、model_state_epoch_XX.th ファイルは各エポック後のモデル重みを含みます。best.th はベストの重みを含みます (つまり、検証データセット上で最小の損失を持つエポックからのものです)。
最後に、「アーカイブ」ファイル model.tar.gz があり、これは訓練 configuration、ベスト重み、そして語彙を含みます。
モデルを評価する
ひとたびモデルを訓練すれば、他のデータセット上でそれを評価することを望みがちでしょう。ファイル sentences.small.test の他の 1000 センテンスを持ち、これは Amazon S3 で公に共有されています。
evaluate コマンドを使用できます、それにアーカイブ化されたモデルと評価データセットを与えます :
$ allennlp evaluate /tmp/tutorials/getting_started/model.tar.gz https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test
これを実行するときそれはアーカイブ化されたモデルをロードし、評価データセットをダウンロードしてキャッシュして、そして予測を行ないます :
2017-08-23 19:49:18,451 - INFO - allennlp.models.archival - extracting archive file /tmp/tutorials/getting_started/model.tar.gz to temp dir /var/folders/_n/mdsjzvcs6s705kpn87f399880000gp/T/tmptgu44ulc 2017-08-23 19:49:18,643 - INFO - allennlp.commands.evaluate - Reading evaluation data from https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test 2017-08-23 19:49:18,643 - INFO - allennlp.common.file_utils - https://allennlp.s3.amazonaws.com/datasets/getting-started/sentences.small.test not found in cache, downloading to /Users/joelg/.allennlp/datasets/aHR0cHM6Ly9hbGxlbm5scC5zMy5hbWF6b25hd3MuY29tL2RhdGFzZXRzL2dldHRpbmctc3RhcnRlZC9zZW50ZW5jZXMuc21hbGwudGVzdA== 100%|████████████████████████████████████████████████████████████████████████████████████| 170391/170391 [00:00<00:00, 1306579.69B/s] 2017-08-23 19:49:20,203 - INFO - allennlp.data.dataset_readers.sequence_tagging - Reading instances from lines in file at: /Users/joelg/.allennlp/datasets/aHR0cHM6Ly9hbGxlbm5scC5zMy5hbWF6b25hd3MuY29tL2RhdGFzZXRzL2dldHRpbmctc3RhcnRlZC9zZW50ZW5jZXMuc21hbGwudGVzdA== 1000it [00:00, 36100.84it/s] 2017-08-23 19:49:20,233 - INFO - allennlp.data.dataset - Indexing dataset 100%|██████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:00<00:00, 7155.68it/s] 2017-08-23 19:49:20,373 - INFO - allennlp.commands.evaluate - Iterating over dataset 100%|████████████████████████████████████████████████████████████████████████████████████████████████| 32/32 [00:05<00:00, 5.47it/s] 2017-08-23 19:49:26,228 - INFO - allennlp.commands.evaluate - Finished evaluating. 2017-08-23 19:49:26,228 - INFO - allennlp.commands.evaluate - Metrics: 2017-08-23 19:49:26,228 - INFO - allennlp.commands.evaluate - accuracy: 0.9070572302753674 2017-08-23 19:49:26,228 - INFO - allennlp.commands.evaluate - accuracy3: 0.9681496714651151
もし貴方が一つ持つのであれば、GPU を使用するためのコマンドライン・オプションもまたあります。
予測を行なう
最後に、モデルを訓練することの価値は何でしょう ? もしそれを予測するために使用できないのであれば。predict コマンドはアーカイブ化されたモデルと入力の JSON 行ファイルを取りモデルを使用して予測を行ないます。ここで、タギング・モデルのための "predictor" は sentence を含む JSON blob を想定します :
$ cat <> inputs.txt {"sentence": "I am reading a tutorial."} {"sentence": "Natural language processing is easy."} EOF
その後予測を行なうことができます :
$ allennlp predict /tmp/tutorials/getting_started/model.tar.gz inputs.txt ... lots of logging omitted {"tags": ["ppss", "bem", "vbg", "at", "nn", "."], "class_probabilities": [[ ... ]]} {"tags": ["jj", "nn", "nn", "bez", "jj", "."], "class_probabilities": [[ ... ]]}
ここで "tags" は各センテンスのための品詞タグで、"class_probabilities" は各センテンスのためのタグの予測された分布です。
以上