ホーム » NNI

NNI」カテゴリーアーカイブ

AutoML : NNI 1.5 : 自動調整 : 上級 : アドバイザーのカスタマイズ

AutoML : NNI 1.5 : 自動調整 : 上級 : How To – 貴方自身のアドバイザーをカスタマイズする (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/01/2020

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : 上級 : How To – 貴方自身のアドバイザーをカスタマイズする

アドバイザーは automl アルゴリズムがチューナーとアセッサーの両者のメソッドを望むシナリオを対象としています。アドバイザーはそれがトライアル・パラメータ・リクエスト、最終結果を受け取り、そしてトライアル・パラメータを生成するという点でチューナーに類似しています。また、それが中間結果、トライアルの最終状態を受け取り、そしてトライアル kill コマンドを送ることができるという点でアセッサーに類似しています。アドバイザーを使用する場合、チューナーとアセッサーは同時に使用されることが許されないことに注意してください。

ユーザがカスタマイズされたアドバイザーを実装することを望む場合、以下が必要なだけです :

 
1. MsgDispatcherBase クラスから継承して Advisor を定義する。例えば :

from nni.msg_dispatcher_base import MsgDispatcherBase

class CustomizedAdvisor(MsgDispatcherBase):
    def __init__(self, ...):
        ...

 
2) handle_request を除いてプレフィクス handle_ でメソッドを実装する。MsgDispatcherBase のための docs を有用と見出すかもしれません。

 
3) 実験 YAML config ファイルで貴方のカスタマイズされたアドバイザーを configure する

チューナーとアセッサーと同様です。NNI は貴方のカスタマイズされた Advisor クラスの位置を特定してクラスをインスタンス化する必要がありますので、カスタマイズされた Advisor クラスの位置を指定してパラメータとしてリテラル値を __init__ コンストラクタに渡す必要があります。

advisor:
  codeDir: /home/abc/myadvisor
  classFileName: my_customized_advisor.py
  className: CustomizedAdvisor
  # Any parameter need to pass to your advisor class __init__ constructor
  # can be specified in this optional classArgs field, for example
  classArgs:
    arg1: value1

貴方のアドバイザーの作業ディレクトリは <home>/nni/experiments/<experiment_id>/log で、これは環境変数 NNI_LOG_DIRECTORY で取得できることに注意してください。

 

サンプル

ここ でサンプルを提供しています。

 

以上






AutoML : NNI 1.5 : 自動調整 : 上級 : アセッサーのカスタマイズ

