Main Content

カスタム出力層の逆方向損失関数の指定

ヒント

カスタム出力層は非推奨です。代わりに関数 trainnet を使用し、カスタム損失関数を指定します。損失関数のカスタム逆方向逆関数を指定するには、deep.DifferentiableFunction オブジェクトを使用します。詳細については、Define Custom Deep Learning Operationsを参照してください。

関数 trainNetwork を使用するにあたって、目的のタスクに必要な出力層が Deep Learning Toolbox™ に用意されていない場合、独自のカスタム出力層を定義できます。カスタム出力層を作成するにあたって、逆方向損失関数の作成は任意です。順方向損失関数が dlarray オブジェクトをサポートする関数のみを使用する場合、ソフトウェアは、自動微分を使用して微分を自動的に求めます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。dlarray オブジェクトをサポートしていない関数を使用する場合、または逆方向損失関数に特定のアルゴリズムを使用する場合、この例を指針として使用してカスタム逆方向関数を定義できます。

カスタム分類出力層の定義の例は、残差平方和 (SSE) 損失を使用するカスタム分類出力層を定義および作成する方法を示しており、次の手順を実行します。

  1. 層の命名 – MATLAB® で使用できるように層に名前を付けます。

  2. 層のプロパティの宣言 – 層のプロパティを指定します。

  3. コンストラクター関数の作成 (オプション) – 層の構築とそのプロパティ初期化の方法を指定します。コンストラクター関数を指定しない場合、プロパティは作成時に '' で初期化されます。

  4. 順方向損失関数の作成 – 予測と学習ターゲットの間の損失を指定します。

  5. 逆方向損失関数の作成 (オプション) – 予測についての損失の微分を指定します。逆方向損失関数を指定しない場合、順方向損失関数は dlarray オブジェクトをサポートしなければなりません。

逆方向損失関数の作成はオプションです。順方向損失関数が dlarray オブジェクトをサポートする関数のみを使用する場合、ソフトウェアは、自動微分を使用して微分を自動的に求めます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。dlarray オブジェクトをサポートしていない関数を使用する場合、または逆方向損失関数に特定のアルゴリズムを使用する場合、この例を指針として使用してカスタム逆方向関数を定義できます。

カスタム層の作成

カスタム分類出力層の定義の例では、SSE 分類層の作成方法を示しています。

分類 SSE 層は、分類問題の残差平方和損失を計算します。SSE は、2 つの連続確率変数間の誤差測定です。予測 Y と学習ターゲット T について、Y と T の間の SSE 損失は次で与えられます。

L=1Nn=1Ni=1K(YniTni)2,

ここで、N は観測値の数、K はクラスの数です。

カスタム分類出力層の定義の例で作成された層を表示します。この層には関数 backwardLoss がありません。

classdef sseClassificationLayer < nnet.layer.ClassificationLayer ... 
        & nnet.layer.Acceleratable
    % Example custom classification layer with sum of squares error loss.
    
    methods
        function layer = sseClassificationLayer(name)
            % layer = sseClassificationLayer(name) creates a sum of squares
            % error classification layer and specifies the layer name.
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Sum of squares error';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the SSE loss between
            % the predictions Y and the training targets T.

            % Calculate sum of squares.
            sumSquares = sum((Y-T).^2);
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(sumSquares)/N;
        end
    end
end

逆方向損失関数の作成

入力データおよび学習可能なパラメーターについての損失の微分を返す関数 backwardLoss を実装します。

backwardLoss の構文は、dLdY = backwardLoss(layer,Y,T) です。入力 Y はネットワークで行った予測を含み、T は学習ターゲットを含みます。出力 dLdY は予測 Y についての損失の微分です。出力 dLdY は、層入力 Y と同じサイズでなければなりません。

YT の次元は forwardLoss の入力と同じです。

予測 Y についての SSE 損失の微分は次で与えられます。

δLδYi=2N(YiTi),

ここで、N は入力内の観測値の数です。

これらの微分を返す逆方向損失関数を作成します。

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the SSE loss with respect to the predictions Y.
            
            N = size(Y,4);
            dLdY = 2*(Y-T)/N;
        end

層の完成

完成した層のクラス ファイルを表示します。

classdef sseClassificationLayer < nnet.layer.ClassificationLayer
    % Example custom classification layer with sum of squares error loss.
    
    methods
        function layer = sseClassificationLayer(name)
            % layer = sseClassificationLayer(name) creates a sum of squares
            % error classification layer and specifies the layer name.
    
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Sum of squares error';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the SSE loss between
            % the predictions Y and the training targets T.

            % Calculate sum of squares.
            sumSquares = sum((Y-T).^2);
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(sumSquares)/N;
        end

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the SSE loss with respect to the predictions Y.
            
            N = size(Y,4);
            dLdY = 2*(Y-T)/N;
        end
    end
end

GPU 互換性

層の順方向関数が dlarray オブジェクトを完全にサポートしている場合、層は GPU 互換です。そうでない場合、GPU 互換にするには、層関数が入力をサポートし、gpuArray (Parallel Computing Toolbox) 型の出力を返さなければなりません。

多くの MATLAB 組み込み関数が入力引数 gpuArray (Parallel Computing Toolbox) および dlarray をサポートしています。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。

参考

| | | | | |

関連するトピック