Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ベイズ最適化を使用した実験ハイパーパラメーターの調整

この例では、実験マネージャーでベイズ最適化を適用し、畳み込みニューラル ネットワークに最適なネットワーク ハイパーパラメーターと学習オプションを求める方法を説明します。ベイズ最適化により、実験においてハイパーパラメーターをスイープするための代替手法が得られます。各ハイパーパラメーターの値の範囲を指定し、最適化するメトリクスを選択します。すると、選択したメトリクスを最適化するハイパーパラメーターの組み合わせを実験マネージャーが検索します。ベイズ最適化には Statistics and Machine Learning Toolbox™ が必要です。

この例では、CIFAR-10 データ セットのイメージを分類するようネットワークに学習させます。この実験では、ベイズ最適化を使用し、カスタム メトリクス関数を最小化するハイパーパラメーターの組み合わせを見つけます。ハイパーパラメーターには、学習アルゴリズムのオプションに加え、ネットワーク アーキテクチャ自体のパラメーターも含まれます。カスタム メトリクス関数は、ランダムに選択されたテスト セットの分類誤差を求めます。実験マネージャーでのカスタム メトリクスの定義の詳細については、メトリクス関数を使用した深層学習実験の評価を参照してください。

あるいは、関数 bayesopt を呼び出すことで、最適なハイパーパラメーター値をプログラムによって見つけることもできます。詳細については、ベイズ最適化を使用した深層学習を参照してください。

実験を開く

まず、例を開きます。実験マネージャーによって、検証と実行が可能な事前構成済みの実験を含むプロジェクトが読み込まれます。実験を開くには、[実験ブラウザー] ペインで、実験の名前 (BayesOptExperiment) をダブルクリックします。

組み込みの学習実験は、説明、ハイパーパラメーターのテーブル、セットアップ関数、および実験の結果を評価するためのメトリクス関数の集合で構成されます。ベイズ最適化を使用する実験には、実験の期間を制限する追加のオプションが含まれます。詳細については、深層学習実験の構成を参照してください。

[説明] フィールドには、実験を説明するテキストが表示されます。この例の説明は次のようになります。

Find optimal hyperparameters and training options for convolutional neural network.
Hyperparamters determine the network section depth, initial learning rate,
stochastic gradient descent momentum, and L2 regularization strength.

[ハイパーパラメーター] セクションでは、実験で使用する手法 (Bayesian Optimization) とハイパーパラメーターのオプションを指定します。各ハイパーパラメーターについて、次のオプションを指定します。

  • 範囲 — 実数値または整数値のハイパーパラメーターの下限と上限を示す 2 要素のベクトル、または categorical ハイパーパラメーターが取り得る値をリストする string 配列または cell 配列を入力します。

  • real (実数値のハイパーパラメーター)、integer (整数値のハイパーパラメーター)、または categorical (categorical ハイパーパラメーター) を選択します。

  • 変換none (変換なし) または log (対数変換) を選択します。log の場合、ハイパーパラメーターは real またはinteger で正でなければなりません。ハイパーパラメーターが検索され、対数スケールでモデル化されます。

実験を実行すると、実験マネージャーはハイパーパラメーターの最適な組み合わせを検索します。実験の各試行では、前の試行の結果に基づいてハイパーパラメーター値の新しい組み合わせが使用されます。この例では、次のハイパーパラメーターを使用します。

  • SectionDepth — このパラメーターはネットワークの深さを制御します。ネットワーク内の層の合計数は 9*SectionDepth+7 です。実験セットアップ関数において、各層の畳み込みフィルターの数は 1/sqrt(SectionDepth) に比例するため、パラメーター数と各反復に必要な計算量は、セクション深さが異なる場合でもほぼ同じになります。

  • InitialLearnRate — 最適な学習率は、学習させるネットワークにもよりますが、データにも左右されます。

  • Momentum — 確率的勾配降下モーメンタムは、前の反復での更新に比例する寄与を現在の更新に含めることによって、パラメーター更新に慣性を追加します。慣性効果により、パラメーター更新がより円滑に行われるようになり、確率的勾配降下に固有のノイズが低減されます。

  • L2Regularization — L2 正則化を使用して過適合を防止します。正則化強度の空間を検索して、適切な値を求めます。データ拡張やバッチ正規化も、ネットワークの正則化に役立ちます。