AutoML : NNI 1.5 : 自動調整 : 上級 : アセッサーのカスタマイズ (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/01/2020

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : 上級 : アセッサーのカスタマイズ

NNI は調整要求のために貴方自身でアセッサーを構築することをサポートします。

カスタマイズされたアセッサーを実装することを望む場合、行なうべき 3 つのことがあります :

  1. 基底 Assessor クラスを継承する。
  2. assess_trial 関数を実装する。
  3. 実験 YAML config ファイルで貴方のカスタマイズされたアセッサーを configure する。

 
1. Inherit the base Assessor class

from nni.assessor import Assessor

class CustomizedAssessor(Assessor):
    def __init__(self, ...):
        ...

 
2. assess_trial 関数を実装する

from nni.assessor import Assessor, AssessResult

class CustomizedAssessor(Assessor):
    def __init__(self, ...):
        ...

    def assess_trial(self, trial_history):
        """
        Determines whether a trial should be killed. Must override.
        trial_history: a list of intermediate result objects.
        Returns AssessResult.Good or AssessResult.Bad.
        """
        # you code implement here.
        ...

 
3. 実験 YAML config ファイルで貴方のカスタマイズされたアセッサーを configure する

NNI は貴方のカスタマイズされた Assessor クラスの位置を特定してクラスをインスタンス化する必要がありますので、カスタマイズされた Assessor クラスの位置を指定してパラメータとしてリテラル値を __init__ コンストラクタに渡す必要があります。

assessor:
  codeDir: /home/abc/myassessor
  classFileName: my_customized_assessor.py
  className: CustomizedAssessor
  # Any parameter need to pass to your Assessor class __init__ constructor
  # can be specified in this optional classArgs field, for example
  classArgs:
    arg1: value1

2 内で注意してください。オブジェクト trial_history は正確に、トライアルが SDK report_intermediate_result 関数を使用してアセッサーに送るオブジェクトです。

アセッサーの作業ディレクトリは <home>/nni/experiments/<experiment_id>/log で、これは環境変数 NNI_LOG_DIRECTORY で取得できます。

より詳細なサンプルは以下で見れるでしょう :

 

以上






AutoML : NNI 1.5 : 自動調整 : 上級 : チューナーのカスタマイズ

AutoML : NNI 1.5 : 自動調整 : 上級 : チューナーのカスタマイズ (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/31/2020

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : 上級 : チューナーのカスタマイズ

チューナーをカスタマイズする

NNI は組込みチューナーで先端技術の調整アルゴリズムを提供します。NNI は調整要件のために貴方自身でチューナーを構築することをサポートします。

貴方自身の調整アルゴリズムを実装することを望むのであれば、カスタマイズされたチューナーを実装できます、行なうべき 3 つのことがあります :

  1. 基底 Tuner クラスを継承する
  2. receive_trial_result と generate_parameter 関数を実装する
  3. 実験 YAML config ファイルで貴方のカスタマイズされたチューナーを configure する

 
ここにサンプルがあります :

1. 基底 Tuner クラスを継承する

from nni.tuner import Tuner

class CustomizedTuner(Tuner):
    def __init__(self, ...):

 
2. receive_trial_result と generate_parameter 関数を実装する

from nni.tuner import Tuner

class CustomizedTuner(Tuner):
    def __init__(self, ...):
        ...

    def receive_trial_result(self, parameter_id, parameters, value, **kwargs):
    '''
    Receive trial's final result.
    parameter_id: int
    parameters: object created by 'generate_parameters()'
    value: final metrics of the trial, including default metric
    '''
    # your code implements here.
    ...

    def generate_parameters(self, parameter_id, **kwargs):
    '''
    Returns a set of trial (hyper-)parameters, as a serializable object
    parameter_id: int
    '''
    # your code implements here.
    return your_parameters

receive_trial_result はパラメータ入力として parameter_id, parameters, value を受け取ります。また、Tuner はトライアルが送ったものと正確に同じ value オブジェクトを受け取ります。

generate_parameters 関数から返される your_parameters は NNI SDK により json オブジェクトとして pack されます。NNI SDK は json オブジェクトを unpack してトライアルは正確に同じ your_parameters を Tuner から受け取ります。

例えば : 貴方がこのように generate_parameters を実装する場合 :

def generate_parameters(self, parameter_id, **kwargs):
    '''
    Returns a set of trial (hyper-)parameters, as a serializable object
    parameter_id: int
    '''
    # your code implements here.
    return {"dropout": 0.3, "learning_rate": 0.4}

それは貴方のチューナーが常にパラメータ {“dropout”: 0.3, “learning_rate”: 0.4} を生成することを意味します。それからトライアルは API nni.get_next_parameter() を呼び出すことにより {“dropout”: 0.3, “learning_rate”: 0.4} を受け取ります。ひとたびトライアルが結果 (通常はある種のメトリクス) とともに終了すれば、それは API nni.report_final_result() を呼び出すことにより結果をチューナーに送ることができます、例えば nni.report_final_result(0.93) です。それから貴方のチューナーの receive_trial_result 関数は次のように結果を受け取ります :

parameter_id = 82347
parameters = {"dropout": 0.3, "learning_rate": 0.4}
value = 0.93

貴方のチューナーの作業ディレクトリは <home>/nni/experiments/<experiment_id>/log で、これは環境変数 NNI_LOG_DIRECTORY で受け取ることができて、従って、貴方自身のチューナーのディレクトリでファイル (e.g., data.txt) にアクセスすることを望む場合、open(‘data.txt’, ‘r’) は使用できないことに注意してください。代わりに、以下を使用するべきです :

_pwd = os.path.dirname(__file__)
_fd = open(os.path.join(_pwd, 'data.txt'), 'r')

これは貴方のチューナーが貴方のチューナーのディレクトリで実行されないからです (i.e., pwd は貴方自身のチューナーのディレクトリではありません)。

 
3. 実験 YAML config ファイルで貴方のカスタマイズされたチューナーを configure する

NNI は貴方のカスタマイズされたチューナークラスの位置を特定してクラスをインスタンス化する必要がありますので、カスタマイズされたチューナークラスの位置を指定してパラメータとしてリテラル値を __init__ コンストラクタに渡す必要があります。

tuner:
  codeDir: /home/abc/mytuner
  classFileName: my_customized_tuner.py
  className: CustomizedTuner
  # Any parameter need to pass to your tuner class __init__ constructor
  # can be specified in this optional classArgs field, for example
  classArgs:
    arg1: value1

より詳細なサンプルは以下を見ることができるでしょう :

 

より進んだ automl アルゴリズムを書く

上のメソッドは通常は一般的なチューナーを書くために十分です。けれども、よりパワフルな automl アルゴリズムを持つために、ユーザはより多くのメソッド、例えば、中間結果、トライアルの状態 (アセッサーのメソッド) も望むかも知れません。そのため、アドバイザーと呼ばれるもう一つの概念を持ちます、これは src/sdk/pynni/nni/msg_dispatcher_base.py の MsgDispatcherBase から直接に継承します。カスタマイズされたアドバイザーをどのように書くかについては ここ を参照してください。

 

以上






AutoML : NNI 1.5 : 自動調整 : アセッサー : 組込みアセッサー

AutoML : NNI 1.5 : 自動調整 : アセッサー : 組込みアセッサー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/30/2020

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : アセッサー : 組込みアセッサー

計算リソースを節約するため、NNI は早期停止 (= early stopping) ポリシーをサポートしていてこのジョブを行なうためにアセッサー (= Assessor) と呼ばれるインターフェイスを持ちます。

アセッサーはトライアルから中間結果を受け取り、そしてトライアルが特定のアルゴリズムを使用して kill されるべきかを決定します。トライアル実験がひとたび早期停止条件に適合すれば (これはアセッサーが最終結果について悲観的であることを意味します)、アセッサーはトライアルを kill してトライアルのステータスは EARLY_STOPPED になります。

ここに ‘maximize’ モードの ‘Curvefitting’ アセッサーを使用した後の MNIST の実験結果があります。アセッサーが悪いハイパーパラメータを持つ多くのトライアルを前もって成功的に 早期停止 したことを見れます。アセッサーを使用する場合、同じ計算リソースを使用してより良いハイパーパラメータを得るかもしれません。

実装コード・ディレクトリ : [config_assessor.yml](https://github.com/Microsoft/nni/blob/master/examples/trials/mnist-tfv1/config_assessor.yml)

 

組込みアセッサー : 概要

NNI は組込みアセッサー内で最先端の調整アルゴリズムを提供してそれらを容易に利用できるようにしています。下は NNI の現在の組込みアセッサーの簡潔な概要です。

Note : 各アセッサーのインスール要件、推奨使用シナリオ、そして config サンプルを得るためにはアセッサーの名前をクリックしてください。各アルゴリズムの詳細説明へのリンクは各アセッサーの提案シナリオの最後で提供されます。

現在、以下のアセッサーをサポートしています :

  • Medianstop
    Medianstop は単純な早期停止ルールです。それは、トライアルのステップ S までのベスト目的値がステップ S までに報告された総ての完了したトライアルの目的の実行平均の median 値よりも厳密に悪い場合に、ステップ S でペンディング・トライアル X を停止します。
    参照ペーパー

  • Curvefitting
    カーブフィッティング (曲線あてはめ) アセッサーは LPA (learning, predicting, assessing) アルゴリズムです。それは、最終エポックのパフォーマンスの予測が訓練履歴の最善の最終パフォーマンスよりも悪い場合、ステップ S でペンディング・トライアル X を停止します。このアルゴリズムでは、精度曲線にあてはめるために 12 曲線を使用します。
    参照ペーパー

 

組込みアセッサーの使用方法

NNI SDK により提供される組込みアセッサーの使用方法は config.yml ファイルで builtinAssessorName と classArgs を宣言する一つを必要とします。このパートでは、各アセッサーのための使用方法の詳細と提案シナリオ、classArg 要件と、サンプルを紹介します。

Note: config.yml ファイルを書くとき提供される形式に従ってください。

 

組込みアセッサー名 : Medianstop

推奨シナリオ

それはパフォーマンス曲線の広い範囲で適用可能ですので、それは調整進捗をスピードアップするために様々なシナリオで利用できます。
詳細説明

 
classArgs の要件

  • optimize_mode (maximize または minimize, オプション, default = maximize) –
    ‘maximize’ の場合、アセッサーはより小さい期待値を持つトライアルを停止します。
    ‘minimize’ の場合、アセッサーはより大きい期待値を持つトライアルを停止します。

  • start_step (int、オプション、default = 0) –
    トライアルは、報告された中間結果の start_step 数を受け取った後にだけ、停止されるか否かを決定されます。

 
使用方法サンプル :

# config.yml
assessor:
    builtinAssessorName: Medianstop
    classArgs:
      optimize_mode: maximize
      start_step: 5

 

組込みアセッサー名 : Curvefitting

推奨シナリオ

それはパフォーマンス曲線の広い範囲で適用可能ですので、それは調整進捗をスピードアップするために様々なシナリオで利用できます。更に良いことに、それは類似のパフォーマンスを持つ曲線を処理して評価することができます。
詳細説明

 
classArgs の要件

  • epoch_num (int, required) –
    エポックの総数。どのポイントを予測する必要があるかを決定するためにエポック数を知る必要があります。

  • optimize_mode (maximize または minimize, オプション, default = maximize) –
    ‘maximize’ の場合、アセッサーはより小さい期待値を持つトライアルを停止します。
    ‘minimize’ の場合、アセッサーはより大きい期待値を持つトライアルを停止します。

  • start_step (int、オプション、default = 6) –
    トライアルは、報告された中間結果の start_step 数を受け取った後にだけ、停止されるか否かを決定されます。

  • threshold (float、オプション、default = 0.95) –
    最悪のパフォーマンス曲線を早期停止することを決定するために使用する閾値。例えば: threshold = 0.95, optimize_mode = maximize、履歴の最善パフォーマンスが 0.9 である場合、予測された値が 0.95 * 0.9 = 0.855 より低いトライアルを停止します。

  • gap (int、オプション、default = 1) –
    アセッサー判定の間の gap interval。例えば: gap = 2, start_step = 6 である場合、6, 8, 10, 12… の中間結果を得るときに結果を査定します。

 
使用方法サンプル :

# config.yml
assessor:
    builtinAssessorName: Curvefitting
    classArgs:
      epoch_num: 20
      optimize_mode: maximize
      start_step: 6
      threshold: 0.95
      gap: 1
 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : PBT チューナー

AutoML : NNI 1.5 : 自動調整 : チューナー : PBT チューナー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/30/2020 (1.6.0)

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : PBT チューナー

PBT (集団ベース訓練, Population Based Training) は ニューラルネットワークの集団ベース訓練 に由来します。それは単純な非同期最適化アルゴリズムで、これはパフォーマンスを最大化するためにモデルの集団とそれらのハイパーパラメータを結合的に最適化するために固定計算バジェットを効果的に利用します。重要なことは、PBT は単一の固定セットを見つけようとする generally sub-optimal ストラテジーに従うよりもハイパーパラメータ設定のスケジュールを発見することです。

PBTTuner は幾つかのトライアル (i.e. population_size) で集団を初期化します。上の図で 4 つのステップがあり、各トライアルは 1 ステップにより実行されます。1 ステップがどれくらい長いかはトライアルコードにより制御されます, e.g. 1 エポック。トライアルが開始されるとき、それは PBTTuner により指定されたチェックポイントをロードして続けて 1 ステップを実行します、それからチェックポイントを PBTTuner により指定されたディレクトリにセーブして抜けます。(一つの) 集団内のトライアル (群) は同期的にステップを実行します、つまり、総てのトライアルが i-th ステップを終了した後、(i+1)-th ステップが開始できます。PBT の exploitation と探索は 2 つの連続するステップの間で実行されます。

 

チェックポイント・ディレクトリを提供する

幾つかのトライアルは他のトライアルのチェックポイントをロードする必要がありますので、ユーザは総てのトライアルからアクセス可能なディレクトリ (i.e., all_checkpoint_dir) を提供するべきです。それはローカルモードでは容易です、ユーザはデフォルトディレクトリを直接利用するか、またはローカルマシン上の任意のディレクトリを指定できるでしょう。他の訓練サービスについては、ユーザはNFS、Azure ストレージのような、共有ストレージでディレクトリを提供するために それらの訓練サービスのドキュメント に従うべきです。

 

トライアルコードを変更する

ステップを実行する前に、トライアルはチェックポイントをロードする必要があります、チェックポイント・ディレクトリは PBTTuner により生成されるハイパーパラメータ configuration で指定されます, i.e., params[‘load_checkpoint_dir’]。同様に、チェックポイントをセーブするためのディレクトリも configuration に含まれます, i.e., params[‘save_checkpoint_dir’]。ここでは、all_checkpoint_dir が load_checkpoint_dir と save_checkpoint_dir のベースフォルダで、その形式は all_checkpoint_dir/<population-id>/<step> です。

params = nni.get_next_parameter()
# the path of the checkpoint to load
load_path = os.path.join(params['load_checkpoint_dir'], 'model.pth')
# load checkpoint from `load_path`
...
# run one step
...
# the path for saving a checkpoint
save_path = os.path.join(params['save_checkpoint_dir'], 'model.pth')
# save checkpoint to `save_path`
...

完全なサンプルは ここ で見つかります。

 

実験 config

下は実験 config ファイルの PBTTuner configuration のサンプルです。PBTTuner が使用される場合アセッサーは許可されないことに注意してください。

# config.yml
tuner:
  builtinTunerName: PBTTuner
  classArgs:
    optimize_mode: maximize
    all_checkpoint_dir: /the/path/to/store/checkpoints
    population_size: 10

 

制限

データのインポートはまだサポートされていません。

 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : PPO チューナー

AutoML : NNI 1.5 : 自動調整 : チューナー : PPO チューナー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/29/2020 (1.6.0)

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : PPO チューナー

PPOTuner

これは NNI のニューラル・アーキテクチャ探索 (NAS) インターフェイスに最適化されたチューナーです。それは PPO アルゴリズム を使用します。実装は ここの ppo2 OpenAI 実装の主要ロジックを継承してそして NAS シナリオのために適応されます。

私達は mnist-nas サンプルを成功的に調整して以下の結果を持ちます : NOTE : このサンプルを最新の NAS インターフェイスにリファクタリングしていて、リファクタリングの後でサンプルコードを公開します

私達はまた (各トライアルのための制限されたエポック数, i.e., 8 エポックで) enas ペーパーの画像分類のためにマクロ探索空間 (訳注 : リンク切れ) を調整します、これは NAS インターフェイスを使用して実装されて PPOTuner で調整されます。探索空間がどのように見えるかを示すためにここに enas ペーパー からの図 7 があります :

上の図は選択されたアーキテクチャです。各正方形は層で、その演算は 6 オプションから選択されました。各点線はスキップ接続で、各正方形の層は 0 か 1 のスキップ接続を選択できて、前の層から出力を得ます。オリジナルのマクロ探索空間では、各正方形の層は任意の数のスキップ接続を選択できましたが、その一方で私達の実装では、0 か 1 を選択することが許されるだけであることに注意してください。

結果は下の図で示されます (ここ (訳注: リンク切れ) で実験構成を見てください) :

 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : BOHB アドバイザー

AutoML : NNI 1.5 : 自動調整 : チューナー : BOHB アドバイザー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/29/2020 (1.6.0)

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : BOHB アドバイザー

1. イントロダクション

BOHB は この参照ペーパー で述べられている堅牢で効率的なハイパーパラメータ調整アルゴリズムです。BO は「Bayesian 最適化」の略で HB は “Hyperband” の略です。

BOHB は評価するためにどのバジェットでどのくらいの configuration かを決定するために HB (Hyperband) に依拠しますが、それは各 HB 反復の最初で configuration のランダム選択をモデルベースの探索 (Bayesian 最適化) で置き換えます。ひとたび反復のための configuration の望ましい数に到達すれば、標準的な次の半減させる手続きがこれらの configuration を使用して遂行されます。後の反復のモデルのための基底として利用するため総てのバジェット b 上 configuration x の総ての関数評価 g(x, b) のパフォーマンスを追跡します。

下で BOHB プロセスの紹介を 2 つのパートに分割します :

 

HB (Hyperband)

バジェットを選択する Hyperband の方法に従い、SuccessiveHalving を使用し続けます。より多くの詳細については、Hyperband in NNIHyperband のための参照ペーパー を参照できます。この手続きは下の擬似コードで要約できます。

 

BO (Bayesian 最適化)

BOHB の BO パートは一つの主要な違いとともに TPE に密接に類似しています : 入力空間の交互作用効果をより良く処理するために TPE で使用される 1-次元 KDE の階層と比較してシングル多次元 KDE を選択しました。

ツリー Parzen 推定器 (TPE) : 密度をモデル化するために KDE (カーネル密度推定器) を使用します。

有用な KDE に適合するため、データポイントの最小数 Nmin を必要とします ; これは私達の実験のためには d + 1 に設定されます、ここで d はハイパーパラメータの数です。モデルを出来る限り早期に構築するため、Nb = |Db| まで待ちません、ここでバジェット b のための観測数は q · Nb ≥ Nmin を満たすために十分大きいです。代わりに、Nmin + 2 ラダム configuration で初期化後、以下を選択します :

それぞれ、2 つの密度をモデル化するために最善と最悪の configuration です。

configuration のランダム fraction と名前付けられた定数 fraction をランダムに一様にサンプリングすることにも注意してください。

 

2. ワークフロー

この画像は BOHB のワークフローを示します。ここで max_budget = 9, min_budget = 1, eta = 3, 他はデフォルトに設定します。この場合、s_max = 2 ですので、 {s=2, s=1, s=0, s=2, s=1, s=0, …} サイクルで連続的に実行します。SuccessiveHalving (オレンジ色のボックス) の各ステージで、トップ 1/eta configuration を選択して、SuccessiveHalving ステージをこの反復の終わりまで繰り返し、それらをより多くのバジェットで再度実行します。同時に、各トライアルの configuration、バジェットそして最後のメトリクスを集めてこれらをキー “budget” を持つ多次元 KDEmodel を構築するために使用します。多次元 KDE は次の反復のための configuration の選択をガイドするために使用されます。

(選択をガイドするために多次元 KDE を使用する) サンプリング手続きは下の擬似コードで要約されます。

 

3. 使用方法

BOHB は ConfigSpace パッケージを必要とします。ConfigSpace は次のコマンドを使用してインストールできます。

nnictl package install --name=BOHB

BOHB を利用するには、実験の YAML config ファイルで以下の spec を追加するべきです :

advisor:
  builtinAdvisorName: BOHB
  classArgs:
    optimize_mode: maximize
    min_budget: 1
    max_budget: 27
    eta: 3
    min_points_in_model: 7
    top_n_percent: 15
    num_samples: 64
    random_fraction: 0.33
    bandwidth_factor: 3.0
    min_bandwidth: 0.001

classArgs 要件 :

(訳注: classArgs 要件の詳細は 原文 参照)

 

4. ファイル構造

アドバイザーは多くの様々なファイル、関数とクラスを持ちます。ここでは、それらのファイルの殆どに簡潔な紹介を与えるだけです :

  • bohb_advisor.py BOHB の定義、新しいトライアルの生成と結果の処理を含む、ディスパッチャーとの相互作用を扱います。HB (Hyperband) パートの実装も含みます。
  • config_generator.py BO (Bayesian 最適化) パートの実装を含みます。関数 get_config は BO に基づいて新しい configuration を生成できます ; 関数 new_result は新しい結果でモデルを更新します。

 

5. 実験

MNIST with BOHB

コード実装 : examples/trials/mnist-advisor

MNIST データセット上で CNN を構築するために BOHB を選択しました。次は実験の最終結果です :

より多くの実験結果は 参照ペーパー で見つけられます。BOHB は前の結果を良く利用して調査と exploitation のバランスの取れたトレードオフを持つことを見れます。

 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : ネットワーク Morphism

AutoML : NNI 1.5 : 自動調整 : チューナー : ネットワーク Morphism (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/28/2020 (1.6.0)

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : ネットワーク Morphism

1. イントロダクション

Autokeras はネットワーク Morphism を利用するポピュラーな autoML ツールです。Autokeras の基本的なアイデアはニューラルネットワーク・アーキテクチャのメトリックを推定するために Bayesian 回帰を利用することです。毎回、それは father ネットワークから幾つかの child ネットワークを生成します。それからそれはネットワークの訓練結果の履歴からメトリック値とメトリック値ペアを推定するために naive Bayesian 回帰を利用します。次に、それは最善の、推定されたパフォーマンスを持つ child を選択してそれを訓練キューに追加します。Autokeras のワークにインスパイアされてその コード を参照し、私達は NNI プラットフォームでネットワーク Morphism 法を実装しました。

ネットワーク morphism トライアル使用方法についてより多く知ることを望むのであれば、Readme.md を見てください。

 

2. 使用方法

ネットワーク Morphism を使用するには、config.yml ファイルで以下の spec を変更するべきです :

tuner:
  #choice: NetworkMorphism
  builtinTunerName: NetworkMorphism
  classArgs:
    #choice: maximize, minimize
    optimize_mode: maximize
    #for now, this tuner only supports cv domain
    task: cv
    #modify to fit your input image width
    input_width: 32
    #modify to fit your input image channel
    input_channel: 3
    #modify to fit your number of classes
    n_output_node: 10

訓練手続きでは、それはネットワークグラフを表す JSON ファイルを生成します。ユーザはこの JSON ファイルから PyTorch or Keras モデルを構築するために “json_to_graph()” 関数を呼び出すことができます。

import nni
from nni.networkmorphism_tuner.graph import json_to_graph

def build_graph_from_json(ir_model_json):
    """build a pytorch model from json representation
    """
    graph = json_to_graph(ir_model_json)
    model = graph.produce_torch_model()
    return model

# trial get next parameter from network morphism tuner
RCV_CONFIG = nni.get_next_parameter()
# call the function to build pytorch model or keras model
net = build_graph_from_json(RCV_CONFIG)

# training procedure
# ....

# report the final accuracy to NNI
nni.report_final_result(best_acc)

最善のモデルをセーブしてロードすることを望む場合、以下のメソッドが勧められます。

# 1. Use NNI API
## You can get the best model ID from WebUI
## or `nni/experiments/experiment_id/log/model_path/best_model.txt'

## read the json string from model file and load it with NNI API
with open("best-model.json") as json_file:
    json_of_model = json_file.read()
model = build_graph_from_json(json_of_model)

# 2. Use Framework API (Related to Framework)
## 2.1 Keras API

## Save the model with Keras API in the trial code
## it's better to save model with id in nni local mode
model_id = nni.get_sequence_id()
## serialize model to JSON
model_json = model.to_json()
with open("model-{}.json".format(model_id), "w") as json_file:
    json_file.write(model_json)
## serialize weights to HDF5
model.save_weights("model-{}.h5".format(model_id))

## Load the model with Keras API if you want to reuse the model
## load json and create model
model_id = "" # id of the model you want to reuse
with open('model-{}.json'.format(model_id), 'r') as json_file:
    loaded_model_json = json_file.read()
loaded_model = model_from_json(loaded_model_json)
## load weights into new model
loaded_model.load_weights("model-{}.h5".format(model_id))

## 2.2 PyTorch API

## Save the model with PyTorch API in the trial code
model_id = nni.get_sequence_id()
torch.save(model, "model-{}.pt".format(model_id))

## Load the model with PyTorch API if you want to reuse the model
model_id = "" # id of the model you want to reuse
loaded_model = torch.load("model-{}.pt".format(model_id))

 

3. ファイル構造

チューナーは多くの様々なファイル、関数とクラスを持ちます。ここで、それらのファイルの多くに簡潔な紹介だけ与えます :

  • networkmorphism_tuner.py はネットワーク morphism テクニックを使用するチューナーです。
  • bayesian.py は既に探求したモデルに基づいて未知のモデルのメトリックを推定するための Bayesian 法です。
  • graph.py はメタグラフ・データ構造です。クラス Graph はモデルのニューラル・アーキテクチャ・グラフを表します。
    • グラフはモデルからニューラル・アーキテクチャ・グラフを抽出します。
    • グラフの各ノードは層間の中間 tensor です。
    • 各層はグラフのエッジです。
    • 特に、マルチエッジは同じ層を参照するかもしれません。
  • graph_transformer.py は幾つかのグラフ変換を含みます、これはグラフを拡大し、深くし、あるいはスキップ接続を追加します。
  • layers.py はモデルで使用する総ての層を含みます。
  • layer_transformer.py は幾つかの層変換を含みます、これは層を拡大し、深くし、あるいはスキップ接続を追加します。
  • nn.py は初期ネットワークを生成するクラスを含みます。
  • metric.py Accuracy と MSE を含む幾つかのメトリッククラス。
  • utils.py は Keras を使用する、cifar10 データセットのためのサンプル探索ネットワーク・アーキテクチャです。

 

4. ネットワーク表現 Json サンプル

ここに私達が定義した中間表現 JSON ファイルのサンプルがあります、これはアーキテクチャ探索手続きでチューナーからトライアルに渡されます。ユーザはこの JSON ファイルから PyTorch か Keras モデルを構築するためにトライアルコードで “json_to_graph()” 関数を呼び出すことができます。

{
     "input_shape": [32, 32, 3],
     "weighted": false,
     "operation_history": [],
     "layer_id_to_input_node_ids": {"0": [0],"1": [1],"2": [2],"3": [3],"4": [4],"5": [5],"6": [6],"7": [7],"8": [8],"9": [9],"10": [10],"11": [11],"12": [12],"13": [13],"14": [14],"15": [15],"16": [16]
     },
     "layer_id_to_output_node_ids": {"0": [1],"1": [2],"2": [3],"3": [4],"4": [5],"5": [6],"6": [7],"7": [8],"8": [9],"9": [10],"10": [11],"11": [12],"12": [13],"13": [14],"14": [15],"15": [16],"16": [17]
     },
     "adj_list": {
         "0": [[1, 0]],
         "1": [[2, 1]],
         "2": [[3, 2]],
         "3": [[4, 3]],
         "4": [[5, 4]],
         "5": [[6, 5]],
         "6": [[7, 6]],
         "7": [[8, 7]],
         "8": [[9, 8]],
         "9": [[10, 9]],
         "10": [[11, 10]],
         "11": [[12, 11]],
         "12": [[13, 12]],
         "13": [[14, 13]],
         "14": [[15, 14]],
         "15": [[16, 15]],
         "16": [[17, 16]],
         "17": []
     },
     "reverse_adj_list": {
         "0": [],
         "1": [[0, 0]],
         "2": [[1, 1]],
         "3": [[2, 2]],
         "4": [[3, 3]],
         "5": [[4, 4]],
         "6": [[5, 5]],
         "7": [[6, 6]],
         "8": [[7, 7]],
         "9": [[8, 8]],
         "10": [[9, 9]],
         "11": [[10, 10]],
         "12": [[11, 11]],
         "13": [[12, 12]],
         "14": [[13, 13]],
         "15": [[14, 14]],
         "16": [[15, 15]],
         "17": [[16, 16]]
     },
     "node_list": [
         [0, [32, 32, 3]],
         [1, [32, 32, 3]],
         [2, [32, 32, 64]],
         [3, [32, 32, 64]],
         [4, [16, 16, 64]],
         [5, [16, 16, 64]],
         [6, [16, 16, 64]],
         [7, [16, 16, 64]],
         [8, [8, 8, 64]],
         [9, [8, 8, 64]],
         [10, [8, 8, 64]],
         [11, [8, 8, 64]],
         [12, [4, 4, 64]],
         [13, [64]],
         [14, [64]],
         [15, [64]],
         [16, [64]],
         [17, [10]]
     ],
     "layer_list": [
         [0, ["StubReLU", 0, 1]],
         [1, ["StubConv2d", 1, 2, 3, 64, 3]],
         [2, ["StubBatchNormalization2d", 2, 3, 64]],
         [3, ["StubPooling2d", 3, 4, 2, 2, 0]],
         [4, ["StubReLU", 4, 5]],
         [5, ["StubConv2d", 5, 6, 64, 64, 3]],
         [6, ["StubBatchNormalization2d", 6, 7, 64]],
         [7, ["StubPooling2d", 7, 8, 2, 2, 0]],
         [8, ["StubReLU", 8, 9]],
         [9, ["StubConv2d", 9, 10, 64, 64, 3]],
         [10, ["StubBatchNormalization2d", 10, 11, 64]],
         [11, ["StubPooling2d", 11, 12, 2, 2, 0]],
         [12, ["StubGlobalPooling2d", 12, 13]],
         [13, ["StubDropout2d", 13, 14, 0.25]],
         [14, ["StubDense", 14, 15, 64, 64]],
         [15, ["StubReLU", 15, 16]],
         [16, ["StubDense", 16, 17, 64, 10]]
     ]
 }

モデルを 有向非巡回グラフ として考えることができます。各モデルの定義は JSON オブジェクトです、そこでは :

(訳注: 定義の詳細は 原文 参照)

 

5. TODO

次のステップで、API を固定ネットワーク generator からより多くの利用可能な演算子を持つネットワーク generator に変更します。将来的に中間表現 spec として JSON の代わりに ONNX を後で使用します。

 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : Hyperband

AutoML : NNI 1.5 : 自動調整 : チューナー : Hyperband (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/28/2020 (1.6.0)

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : Hyperband

1. イントロダクション

Hyperband はポピュラーな autoML アルゴリズムです。Hyperband の基本的なアイデアは幾つかのバケットを作成することです、各々は n 個のランダムに生成されたハイパーパラメータ configuration を持ち、各々の configuration は r リソース (e.g., エポック数、バッチ数) を使用します。n configuration が終了した後、それは top n/eta configuration を選択してそれらを増やされた r*eta リソースを使用して実行します。最後に、それはそれまでに見つけた最善の configuration を選択します。

 

2. 完全な並列性を持つ実装

最初に、これはチューナーとアセッサーではなく、MsgDispatcherBase に基づいて autoML アルゴリズムをどのように書くかのサンプルです。Hyperband はこのように実装されています、何故ならばそれはチューナーとアセッサーの両者の関数を統合するからです、そしてそれをアドバイザーと呼びます。

2 番目に、この実装は Hyperband の内部的な並列性をフルに活用しています。特に、次のバケットは厳密には現在のバケット後に開始はされません。代わりに、それは利用可能なリソースがあるときに開始します。

 

3. 使用方法

Hyperband を使用するには、貴方の実験の YAML config ファイルで以下のspec を追加するべきです :

advisor:
  #choice: Hyperband
  builtinAdvisorName: Hyperband
  classArgs:
    #R: the maximum trial budget
    R: 100
    #eta: proportion of discarded trials
    eta: 3
    #choice: maximize, minimize
    optimize_mode: maximize

ひとたびアドバイザーを使用すれば、config ファイルにチューナーとアセッサー spec を追加することは許されないことに注意してください。Hyperband を使用するとき、トライアルにより受け取るハイパーパラメータ (i.e., キーバリューペア) の中に、ユーザにより定義される TRIAL_BUDGET と呼ばれるもう一つのキーがあります。この TRIAL_BUDGET を使用することにより、トライアルはそれがどのくらい長く実行されるかを制御できます。

貴方のトライアルコードの report_intermediate_result(metric) と report_final_result(metric) については、メトリックは数値か辞書であるべきで、これはその値として数値を持つキー default を持ちます。この数値は貴方が最大化または最小化することを望む一つ、例えば、精度か損失です。

R と eta は貴方が変更可能な Hyperband のパラメータです。R は configuration に割り当てることができる最大トライアル・バジェットです。ここでは、トライアル・バジェットはエポックかミニバッチの数です。この TRIAL_BUDGET はそれがどのくらい長く実行されるかを制御するためにトライアルにより使用されるべきです。詳細は examples/trials/mnist-advisor/ 下のサンプルを参照してください。

eta は、n configuration からの n/eta configuration は存続してより多くのバジェットを使用して再実行されることを意味します。

ここに R=81 と eta=3 の具体的なサンプルがあります :

s=4 s=3 s=2 s=1 s=0
i n r n r n r n r n r
0 81 1 27 3 9 9 6 27 5 81
1 27 3 9 9 3 27 2 81
2 9 9 3 27 1 81
3 3 1 81
4 1 81

s はバケットを意味し、n は生成される configuration の数を意味し、対応する r はこれらの configuration が幾つのバジェットを実行するかを意味します。i はラウンドを意味し、例えば、バケット 4 は 5 ラウンドを持ち、バケット 3 は 4 ラウンドを持ちます。

トライアルコードを書くことについての情報は、examples/trials/mnist-hyperband/ 下の手順を参照してください。

 

4. 将来的な改良

Hyperband の現在の実装は単純な早期停止アルゴリズムをサポートすることにより更に改良できます、何故ならばトップ n/eta の総ての configuration が上手くは遂行されない可能性があるからです。任意の見込みのない configuration は早期に停止されるべきです。

現在の実装では、configuration はランダムに生成されます、これは ペーパー のデザインに従っています。改良として、configuration はより進んだアルゴリズムを活用することによりより賢明に生成できるでしょう。

 

以上






AutoML : NNI 1.5 : 自動調整 : チューナー : バッチチューナー, グリッドサーチ, GP チューナー

AutoML : NNI 1.5 : 自動調整 : チューナー : バッチチューナー, グリッドサーチ, GP チューナー (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 05/27/2020

* 本ページは、NNI の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

自動調整 : チューナー : バッチチューナー, グリッドサーチ, GP チューナー

バッチチューナー

バッチ・チューナーはユーザにトライアルコードのために様々な configuration (i.e., ハイパーパラメータの選択) を単純に提供することを可能にします。総ての configuration を終了後、実験は完了します。バッチ・チューナーは探索空間 spec で type choice をサポートするだけです。

提案シナリオ : 試すことを望む configuration が決定すれば、それらを (choice を使用して) 探索空間ファイルでリストしてそれらをバッチ・チューナーを使用して実行できます。

 

グリッドサーチ

グリッドサーチは searchspace ファイルで定義されたハイパーパラメータ空間の手動で指定されたサブセットを通してしらみつぶし探索 (= exhaustive searching) を遂行します。

探索空間の受け入れ可能な type は choice, quniform と randint だけであることに注意してください。

 

GP チューナー

Bayesian 最適化は最適化することを望む関数を最善に説明する関数の事後分布 (ガウス過程) を構築することにより動作します。観測の数が増えるにつれて、事後分布は改良され、そしてアルゴリズムはパラメータ空間のどの領域が調べるに値しどれがそうでないかにより確信を持つようになります。

GP チューナーは最適な組み合わせに近いパラメータの組み合わせを見つけるために必要なステップ数を最小化/最大化するように設計されています。それを行なうため、このメソッドは (acquisition 関数の最大値を見つける) proxy (代理) 最適化問題を利用します、これは、依然として困難な問題であるにもかかわらず、解くために (計算的な意味で) コストが安く、そして一般的なツールに従います。従って Bayesian 最適化は最適化される関数のサンプリングが非常に高価であるような状況のために提案されます。

探索空間内の受け入れ可能な type は randint, uniform, quniform, loguniform, qloguniform と数値 choice だけであることに注意してください。

最適化アプローチは Algorithms for Hyper-Parameter Optimization のセクション 3 で説明されます。

 

以上






AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com