このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
adamupdate
適応モーメント推定 (Adam) を使用してパラメーターを更新する
構文
説明
適応モーメント推定 (Adam) アルゴリズムを使用して、カスタム学習ループでネットワークの学習可能なパラメーターを更新します。
メモ
この関数は、Adam 最適化アルゴリズムを適用して、カスタム学習ループでネットワークのパラメーターを更新します。関数 trainnet
を使用して Adam ソルバーでニューラル ネットワークに学習させるには、関数 trainingOptions
を使用してソルバーを "adam"
に設定します。
[
は、Adam アルゴリズムを使用して、ネットワーク netUpdated
,averageGrad
,averageSqGrad
] = adamupdate(net
,grad
,averageGrad
,averageSqGrad
,iteration
)net
の学習可能なパラメーターを更新します。dlnetwork
オブジェクトとして定義されたネットワークを反復的に更新するには、学習ループでこの構文を使用します。
[
は、Adam アルゴリズムを使用して、params
,averageGrad
,averageSqGrad
] = adamupdate(params
,grad
,averageGrad
,averageSqGrad
,iteration
)params
に含まれる学習可能なパラメーターを更新します。関数を使用して定義されたネットワークの学習可能なパラメーターを反復的に更新するには、学習ループでこの構文を使用します。
[___] = adamupdate(___
は、前述の構文の入力引数に加え、グローバル学習率、勾配減衰、二乗勾配減衰、および微小定数イプシロンに使用する値も指定します。 learnRate
,gradDecay
,sqGradDecay
,epsilon
)
例
adamupdate
を使用した学習可能なパラメーターの更新
グローバル学習率 0.05
、勾配減衰係数 0.75
、および二乗勾配減衰係数 0.95
で、適応モーメント推定による更新を 1 ステップ実行します。
パラメーターとパラメーター勾配を数値配列として作成します。
params = rand(3,3,4); grad = ones(3,3,4);
最初の反復の反復カウンター、平均勾配、および平均二乗勾配を初期化します。
iteration = 1; averageGrad = []; averageSqGrad = [];
グローバル学習率、勾配減衰係数、および二乗勾配減衰係数のカスタム値を指定します。
learnRate = 0.05; gradDecay = 0.75; sqGradDecay = 0.95;
adamupdate
を使用して学習可能なパラメーターを更新します。
[params,averageGrad,averageSqGrad] = adamupdate(params,grad,averageGrad,averageSqGrad,iteration,learnRate,gradDecay,sqGradDecay);
反復カウンターを更新します。
iteration = iteration + 1;
adamupdate
を使用したネットワークの学習
adamupdate
を使用して、Adam アルゴリズムによるネットワークの学習を行います。
学習データの読み込み
数字の学習データを読み込みます。
[XTrain,TTrain] = digitTrain4DArrayData; classes = categories(TTrain); numClasses = numel(classes);
ネットワークの定義
ネットワークを定義し、イメージ入力層で Mean
オプションを使用して平均イメージの値を指定します。
layers = [ imageInputLayer([28 28 1],'Mean',mean(XTrain,4)) convolution2dLayer(5,20) reluLayer convolution2dLayer(3,20,'Padding',1) reluLayer convolution2dLayer(3,20,'Padding',1) reluLayer fullyConnectedLayer(numClasses) softmaxLayer];
層配列から dlnetwork
オブジェクトを作成します。
net = dlnetwork(layers);
モデル損失関数の定義
例の最後にリストされている補助関数 modelLoss
を作成します。この関数は、dlnetwork
オブジェクト、および入力データのミニバッチとそれに対応するラベルを受け取り、学習可能なパラメーターについての損失とその損失の勾配を返します。
学習オプションの指定
学習中に使用するオプションを指定します。
miniBatchSize = 128; numEpochs = 20; numObservations = numel(TTrain); numIterationsPerEpoch = floor(numObservations./miniBatchSize);
ネットワークの学習
平均勾配および 2 乗平均勾配を初期化します。
averageGrad = []; averageSqGrad = [];
学習の進行状況モニター用に合計反復回数を計算します。
numIterations = numEpochs * numIterationsPerEpoch;
TrainingProgressMonitor
オブジェクトを初期化します。monitor オブジェクトを作成するとタイマーが開始されるため、学習ループに近いところでオブジェクトを作成するようにしてください。
monitor = trainingProgressMonitor(Metrics="Loss",Info="Epoch",XLabel="Iteration");
カスタム学習ループを使用してモデルに学習させます。各エポックについて、データをシャッフルしてデータのミニバッチをループで回します。関数 adamupdate
を使用してネットワーク パラメーターを更新します。反復が終了するたびに、学習の進行状況を表示します。
GPU が利用できる場合、GPU で学習を行います。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
iteration = 0; epoch = 0; while epoch < numEpochs && ~monitor.Stop epoch = epoch + 1; % Shuffle data. idx = randperm(numel(TTrain)); XTrain = XTrain(:,:,:,idx); TTrain = TTrain(idx); i = 0; while i < numIterationsPerEpoch && ~monitor.Stop i = i + 1; iteration = iteration + 1; % Read mini-batch of data and convert the labels to dummy % variables. idx = (i-1)*miniBatchSize+1:i*miniBatchSize; X = XTrain(:,:,:,idx); T = zeros(numClasses, miniBatchSize,"single"); for c = 1:numClasses T(c,TTrain(idx)==classes(c)) = 1; end % Convert mini-batch of data to a dlarray. X = dlarray(single(X),"SSCB"); % If training on a GPU, then convert data to a gpuArray. if canUseGPU X = gpuArray(X); end % Evaluate the model loss and gradients using dlfeval and the % modelLoss function. [loss,gradients] = dlfeval(@modelLoss,net,X,T); % Update the network parameters using the Adam optimizer. [net,averageGrad,averageSqGrad] = adamupdate(net,gradients,averageGrad,averageSqGrad,iteration); % Update the training progress monitor. recordMetrics(monitor,iteration,Loss=loss); updateInfo(monitor,Epoch=epoch + " of " + numEpochs); monitor.Progress = 100 * iteration/numIterations; end end
ネットワークのテスト
真のラベルをもつテスト セットで予測を比較して、モデルの分類精度をテストします。
[XTest,TTest] = digitTest4DArrayData;
次元形式 "SSCB"
(空間、空間、チャネル、バッチ) を使用して、データを dlarray
に変換します。GPU で予測する場合、データを gpuArray
にも変換します。
XTest = dlarray(XTest,"SSCB"); if canUseGPU XTest = gpuArray(XTest); end
dlnetwork
オブジェクトを使用してイメージを分類するには、関数 predict
を使用してスコアが最も高いクラスを見つけます。
YTest = predict(net,XTest); [~,idx] = max(extractdata(YTest),[],1); YTest = classes(idx);
分類精度を評価します。
accuracy = mean(YTest==TTest)
accuracy = 0.9908
モデル損失関数
補助関数 modelLoss
は、dlnetwork
オブジェクト net
、および入力データのミニバッチ X
とそれに対応するラベル T
を受け取り、net
内の学習可能なパラメーターについての損失とその損失の勾配を返します。勾配を自動的に計算するには、関数 dlgradient
を使用します。
function [loss,gradients] = modelLoss(net,X,T) Y = forward(net,X); loss = crossentropy(Y,T); gradients = dlgradient(loss,net.Learnables); end
入力引数
net
— ネットワーク
dlnetwork
オブジェクト
ネットワーク。dlnetwork
オブジェクトとして指定します。
この関数は、dlnetwork
オブジェクトの Learnables
プロパティを更新します。net.Learnables
は、3 つの変数をもつ table です。
Layer
— 層の名前。string スカラーとして指定します。Parameter
— パラメーター名。string スカラーとして指定します。Value
— パラメーターの値。dlarray
を含む cell 配列として指定します。
入力引数 grad
は、net.Learnables
と同じ形式の table でなければなりません。
params
— ネットワークの学習可能パラメーター
dlarray
| 数値配列 | cell 配列 | 構造体 | table
ネットワークの学習可能なパラメーター。dlarray
、数値配列、cell 配列、構造体、または table として指定します。
params
を table として指定する場合、次の 3 つの変数を table に含めなければなりません。
Layer
— 層の名前。string スカラーとして指定します。Parameter
— パラメーター名。string スカラーとして指定します。Value
— パラメーターの値。dlarray
を含む cell 配列として指定します。
cell 配列、構造体、table、入れ子になった cell 配列、または入れ子になった構造体を使用し、ネットワークの学習可能なパラメーターのコンテナーとして params
を指定できます。cell 配列、構造体、または table に含まれる学習可能なパラメーターは、データ型が double
または single
である dlarray
または数値でなければなりません。
入力引数 grad
のデータ型、順序、およびフィールド (構造体の場合) または変数 (table の場合) は、params
とまったく同じでなければなりません。
学習可能なパラメーターに複素数値を使用できます。 (R2024a 以降)該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 学習可能なパラメーターに複素数値を使用してはなりません。モデルに複素数の学習可能なパラメーターが含まれている場合、学習可能なパラメーターを実数値に変換してから勾配を計算してください。
grad
— 損失の勾配
dlarray
| 数値配列 | cell 配列 | 構造体 | table
損失の勾配。dlarray
、数値配列、cell 配列、構造体、または table として指定します。
grad
の厳密な形式は、入力ネットワークまたは学習可能なパラメーターによって異なります。adamupdate
に与えることができる入力について、grad
で要求される形式を次の表に示します。
入力 | 学習可能なパラメーター | 勾配 |
---|---|---|
net | 変数 Layer 、Parameter 、および Value を含む table net.Learnables 。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列から成ります。 | データ型、変数、および順序が net.Learnables と同じである table。grad は、各学習可能なパラメーターの勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
params | dlarray | データ型と順序が params と同じである dlarray |
数値配列 | データ型と順序が params と同じである数値配列 | |
cell 配列 | データ型、構造体、および順序が params と同じである cell 配列 | |
構造体 | データ型、フィールド、および順序が params と同じである構造体 | |
変数 Layer 、Parameter 、および Value をもつ table。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列で構成されていなければなりません。 | データ型、変数、および順序が params と同じである table。grad は、各学習可能なパラメーターの勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
dlgradient
への呼び出しが含まれる関数を評価する dlfeval
を呼び出すことで、grad
を取得できます。詳細については、Deep Learning Toolbox での自動微分の使用を参照してください。
勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。
averageGrad
— パラメーター勾配の移動平均
[]
| dlarray
| 数値配列 | cell 配列 | 構造体 | table
パラメーター勾配の移動平均。空の配列、dlarray
、数値配列、cell 配列、構造体、または table として指定します。
averageGrad
の厳密な形式は、入力ネットワークまたは学習可能なパラメーターによって異なります。adamupdate
に与えることができる入力について、averageGrad
で要求される形式を次の表に示します。
入力 | 学習可能なパラメーター | 平均勾配 |
---|---|---|
net | 変数 Layer 、Parameter 、および Value を含む table net.Learnables 。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列から成ります。 | データ型、変数、および順序が net.Learnables と同じである table。averageGrad は、各学習可能なパラメーターの平均勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
params | dlarray | データ型と順序が params と同じである dlarray |
数値配列 | データ型と順序が params と同じである数値配列 | |
cell 配列 | データ型、構造体、および順序が params と同じである cell 配列 | |
構造体 | データ型、フィールド、および順序が params と同じである構造体 | |
変数 Layer 、Parameter 、および Value をもつ table。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列で構成されていなければなりません。 | データ型、変数、および順序が params と同じである table。averageGrad は、各学習可能なパラメーターの平均勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
averageGrad
および averageSqGrad
を空の配列として指定した場合、この関数は、過去の勾配が存在しないと仮定し、一連の反復における最初の更新時と同じ処理を実行します。学習可能なパラメーターを反復的に更新するには、前回の adamupdate
の呼び出しで得られた出力 averageGrad
を入力 averageGrad
として使用します。
勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。
averageSqGrad
— 二乗パラメーター勾配の移動平均
[]
| dlarray
| 数値配列 | cell 配列 | 構造体 | table
二乗パラメーター勾配の移動平均。空の配列、dlarray
、数値配列、cell 配列、構造体、または table として指定します。
averageSqGrad
の厳密な形式は、入力ネットワークまたは学習可能なパラメーターによって異なります。adamupdate
に与えることができる入力について、averageSqGrad
で要求される形式を次の表に示します。
入力 | 学習可能なパラメーター | 平均二乗勾配 |
---|---|---|
net | 変数 Layer 、Parameter 、および Value を含む table net.Learnables 。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列から成ります。 | データ型、変数、および順序が net.Learnables と同じである table。averageSqGrad は、各学習可能なパラメーターの平均二乗勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
params | dlarray | データ型と順序が params と同じである dlarray |
数値配列 | データ型と順序が params と同じである数値配列 | |
cell 配列 | データ型、構造体、および順序が params と同じである cell 配列 | |
構造体 | データ型、フィールド、および順序が params と同じである構造体 | |
変数 Layer 、Parameter 、および Value をもつ table。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列で構成されていなければなりません。 | データ型、変数、および順序が params と同じである table。averageSqGrad は、各学習可能なパラメーターの平均二乗勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。 |
averageGrad
および averageSqGrad
を空の配列として指定した場合、この関数は、過去の勾配が存在しないと仮定し、一連の反復における最初の更新時と同じ処理を実行します。学習可能なパラメーターを反復的に更新するには、前回の adamupdate
の呼び出しで得られた出力 averageSqGrad
を入力 averageSqGrad
として使用します。
勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。
iteration
— 反復回数
正の整数
反復回数。正の整数として指定します。adamupdate
を最初に呼び出すときは、1
の値を使用します。その後、adamupdate
を呼び出すたびに、iteration
を 1
ずつインクリメントしなければなりません。Adam アルゴリズムは、この値を使用して、一連の反復処理の開始時に移動平均のバイアスを修正します。
learnRate
— グローバル学習率
0.001
(既定値) | 正のスカラー
グローバル学習率。正のスカラーとして指定します。learnRate
の既定値は 0.001
です。
ネットワーク パラメーターを dlnetwork
として指定した場合、各パラメーターの学習率は、グローバル学習率に、ネットワーク層で定義された対応する学習率係数プロパティを乗算した値になります。
gradDecay
— 勾配減衰係数
0.9
(既定値) | 0
~ 1
の正のスカラー
勾配減衰係数。0
~ 1
の正のスカラーとして指定します。gradDecay
の既定値は 0.9
です。
sqGradDecay
— 二乗勾配減衰係数
0.999
(既定値) | 0
~ 1
の正のスカラー
二乗勾配減衰係数。0
~ 1
の正のスカラーとして指定します。sqGradDecay
の既定値は 0.999
です。
epsilon
— 微小定数
1e-8
(既定値) | 正のスカラー
ゼロ除算エラーを回避するための微小定数。正のスカラーとして指定します。epsilon
の既定値は 1e-8
です。
出力引数
netUpdated
— 更新されたネットワーク
dlnetwork
オブジェクト
更新されたネットワーク。dlnetwork
オブジェクトとして返されます。
この関数は、dlnetwork
オブジェクトの Learnables
プロパティを更新します。
params
— 更新されたネットワークの学習可能なパラメーター
dlarray
| 数値配列 | cell 配列 | 構造体 | table
更新されたネットワークの学習可能なパラメーター。dlarray
、数値配列、cell 配列、構造体、またはネットワークの更新された学習可能なパラメーターが格納された変数 Value
をもつ table として返されます。
学習可能なパラメーターに複素数値を使用できます。 (R2024a 以降)該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 学習可能なパラメーターに複素数値を使用してはなりません。モデルに複素数の学習可能なパラメーターが含まれている場合、学習可能なパラメーターを実数値に変換してから勾配を計算してください。
averageGrad
— 更新されたパラメーター勾配の移動平均
dlarray
| 数値配列 | cell 配列 | 構造体 | table
更新されたパラメーター勾配の移動平均。dlarray
、数値配列、cell 配列、構造体、または table として返されます。
勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。
averageSqGrad
— 更新された二乗パラメーター勾配の移動平均
dlarray
| 数値配列 | cell 配列 | 構造体 | table
更新された二乗パラメーター勾配の移動平均。dlarray
、数値配列、cell 配列、構造体、または table として返されます。
勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。
R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。
アルゴリズム
適応モーメント推定
適応モーメント推定 (Adam) [1]では、RMSProp に似ているが、モーメンタム項が追加されたパラメーター更新を使用します。これは、パラメーターの勾配とそれらの二乗値の両方について要素単位の移動平均を維持します。
減衰率 β1 と β2 は、それぞれ勾配減衰係数および二乗勾配減衰係数です。Adam では、移動平均を使用してネットワーク パラメーターを次のように更新します。
値 α は学習率です。多数の反復に対する勾配が類似している場合、勾配の移動平均を使用すると、パラメーター更新で特定方向のモーメンタム項を選択できます。勾配のほとんどがノイズである場合、勾配の移動平均が小さくなり、パラメーター更新も小さくなります。Adam の完全な更新には、学習の最初に現れるバイアスを補正するメカニズムも含まれています。詳細については、[1]を参照してください。
参照
[1] Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980 (2014).
拡張機能
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意および制限:
以下の入力引数の少なくとも 1 つが、
gpuArray
型の基になるデータをもつgpuArray
またはdlarray
である場合、この関数は GPU で実行されます。grad
averageGrad
averageSqGrad
params
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2019b で導入R2024a: 複素数値の学習可能なパラメーターと勾配
学習可能なパラメーター、勾配、勾配の移動平均、および勾配の 2 乗の移動平均に、複素数値を使用できます。更新された学習可能なパラメーターが複素数値である場合、該当する演算が複素数値のパラメーターをサポートしていることを確認してください。
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)