Main Content

rmspropupdate

平方根平均二乗伝播 (RMSProp) を使用してパラメーターを更新する

R2019b 以降

説明

平方根平均二乗伝播 (RMSProp) アルゴリズムを使用して、カスタム学習ループでネットワークの学習可能なパラメーターを更新します。

メモ

この関数は、RMSProp 最適化アルゴリズムを適用して、カスタム学習ループでネットワークのパラメーターを更新します。関数 trainnet を使用して RMSProp ソルバーでニューラル ネットワークに学習させるには、関数 trainingOptions を使用してソルバーを "rmsprop" に設定します。

[netUpdated,averageSqGrad] = rmspropupdate(net,grad,averageSqGrad) は、RMSProp アルゴリズムを使用して、ネットワーク net の学習可能なパラメーターを更新します。dlnetwork オブジェクトとして定義されたネットワークを反復的に更新するには、学習ループでこの構文を使用します。

[params,averageSqGrad] = rmspropupdate(params,grad,averageSqGrad) は、RMSProp アルゴリズムを使用して、params に含まれる学習可能なパラメーターを更新します。関数を使用して定義されたネットワークの学習可能なパラメーターを反復的に更新するには、学習ループでこの構文を使用します。

[___] = rmspropupdate(___learnRate,sqGradDecay,epsilon) は、前述の構文の入力引数に加え、グローバル学習率、二乗勾配減衰、および微小定数イプシロンに使用する値も指定します。

すべて折りたたむ

グローバル学習率 0.05、二乗勾配減衰係数 0.95 で、平方根平均二乗伝播による更新を 1 ステップ実行します。

パラメーターとパラメーター勾配を数値配列として作成します。

params = rand(3,3,4);
grad = ones(3,3,4);

最初の反復の平均二乗勾配を初期化します。

averageSqGrad = [];

グローバル学習率と二乗勾配減衰係数のカスタム値を指定します。

learnRate = 0.05;
sqGradDecay = 0.95;

rmspropupdate を使用して学習可能なパラメーターを更新します。

[params,averageSqGrad] = rmspropupdate(params,grad,averageSqGrad,learnRate,sqGradDecay);

rmspropupdate を使用し、平方根平均二乗伝播 (RMSProp) アルゴリズムを使用してネットワークに学習させます。

学習データの読み込み

数字の学習データを読み込みます。

[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);

ネットワークの学習

平均二乗勾配を初期化します。

averageSqGrad = [];

学習の進行状況モニター用に合計反復回数を計算します。

numIterations = numEpochs * numIterationsPerEpoch;

TrainingProgressMonitor オブジェクトを初期化します。monitor オブジェクトを作成するとタイマーが開始されるため、学習ループに近いところでオブジェクトを作成するようにしてください。

monitor = trainingProgressMonitor(Metrics="Loss",Info="Epoch",XLabel="Iteration");

カスタム学習ループを使用してモデルに学習させます。各エポックについて、データをシャッフルしてデータのミニバッチをループで回します。関数 rmspropupdate を使用してネットワーク パラメーターを更新します。反復が終了するたびに、学習の進行状況を表示します。

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 RMSProp optimizer.
        [net,averageSqGrad] = rmspropupdate(net,gradients,averageSqGrad);

        % 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.9926

モデル損失関数

補助関数 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

入力引数

すべて折りたたむ

ネットワーク。dlnetwork オブジェクトとして指定します。

この関数は、dlnetwork オブジェクトの Learnables プロパティを更新します。net.Learnables は、3 つの変数をもつ table です。

  • Layer — 層の名前。string スカラーとして指定します。

  • Parameter — パラメーター名。string スカラーとして指定します。

  • Value — パラメーターの値。dlarray を含む cell 配列として指定します。

入力引数 grad は、net.Learnables と同じ形式の 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 より前: 学習可能なパラメーターに複素数値を使用してはなりません。モデルに複素数の学習可能なパラメーターが含まれている場合、学習可能なパラメーターを実数値に変換してから勾配を計算してください。

損失の勾配。dlarray、数値配列、cell 配列、構造体、または table として指定します。

grad の厳密な形式は、入力ネットワークまたは学習可能なパラメーターによって異なります。rmspropupdate に与えることができる入力について、grad で要求される形式を次の表に示します。

入力学習可能なパラメーター勾配
net変数 LayerParameter、および Value を含む table net.Learnables。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列から成ります。 データ型、変数、および順序が net.Learnables と同じである table。grad は、各学習可能なパラメーターの勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。
paramsdlarrayデータ型と順序が params と同じである dlarray
数値配列データ型と順序が params と同じである数値配列
cell 配列データ型、構造体、および順序が params と同じである cell 配列
構造体データ型、フィールド、および順序が params と同じである構造体
変数 LayerParameter、および Value をもつ table。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列で構成されていなければなりません。データ型、変数、および順序が params と同じである table。grad は、各学習可能なパラメーターの勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。

