Auto ML : NNI Tutorials : チューナー (1) 組み込みチューナー (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/01/2019
* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- https://nni.readthedocs.io/en/latest/tuners.html
- https://nni.readthedocs.io/en/latest/Builtin_Tuner.html
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
NNI Tutorials : チューナー
NNI はパラメータ調整アルゴリズムをセットアップするアプローチを採用するための簡単な方法を提供します、それらをチューナーと呼びます。
チューナーは、特定のパラメータ/アーキテクチャ構成のパフォーマンスを評価するためにトライアルからメトリクスを受け取ります。
NNI では、チューナーを設定するために 2 つのアプローチをサポートします : 1 番目は nni sdk により提供される組み込みチューナーを直接的に使用します、2 番目は貴方自身でチューナーファイルをカスタマイズします。チューナー & アセッサーの機能を結合する Advisor もまた持ちます。
NNI Tutorials : 組み込みチューナー
NNI は組み込みチューナーとして最先端チューニングアルゴリズムを提供してそれらを使用することを容易にしています。下は現時点での NNI 組み込みチューナーの簡潔な要約です。
現在以下のアルゴリズムをサポートしています :
- TPE
TPE (Tree-structured Parzen Estimator, 木構造 Parzen 推定器) は SMBO (sequential model-based optimization, シーケンシャル・モデルベースの最適化) アプローチです。SMBO 法は計測履歴に基づきハイパーパラメータのパフォーマンスを見積もるためにモデルをシーケンシャルに構築し、それから続いてこのモデルに基づいてテストするために新しいパラメータを選択します。
参照ペーパー - ランダム探索 (Random Search)
ハイパーパラメータ最適化のためのランダム探索ではランダム探索が驚くほど単純で効果的であるかもしれないことを示します。ハイパーパラメータの事前分布について知識を持たないときにはベースラインとしてランダム探索を使用できることを提案します。
参照ペーパー - 焼きなまし (Anneal)
この単純なアニーリング・アルゴリズムは事前分布からサンプリングすることにより開始しますが、点からのサンプリングは時間とともに (観測される) 最善のものにどんどん近づいていく傾向があります。このアルゴリズムは応答曲面 (= response surface) の滑らかさを活用するランダム探索の単純なバリエーションです。annealing rate は adaptive ではありません。 - Naive Evolution
Naive Evolution は “Large-Scale Evolution of Image Classifiers” に由来します。それはランダムに探索空間上 population-based を初期化します。各世代 (= generation) について、それは次の世代を得るためにより良いものを選択してその上で何某かの変更 (= mutation) (e.g., ハイパーパラメータを変更する、一つの層を追加/除去する) を行ないます。Naive Evolution は動作するために多くのトライアルを要求しますが、新しい特徴を拡張することは非常に単純で容易です。
参照ペーパー - SMAC
SMAC は SMBO (Sequential Model-Based Optimization) に基づいています。カテゴリカル・パラメータを扱うために、それは最も卓越した以前に使用されたモデルクラス (ガウス確率過程モデル) を適合させてランダムフォレストのモデルクラスを SMBO に導入します。nni によりサポートされる SMAC は SMAC3 Github repo 上のラッパーです。注意してください、SMAC は nnictl パッケージコマンドによりインストールされる必要があります。
参照ペーパー, Github Repo - バッチ・チューナー (Batch tuner)
バッチ・チューナーはユーザにトライアルコードのために様々な configuration (i.e., ハイパーパラメータの選択) を単純に提供することを可能にします。総ての configuration を終了後、実験は完了します。バッチ・チューナーは探索空間 spec で型 (= type) choice をサポートするだけです。 - グリッドサーチ
グリッドサーチは searchspace で定義されたハイパーパラメータ空間の手動で指定されたサブセットを通してしらみつぶし探索 (= exhaustive searching) を遂行します。受け入れ可能な探索空間の型は choice, quniform, qloguniform だけであることに注意してください。quniform と qloguniform の数字 q は特別な意味を持ちます (探索空間 spec の spec とは異なります)。範囲 low と high から公平にサンプリングされる値の数を意味します。 - Hyperband
Hyperband は多くの configuration をできるかぎり調査するために限定されたリソースを利用しようとして最終結果を得るために有望なもの達を見出します。基本的なアイデアは多くの configuration を生成して有望な一つを見い出すために少数の STEPs の間それらを実行して、それから幾つかのより有望なものを選択するために更にそれらの有望なもの達を訓練します。
参照ペーパー - Network Morphism
Network Morphism は深層学習モデルのアーキテクチャを自動的に探索するための機能を提供します。総てのチャイルドネットワークはその親ネットワークから知識を継承して多様なネットワークのタイプに変形 (=morph) します、深さ、幅とスキップコネクションを含みます。次に、それは履歴アーキテクチャとメトリックペアを使用してチャイルドネットワークの値を推定します。それからそれは訓練するために最も有望なものを選択します。
参照ペーパー - Metis チューナー
Metis はそれがチューニング・パラメータになるとき次の恩恵を与えます : 多くのツールが最適な configuration を予測だけをする一方で、Metis は 2 つの出力を貴方に与えます : (a) 最適な configuration の現在の予測、そして (b) 次のトライアルのための提案です。それ以上の当て推量はありません。殆どのツールが訓練データセットがノイズのあるデータを持たないことを仮定する一方で、Metis は実際には特定のハイパーパラメータを再サンプリングする必要があるかを知らせます。
参照ペーパー
組み込みチューナーの使用方法
NNI SDK により提供される組み込みチューナーの利用は config.yml ファイルで builtinTunerName と classArgs を宣言することを必要とします。このパートでは、推奨シナリオ (= suggested scenarios)、classArg 要件と各チューナーのサンプルについての詳細な使用方法を紹介します。
Note: 貴方の config.yml ファイルを書く時フォーマットに従ってください。SMAC のように、幾つかの組み込みチューナーは nnictl パッケージによりインストールされる必要があります。
組み込みチューナー名 : TPE
推奨シナリオ
TPE は、ブラックボックスな最適化として、様々なシナリオで使用することができて一般に良いパフォーマンスを示します。特に、制限された計算リソースを持ち少数のトライアルを試すことだけができるときです。巨大な数の実験から、TPE がランダム探索よりも遥かに良いことを見い出せました。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: TPE classArgs: optimize_mode: maximize
組み込みチューナー名 : Random
推奨シナリオ
ランダム探索は各トライアルがそれほど長くはかからず (e.g., 各トライアルがすぐに完了できる、あるいはアセッサーにより迅速に早期に停止される)、そして十分な計算リソースを持つときに提案されます。あるいは探索空間を一様に調査することを望むでしょう。ランダム探索は探索アルゴリズムのベースラインとして考えることができます。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: Random classArgs: optimize_mode: maximize
組み込みチューナー名 : Anneal
推奨シナリオ
アニールは各トライアルがそれほど長くはかからず、そして十分な計算リソースを持つときに提案されます (ランダム探索と殆ど同じです)。あるいは探索空間の変数がある事前分布からサンプリングできるでしょう。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: Anneal classArgs: optimize_mode: maximize
組み込みチューナー名 : Evolution
推奨シナリオ
その計算リソースの要件は比較的高いです。特に、局所的な最適条件にはまることを回避するためにそれは巨大な初期個体群 (= population) を必要とします。貴方のトライアルが短いかアセッサーを活用するのであれば、このチューナーは良い選択です。そして、貴方のトライアルコードが weight transfer をサポートする、つまり、トライアルは converged weights をその親から継承できるときにより提案されます。これは訓練進捗を大いにスピードアップできます。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: Evolution classArgs: optimize_mode: maximize
組み込みチューナー名 : SMAC
インストール
SMAC は最初の使用前に次のコマンドによりインストールされる必要があります。
nnictl package install --name=SMAC
推奨シナリオ
TPE と類似して、SMAC もまた様々なシナリオで試せるブラックボック・チューナーで、計算リソースが制限されているときに提案されます。それは離散的なハイパーパラメータのために最適化され、従って貴方のハイパーパラメータの多くが離散的であるときに提案されます。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: SMAC classArgs: optimize_mode: maximize
組み込みチューナー名 : BatchTuner
推奨シナリオ
試すことを望む configuration が決定すれば、それらを (choice を使用して) searchspace ファイルでリストしてそれらをバッチ・チューナーを使用して実行できます。
使用例 :
# 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 でなければなりませんそして値は総て combined-params 値を含みます。
組み込みチューナー名 : Grid Search
推奨シナリオ
受け入れ可能な探索空間の型は choice, quniform, qloguniform だけであることに注意してください。quniform と qloguniform の数字 q は特別な意味を持ちます (探索空間 spec の spec とは異なります)。範囲 low と high から公平にサンプリングされる値の数を意味します。
それは探索空間が小さいときに提案され、総ての探索空間をしらみつぶしに sweep することに適しています。
使用例 :
# config.yml tuner: builtinTunerName: GridSearch
組み込みチューナー名 : Hyperband
推奨シナリオ
それは制限された計算リソースを持ちながら比較的巨大な探索空間を持つときに提案されます。中間結果 (e.g. 精度) が良いまたは悪い最終結果 (e.g. 精度) をある程度反映できるシナリオで上手く動作します。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。 - R (int, optional, default = 60) – トライアルの割り当てられる最大 STEPs (ミニバッチかエポックの数であり得ます)。各トライアルはそれがどのくらい長く実行されるかを制御するために STEPS を使用するべきです。
- eta (int, optional, default = 3) – (eta-1)/eta は破棄されるトライアルの割合です。
使用例 :
# config.yml advisor: builtinAdvisorName: Hyperband classArgs: optimize_mode: maximize R: 60 eta: 3
組み込みチューナー名 : NetworkMorphism
インストール
NetworkMorphism は pyTorch を必要としますので、ユーザはそれを最初にインストールするべきです。
推奨シナリオ
深層学習メソッドを貴方のタスク (貴方自身のデータセット) に適用することを望むがしかしネットワークをどのように選択して設計するかのアイデアを持たないことが提示されます。貴方自身のデータセットと貴方自身のデータ増強メソッドに fit させるために サンプル を変更します。バッチサイズ、学習率や optimizer を変更することもできます。良いネットワーク・アーキテクチャを見つけるための異なるタスクにも適します。今はこのチューナーはコンピュータビジョン・ドメインをサポートするだけです。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。 - task ((‘cv’), optional, default = ‘cv’) – 実験のドメイン、今のところは、このチューナーはコンピュータ・ビジョン (cv) ドメインをサポートするだけです。
- input_width (int, optional, default = 32) – 入力画像幅
- input_channel (int, optional, default = 3) – 入力画像チャネル
- n_output_node (int, optional, default = 10) – クラス数
使用例 :
# config.yml tuner: builtinTunerName: NetworkMorphism classArgs: optimize_mode: maximize task: cv input_width: 32 input_channel: 3 n_output_node: 10
組み込みチューナー名 : MetisTuner
探索空間の受け入れる型は choice, quniform, uniform と randint だけであることに注意してください。
インストール
Metis チューナーは sklearn を必要としますので、ユーザは最初にそれをインストールするべきです。ユーザはそれをインストールするために “pip3 install sklearn” を使用できるでしょう。
推奨シナリオ
TPE と SMAC に類似して、Metis はブラックボックス・チューナーです。貴方のシステムが各トライアルを終えるのに時間がかかるのであれば、Metis はランダム探索のような他のアプローチよりも好ましいでしょう。更に、Metis は続くトライアルのガイダンスを提供します。ユーザは精度のような最終結果を nni SDK を呼び出すことによりチューナーに送る必要があるだけです。
classArg の要件
- optimize_mode (maximize または minimize, optional, default = maximize) –
‘maximize’ の場合、チューナーはより大きな expectation でハイパーパラメータ・セットを返します。
‘minimize’ の場合、チューナーはより小さな expectation でハイパーパラメータ・セットを返します。
使用例 :
# config.yml tuner: builtinTunerName: MetisTuner classArgs: optimize_mode: maximize
以上