May the Neural Networks be with you

ニューラルネットワークと共にあらんことを

Allentuneを用いたAllenNLPモデルのハイパーパラメータのチューニング

こんにちは@shunk031です。

この記事は彌冨研 Advent Calendar 2019 20日目の記事です。

前回の記事は「期待検証性能(expected validation performance)」をもとにしたパラメータ探索の検証についてでした。

shunk031.hatenablog.com

今回の記事はallentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介します。このallentuneには 期待検証性能 によるハイパーパラメータ探索の検証が行える手法が実装されています。

github.com

AllenNLPはPyTorchで構築されたリサーチにフォーカスしたオープンソースNLPライブラリです。

github.com

アルゴリズム

ハイパーパラメータのサンプリング手法

ハイパーパラメータ探索のアルゴリズムとして、random searchgrid search が実装されています。これらは Rayが提供しているものを使用しています。

期待検証性能によるパラメータ探索の検証

allentuneのアルゴリズムは以下の論文が元になっています。

arxiv.org

使い方

基本的にはallentuneのREADMEを参考に手順を踏むと実行可能ですが、依存しているパッケージのバージョンまわりで少しハマりポイントがあります。

インストール

レポジトリからクローンしてきてpipでインストールします。

$ git clone https://github.com/allenai/allentune.git
$ cd allentune
$ pip install --editable .

2019年12月現在の情報

このとき、普通にインストールすると依存でTensorflowの最新版(2019年12月現在v2.0.0が入ります)がインストールされますが、Rayが2系に対応していないため、Tensorflow 1.xxx系 を使ってください。

モデルの設定

学習を行うモデルの設定を記述します。例として classifier.jsonnet として定義しています (公式の設定例)

ハイパーパラメータとなる値は環境変数を通じて設定されるので std.extVar 等のjsonnetのメソッドを通じて流れるように設定ファイルを記述する必要があります。

通常のAllenNLPでのjsonnetでは相対パスが読み込めますが、allentuneの場合はjsonnetに相対パスを書いている場合は相対パスが解決できずエラーで読み込めなくなります。絶対パスを書く必要がありそうです。

探索範囲の指定

search_space.json (公式の設定例) を作成して、探索範囲を指定します。allentuneでは以下のサンプリング手法がサポートしています:

  • choice
    • 指定した要素群から選択する手法
  • integer
    • 指定した範囲内で整数をランダムにサンプルする手法
  • uniform
    • 指定した範囲内で一様分布に従った浮動小数点数をサンプルする手法
  • loguniform
    • 指定した範囲内で対数一様分布に従った浮動小数点数をサンプルする手法

ハイパーパラメータとして与えたい変数と、そのハイパーパラメータのサンプリング手法、そしてその範囲を与える形です。

実行方法

パラメータの探索範囲をと探索方法を指定する search_space.json とモデルの設定ファイル classifier.jsonnet が用意できたら、以下のように allentune コマンドを用いてハイパーパラメータ探索を開始できます。

$ allentune search \
    --experiment-name classifier_search \
    --num-cpus 56 \
    --num-gpus 4 \
    --cpus-per-trial 1 \
    --gpus-per-trial 1 \
    --search-space examples/search_space.json \
    --num-samples 30 \
    --base-config examples/classifier.jsonnet

--num-gpus に50を渡すと50GPUに対してハイパーパラメータ探索が実行されます。あとは実行して最強のハイパーパラメータを探してもらうだけです。論文でも読んで待ちましょう。

探索結果の確認

ハイパーパラメータの探索結果を確認する場合、以下のコマンドを実行することで performance-metric に指定したメトリックに対してベストなハイパーパラメータを確認することが可能です。

$ allentune report \
    --log-dir logs/classifier_search/ \
    --performance-metric best_validation_accuracy \
    --model cnn

期待検証性能の可視化

ハイパーパラメータの探索施行数と期待検証性能の関係図をプロットすることが可能です。 期待検証性能がサチってきていることがわかれば、それ以上探索しなくてもよくなります。

$ allentune plot \
    --data-name IMDB \
    --subplot 1 1 \
    --figsize 10 10 \
    --result-file logs/classifier_search/results.jsonl \
    --output-file classifier_performance.pdf \
    --performance-metric-field best_validation_accuracy \
    --performance-metric accuracy

所感

allentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介しました。 ちょうどこのブログを書いていたときにallentuneでハイパーパラメータ探索を実行していました。

こんにちは@shunk031です。 Geforce RTX 2080Tiを50枚ほど使うとぽかぽかします。みなさんもぜひ試してみてください。

ハイパーパラメータ探索のライブラリでは hyperoptoptunaGPyOpt 等がありますが、AllenNLPで実装したモデルに対して簡単にチューニングを実行できるallentuneはNLPの研究者や技術者には必須のものであると考えています。ぜひみなさん使ってみてください。