Main Content

カスタム深層学習出力層の定義

ヒント

このトピックでは、問題に合わせてカスタム深層学習出力層を定義する方法を説明します。Deep Learning Toolbox™ に組み込まれている層の一覧については、深層学習層の一覧を参照してください。

カスタム中間層を定義する方法については、カスタム深層学習中間層の定義を参照してください。

目的のタスクに必要な出力層が Deep Learning Toolbox に用意されていない場合、このトピックを指針として使用して独自のカスタム層を定義できます。カスタム層を定義した後、その層の有効性、GPU 互換性、定義した勾配の出力の正しさをチェックできます。

出力層のアーキテクチャ

学習時のフォワード パスの最後で、出力層は前の層の予測 (ネットワーク出力) Y を受け取り、これらの予測と学習ターゲットの間の損失 L を計算します。出力層は、予測 Y について損失 L の微分を計算し、結果を前の層に出力 (逆伝播) します。

次の図は、畳み込みニューラル ネットワークおよび出力層におけるデータのフローを示しています。

出力層テンプレート

カスタム中間層を定義するには、次のいずれかのクラス定義テンプレートを使用します。これらテンプレートは、出力層のクラス定義の構造を示しています。概要は次のとおりです。

  • 層のプロパティを定義するオプションの properties ブロック。詳細については、出力層のプロパティを参照してください。

  • 層のコンストラクター関数。

  • 関数 forwardLoss。詳細については、順方向損失関数を参照してください。

  • オプションの関数 backwardLoss。詳細については、逆方向損失関数を参照してください。

分類出力層テンプレート

このテンプレートは、損失関数を含む分類出力層の構造の概要を示しています。分類出力層を定義し、損失関数を指定する方法を示す例については、カスタム分類出力層の定義を参照してください。

classdef myClassificationLayer < nnet.layer.ClassificationLayer % ...
        % & nnet.layer.Acceleratable % (Optional)
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myClassificationLayer()           
            % (Optional) Create a myClassificationLayer.

            % Layer constructor function goes here.
        end

        function loss = forwardLoss(layer,Y,T)
            % Return the loss between the predictions Y and the training 
            % targets T.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         loss  - Loss between Y and T

            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer,Y,T)
            % (Optional) Backward propagate the derivative of the loss 
            % function.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         dLdY  - Derivative of the loss with respect to the 
            %                 predictions Y

            % Layer backward loss function goes here.
        end
    end
end

回帰出力層テンプレート

このテンプレートは、損失関数を含む回帰出力層の構造の概要を示しています。回帰出力層を定義し、損失関数を指定する方法を示す例については、カスタム回帰出力層の定義を参照してください。

classdef myRegressionLayer < nnet.layer.RegressionLayer % ...
        % & nnet.layer.Acceleratable % (Optional)
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myRegressionLayer()           
            % (Optional) Create a myRegressionLayer.

            % Layer constructor function goes here.
        end

        function loss = forwardLoss(layer,Y,T)
            % Return the loss between the predictions Y and the training
            % targets T.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         loss  - Loss between Y and T

            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer,Y,T)
            % (Optional) Backward propagate the derivative of the loss 
            % function.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         dLdY  - Derivative of the loss with respect to the 
            %                 predictions Y        

            % Layer backward loss function goes here.
        end
    end
end

カスタム層の高速化

カスタム層の定義時に逆方向関数を指定しない場合、自動微分を使用して勾配が自動的に決定されます。

逆方向関数がないカスタム層でネットワークに学習させる場合、カスタム層の順方向関数の各 dlarray 入力オブジェクトがトレースされ、自動微分に使用される計算グラフが決定されます。このトレース処理には時間がかかる場合があります。また、同じトレースが繰り返し計算される場合があります。トレースの最適化、キャッシュ、再利用を行うことで、ネットワーク学習時の勾配計算を高速化できます。また、学習後にこれらのトレースは再利用され、ネットワーク予測が高速化されます。

トレースは、層入力のサイズ、形式、基となるデータ型によって異なります。つまり、入力のサイズ、形式、基となるデータ型がキャッシュに含まれていない場合、層によって新しいトレースがトリガーされます。既にキャッシュされているトレースに対して入力の値のみが異なる場合、新しいトレースはトリガーされません。

カスタム層が高速化をサポートするように指定するには、カスタム層の定義時に nnet.layer.Acceleratable クラスからも継承します。nnet.layer.Acceleratable からカスタム層を継承すると、dlnetwork オブジェクトを使ってデータを渡すときにトレースが自動的にキャッシュされます。

たとえば、カスタム層 myLayer が高速化をサポートするように指定するには、次の構文を使用します。

classdef myLayer < nnet.layer.Layer & nnet.layer.Acceleratable
    ...
end

高速化の考慮事項

トレースのキャッシュの特性上、すべての関数が高速化をサポートしているわけではありません。

キャッシュ プロセスでは、変更される可能性がある、または外部の要因に左右される値またはコード構造がキャッシュされる場合があります。以下のようなカスタム層を高速化する際は、注意が必要です。

  • 乱数を生成する。

  • dlarray オブジェクトの値によって決まる条件を含む if ステートメントや while ループを使用する。

キャッシュ プロセスでは計算が追加されるため、場合によっては、高速化によってコードの実行時間が長くなってしまうことがあります。このシナリオは、再利用できない新しいキャッシュを作成することに頻繁に時間が費やされる場合に発生します。たとえば、シーケンス長が異なる複数のミニバッチを関数に渡すと、それぞれのシーケンス長ごとに新しいトレースがトリガーされます。

