Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

パラメーターの設定と畳み込みニューラル ネットワークの学習

畳み込みニューラル ネットワークの層の指定の説明に従ってニューラル ネットワークの層を定義したら、次のステップはネットワークの学習オプションの設定です。関数 trainingOptions を使用してグローバル学習パラメーターを定義します。ネットワークに学習させるには、trainingOptions が返すオブジェクトを関数 trainNetwork への入力引数として使用します。次に例を示します。

options = trainingOptions('adam');
trainedNet = trainNetwork(data,layers,options);

学習可能なパラメーターのある層には、学習パラメーターを調節するためのオプションもあります。詳細については、畳み込み層と全結合層のパラメーターの設定を参照してください。

ソルバーと最大エポック数の指定

trainNetwork では、確率的勾配降下法のさまざまなバリアントを使用したネットワーク学習が可能です。関数 trainingOptions の最初の入力引数を使用して、最適化アルゴリズムを指定します。損失を最小化するために、これらのアルゴリズムは、損失関数の負の勾配の方向に小さなステップで進み、ネットワーク パラメーターを更新します。

'adam' (adaptive moment estimation、適応モーメント推定) ソルバーは、多くの場合、最初に試すのに適したオプティマイザーです。'rmsprop' (平方根平均二乗伝播) および 'sgdm' (モーメンタム項付き確率的勾配降下法) オプティマイザーを試して、学習が改善されるかを確認することもできます。どのソルバーがより有効に機能するかはタスクによって異なります。さまざまなソルバーの詳細については、関数 trainingOptions を参照してください。

ソルバーは、各ステップでデータのサブセットを使用してパラメーターを更新します。このサブセットを "ミニバッチ" と呼びます。ミニバッチのサイズは、trainingOptions の名前と値のペアの引数 'MiniBatchSize' を使用して指定できます。それぞれのパラメーター更新を "反復" と呼びます。データセット全体を一巡することを 1 "エポック" と呼びます。学習するエポックの最大回数は、trainingOptions の名前と値のペアの引数 'MaxEpochs' を使用して指定できます。既定値は 30 ですが、小規模なネットワークの場合や、学習の大部分が既に済んでいる微調整や転移学習の場合には、より小さい数のエポックを選択することもできます。

既定では、学習前に 1 回、データがシャッフルされます。この設定は、名前と値のペアの引数 'Shuffle' を使用して変更できます。

学習率の指定と変更

グローバル学習率は、trainingOptions の名前と値のペアの引数 'InitialLearnRate' を使用して指定できます。既定では、trainNetwork は学習プロセス全体でこの値を使用します。特定のエポック数ごとに、学習率に係数を乗算して学習率を変更することを選択できます。学習プロセス全体で小さな固定の学習率を使用する代わりに、学習の初期は大きな学習率を選択し、最適化しながらこの値を徐々に小さくできます。そうすることで学習時間が短縮されるのと同時に、学習の進行に合わせて損失の最小値に向けてステップをより小さくできます。

ヒント

学習中にミニバッチの損失が NaN になる場合、学習率が高すぎると考えられます。学習率をたとえば 3 分の 1 に下げて、ネットワーク学習を再開してみてください。

学習率を徐々に小さくするには、名前と値のペアの引数 'LearnRateSchedule','piecewise' を使用します。このオプションを選択すると、trainNetwork は 10 エポックごとに 0.1 の係数を初期学習率に乗算します。初期学習率からの縮小に使用する係数とエポック数は、名前と値のペアの引数 'LearnRateDropFactor''LearnRateDropPeriod' をそれぞれ使用して指定できます。

検証データの指定

学習中にネットワークの検証を実行するには、trainingOptions の名前と値のペアの引数 'ValidationData' を使用して、検証データを指定します。既定では、trainNetwork は 50 回の反復ごとに、検証データの応答を予測し検証の損失と精度 (回帰ネットワークの平方根平均二乗誤差) を計算することによって、ネットワークを検証します。検証頻度は、名前と値のペアの引数 'ValidationFrequency' を使用して変更できます。ネットワークに予測時と学習中で動作が異なる層 (ドロップアウト層など) がある場合、検証精度が学習 (ミニバッチ) 精度より高くなる可能性があります。検証データを使用して、検証損失が減少しなくなったときに学習を自動的に停止することもできます。自動検証停止をオンにするには、名前と値のペアの引数 'ValidationPatience' を使用します。

学習中に一定の間隔で検証を実行すると、ネットワークが学習データに過適合しているかどうかを判断するのに役立ちます。よくある問題は、ネットワークが学習データを単に "記憶" したにすぎず、新しいデータについて正確な予測を可能にする一般的な特徴を学習していないことです。ネットワークが過適合しているかどうかを確認するには、学習損失および学習精度を対応する検証メトリクスと比較します。学習損失が検証損失より大幅に小さい、または学習精度が検証精度よりも大幅に高い場合、ネットワークは過適合しています。

