AutoML : NNI 1.5 : 自動調整 : チューナー : 組込みチューナー概要 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/26/2020
* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
自動調整 : チューナー : 組込みチューナー
NNI はパラメータ調整アルゴリズムをセットアップするアプローチを採用するための容易な方法を提供します、それらをチューナーと呼びます。
チューナーは、特定のパラメータ/アーキテクチャ構成のパフォーマンスを評価するためにトライアルからメトリクスを受け取ります。チューナーは次のハイパーパラメータあるいはアーキテクチャ構成をトライアルに送ります。
自動調整 : チューナー : ハイパーパラメータ調整のための組込みチューナー
NNI は組込みチューナーの一部として最先端チューニング・アルゴリズムを提供してそれらを利用することを容易にしています。下は現時点での NNI 組込みチューナーの簡潔な要約です。
Note: チューナーのインストール要件、推奨シナリオ、そしてサンプル configuration を得るにはチューナーの名前をクリックしてください。各アルゴリズムの詳細な説明のためのリンクは各チューナーのための推奨シナリオの最後にあります。ここに幾つかの問題における各種チューナーを比較する 記事 があります。
現在以下のアルゴリズムをサポートしています :
- TPE
TPE (木構造 Parzen 推定器, Tree-structured Parzen Estimator) は SMBO (シーケンシャル・モデルベースの最適化, sequential model-based optimization) アプローチです。SMBO 法は計測履歴に基づきハイパーパラメータのパフォーマンスを見積もるためにモデルをシーケンシャルに構築し、それから続いてこのモデルに基づいてテストするために新しいパラメータを選択します。
参照ペーパー - ランダム探索 (Random Search)
ハイパーパラメータ最適化のためのランダム探索ではランダム探索が驚くほど単純で効果的であるかもしれないことを示します。ハイパーパラメータの事前分布についての知識を持たないときにはベースラインとしてランダム探索を使用できるであろうことを提案します。
参照ペーパー - 焼なまし (Anneal)
この単純なアニーリング・アルゴリズムは事前分布からサンプリングすることにより開始しますが、点からのサンプリングは時間とともに (観測された) 最善のものにどんどん近づいていく傾向があります。このアルゴリズムは応答曲面 (= response surface) の滑らかさを活用するランダム探索の単純なバリエーションです。annealing 率は適応的ではありません。 - Naive Evolution
Naive Evolution (単純な or 先入的知識のない進化) は Large-Scale Evolution of Image Classifiers に由来します。それは探索空間に基づいて集団 (= population) をランダムに初期化します。各世代 (= generation) について、それは次の世代を得るためにより良いものを選択してその上で何某かの変異 (= mutation) (e.g., ハイパーパラメータを変更する、一つの層を追加/除去する) を行ないます。Naive Evolution は動作するために多くのトライアルを要求しますが、新しい特徴を拡張することは非常に単純で容易です。
参照ペーパー - SMAC
SMAC は SMBO (Sequential Model-Based Optimization) に基づいています。カテゴリカル・パラメータを扱うため、それは最も卓越した以前に使用されたモデルクラス (ガウス確率過程モデル) を適合させてランダムフォレストのモデルクラスを SMBO に導入します。NNI によりサポートされる SMAC は SMAC3 Github repo 上のラッパーです。注意してください、SMAC は nnictl パッケージコマンドによりインストールされる必要があります。
参照ペーパー, Github レポジトリ - バッチ・チューナー (Batch tuner)
バッチ・チューナーはユーザにトライアルコードのために様々な configuration (i.e., ハイパーパラメータの選択) を単純に提供することを可能にします。総ての configuration を終了後、実験は完了します。バッチ・チューナーは探索空間 spec で type choice をサポートするだけです。 - グリッドサーチ
グリッドサーチは searchspace ファイルで定義されたハイパーパラメータ空間の手動で指定されたサブセットを通してしらみつぶし探索 (= exhaustive searching) を遂行します。探索空間の受け入れ可能な type は choice, quniform, randint だけであることに注意してください。 - Hyperband
Hyperband は多くの configuration をできるかぎり調査するために限定されたリソースを利用しようとして最終結果として最も有望なものを返します。基本的なアイデアは多くの configuration を生成して小さい数のトライアルについてそれらを実行します。有望でない半分の configuration は破棄され、残りは新しい configuration の選択とともに更に訓練されます。これらの populations のサイズはリソース制約 (e.g. 割当て探索時間) に過敏です。
参照ペーパー - Network Morphism
Network Morphism は深層学習アーキテクチャを自動的に探索するための機能を提供します。それはチャイルドネットワークを生成します、それらは親ネットワークから知識を継承したそれらからの変形です。深さ、幅とスキップコネクションにおける変更を含みます。次に、それは履歴アーキテクチャとメトリックペアを使用してチャイルドネットワークの値を推定します。それからそれは訓練するために最も有望なものを選択します。
参照ペーパー - Metis チューナー
Metis はそれが調整パラメータになるとき次の恩恵を与えます : 多くのツールが最適な configuration の予測だけをする一方で、Metis は 2 つの出力を貴方に与えます : (a) 最適な configuration の現在の予測、そして (b) 次のトライアルのための提案です。それ以上の当て推量はありません。殆どのツールが訓練データセットがノイズのあるデータを持たないことを仮定する一方で、Metis は実際には特定のハイパーパラメータを再サンプリングする必要があるかを知らせます。
参照ペーパー - BOHB
BOHB は Hyperband への追随ワークです。それは、新しい configuration が終了したトライアルを活用することなくランダムに生成されるという、Hyperband の弱点を対象としています。名前 BOHB については、HB は Hyperband を意味し、BO は Bayesian 最適化を意味しています。BOHB はマルチ TPE モデルを構築することにより終了したトライアルを活用し、これらのモデルを通して新しい configuration の比率が生成されます。
参照ペーパー - GP チューナー
ガウス過程チューナーは代行としてガウス過程による sequential model-based 最適化 (SMBO) アプローチです。
参照ペーパー, Github レポジトリ - PPO チューナー
PPO チューナーは PPO アルゴリズムに基づく強化学習チューナーです。
参照ペーパー - PBT チューナー
PBT チューナーは単純な非同期最適化アルゴリズムで、これはパフォーマンスを最大化するためにモデルとそれらのハイパーパラメータの population を結合的に最適化するために固定された計算バジェットを効果的に利用します。
参照ペーパー
組込みチューナーの使用方法
NNI SDK により提供される組込みチューナーの利用は config.yml ファイルで builtinTunerName と classArgs を宣言することを必要とします。このパートでは、使用方法と推奨シナリオ、classArgs 要件とサンプル configuration についての情報とともに各チューナーを紹介します。
Note: 貴方の config.yml ファイルを書く時フォーマットに従ってください。SMAC のように、幾つかの組込みチューナーは nnictl パッケージを使用してインストールされる必要があります。
組込みチューナー名 : TPE
推奨シナリオ
TPE は、ブラックボックスな最適化として、様々なシナリオで使用することができて一般に良いパフォーマンスを示します。特に、制限された計算リソースを持ち少数のトライアルを試すことだけができるときです。巨大な数の実験から、TPE がランダム探索よりも遥かに良いことを見い出せました。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize, オプション, default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。
Note: 巨大スケールのトライアルの同時並列のために TPE の並列性を最適化しました。最適化あるいは turn-on 最適化の原理については、TPE ドキュメント を参照してください。
サンプル構成 :
# config.yml tuner: builtinTunerName: TPE classArgs: optimize_mode: maximize
組込みチューナー名 : Random
推奨シナリオ
ランダム探索は各トライアルがそれほど長くはかからず (e.g., 各トライアルが非常に素早く完了できる、あるいはアセッサーにより早期に停止される)、そして十分な計算リソースを持つときに提案されます。探索空間を一様に調査することを望む場合にも有用です。
ランダム探索は探索アルゴリズムのベースラインとして考えることができます。
詳細説明
サンプル構成 :
# config.yml tuner: builtinTunerName: Random
組込みチューナー名 : Anneal
推奨シナリオ
アニールは各トライアルがそれほど長くはかからず、そして十分な計算リソースを持つときに提案されます (ランダム探索に非常に類似しています)。探索空間の変数がある事前分布からサンプリングできるときにも有用です。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。
サンプル構成 :
# config.yml tuner: builtinTunerName: Anneal classArgs: optimize_mode: maximize
組込みチューナー名 : Evolution
推奨シナリオ
その計算リソースの要件は比較的高いです。特に、局所的な最適条件にはまることを回避するためにそれは巨大な初期集団 (= population) を必要とします。貴方のトライアルが短いかアセッサーを活用するのであれば、このチューナーは良い選択です。貴方のトライアルコードが重み転移をサポートするときにも推奨されます ; つまり、トライアルはその親から収束した重みを継承できるときです。これは訓練プロセスを非常にスピードアップできます。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとります。 - population_size (int value (should > 0)、オプション、default = 20) –
evolution チューナーにおける集団 (trial num) の初期サイズ。ユーザがアルゴリズムから多くを得られるように population_size は concurrency よりも遥かに大きいことが推奨されます (そして少なくとも concurrency、そうでなければチューナーはパラメータの最初の生成で失敗します)。
サンプル構成 :
# config.yml tuner: builtinTunerName: Evolution classArgs: optimize_mode: maximize population_size: 100
組込みチューナー名 : SMAC
SMAC は現在 Windows 上の実行をサポートしないことに注意してください。特定の理由については、GitHub issue を参照してください。
インストール
SMAC は最初の使用前に次のコマンドによりインストールされる必要があります。リマインダーとして、swig が SMAC のために必要です ; Ubuntu については swig は apt でインストールできます。
nnictl package install --name=SMAC
推奨シナリオ
TPE と類似して、SMAC もまた様々なシナリオで試せるブラックボックス・チューナーで、計算リソースが制限されているときに提案されます。それは離散的なハイパーパラメータのために最適化され、従って貴方のハイパーパラメータの多くが離散的であるときに提案されます。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - config_dedup (True or False、オプション、default = False) –
True の場合、チューナーは既に生成された configuration を生成しません。
False の場合、configuration は二度生成されるかもしれませんが、比較的巨大な探索空間については稀です。
サンプル構成 :
# config.yml tuner: builtinTunerName: SMAC classArgs: optimize_mode: maximize
組込みチューナー名 : BatchTuner
推奨シナリオ
前もって試すことを望む configuration が決定すれば、それらを (choice を使用して) 探索空間ファイルでリストしてそれらをバッチ・チューナーを使用して実行できます。
詳細説明
サンプル構成 :
# config.yml tuner: builtinTunerName: BatchTuner
BatchTuner のための探索空間は次のようなものであることに注意してください :
{ "combine_params": { "_type" : "choice", "_value" : [{"optimizer": "Adam", "learning_rate": 0.00001}, {"optimizer": "Adam", "learning_rate": 0.0001}, {"optimizer": "Adam", "learning_rate": 0.001}, {"optimizer": "SGD", "learning_rate": 0.01}, {"optimizer": "SGD", "learning_rate": 0.005}, {"optimizer": "SGD", "learning_rate": 0.0002}] } }
この探索空間ファイルは高位キー combine_params を含みます。探索空間の params の type は choice でなければなりませんそして値は総ての結合された params 値を含みます。
組込みチューナー名 : Grid Search
推奨シナリオ
探索空間の受け入れ可能な type は choice, quniform と randint だけであることに注意してください。
これは探索空間が小さいときに提案されます。総ての探索空間をしらみつぶしに sweep することが適しているときに提案されます。
詳細説明
サンプル構成 :
# config.yml tuner: builtinTunerName: GridSearch
組み込みチューナー名 : Hyperband
推奨シナリオ
これは制限された計算リソースを持ちながら比較的巨大な探索空間を持つときに提案されます。それは中間結果が良いまたは悪い最終結果をある程度示せるシナリオで上手く動作します。例えば、モデルが訓練で早期により正確なモデルが後でも更に正確なときです。
詳細説明
classArg の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - R (int、オプション、default = 60) – トライアルに割り当てられる最大量 (= budget) (ミニバッチかエポックの数であり得ます)。各トライアルはそれがどのくらい長く実行されるかを制御するために TRIAL_BUDGET を使用するべきです。
- eta (int、オプション、default = 3) – (eta-1)/eta は破棄されるトライアルの割合です。
サンプル構成 :
# config.yml advisor: builtinAdvisorName: Hyperband classArgs: optimize_mode: maximize R: 60 eta: 3
組み込みチューナー名 : NetworkMorphism
インストール
NetworkMorphism は PyTorch と Keras を必要としますので、ユーザはそれらを最初にインストールするべきです。対応する requirements ファイルは ここ です。
推奨シナリオ
これは、深層学習メソッドを貴方のタスクに適用することを望むがしかしネットワークをどのように選択または設計するかのアイデアを持たないときに提案されます。貴方自身のデータセットと貴方自身のデータ増強メソッドに適合させるためにこの サンプル を変更して良いです。バッチサイズ、学習率や optimizer を変更することもできます。現在、このチューナーはコンピュータビジョン・ドメインをサポートするだけです。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - task ((‘cv’)、オプション、default = ‘cv’) – 実験のドメイン。今のところは、このチューナーはコンピュータ・ビジョン (cv) ドメインをサポートするだけです。
- input_width (int、オプション、default = 32) – 入力画像幅
- input_channel (int、オプション、default = 3) – 入力画像チャネル
- n_output_node (int、オプション、default = 10) – クラス数
サンプル構成 :
# config.yml tuner: builtinTunerName: NetworkMorphism classArgs: optimize_mode: maximize task: cv input_width: 32 input_channel: 3 n_output_node: 10
組み込みチューナー名 : MetisTuner
探索空間 type の受け入れる type は quniform, uniform, randint と数値 choice だけであることに注意してください。数値だけがサポートされます、何故ならば値は異なるポイント間の「距離」を評価するために使用されるからです。
推奨シナリオ
TPE と SMAC に類似して、Metis はブラックボックス・チューナーです。貴方のシステムが各トライアルを終えるのに時間がかかるのであれば、Metis はランダム探索のような他のアプローチよりも好ましいでしょう。更に、Metis は続くトライアルのガイダンスを提供します。ここに Metis の利用の サンプル があります。ユーザは精度のような最終結果を NNI SDK を呼び出すことによりチューナーに送る必要があるだけです。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。
サンプル構成 :
# config.yml tuner: builtinTunerName: MetisTuner classArgs: optimize_mode: maximize
組み込みチューナー名 : BOHB
インストール
BOHB アドバイザーは ConfigSpace パッケージを必要とします。ConfigSpace は次のコマンドを使用してインストールできます。
nnictl package install --name=BOHB
推奨シナリオ
Hyperband と同様に、BOHB は制限された計算リソースを持ちながら比較的巨大な探索空間を持つときに提案されます。それは中間結果が、良いあるいは悪い最終結果をある程度示せるシナリオで上手く遂行します。この場合、それは Bayesian 最適化の利用により Hyperband よりも良い configuration に収束するかもしれません。
詳細説明
classArgs の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - (訳注: 以下省略。必要な場合には 原文 を参照してください。)
サンプル構成 :
advisor: builtinAdvisorName: BOHB classArgs: optimize_mode: maximize min_budget: 1 max_budget: 27 eta: 3
組み込みチューナー名 : GPTuner
探索空間内の受け入れる type は randint, uniform, quniform, loguniform, qloguniform と数値 choice だけであることに注意してください。数値だけがサポートされます、何故ならば値は異なるポイント間の「距離」を評価するために使用されるからです。
推奨シナリオ
Sequential Model-based グローバル最適化 (SMBO) アルゴリズムのストラテジーとして、GP チューナーは (acquisition 関数の最大値を見つける) proxy (代理) 最適化問題を利用します、これは、依然として困難であるにもかかわらず、解くために (計算的な意味で) コストが安く、それを解くために一般的なツールが使用できます。従って、最適化される関数が評価するために非常に高価であるような状況のために最も適切です。GP は計算リソースが制限されているときに利用できます。けれども、GP チューナーはグラム行列を逆にする要件のために O(N^3) で増大する計算コストを持ちますので、多くのトライアルが必要なときには適しません。
詳細説明
classArg の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - (訳注: 以下省略。必要な場合には 原文 を参照してください。)
サンプル構成 :
# config.yml tuner: builtinTunerName: GPTuner classArgs: optimize_mode: maximize utility: 'ei' kappa: 5.0 xi: 0.0 nu: 2.5 alpha: 1e-6 cold_start_num: 10 selection_num_warm_up: 100000 selection_num_starting_points: 250
組み込みチューナー名 : PPOTuner
探索空間内の受け入れる type は mutable_layer だけであることに注意してください。optional_input_size は 0, 1 または [0, 1] だけであり得ます。
推奨シナリオ
PPOTuner は PPO アルゴリズムに基づく強化学習チューナーです。PPOTuner はニューラルアーキテクチャ探索を行なう NNI NAS インターフェイスを使用するとき利用できます。一般に、強化学習アルゴリズムはより多くの計算リソースを必要としますが、PPO アルゴリズムは他よりも比較的効率的です。多くの総量の利用可能な計算リソースを持つときこのチューナーを利用することが勧められます。mnist-nas (訳注: リンク切れ) サンプルのような非常に単純なタスクでそれを試せるでしょう。詳細 を見てください。
classArg の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - (訳注: 以下省略。必要な場合には 原文 を参照してください。)
サンプル構成 :
# config.yml tuner: builtinTunerName: PPOTuner classArgs: optimize_mode: maximize
組み込みチューナー名 : PBTTuner
推奨シナリオ
Population Based 訓練 (PBT) は並列探索法とシークエンシャル最適化法を橋渡しして拡張します。それはよりよいものを探索するために定期的に現在良いパフォーマンスのものから重みを継承することにより、比較的小さい計算リソースを必要とします。PBTTuner では、ユーザはスクラッチからモデルを訓練することにより訓練されたモデルを再生成できるような configuration ではなく、最終的に訓練されたモデルを得ます。これはモデル重みが探索プロセス全体をと推して定期的に継承されるからです。PBT はまた訓練アプローチとしても見れます。特定の configuration を得る必要がなく、単に良いモデルを期待する場合には、PBTTuner は良い選択です。詳細 を見てください。
classArg の要件
- optimize_mode (maximize または minimize、オプション、default = maximize) –
‘maximize’ の場合、チューナーはメトリクスを最大化しようとします。
‘minimize’ の場合、チューナーはメトリクスを最小化しようとします。 - (訳注: 以下省略。必要な場合には 原文 を参照してください。)
サンプル構成 :
# config.yml tuner: builtinTunerName: PBTTuner classArgs: optimize_mode: maximize
このチューナーを利用するためには、トライアルコードはそれに応じて変更されるべきです、詳細は PBTTuner のドキュメント を参照してください。
以上