[ベイズ最適化オプション] では、実行する試行の最大時間 (秒単位) と最大回数を入力することで、実験の期間を指定できます。ベイズ最適化の能力を最大限に活用するには、目的関数の評価を 30 回以上行う必要があります。

[セットアップ関数] は、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成します。セットアップ関数を検査するには、[セットアップ関数][編集] をクリックします。MATLAB® エディターでセットアップ関数が開きます。

この例では、セットアップ関数には 3 つのセクションがあります。

  • 学習データの読み込みでは、CIFAR-10 データ セットからイメージとラベルをダウンロードして抽出します。このデータセットは約 175 MB です。インターネット接続の速度によっては、ダウンロード プロセスに時間がかかることがあります。学習データについて、この例では、ランダムな平行移動と水平方向の反転を適用することにより、augmentedImageDatastore を作成します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。ネットワーク検証を有効にするために、この例では 5000 枚のイメージを拡張なしで使用します。このデータセットの詳細については、イメージ データセットを参照してください。

  • ネットワーク アーキテクチャの定義では、深層学習による分類用の畳み込みニューラル ネットワークのアーキテクチャを定義します。この例では、学習対象のネットワークに 3 つのセクションがあり、各セクションには SectionDepth 個の同一の畳み込み層があります。各畳み込み層の後に、バッチ正規化層と ReLU 層が続きます。空間の出力サイズが入力サイズと常に同じになるように、畳み込み層はパディングを追加しています。セクション間では、最大プーリング層は係数 2 で空間次元をダウンサンプリングします。各畳み込み層で必要な計算量が確実にほぼ同じとなるように、フィルターの数は 1 つのセクションから次のセクションに進むたびに 2 倍ずつ増加します。各畳み込み層のフィルターの数は 1/sqrt(SectionDepth) に比例します。それにより、深さの異なるネットワークでパラメーターの数がほぼ同じになり、反復ごとに必要となる計算量もほぼ同じになります。

  • 学習オプションの指定では、ベイズ最適化アルゴリズムによって生成された学習オプション 'InitialLearnRate''Momentum''L2Regularization' の値を使用し、実験用の trainingOptions オブジェクトを定義します。この例では、ネットワークの学習を一定のエポック数行い、最後の方のエポックでは、エポックごとに検証を行い、学習率を 10 分の 1 に下げます。これにより、パラメーター更新のノイズが減少し、ネットワーク パラメーターが安定して損失関数が最小値に近づくようになります。

[メトリクス] セクションは、実験結果を評価するオプションの関数を指定します。ネットワークの学習が完了するたびに、実験マネージャーによってこれらの関数が評価されます。メトリクス関数を検査するには、メトリクス関数の名前を選択して [編集] をクリックします。MATLAB エディターでメトリクス関数が開きます。

この例には、カスタム メトリクス関数 ErrorRate が含まれています。この関数は、5000 枚のテスト イメージとラベルをランダムに選択し、学習したネットワークをそれらのイメージで評価し、ネットワークが誤分類するイメージの比率を計算します。

function metricOutput = ErrorRate(trialInfo)
datadir = tempdir;
[~,~,XTest,YTest] = loadCIFARData(datadir);
idx = randperm(numel(YTest),5000);
XTest = XTest(:,:,:,idx);
YTest = YTest(idx);
YPredicted = classify(trialInfo.trainedNetwork,XTest);
metricOutput = 1 - mean(YPredicted == YTest);
end

[最適化] フィールドと [方向] フィールドは、ベイズ最適化アルゴリズムが目的関数として使用するメトリクスを示します。この実験の場合、実験マネージャーは、ErrorRate メトリクスの値を最小化しようとします。

