trainingOptions
深層学習ニューラル ネットワークの学習のオプション
説明
は、options
= trainingOptions(solverName
)solverName
によって指定されるオプティマイザーの学習オプションを返します。ネットワークに学習させるには、学習オプションを関数 trainNetwork
への入力引数として使用します。
は、学習オプションと、1 つ以上の名前と値の引数で指定された追加オプションを返します。options
= trainingOptions(solverName
,Name=Value
)
例
学習オプションの指定
モーメンタム項付き確率的勾配降下法を使用したネットワーク学習の一連のオプションを作成します。5 エポックごとに 0.2 ずつ学習率を下げます。学習のエポックの最大回数を 20 に設定し、反復ごとに 64 個の観測値があるミニバッチを使用します。学習の進行状況プロットをオンにします。
options = trainingOptions("sgdm", ... LearnRateSchedule="piecewise", ... LearnRateDropFactor=0.2, ... LearnRateDropPeriod=5, ... MaxEpochs=20, ... MiniBatchSize=64, ... Plots="training-progress")
options = TrainingOptionsSGDM with properties: Momentum: 0.9000 InitialLearnRate: 0.0100 LearnRateSchedule: 'piecewise' LearnRateDropFactor: 0.2000 LearnRateDropPeriod: 5 L2Regularization: 1.0000e-04 GradientThresholdMethod: 'l2norm' GradientThreshold: Inf MaxEpochs: 20 MiniBatchSize: 64 Verbose: 1 VerboseFrequency: 50 ValidationData: [] ValidationFrequency: 50 ValidationPatience: Inf Shuffle: 'once' CheckpointPath: '' CheckpointFrequency: 1 CheckpointFrequencyUnit: 'epoch' ExecutionEnvironment: 'auto' WorkerLoad: [] OutputFcn: [] Plots: 'training-progress' SequenceLength: 'longest' SequencePaddingValue: 0 SequencePaddingDirection: 'right' DispatchInBackground: 0 ResetInputNormalization: 1 BatchNormalizationStatistics: 'population' OutputNetwork: 'last-iteration'
深層学習における学習の進行状況の監視
この例では、深層学習ネットワークの学習プロセスを監視する方法を示します。
深層学習のネットワークに学習させる場合、学習の進行状況を監視すると役に立つことがよくあります。学習中のさまざまなメトリクスのプロットにより、学習の進行状況を知ることができます。たとえば、ネットワークの精度が改善されているかどうか、その改善の速度、さらにネットワークで学習データへの過適合が始まっているかどうかを判定できます。
この例では、関数 trainNetwork
を使用して学習させたネットワークの学習の進行状況を監視する方法を示します。カスタム学習ループを使用して学習させたネットワークの場合は、trainingProgressMonitor
オブジェクトを使用して学習中のメトリクスをプロットします。詳細については、Monitor Custom Training Loop Progressを参照してください。
trainingOptions
で Plots
学習オプションを "training-progress"
に設定してネットワークの学習を開始すると、trainNetwork
によって Figure が作成され、反復ごとに学習メトリクスが表示されます。各反復は、勾配の推定と、ネットワーク パラメーターの更新で構成されます。trainingOptions
に検証データを指定すると、trainNetwork
によってネットワークが検証されるたびに Figure に検証メトリクスが表示されます。Figure には次がプロットされます。
学習精度 — 個々のミニバッチの分類精度。
平滑化後の学習精度 — 学習精度に平滑化アルゴリズムを適用することによって求められる、平滑化された学習精度。精度を平滑化していない場合よりノイズが少なく、トレンドを見つけやすくなります。
検証精度 — (
trainingOptions
を使用して指定された) 検証セット全体に対する分類精度。学習損失、平滑化後の学習損失、検証損失 — それぞれ、各ミニバッチの損失、その平滑化バージョン、検証セットの損失。ネットワークの最後の層が
classificationLayer
である場合、損失関数は交差エントロピー損失です。分類問題と回帰問題の損失関数の詳細は、出力層を参照してください。
回帰ネットワークの場合、Figure には精度ではなく平方根平均二乗誤差 (RMSE) がプロットされます。
Figure では、影付きの背景を使用して各学習エポックがマークされます。1 エポックは、データセット全体を一巡することです。
学習中、右上隅の停止ボタンをクリックして学習を停止し、ネットワークの現在の状態を返すことができます。たとえば、ネットワークの精度が横ばい状態に達し、これ以上改善されないことが明確な場合に、学習の停止が必要になることがあります。停止ボタンのクリックの後、学習が完了するまでしばらくかかることがあります。学習が完了すると、trainNetwork
が学習済みネットワークを返します。
学習が終了すると、[結果] に最終検証精度と学習の終了理由が表示されます。OutputNetwork
学習オプションが "last-iteration"
(既定値) である場合、最終メトリクスは最後の学習反復に対応します。OutputNetwork
学習オプションが "best-validation-loss"
である場合、最終メトリクスは検証損失が最小の反復に対応します。最終検証メトリクスが計算される反復には、プロットで "Final" とラベル付けされます。
ネットワークにバッチ正規化層が含まれている場合、最終検証メトリクスは学習中に評価される検証メトリクスと異なる可能性があります。これは、バッチ正規化に使用される平均と分散の値が、学習完了後に変わる可能性があるためです。たとえば、BatchNormalizationStatisics
学習オプションが "population"
である場合、学習後に学習データが再度渡され、その結果得られる平均と分散を使用して最終的なバッチ正規化の統計量が決定されます。BatchNormalizationStatisics
学習オプションが "moving"
である場合、学習中に実行時推定を使用して統計量が近似され、最新の統計値が使用されます。
右側には、学習の時間と設定に関する情報が表示されます。学習オプションの詳細は、パラメーターの設定と畳み込みニューラル ネットワークの学習を参照してください。
学習の進行状況のプロットを保存するには、学習ウィンドウの [学習プロットのエクスポート] をクリックします。プロットは PNG、JPEG、TIFF、または PDF ファイルとして保存できます。座標軸ツール バーを使用して、損失、精度、および平方根平均二乗誤差の個々のプロットを保存することもできます。
学習時の進行状況のプロット
ネットワークに学習させ、学習中にその進行状況をプロットします。
5000 個の数字のイメージが格納されている学習データを読み込みます。ネットワークの検証用に 1000 個のイメージを残しておきます。
[XTrain,YTrain] = digitTrain4DArrayData; idx = randperm(size(XTrain,4),1000); XValidation = XTrain(:,:,:,idx); XTrain(:,:,:,idx) = []; YValidation = YTrain(idx); YTrain(idx) = [];
数字のイメージ データを分類するネットワークを構築します。
layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,8,Padding="same") batchNormalizationLayer reluLayer maxPooling2dLayer(2,Stride=2) convolution2dLayer(3,16,Padding="same") batchNormalizationLayer reluLayer maxPooling2dLayer(2,Stride=2) convolution2dLayer(3,32,Padding="same") batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];
ネットワーク学習のオプションを指定します。学習中に一定の間隔でネットワークを検証するための検証データを指定します。エポックごとに約 1 回ネットワークが検証されるように、ValidationFrequency
の値を選択します。学習中に学習の進行状況をプロットするには、Plots
学習オプションを "training-progress"
に設定します。
options = trainingOptions("sgdm", ... MaxEpochs=8, ... ValidationData={XValidation,YValidation}, ... ValidationFrequency=30, ... Verbose=false, ... Plots="training-progress");
ネットワークに学習をさせます。
net = trainNetwork(XTrain,YTrain,layers,options);
入力引数
solverName
— ネットワークの学習用のソルバー
'sgdm'
| 'rmsprop'
| 'adam'
ネットワークの学習用のソルバー。次のいずれかに指定します。
'sgdm'
— モーメンタム項付き確率的勾配降下法 (SGDM) オプティマイザーを使用します。モーメンタム項の値は、Momentum
学習オプションを使用して指定できます。'rmsprop'
— RMSProp オプティマイザーを使用します。勾配の二乗の移動平均の減衰率は、SquaredGradientDecayFactor
学習オプションを使用して指定できます。'adam'
— Adam オプティマイザーを使用します。勾配の移動平均の減衰率と勾配の二乗の移動平均の減衰率は、GradientDecayFactor
学習オプションとSquaredGradientDecayFactor
学習オプションをそれぞれ使用して指定できます。
さまざまなソルバーの詳細は、確率的勾配降下法を参照してください。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name
を引用符で囲みます。
例: InitialLearnRate=0.03,L2Regularization=0.0005,LearnRateSchedule="piecewise"
は、初期学習率を 0.03、L2
正則化係数を 0.0005 に指定し、指定されたエポック数ごとに特定の係数を乗算して学習率を下げるように指定します。
Plots
— ネットワークの学習中に表示するプロット
'none'
| 'training-progress'
ネットワークの学習時に表示するプロット。次のいずれかに指定します。
'none'
— 学習中にプロットを表示しません。'training-progress'
— 学習の進行状況をプロットします。プロットには、ミニバッチの損失と精度、検証の損失と精度、および学習の進行状況に関する追加情報が表示されます。プロットの右上隅には、停止ボタンがあります。そのボタンをクリックすると、学習が停止し、ネットワークの現在の状態が返されます。[学習プロットのエクスポート] をクリックすると、学習プロットをイメージまたは PDF として保存できます。学習の進行状況プロットの詳細については、深層学習における学習の進行状況の監視を参照してください。
Verbose
— 学習の進行状況の情報を表示するかどうかのインジケーター
1
(true) (既定値) | 0
(false)
コマンド ウィンドウに学習の進行状況の情報を表示するかどうかのインジケーター。1
(true) または 0
(false) として指定します。
詳細出力には次の情報が表示されます。
分類ネットワーク
フィールド | 説明 |
---|---|
Epoch | エポック数。1 エポックは、データを一巡することに対応します。 |
Iteration | 反復回数。反復は、ミニバッチに対応します。 |
Time Elapsed | 経過時間。時間、分、秒で示されます。 |
Mini-batch Accuracy | ミニバッチの分類精度。 |
Validation Accuracy | 検証データの分類精度。検証データを指定しない場合、このフィールドは表示されません。 |
Mini-batch Loss | ミニバッチの損失。出力層が ClassificationOutputLayer オブジェクトの場合、損失は、互いに排他的なクラスを含むマルチクラス分類問題の交差エントロピー損失です。 |
Validation Loss | 検証データの損失。出力層が ClassificationOutputLayer オブジェクトの場合、損失は、互いに排他的なクラスを含むマルチクラス分類問題の交差エントロピー損失です。検証データを指定しない場合、このフィールドは表示されません。 |
Base Learning Rate | 基本学習率。層の学習率係数とこの値が乗算されます。 |
回帰ネットワーク
フィールド | 説明 |
---|---|
Epoch | エポック数。1 エポックは、データを一巡することに対応します。 |
Iteration | 反復回数。反復は、ミニバッチに対応します。 |
Time Elapsed | 経過時間。時間、分、秒で示されます。 |
Mini-batch RMSE | ミニバッチの平方根平均二乗誤差 (RMSE)。 |
Validation RMSE | 検証データの RMSE。検証データを指定しない場合、このフィールドは表示されません。 |
Mini-batch Loss | ミニバッチの損失。出力層が RegressionOutputLayer オブジェクトの場合、損失は半平均二乗誤差になります。 |
Validation Loss | 検証データの損失。出力層が RegressionOutputLayer オブジェクトの場合、損失は半平均二乗誤差になります。検証データを指定しない場合、このフィールドは表示されません。 |
Base Learning Rate | 基本学習率。層の学習率係数とこの値が乗算されます。 |
学習が停止すると、詳細出力に停止の理由が表示されます。
検証データを指定するには、ValidationData
学習オプションを使用します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
VerboseFrequency
— 詳細出力の頻度
50
(既定値) | 正の整数
コマンド ウィンドウへの表示間の反復回数を示す、詳細出力の頻度。正の整数として指定します。このオプションは、Verbose
学習オプションが 1
(true) の場合にのみ効果があります。
学習中にネットワークを検証する場合、trainNetwork
でも、検証時に毎回、コマンド ウィンドウへの出力が行われます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MaxEpochs
— エポックの最大回数
30
(既定値) | 正の整数
学習に使用するエポックの最大回数。正の整数として指定します。
反復とは、勾配降下法アルゴリズムでミニバッチを使用して損失関数の最小化を目指して実行される 1 ステップのことです。1 エポックは、データセット全体を一巡することです。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MiniBatchSize
— ミニバッチのサイズ
128
(既定値) | 正の整数
学習の各反復で使用するミニバッチのサイズ。正の整数として指定します。ミニバッチとは、損失関数の勾配を評価し、重みを更新するために使用される学習セットのサブセットのことです。
ミニバッチのサイズによって学習標本の数が均等に分割されない場合、trainNetwork
は、各エポックの最後の完全なミニバッチに収まらない学習データを破棄します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Shuffle
— データのシャッフルのオプション
'once'
| 'never'
| 'every-epoch'
データのシャッフルのオプション。以下のいずれかに指定します。
'once'
— 学習前に 1 回、学習データと検証データをシャッフルします。'never'
— データをシャッフルしません。'every-epoch'
— 各学習エポックの前に学習データをシャッフルし、ネットワークの各検証の前に検証データをシャッフルします。ミニバッチのサイズによって学習標本の数が均等に分割されない場合、trainNetwork
は、各エポックの最後の完全なミニバッチに収まらない学習データを破棄します。エポックごとに同じデータが破棄されるのを回避するには、Shuffle
学習オプションを'every-epoch'
に設定します。
ValidationData
— 学習中の検証に使用するデータ
[]
(既定値) | データストア | table | cell 配列
学習中の検証で使用するデータ。[]
として指定するか、検証予測子と検証応答を含むデータストア、table、または cell 配列として指定します。
関数 trainNetwork
でサポートされているのと同じ形式を使用して、検証予測子と検証応答を指定できます。検証データは、データストア、table、または cell 配列 {predictors,responses}
として指定できます。ここで、predictors
には検証予測子を格納し、responses
には検証応答を格納します。
詳細については、関数 trainNetwork
の入力引数 images
、sequences
、および features
を参照してください。
学習中に、trainNetwork
は検証データの検証精度と検証損失を計算します。検証頻度を指定するには、ValidationFrequency
学習オプションを使用します。検証データを使用して、検証損失が減少しなくなったときに学習を自動的に停止することもできます。自動検証停止をオンにするには、ValidationPatience
学習オプションを使用します。
ネットワークに予測時と学習中で動作が異なる層 (ドロップアウト層など) がある場合、検証精度が学習 (ミニバッチ) 精度より高くなる可能性があります。
検証データは、Shuffle
学習オプションに従ってシャッフルされます。Shuffle
が 'every-epoch'
の場合、検証データはネットワークの各検証の前にシャッフルされます。
ValidationData
が []
の場合、学習中にネットワークが検証されません。
ValidationFrequency
— ネットワークの検証の頻度
50
(既定値) | 正の整数
反復回数で示されるネットワークの検証の頻度。正の整数として指定します。
ValidationFrequency
の値は、検証メトリクスの評価間の反復回数です。検証データを指定するには、ValidationData
学習オプションを使用します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ValidationPatience
— 検証停止までの待機回数
Inf
(既定値) | 正の整数
ネットワークの学習の検証を停止するまでの待機回数。正の整数または Inf
として指定します。
ValidationPatience
は、ネットワークの学習が停止するまでに、検証セットでの損失が前の最小損失以上になることが許容される回数を指定します。ValidationPatience
が Inf
の場合、検証損失の値によって学習が早期に停止することはありません。
返されるネットワークは、OutputNetwork
学習オプションによって異なります。検証損失が最小のネットワークを返すようにするには、OutputNetwork
学習オプションを "best-validation-loss"
に設定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
OutputNetwork
— 学習完了時に返すネットワーク
'last-iteration'
(既定値) | 'best-validation-loss'
学習完了時に返すネットワーク。次のいずれかとして指定します。
'last-iteration'
– 最後の学習反復に対応するネットワークを返す。'best-validation-loss'
– 検証損失が最小となる学習反復に対応するネットワークを返す。このオプションを使用するには、ValidationData
学習オプションを指定しなければなりません。
InitialLearnRate
— 初期学習率
正のスカラー
学習に使用される初期学習率。正のスカラーとして指定します。
既定値は、'sgdm'
ソルバーでは 0.01
、'rmsprop'
ソルバーおよび 'adam'
ソルバーでは 0.001
です。
学習率が小さすぎる場合、学習に時間がかかることがあります。学習率が大きすぎる場合、学習結果が準最適になったり、発散したりすることがあります。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
LearnRateSchedule
— 学習中に学習率を下げるオプション
'none'
(既定値) | 'piecewise'
学習中に学習率を下げるオプション。次のいずれかとして指定します。
'none'
— 学習率は学習全体を通じて一定のままです。'piecewise'
— 特定のエポック数ごとに特定の係数を乗算して学習率が更新されます。この係数の値を指定するには、LearnRateDropFactor
学習オプションを使用します。乗算の間隔のエポック数を指定するには、LearnRateDropPeriod
学習オプションを使用します。
LearnRateDropPeriod
— 学習率を下げるまでのエポック数
10
(既定値) | 正の整数
学習率を下げるまでのエポック数。正の整数として指定します。このオプションは、LearnRateSchedule
学習オプションが 'piecewise'
の場合にのみ有効です。
指定したエポック数が経過するたびに、グローバル学習率と低下係数が乗算されます。LearnRateDropFactor
学習オプションを使用して低下係数を指定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
LearnRateDropFactor
— 学習率を下げる係数
0.1
(既定値) | 0
から 1
までのスカラー
学習率を下げる係数。0
から 1
までのスカラーとして指定します。このオプションは、LearnRateSchedule
学習オプションが 'piecewise'
の場合にのみ有効です。
LearnRateDropFactor
は、特定のエポック数が経過するたびに学習率に適用される乗法係数です。LearnRateDropPeriod
学習オプションを使用してエポック数を指定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
L2Regularization
— L2 正則化の係数
0.0001
(既定値) | 非負のスカラー
L2 正則化 (重み減衰) の係数。非負のスカラーとして指定します。詳細については、L2 正則化を参照してください。
学習可能なパラメーターのあるネットワーク層に対して L2 正則化の乗数を指定できます。詳細については、畳み込み層と全結合層のパラメーターの設定を参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Momentum
— 前のステップの寄与
0.9
(既定値) | 0
から 1
までのスカラー
モーメンタム項付き確率的勾配降下法における前の反復から現在の反復へのパラメーター更新ステップの寄与。0
から 1
までのスカラーとして指定します。
値 0
は前のステップからの寄与がないことを意味し、値 1
は前のステップからの寄与が最大であることを意味します。ほとんどのタスクにおいて、既定値で良い結果が得られます。
Momentum
学習オプションを指定するには、solverName
が 'sgdm'
でなければなりません。
詳細については、モーメンタム項付き確率的勾配降下法を参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
GradientDecayFactor
— 勾配の移動平均の減衰率
0.9
(既定値) | 1
未満の非負のスカラー
Adam ソルバーの勾配の移動平均の減衰率。1
未満の非負のスカラーとして指定します。勾配の減衰率は、Adamの節で β1
で表されます。
GradientDecayFactor
学習オプションを指定するには、solverName
が 'adam'
でなければなりません。
ほとんどのタスクにおいて、既定値で良い結果が得られます。
詳細については、Adamを参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
SquaredGradientDecayFactor
— 勾配の二乗の移動平均の減衰率
1
未満の非負のスカラー
Adam ソルバーおよび RMSProp ソルバーの勾配の二乗の移動平均の減衰率。1
未満の非負のスカラーとして指定します。勾配の二乗の減衰率は、[4]で β2
として表されます。
SquaredGradientDecayFactor
学習オプションを指定するには、solverName
が 'adam'
または 'rmsprop'
でなければなりません。
減衰率の一般的な値は 0.9
、0.99
、および 0.999
であり、平均化の長さとしては 10
回、100
回、および 1000
回のパラメーター更新にそれぞれ対応しています。
Adam ソルバーの既定値は 0.999
です。RMSProp ソルバーの既定値は 0.9
です。
詳細については、AdamおよびRMSPropを参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Epsilon
— 分母のオフセット
1e-8
(既定値) | 正のスカラー
Adam および RMSProp ソルバーの分母のオフセット。正のスカラーとして指定します。
ソルバーは、ネットワーク パラメーターの更新時に分母にオフセットを追加して、ゼロ除算を回避します。ほとんどのタスクにおいて、既定値で良い結果が得られます。
Epsilon
学習オプションを指定するには、solverName
が 'adam'
または 'rmsprop'
でなければなりません。
詳細については、AdamおよびRMSPropを参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ResetInputNormalization
— 入力層の正規化をリセットするオプション
1
(true) (既定値) | 0
(false)
入力層の正規化をリセットするオプション。次のいずれかに指定します。
1
(true) — 入力層の正規化統計量をリセットし、学習時に再計算します。0
(false) — 正規化統計量が空の場合、学習時に計算します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
BatchNormalizationStatistics
— バッチ正規化層の統計量を評価するモード
'population'
(既定値) | 'moving'
バッチ正規化層の統計量を評価するモード。次のいずれかとして指定します。
'population'
– 母集団の統計量を使用します。学習終了後に学習データが再度渡され、その結果得られる平均と分散を使用して最終的な統計量が決定されます。'moving'
– 学習中、以下の更新ステップで与えられる実行時推定を使用して統計量を近似します。ここで、 と はそれぞれ更新後の平均と分散、 と はそれぞれ平均と分散の減衰値、 と はそれぞれ層入力の平均と分散、 と はそれぞれ移動平均と分散の最新値を表します。学習終了後、最後に得られた移動平均と分散の値が使用されます。このオプションは、CPU および単一の GPU による学習のみをサポートします。
GradientThreshold
— 勾配のしきい値
Inf
(既定値) | 正のスカラー
勾配のしきい値。Inf
または正のスカラーとして指定します。勾配が GradientThreshold
の値を超えた場合、勾配は GradientThresholdMethod
学習オプションに応じてクリップされます。
詳細については、勾配クリップを参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
GradientThresholdMethod
— 勾配しきい値法
'l2norm'
(既定値) | 'global-l2norm'
| 'absolute-value'
勾配のしきい値を超えた勾配の値をクリップするために使用する勾配しきい値法。次のいずれかに指定します。
'l2norm'
— 学習可能なパラメーターの勾配の L2 ノルムがGradientThreshold
より大きい場合は、L2 ノルムがGradientThreshold
に等しくなるように勾配をスケーリングします。'global-l2norm'
— グローバル L2 ノルム L がGradientThreshold
より大きい場合は、すべての勾配をGradientThreshold/
L 倍にスケーリングします。グローバル L2 ノルムでは、すべての学習可能なパラメーターが考慮されます。'absolute-value'
— 学習可能なパラメーターの勾配に含まれる個々の偏微分の絶対値がGradientThreshold
より大きい場合、偏微分の符号を維持したまま、大きさがGradientThreshold
に等しくなるように偏微分をスケーリングします。
詳細については、勾配クリップを参照してください。
SequenceLength
— シーケンスのパディングまたは切り捨てを行うオプション
"longest"
(既定値) | "shortest"
| 正の整数
入力シーケンスのパディング、切り捨て、または分割を行うオプション。次のいずれかに指定します。
"longest"
— 各ミニバッチで、最長のシーケンスと同じ長さになるようにシーケンスのパディングを行います。このオプションを使用するとデータは破棄されませんが、パディングによってネットワークにノイズが生じることがあります。"shortest"
— 各ミニバッチで、最短のシーケンスと同じ長さになるようにシーケンスの切り捨てを行います。このオプションを使用するとパディングは追加されませんが、データが破棄されます。正の整数 — 各ミニバッチについて、そのミニバッチ内で最も長いシーケンスに合わせてシーケンスをパディングした後、指定した長さのより小さいシーケンスに分割します。分割が発生すると、追加のミニバッチが作成されます。指定したシーケンス長によってデータのシーケンスを均等に分割できない場合、最後のシーケンスを含むミニバッチの長さは指定した長さより短くなります。シーケンス全体がメモリに収まらない場合は、このオプションを使用します。または、
MiniBatchSize
オプションをより小さい値に設定して、ミニバッチごとのシーケンス数を減らしてみます。
入力シーケンスのパディング、切り捨て、および分割の効果の詳細は、シーケンスのパディング、切り捨て、および分割を参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| char
| string
SequencePaddingDirection
— パディングまたは切り捨ての方向
"right"
(既定値) | "left"
パディングまたは切り捨ての方向。次のいずれかに指定します。
"right"
— シーケンスの右側に対してパディングまたは切り捨てを行います。シーケンスは同じタイム ステップで始まり、シーケンスの末尾に対して切り捨てまたはパディングの追加が行われます。"left"
— シーケンスの左側に対してパディングまたは切り捨てを行います。シーケンスが同じタイム ステップで終わるように、シーケンスの先頭に対して切り捨てまたはパディングの追加が行われます。
再帰層は 1 タイム ステップずつシーケンス データを処理するため、再帰層の OutputMode
プロパティが 'last'
の場合、最後のタイム ステップでパディングを行うと層の出力に悪影響を与える可能性があります。シーケンス データの左側に対してパディングまたは切り捨てを行うには、SequencePaddingDirection
オプションを "left"
に設定します。
sequence-to-sequence ネットワークの場合 (各再帰層について OutputMode
プロパティが 'sequence'
である場合)、最初のタイム ステップでパティングを行うと、それ以前のタイム ステップの予測に悪影響を与える可能性があります。シーケンスの右側に対してパディングまたは切り捨てを行うには、SequencePaddingDirection
オプションを "right"
に設定します。
入力シーケンスのパディング、切り捨て、および分割の効果の詳細は、シーケンスのパディング、切り捨て、および分割を参照してください。
SequencePaddingValue
— シーケンスをパディングする値
0
(既定値) | スカラー
入力シーケンスをパディングする値。スカラーとして指定します。
このオプションは、SequenceLength
が "longest"
または正の整数の場合にのみ有効です。ネットワーク全体にエラーが伝播される可能性があるため、NaN
でシーケンスをパディングしないでください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ExecutionEnvironment
— ネットワークの学習用のハードウェア リソース
'auto'
| 'cpu'
| 'gpu'
| 'multi-gpu'
| 'parallel'
ネットワークの学習用のハードウェア リソース。次のいずれかに指定します。
'auto'
— 利用可能な場合、GPU を使用します。そうでない場合、CPU を使用します。'cpu'
— CPU を使用します。'gpu'
— GPU を使用します。'multi-gpu'
— 既定のクラスター プロファイルに基づいてローカルの並列プールを使用して、1 つのマシンで複数の GPU を使用します。現在の並列プールがない場合、使用可能な GPU の数と等しいプール サイズの並列プールが起動されます。'parallel'
— 既定のクラスター プロファイルに基づいてローカルまたはリモートの並列プールを使用します。現在の並列プールがない場合、既定のクラスター プロファイルを使用して 1 つのプールが起動されます。プールから GPU にアクセスできる場合、固有の GPU を持つワーカーのみが学習計算を実行します。プールに GPU がない場合、代わりに使用可能なすべての CPU ワーカーで学習が実行されます。
さまざまな実行環境をどのような場合に使用するかの詳細は、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。
'gpu'
、'multi-gpu'
、および 'parallel'
のオプションを使用するには、Parallel Computing Toolbox™ が必要です。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。これらのいずれかのオプションの選択時に Parallel Computing Toolbox または適切な GPU を利用できない場合、エラーが返されます。
並列学習の実行時に性能の改善を確認するには、MiniBatchSize
および InitialLearnRate
学習オプションを GPU の数でスケール アップしてみてください。
'multi-gpu'
オプションと 'parallel'
オプションは、状態パラメーターをもつカスタム層や学習時にステートフルである組み込みの層を含むネットワークをサポートしていません。次に例を示します。
SequenceLength
学習オプションが正の整数の場合のLSTMLayer
オブジェクト、BiLSTMLayer
オブジェクト、GRULayer
オブジェクトなどの再帰層BatchNormalizationStatistics
学習オプションが'moving'
に設定されている場合のBatchNormalizationLayer
オブジェクト
WorkerLoad
— 並列ワーカーの負荷分割
0
から 1
までのスカラー | 正の整数 | 数値ベクトル
GPU 間または CPU 間での並列ワーカーの負荷分割。次のいずれかとして指定します。
0
から1
までのスカラー — ネットワーク学習計算に使用する各マシンのワーカーの割合。バックグラウンド ディスパッチを有効にしたミニバッチ データストアのデータを使用してネットワークの学習を行う場合、残りのワーカーはバックグラウンドでデータを取得して処理します。正の整数 — ネットワーク学習計算に使用する各マシンのワーカー数。バックグラウンド ディスパッチを有効にしたミニバッチ データストアのデータを使用してネットワークの学習を行う場合、残りのワーカーはバックグラウンドでデータを取得して処理します。
数値ベクトル — 並列プール内の各ワーカーのネットワーク学習の負荷。ベクトル
W
の場合、ワーカーi
はW(i)/sum(W)
の割合の作業 (ミニバッチあたりの例の数) を取得します。バックグラウンド ディスパッチを有効にしたミニバッチ データストアのデータを使用してネットワークの学習を行う場合、ワーカーの負荷を 0 にすることで、そのワーカーをバックグラウンドでのデータ取得に使用できます。指定するベクトルには、並列プール内のワーカーごとに 1 つの値が含まれていなければなりません。
並列プールから GPU にアクセスできる場合、固有の GPU を持たないワーカーは学習計算に使用されません。GPU を持つプールの場合、既定では、固有の GPU を持つすべてのワーカーを学習計算に使用し、残りのワーカーをバックグラウンド ディスパッチに使用します。プールから GPU にアクセスできず、CPU を学習に使用する場合、既定では、マシンあたり 1 つのワーカーをバックグラウンド データ ディスパッチに使用します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
DispatchInBackground
— バックグラウンド ディスパッチを有効にするフラグ
0
(false) (既定値) | 1
(true)
データストアから学習データを読み取るためにバックグラウンド ディスパッチ (非同期事前取得キュー) を有効にするフラグ。0
(false) または 1
(true) として指定します。バックグラウンド ディスパッチには Parallel Computing Toolbox が必要です。
DispatchInBackground
は、分割可能なデータストアでのみサポートされます。詳細については、並列学習およびバックグラウンド ディスパッチへのデータストアの使用を参照してください。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
CheckpointPath
— チェックポイント ネットワークの保存用のパス
""
(既定値) | 文字ベクトル
チェックポイント ネットワークの保存用のパス。文字ベクトルまたは string スカラーとして指定します。
パスを指定しない (既定の
""
を使用する) 場合、チェックポイント ネットワークは保存されません。パスを指定すると、
trainNetwork
によってこのパスにチェックポイント ネットワークが保存され、各ネットワークに一意の名前が割り当てられます。その後、いずれかのチェックポイント ネットワークを読み込み、そのネットワークから学習を再開できます。フォルダーが存在していない場合、チェックポイント ネットワークを保存するパスを指定する前に、まずフォルダーを作成しなければなりません。指定したパスが存在していない場合、
trainingOptions
はエラーを返します。
CheckpointFrequency
オプションおよび CheckpointFrequencyUnit
オプションは、チェックポイント ネットワークを保存する頻度を指定します。
ネットワーク チェックポイントの保存の詳細は、チェックポイント ネットワークの保存と学習の再開を参照してください。
データ型: char
| string
CheckpointFrequency
— チェックポイント ネットワークを保存する頻度
1
(既定値) | 正の整数
チェックポイント ネットワークを保存する頻度。正の整数として指定します。
CheckpointFrequencyUnit
が 'epoch'
の場合、CheckpointFrequency
エポックごとにチェックポイント ネットワークが保存されます。
CheckpointFrequencyUnit
が 'iteration'
の場合、CheckpointFrequency
回の反復ごとにチェックポイント ネットワークが保存されます。
このオプションは、CheckpointPath
が空でない場合にのみ有効です。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
CheckpointFrequencyUnit
— チェックポイントの頻度の単位
'epoch'
(既定値) | 'iteration'
チェックポイントの頻度の単位。'epoch'
または 'iteration'
として指定します。
CheckpointFrequencyUnit
が 'epoch'
の場合、CheckpointFrequency
エポックごとにチェックポイント ネットワークが保存されます。
CheckpointFrequencyUnit
が 'iteration'
の場合、CheckpointFrequency
回の反復ごとにチェックポイント ネットワークが保存されます。
このオプションは、CheckpointPath
が空でない場合にのみ有効です。
OutputFcn
— 出力関数
関数ハンドル | 関数ハンドルの cell 配列
学習中に呼び出す出力関数。関数ハンドルまたは関数ハンドルの cell 配列として指定します。trainNetwork
は、学習の開始前に 1 回、各反復後、学習の終了後に 1 回、指定された関数を呼び出します。trainNetwork
は、次のフィールドに情報を格納する構造体を渡します。
フィールド | 説明 |
---|---|
Epoch | 現在のエポック数 |
Iteration | 現在の反復回数 |
TimeSinceStart | 学習を開始してからの時間 (秒単位) |
TrainingLoss | 現在のミニバッチの損失 |
ValidationLoss | 検証データの損失 |
BaseLearnRate | 現在の基本学習率 |
TrainingAccuracy | 現在のミニバッチの精度 (分類ネットワーク) |
TrainingRMSE | 現在のミニバッチの RMSE (回帰ネットワーク) |
ValidationAccuracy | 検証データの精度 (分類ネットワーク) |
ValidationRMSE | 検証データの RMSE (回帰ネットワーク) |
State | 現在の学習の状態 (可能な値は "start" 、"iteration" 、または "done" ) |
フィールドが計算されない、または出力関数の特定の呼び出しに関連していない場合、そのフィールドには空の配列が含まれます。
出力関数を使用して、進行状況を表示またはプロットするか、学習を停止できます。学習を早期に停止するには、出力関数が 1
(true) を返すようにします。いずれかの出力関数から 1
(true) が返されると、学習が終了し、trainNetwork
から最新のネットワークが返されます。出力関数の使用方法を示す例は、深層学習ネットワークの学習時の出力のカスタマイズを参照してください。
データ型: function_handle
| cell
出力引数
options
— 学習オプション
TrainingOptionsSGDM
| TrainingOptionsRMSProp
| TrainingOptionsADAM
学習オプション。TrainingOptionsSGDM
、TrainingOptionsRMSProp
、または TrainingOptionsADAM
オブジェクトとして返されます。ニューラル ネットワークに学習させるには、学習オプションを関数 trainNetwork
への入力引数として使用します。
solverName
が 'sgdm'
、'rmsprop'
、または 'adam'
である場合、学習オプションは TrainingOptionsSGDM
オブジェクト、TrainingOptionsRMSProp
オブジェクト、または TrainingOptionsADAM
オブジェクトとしてそれぞれ返されます。
TrainingOptionsSGDM
オブジェクト、TrainingOptionsADAM
オブジェクト、および TrainingOptionsRMSProp
オブジェクトの学習オプションのプロパティを直接編集できます。たとえば、関数 trainingOptions
を使用した後にミニバッチのサイズを変更するには、MiniBatchSize
プロパティを直接編集します。
options = trainingOptions('sgdm'); options.MiniBatchSize = 64;
ヒント
ほとんどの深層学習タスクでは、事前学習済みのネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。または、
layerGraph
オブジェクトを関数trainNetwork
および関数trainingOptions
と共に使用して、ネットワークを作成してゼロから学習させることができます。タスクに必要な学習オプションが関数
trainingOptions
に用意されていない場合、自動微分を使用してカスタム学習ループを作成できます。詳細については、カスタム学習ループ向けの深層学習ネットワークの定義を参照してください。
アルゴリズム
初期の重みとバイアス
畳み込み層と全結合層の場合、重みとバイアスの初期化はそれぞれ層のWeightsInitializer
プロパティと BiasInitializer
プロパティによって与えられます。重みとバイアスの初期化を変更する方法を示す例については、畳み込み層の初期の重みとバイアスの指定および全結合層の初期の重みとバイアスの指定を参照してください。
確率的勾配降下法
標準の勾配降下法アルゴリズムは、各反復で損失の負の勾配の方向に小さいステップで進むことによって損失関数を最小化するように、ネットワーク パラメーター (重みとバイアス) を更新します。
ここで、 は反復回数、 は学習率、 はパラメーター ベクトル、 は損失関数を意味します。標準の勾配降下法アルゴリズムでは、損失関数の勾配 は、学習セット全体を使用して評価されます。標準の勾配降下法アルゴリズムでは、データセット全体を一度に使用します。
一方、"確率的" 勾配降下法アルゴリズムは、各反復で学習データのサブセットを使用して勾配を評価し、パラメーターを更新します。各反復ではミニバッチと呼ばれる別のサブセットが使用されます。ミニバッチを使用して、学習セット全体に対する学習アルゴリズムを一巡することを、1 "エポック" と言います。確率的勾配降下が確率的と言われるのは、ミニバッチを使用して計算されたパラメーター更新が、データセット全体を使用して得られるパラメーター更新のノイズを含む推定であるためです。MiniBatchSize
と MaxEpochs
の学習オプションをそれぞれ使用して、ミニバッチのサイズとエポックの最大回数を指定できます。
モーメンタム項付き確率的勾配降下法
確率的勾配降下法アルゴリズムは、最適値への最急降下経路に沿って振動することがあります。パラメーター更新へのモーメンタム項の追加は、この振動を減らす方法の 1 つです [2]。モーメンタム項付き確率的勾配降下法 (SGDM) の更新は、以下のとおりです。
ここで、 は、前の勾配ステップから現在の反復への寄与を決定します。Momentum
学習オプションを使用してこの値を指定できます。モーメンタム項付き確率的勾配降下法アルゴリズムを使用してニューラル ネットワークに学習させるには、trainingOptions
への最初の入力引数として 'sgdm'
を指定します。学習率 α の初期値を指定するには、InitialLearnRate
学習オプションを使用します。層やパラメーターごとに異なる学習率を指定することもできます。詳細については、畳み込み層と全結合層のパラメーターの設定を参照してください。
RMSProp
モーメンタム項付き確率的勾配降下法は、すべてのパラメーターに対して 1 つの学習率を使用します。その他の最適化アルゴリズムでは、パラメーターごとに異なり、最適化対象の損失関数に自動的に適応できる学習率を使用して、ネットワーク学習の改善を試みます。RMSProp (平方根平均二乗伝播) は、そのようなアルゴリズムの 1 つです。これは、パラメーターの勾配について要素単位の二乗の移動平均を維持します。
β2 は移動平均の減衰率です。減衰率の一般的な値は、0.9、0.99、および 0.999 です。対応する勾配の二乗の平均化長は、1/(1-β2) に等しく、それぞれ 10、100、および 1000 回のパラメーター更新です。SquaredGradientDecayFactor
学習オプションを使用して β2 を指定できます。RMSProp アルゴリズムでは、この移動平均を使用して各パラメーターの更新を個別に正規化します。
ここで、除算は要素単位で実行されます。RMSProp を使用すると、勾配が大きいパラメーターの学習率は効果的に減少し、勾配が小さいパラメーターの学習率は増加します。ɛ は、ゼロ除算を回避するために追加する小さい定数です。Epsilon
学習オプションを使用して、ɛ を指定できますが、通常は既定値で良い結果が得られます。RMSProp を使用してニューラル ネットワークに学習させるには、trainingOptions
への最初の入力として 'rmsprop'
を指定します。
Adam
Adam (adaptive moment estimation、適応モーメント推定) [4]では、RMSProp に似ているが、モーメンタム項が追加されたパラメーター更新を使用します。これは、パラメーターの勾配とそれらの二乗値の両方について要素単位の移動平均を維持します。
減衰率 β1 と β2 は、GradientDecayFactor
学習オプションと SquaredGradientDecayFactor
学習オプションをそれぞれ使用して指定できます。Adam では、移動平均を使用してネットワーク パラメーターを次のように更新します。
多数の反復に対する勾配が類似している場合、勾配の移動平均を使用すると、パラメーター更新で特定方向のモーメンタム項を選択できます。勾配のほとんどがノイズである場合、勾配の移動平均が小さくなり、パラメーター更新も小さくなります。Epsilon
学習オプションを使用して ɛ を指定できます。通常は既定値で良い結果が得られますが、特定の問題では、1 に近い大きな値の方がより良い場合があります。Adam を使用してニューラル ネットワークに学習させるには、trainingOptions
への最初の入力として 'adam'
を指定します。Adam の完全な更新には、学習の最初に現れるバイアスを補正するメカニズムも含まれています。詳細については、[4]を参照してください。
すべての最適化アルゴリズムの学習率 α は、InitialLearnRate
学習オプションを使用して指定します。学習率の効果は最適化アルゴリズムによって異なるため、一般的に、最適な学習率も異なります。層やパラメーターごとに異なる学習率を指定することもできます。詳細については、畳み込み層と全結合層のパラメーターの設定を参照してください。
勾配クリップ
勾配の大きさが指数関数的に増加する場合、学習は不安定になり、数回の反復で発散する場合があります。この "勾配爆発" は、学習損失が NaN
または Inf
になることによって示されます。勾配クリップでは、学習率が大きい場合や外れ値が存在する場合に学習を安定させることによって、勾配爆発を防ぎます [3]。勾配クリップを使用すると、ネットワークの学習が高速になり、通常は学習済みタスクの精度に影響はありません。
勾配クリップは 2 種類あります。
ノルムベースの勾配クリップでは、しきい値に基づいて勾配を再スケーリングし、勾配の方向は変更しません。
GradientThresholdMethod
の'l2norm'
値と'global-l2norm'
値は、ノルムベースの勾配クリップ法です。値ベースの勾配クリップでは、しきい値より大きい任意の偏微分をクリップします。この場合、勾配の方向が任意に変化する可能性があります。値ベースの勾配クリップの動作は予測できないものになる場合がありますが、変化が十分に小さければ、ネットワークが発散することはありません。
GradientThresholdMethod
の値'absolute-value'
は、値ベースの勾配クリップ法です。
L2 正則化
損失関数 への重みの正則化項の追加は、過適合を抑える方法の 1 つです [1]、[2]。正則化項は、"重み減衰" とも呼ばれます。正則化項付きの損失関数は、以下の形式を取ります。
ここで、 は重みベクトル、 は正則化係数です。正則化関数 は以下のようになります。
バイアスは正則化されないことに注意してください[2]。L2Regularization
学習オプションを使用して、正則化係数 を指定できます。層やパラメーターごとに異なる正則化係数を指定することもできます。詳細については、畳み込み層と全結合層のパラメーターの設定を参照してください。
ネットワーク学習に使用される損失関数には、正則化項が含まれます。ただし、学習中にコマンド ウィンドウと学習の進行状況プロットに表示される損失値はデータのみの損失であり、正則化項は含まれません。
参照
[1] Bishop, C. M. Pattern Recognition and Machine Learning. Springer, New York, NY, 2006.
[2] Murphy, K. P. Machine Learning: A Probabilistic Perspective. The MIT Press, Cambridge, Massachusetts, 2012.
[3] Pascanu, R., T. Mikolov, and Y. Bengio. "On the difficulty of training recurrent neural networks". Proceedings of the 30th International Conference on Machine Learning. Vol. 28(3), 2013, pp. 1310–1318.
[4] Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980 (2014).
バージョン履歴
R2016a で導入R2022b: SequenceLength
学習オプションを整数として指定した場合、trainNetwork
は、分割を行う前に最も長いシーケンスに合わせてミニバッチをパディングする
R2022b 以降、関数 trainNetwork
を使用してシーケンス データでネットワークに学習させるときに、SequenceLength
オプションが整数である場合、各ミニバッチ内で最も長いシーケンスに合わせてシーケンスがパディングされた後、指定したシーケンス長でシーケンスが分割されてミニバッチが作成されます。SequenceLength
によってミニバッチのシーケンスを均等に分割できない場合、最後に分割されたミニバッチの長さは SequenceLength
より短くなります。この動作によって、パディング値しか含まれないタイム ステップでネットワークの学習が行われるのを防ぐことができます。
以前のリリースでは、SequenceLength
の倍数に最も近く、かつミニバッチ長以上の長さとなるように、シーケンスのミニバッチをパディングしてから、データが分割されていました。この動作を再現するには、カスタム学習ループを使用し、データのミニバッチを前処理するタイミングでこの動作を実装します。
R2018b: ValidationPatience
学習オプションの既定値は Inf
R2018b 以降では、ValidationPatience
学習オプションの既定値が Inf
になっています。これは、検証による自動停止がオフであることを意味します。これにより、データから十分に学習する前に学習が停止するのを防ぎます。
以前のバージョンの既定値は 5
です。この動作を再現するには、ValidationPatience
オプションを 5
に設定します。
R2018b: チェックポイント ネットワークのファイル名が異なる
R2018b 以降では、チェックポイント ネットワークを保存すると、net_checkpoint_
で始まるファイル名が割り当てられます。以前のバージョンでは、convnet_checkpoint_
で始まるファイル名が割り当てられます。
チェックポイント ネットワークの保存と読み込みを行うコードがある場合、コードを更新して新しい名前でファイルを読み込みます。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)