Flair 0.6 Tutorial 8: モデル調整 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/02/2020 (0.6.1)
* 本ページは、Flair ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
Facebook: https://www.facebook.com/ClassCatJP/ |
Tutorial 8: モデル調整
これはチュートリアルのパート 8 です、ここではモデルとハイパーパラメータの正しいセットを選択することによりモデルの品質をどのように改良するかを調べます。
ハイパーパラメータを選択する
Flair は良く知られたハイパーパラメータ選択ツール hyperopt のためのラッパーを含みます。
最初に貴方のコーパスをロードする必要があります。次のサンプルで使用される AGNews コーパス をロードすることを望む場合、最初にそれをダウンロードして正しい形式に変換する必要があります。より詳細については チュートリアル 6 を確認してください。
from flair.datasets import TREC_6 # load your corpus corpus = TREC_6()
2 番目にパラメータの探索空間を定義する必要があります。そして hyperopt で定義される総ての パラメータ式 を利用できます。
from hyperopt import hp from flair.hyperparameter.param_selection import SearchSpace, Parameter # define your search space search_space = SearchSpace() search_space.add(Parameter.EMBEDDINGS, hp.choice, options=[ [ WordEmbeddings('en') ], [ FlairEmbeddings('news-forward'), FlairEmbeddings('news-backward') ] ]) search_space.add(Parameter.HIDDEN_SIZE, hp.choice, options=[32, 64, 128]) search_space.add(Parameter.RNN_LAYERS, hp.choice, options=[1, 2]) search_space.add(Parameter.DROPOUT, hp.uniform, low=0.0, high=0.5) search_space.add(Parameter.LEARNING_RATE, hp.choice, options=[0.05, 0.1, 0.15, 0.2]) search_space.add(Parameter.MINI_BATCH_SIZE, hp.choice, options=[8, 16, 32])
Attention: 常に貴方の埋め込みを探索空間に追加するべきです (上で示されたように)。異なる種類の埋め込みをテストすることを望まない場合、単純に探索空間に単に一つの埋め込みオプションを渡します、それからそれは総てのテスト実行で使用されます。ここにサンプルがあります :
search_space.add(Parameter.EMBEDDINGS, hp.choice, options=[ [ FlairEmbeddings('news-forward'), FlairEmbeddings('news-backward') ] ])
最後のステップで実際のパラメータ selector を作成しなければなりません。タスクに依拠して TextClassifierParamSelector か SequenceTaggerParamSelector のいずれかを定義して最適化を開始する必要があります。hyperopt が遂行すべき評価実行の最大数を定義できます (max_evals)。評価実行は指定された数のエポックを遂行します (max_epochs)。ノイズのある評価スコアの問題を乗り越えるために、評価実行からの最後の 3 つの評価スコア (dev_score か dev_loss のいずれか) に渡り平均を取ります、これは最終的なスコアを表して hyperopt に渡されます。追加的に、評価実行毎の実行数を指定できます (training_runs)。1 訓練実行より多く指定する場合、一つの評価実行が指定された回数実行されます。最終的な評価スコアは総てのそれらの実行に渡る平均です。
from flair.hyperparameter.param_selection import TextClassifierParamSelector, OptimizationValue # create the parameter selector param_selector = TextClassifierParamSelector( corpus, False, 'resources/results', 'lstm', max_epochs=50, training_runs=3, optimization_value=OptimizationValue.DEV_SCORE ) # start the optimization param_selector.optimize(search_space, max_evals=100)
パラメータセットと評価スコアは result ディレクトリの param_selection.txt に書かれます。最善のパラメータ組合せを選択する一方でどのようなモデルもディスクにストアしません。訓練の間にテスト実行も遂行しません、訓練後にロギング目的でテストセット上一度モデルを評価するだけです。
最善の学習率を見つける
学習率は最も重要なハイパーパラメータの一つでそれはモデルのアーキテクチャを通した損失 landscape のトポロジーとそれが消費する訓練データに基礎的には依拠します。最適学習 (= optimal learning) は訓練スピードを改良してと望ましくはよりパフォーマンスの高いモデルを与えます。Leslie Smith の Cyclical Learning Rates for Training ペーパーで説明されている単純なテクニックは非常に低い学習率で始めてモデルを訓練して SGD の総てのバッチ更新で学習率を指数関数的に増加することです。学習率に関する損失をプロットすることにより典型的には 3 つの明白なフェイズを観測します : 低い学習率については損失は改良せず、最適な学習率範囲では損失は最急で落ちてそして最後のフェイズでは学習率が大き過ぎるようになるにつれて爆発します。そのようなプロットでは、最適な学習率選択は最適なフェイズから最も高い一つを選択するほどに容易です。
そのような実験を実行するために初期化された ModelTrainer で始めて base_path とファイル名とともに find_learning_rate() を呼び出します、そこには学習率と損失を記録します。それからプロッタの plot_learning_rate() 関数を通して生成された結果をプロットして最適な学習率を選択するために learning_rate.png 画像を見ます :
from flair.datasets import WNUT_17 from flair.embeddings import TokenEmbeddings, WordEmbeddings, StackedEmbeddings from flair.trainers import ModelTrainer from typing import List # 1. get the corpus corpus = WNUT_17().downsample(0.1) print(corpus) # 2. what tag do we want to predict? tag_type = 'ner' # 3. make the tag dictionary from the corpus tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type) print(tag_dictionary.idx2item) # 4. initialize embeddings embedding_types: List[TokenEmbeddings] = [ WordEmbeddings('glove'), ] embeddings: StackedEmbeddings = StackedEmbeddings(embeddings=embedding_types) # 5. initialize sequence tagger from flair.models import SequenceTagger tagger: SequenceTagger = SequenceTagger(hidden_size=256, embeddings=embeddings, tag_dictionary=tag_dictionary, tag_type=tag_type, use_crf=True) # 6. initialize trainer trainer: ModelTrainer = ModelTrainer(tagger, corpus) # 7. find learning rate learning_rate_tsv = trainer.find_learning_rate('resources/taggers/example-ner', 'learning_rate.tsv') # 8. plot the learning rate finder curve from flair.visual.training_curves import Plotter plotter = Plotter() plotter.plot_learning_rate(learning_rate_tsv)
カスタム Optimizer
ModelTrainer を初期化するとき今は訓練のために PyTorch の任意の optimizer を利用できます。optimizer に任意の特別なオプション与えるには weight_decay サンプルで示されるように単にそれを指定します :
from torch.optim.adam import Adam trainer = ModelTrainer(tagger, corpus, optimizer=Adam) trainer.train( "resources/taggers/example", weight_decay=1e-4 )
以上