dlgradient への呼び出しが含まれる関数を評価する dlfeval を呼び出すことで、grad を取得できます。詳細については、Deep Learning Toolbox での自動微分の使用を参照してください。

勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。

R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。

二乗パラメーター勾配の移動平均。空の配列、dlarray、数値配列、cell 配列、構造体、または table として指定します。

averageSqGrad の厳密な形式は、入力ネットワークまたは学習可能なパラメーターによって異なります。rmspropupdate に与えることができる入力について、averageSqGrad で要求される形式を次の表に示します。

入力学習可能なパラメーター平均二乗勾配
net変数 LayerParameter、および Value を含む table net.Learnables。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列から成ります。 データ型、変数、および順序が net.Learnables と同じである table。averageSqGrad は、各学習可能なパラメーターの平均二乗勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。
paramsdlarrayデータ型と順序が params と同じである dlarray
数値配列データ型と順序が params と同じである数値配列
cell 配列データ型、構造体、および順序が params と同じである cell 配列
構造体データ型、フィールド、および順序が params と同じである構造体
変数 LayerParameter、および Value をもつ table。変数 Value は、各学習可能なパラメーターが dlarray として格納された cell 配列で構成されていなければなりません。データ型、変数、および順序が params と同じである table。averageSqGrad は、各学習可能なパラメーターの平均二乗勾配が格納された cell 配列から成る変数 Value で構成されていなければなりません。

averageSqGrad を空の配列として指定した場合、この関数は、過去の勾配が存在しないと仮定し、一連の反復における最初の更新時と同じ処理を実行します。学習可能なパラメーターを反復的に更新するには、前回の rmspropupdate の呼び出しで得られた出力 averageSqGrad を入力 averageSqGrad として使用します。

勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。

R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。

グローバル学習率。正のスカラーとして指定します。learnRate の既定値は 0.001 です。

ネットワーク パラメーターを dlnetwork として指定した場合、各パラメーターの学習率は、グローバル学習率に、ネットワーク層で定義された対応する学習率係数プロパティを乗算した値になります。

二乗勾配減衰係数。01 の正のスカラーとして指定します。sqGradDecay の既定値は 0.9 です。

ゼロ除算エラーを回避するための微小定数。正のスカラーとして指定します。epsilon の既定値は 1e-8 です。

出力引数

すべて折りたたむ

更新されたネットワーク。dlnetwork オブジェクトとして返されます。

この関数は、dlnetwork オブジェクトの Learnables プロパティを更新します。

更新されたネットワークの学習可能なパラメーター。dlarray、数値配列、cell 配列、構造体、またはネットワークの更新された学習可能なパラメーターが格納された変数 Value をもつ table として返されます。

学習可能なパラメーターに複素数値を使用できます。 (R2024a 以降)該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。

R2024a より前: 学習可能なパラメーターに複素数値を使用してはなりません。モデルに複素数の学習可能なパラメーターが含まれている場合、学習可能なパラメーターを実数値に変換してから勾配を計算してください。

更新された二乗パラメーター勾配の移動平均。dlarray、数値配列、cell 配列、構造体、または table として返されます。

勾配に複素数値を使用できます。 (R2024a 以降)複素数値の勾配を使用すると、学習可能なパラメーターが複素数値になる場合があります。該当する演算が複素数値の学習可能なパラメーターをサポートしていることを確認してください。

R2024a より前: 勾配に複素数値を使用してはなりません。モデルに複素数が含まれている場合、すべての出力を実数値に変換してから勾配を計算してください。

アルゴリズム

すべて折りたたむ

平方根平均二乗伝播

モーメンタム項付き確率的勾配降下法は、すべてのパラメーターに対して 1 つの学習率を使用します。その他の最適化アルゴリズムでは、パラメーターごとに異なり、最適化対象の損失関数に自動的に適応できる学習率を使用して、ネットワーク学習の改善を試みます。平方根平均二乗伝播 (RMSProp) はそのようなアルゴリズムの 1 つです。これは、パラメーターの勾配について要素単位の二乗の移動平均を維持します。

v=β2v1+(1β2)[E(θ)]2

β2 は、移動平均の二乗勾配減衰係数です。減衰率の一般的な値は、0.9、0.99、および 0.999 です。対応する勾配の二乗の平均化長は、1/(1-β2) に等しく、それぞれ 10、100、および 1000 回のパラメーター更新です。RMSProp アルゴリズムでは、この移動平均を使用して各パラメーターの更新を個別に正規化します。

θ+1=θαE(θ)v+ϵ

ここで、除算は要素単位で実行されます。RMSProp を使用すると、勾配が大きいパラメーターの学習率は効果的に減少し、勾配が小さいパラメーターの学習率は増加します。ɛ は、ゼロ除算を回避するために追加する小さい定数です。

拡張機能

バージョン履歴

R2019b で導入

すべて展開する