カスタム層の高速化によって速度が低下する場合は、Acceleratable mixin を削除して高速化を無効にするか、Acceleration オプションを "none" に設定して dlnetwork オブジェクトの関数 predictforward の高速化を無効にしてください。

カスタム層の高速化サポートを有効にする方法の詳細については、Custom Layer Function Accelerationを参照してください。

出力層のプロパティ

層のプロパティはクラス定義の properties セクションで宣言します。

既定では、カスタム出力層には次のプロパティがあります。

  • Name層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainNetworkassembleNetworklayerGraph、および dlnetwork は、名前が '' の層に自動的に名前を割り当てます。

  • Description — 層についての 1 行の説明。文字ベクトルまたは string スカラーとして指定します。この説明は、層が Layer 配列に表示されるときに表示されます。層の説明を指定しない場合、"Classification Output" または "Regression Output" が表示されます。

  • Type — 層のタイプ。文字ベクトルまたは string スカラーとして指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。

カスタム分類層には次のプロパティもあります。

  • Classes出力層のクラス。categorical ベクトル、string 配列、文字ベクトルの cell 配列、または 'auto' として指定します。Classes'auto' の場合、学習時にクラスが自動的に設定されます。string 配列または文字ベクトルの cell 配列 str を指定すると、出力層のクラスが categorical(str,str) に設定されます。

カスタム回帰層には次のプロパティもあります。

  • ResponseNames応答の名前。文字ベクトルの cell 配列または string 配列として指定します。学習時に、学習データに従って応答名が自動的に設定されます。既定値は {} です。

層にその他のプロパティがない場合は、properties セクションを省略できます。

順方向損失関数

出力層は、順方向損失関数を使用して予測とターゲットの間の損失 L を計算し、逆方向損失関数を使用して予測についての損失の微分を計算します。

forwardLoss の構文は、loss = forwardLoss(layer,Y,T) です。入力 Y は、ネットワークで行った予測に対応します。これらの予測は前の層の出力です。入力 T は学習ターゲットに対応します。出力 loss は、指定された損失関数に従った YT の間の損失です。出力 loss はスカラーでなければなりません。

逆方向損失関数

層の順方向損失関数が dlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。または、カスタム逆方向損失関数を定義するには、backwardLoss という名前の関数を作成します。カスタム逆方向損失関数の定義方法を示す例については、カスタム出力層の逆方向損失関数の指定を参照してください。

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

分類問題の場合、T の次元は問題のタイプによって異なります。

分類タスク入力サイズ観察値の次元
2 次元イメージ分類1×1×K×N。ここで、K はクラスの数、N は観測値の数です。4
3 次元イメージ分類1×1×1×K×N。ここで、K はクラスの数、N は観測値の数です。5
sequence-to-label 分類K 行 N 列。K はクラスの数、N は観測値の数です。2
sequence-to-sequence 分類K×N×S。ここで、K はクラス数、N は観測値の数、S はシーケンス長です。2

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、Y を必ず K 個のクラスの予測スコアを持つ 4 次元配列にするために、サイズが K の全結合層を含め、その後にソフトマックス層、出力層の順に配置することができます。

回帰問題の場合、T の次元も問題のタイプによって異なります。

回帰タスク入力サイズ観察値の次元
2 次元イメージ回帰1×1×R×N。ここで、R は応答の数、N は観測値の数です。4
2 次元 image-to-image 回帰h×w×c×N。ここで、h、w、および c は、それぞれ出力の高さ、幅、およびチャネル数、N は観測値の数です。4
3 次元イメージ回帰1×1×1×R×N。ここで、R は応答の数、N は観測値の数です。5
3 次元 image-to-image 回帰h×w×d×c×N。ここで、h、w、d、および c は、それぞれ出力の高さ、幅、深さ、およびチャネル数、N は観測値の数です。5
sequence-to-one 回帰R 行 N 列。ここで、R は応答の数、N は観測値の数です。2
sequence-to-sequence 回帰R×N×S。ここで、R は応答の数、N は観測値の数、S はシーケンス長です。2

たとえば、ネットワークで応答が 1 つのイメージ回帰ネットワークを定義していてミニバッチのサイズが 50 の場合、T はサイズ 1 x 1 x 1 x 50 の 4 次元配列です。

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、R 個の応答があるイメージ回帰の場合、Y を必ず正しいサイズの 4 次元配列にするために、出力層の前にサイズが R の全結合層を含めることができます。

関数 forwardLoss および backwardLoss には次の出力引数があります。

関数出力引数説明
forwardLossloss予測 Y と真のターゲット T の間で計算された損失
backwardLossdLdY予測 Y についての損失の微分

関数 backwardLoss は、前の層で必要なサイズの dLdY を出力する必要があります。また、dLdYY と同じサイズでなければなりません。

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)を参照してください。

層の有効性のチェック

カスタム深層学習層を作成する場合、関数 checkLayer を使用して、層が有効であることをチェックできます。この関数は、層について、有効性、GPU 互換性、勾配定義の正しさ、コード生成の互換性をチェックします。層が有効であることをチェックするには、次のコマンドを実行します。

checkLayer(layer,validInputSize)
layer は層のインスタンス、validInputSize は層に有効な入力サイズを指定するベクトルまたは cell 配列です。複数の観測値をチェックするには、ObservationDimension オプションを使用します。コード生成の互換性チェックを実行するには、CheckCodegenCompatibility オプションを 1 (true) に設定します。入力サイズが大きい場合、勾配チェックの実行に時間がかかります。チェックを高速化するには、指定する有効な入力サイズを小さくします。

詳細については、カスタム層の有効性のチェックを参照してください。

参考

| | | |

関連するトピック