過適合を抑えるために、データ拡張の追加を試すことができます。augmentedImageDatastore を使用して、入力イメージのランダム変換を実行します。これにより、ネットワークがオブジェクトの位置や向きを正確に記憶することを防止できます。また、名前と値のペアの引数 'L2Regularization' を使用して L2 正則化を大きくしたり、畳み込み層の後にバッチ正規化層を使用したり、ドロップアウト層を追加したりすることも試せます。

ハードウェア リソースの選択

GPU が利用可能な場合、既定では trainNetwork はそれを学習に使用します。そうでない場合、trainNetwork は CPU を使用します。または、名前と値のペアの引数 'ExecutionEnvironment' を使用して、目的の実行環境を指定することもできます。1 つの CPU ('cpu')、1 つの GPU ('gpu')、複数の GPU ('multi-gpu')、ローカルの並列プールまたは計算クラスター ('parallel') を指定できます。'cpu' 以外のすべてのオプションには Parallel Computing Toolbox™ が必要です。GPU で学習を行うには、サポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

チェックポイント ネットワークの保存と学習の再開

Deep Learning Toolbox™ では、学習の際、ニューラル ネットワークを .mat ファイルとして保存できます。この定期的な保存は、ニューラル ネットワークまたはデータ セットが大規模であり、学習に時間がかかる場合に特に便利です。学習が何らかの理由で中断された場合、最後に保存されたチェックポイント ニューラル ネットワークから学習を再開できます。関数 trainnet および trainNetwork にチェックポイント ニューラル ネットワークを保存させる場合は、trainingOptionsCheckpointPath オプションを使用してパス名を指定しなければなりません。指定したパスが存在していない場合、trainingOptions はエラーを返します。

ソフトウェアは、チェックポイント ニューラル ネットワーク ファイルに一意の名前を自動的に割り当てます。例の名前 net_checkpoint__351__2018_04_12__18_09_52.mat で、351 は反復回数、2018_04_12 は日付、18_09_52 はソフトウェアがニューラル ネットワークを保存した時刻を表します。チェックポイント ニューラル ネットワーク ファイルは、ダブルクリックするか、コマンド ラインで読み込みコマンドを使用すると、読み込むことができます。次に例を示します。

load net_checkpoint__351__2018_04_12__18_09_52.mat
また、ニューラル ネットワークの層を trainnet または trainNetwork の入力引数に使用することで、学習を再開できます。次に例を示します。

trainNetwork(XTrain,TTrain,net.Layers,options)
学習オプションと入力データは、チェックポイント ニューラル ネットワークにこれらの情報が含まれていないため、手動で指定しなければなりません。例については、チェックポイント ネットワークからの学習の再開を参照してください。

畳み込み層と全結合層のパラメーターの設定

学習パラメーターは、畳み込み層や全結合層など、学習可能なパラメーターのある層に trainingOptions で指定したグローバル値とは異なる値に設定できます。たとえば、バイアスまたは重みの学習率を調整するために、層の BiasLearnRateFactor または WeightLearnRateFactor プロパティの値をそれぞれ指定できます。関数 trainNetwork は、trainingOptions を使用して指定された学習率とこれらの係数を乗算します。同様に、これらの層の重みとバイアスの L2 正則化係数は、BiasL2Factor プロパティおよび WeightL2Factor プロパティをそれぞれ指定することによって指定できます。trainNetwork は、trainingOptions を使用して指定された L2 正則化係数とこれらの係数を乗算します。

畳み込み層と全結合層の重みの初期化

層の重みは学習可能なパラメーターです。層の Weights プロパティを使用して、重みの初期値を直接指定できます。ネットワークに学習させるときに、層の Weights プロパティが空ではない場合、関数 trainnet および trainNetworkWeights プロパティを初期値として使用します。Weights プロパティが空の場合、ソフトウェアは層の WeightsInitializer プロパティによって指定された初期化子を使用します。

ネットワークの学習

ネットワークは、ネットワークの層および学習パラメーターを指定した後、学習データを使用して学習させます。次の例にあるように、データ、層、学習オプションはすべて関数 trainNetwork の入力引数です。

layers = [imageInputLayer([28 28 1])
          convolution2dLayer(5,20)
          reluLayer
          maxPooling2dLayer(2,'Stride',2)
          fullyConnectedLayer(10)
          softmaxLayer
          classificationLayer];
options = trainingOptions('adam');
convnet = trainNetwork(data,layers,options);

学習データは、行列、table、または ImageDatastore オブジェクトにすることができます。詳細は、関数 trainNetwork のリファレンス ページを参照してください。

参考

| | |

関連するトピック