実験の実行

実験を実行すると、実験マネージャーは、選択されたメトリクスについて、ハイパーパラメーターの最適な組み合わせを検索します。実験の各試行では、前の試行の結果に基づいてハイパーパラメーター値の新しい組み合わせが使用されます。既定では、実験マネージャーは一度に 1 つの試行を実行します。Parallel Computing Toolbox™ がある場合は、複数の試行を同時に実行できます。最良の結果を得るには、実験を実行する前に、GPU と同じ数のワーカーで並列プールを起動します。詳細については、実験マネージャーを使用したネットワークの並列学習リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。

  • 一度に 1 つの実験の試行を実行するには、[実験マネージャー] ツールストリップで [実行] をクリックします。

  • 複数の試行を同時に実行するには、[並列の使用][実行] の順にクリックします。現在の並列プールがない場合、実験マネージャーは既定のクラスター プロファイルを使用して並列プールを起動します。次に、実験マネージャーは、使用可能な並列ワーカーの数に応じて、複数の同時試行を実行します。

結果テーブルに、各試行のメトリクス関数の値が表示されます。実験マネージャーは、選択されたメトリクスが最適値である試行を示します。たとえば、この実験では、3 番目の試行で誤差率が最小になっています。

実験マネージャーは、選択されたメトリクスが最適となる試行を決定するために、最良点の基準 'min-observed' を使用します。詳細については、ベイズ最適化のアルゴリズム (Statistics and Machine Learning Toolbox)bestPoint (Statistics and Machine Learning Toolbox)を参照してください。

結果の評価

実験内で最適な試行をテストするには、まず、結果テーブル内で誤差率が最も低い行を選択します。

選択した試行の混同行列を表示するには、[混同行列] をクリックします。

追加の計算を実行するには、学習済みのネットワークをワークスペースにエクスポートします。

  1. [実験マネージャー] ツールストリップで、[エクスポート] をクリックします。

  2. ダイアログ ウィンドウで、エクスポートしたネットワークのワークスペース変数の名前を入力します。既定の名前は trainedNetwork です。

  3. エクスポートしたネットワークを補助関数 testSummary への入力として使用します。たとえば、MATLAB コマンド ウィンドウで次のように入力します。

testSummary(trainedNetwork)

この関数は、いくつかの方法でネットワークを評価します。

  • テスト セット全体のラベルを予測し、テスト誤差を計算します。実験マネージャーはネットワークにテスト セット全体を当てることなく最適なネットワークを判断するため、テスト誤差はカスタム メトリクス ErrorRate の値よりも高くなる可能性があります。

  • 標準誤差 (testErrorSE) と、汎化誤差率の近似した 95% 信頼区間 (testError95CI) を計算します。この計算では、テスト セットの各イメージの分類を特定の成功確率をもつ独立事象として扱います。この仮定を使用することで、誤って分類されるイメージの数が二項分布に従います。この方法は通常、"Wald 法" と呼ばれます。

  • この方法では、いくつかのテスト イメージを、予測されたクラスおよびそのクラスである確率と共に表示します。

この関数は、MATLAB コマンド ウィンドウに、これらの統計量の概要を表示します。

******************************************
Test error rate: 0.1801
Standard error: 0.0038
95% confidence interval: [0.1726, 0.1876]
******************************************

実験結果に関する観測結果を記録するには、注釈を追加します。

  1. 結果テーブルで、最適な結果が得られた試行の [ErrorRate] セルを右クリックします。

  2. [注釈の追加] を選択します。

  3. [注釈] ペインで、テキスト ボックスに観測結果を入力します。

詳細については、実験結果の並べ替えとフィルター処理を参照してください。

実験を閉じる

[実験ブラウザー] ペインでプロジェクトの名前を右クリックし、[プロジェクトを閉じる] を選択します。実験マネージャーによって、プロジェクトに含まれるすべての実験と結果が閉じられます。

参考

アプリ

関数

関連するトピック