メインコンテンツ

dljacobian

ヤコビ行列深層学習演算

R2024b 以降

    説明

    ヤコビアン深層学習演算は、指定された入力データと演算次元に関して、ニューラル ネットワークとモデル関数の出力のヤコビ行列を返します。

    jac = dljacobian(u,x,dim) は、指定された演算次元のデータ x に関して、ニューラル ネットワークまたはモデル関数の出力 u のヤコビ行列を返します。

    jac = dljacobian(u,x,dim,EnableHigherDerivatives=tf) は、バックワード パスをトレースして高次微分を有効にするかどうかも指定します。

    すべて折りたたむ

    ニューラル ネットワークを作成します。

    inputSize = [16 16 3];
    numOutputChannels = 5;
    
    layers = [
        imageInputLayer(inputSize)
        convolution2dLayer(3,64)
        reluLayer
        fullyConnectedLayer(numOutputChannels)
        softmaxLayer];
    
    net = dlnetwork(layers);

    学習データを読み込みます。この例では、ランダム データをいくつか生成します。

    numObservations = 128;
    X = rand([inputSize numObservations]);
    X = dlarray(X,"SSCB");
    
    T = rand([numOutputChannels numObservations]);
    T = dlarray(T,"CB");

    ネットワークとデータを入力として受け取り、損失、学習可能なパラメーターに対するその損失の勾配、および入力データに関する予測のヤコビアンを返すモデル損失関数を定義します。

    function [loss,gradients,jac] = modelLoss(net,X,T)
    
    Y = forward(net,X);
    loss = l1loss(Y,T);
    
    X = stripdims(X);
    Y = stripdims(Y);
    
    jac = dljacobian(Y,X,1);
    gradients = dlgradient(loss,net.Learnables);
    
    end

    dlfeval 関数を使用してモデル損失関数を評価します。

    [loss,gradients,jac] = dlfeval(@modelLoss,net,X,T);

    ヤコビアンのサイズを表示します。

    size(jac)
    ans = 1×5
    
         5    16    16     3   128
    
    

    入力引数

    すべて折りたたむ

    ニューラル ネットワークまたはモデル関数の出力。トレースされた dlarray 行列として指定します。

    自動微分を有効にして関数を評価する場合、ソフトウェアは入力 dlarray オブジェクトをトレースします。ソフトウェアが dlarray をトレースするコンテキストには次のものが含まれます。

    • trainnet 関数が評価する損失関数の内部

    • カスタム層が評価する forward 関数の内部

    • dlfeval 関数が評価するモデルとモデル損失関数の内部

    dim 引数で指定されていない次元のサイズは同じでなければなりません。

    入力データ。トレースされた dlarray オブジェクトとして指定します。

    自動微分を有効にして関数を評価する場合、ソフトウェアは入力 dlarray オブジェクトをトレースします。ソフトウェアが dlarray をトレースするコンテキストには次のものが含まれます。

    • trainnet 関数が評価する損失関数の内部

    • カスタム層が評価する forward 関数の内部

    • dlfeval 関数が評価するモデルとモデル損失関数の内部

    dim 引数で指定されていない次元のサイズは同じでなければなりません。

    u の演算次元。正の整数として指定します。

    dljacobian 関数は、データの残りの次元を独立したバッチ次元として扱います。

    データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    高次微分を有効にするフラグ。次のいずれかの値として指定します。

    • 数値または logical 1 (true) — 高次微分を有効にします。自動微分を使用して微分を計算する関数 (dlgradientdljacobiandldivergence、および dllaplacian など) をさらに呼び出したときに、返された値を計算で使用できるように、バックワード パスがトレースされます。

    • 数値または logical 0 (false) — 高次微分を無効にします。バックワード パスはトレースされません。一次微分のみを計算する場合、このオプションを使用すると、通常、処理時間が短縮され、メモリ使用量が節約されます。

    出力引数

    すべて折りたたむ

    ヤコビアン。形式を整えていない dlarray オブジェクトとして返されます。

    jac のレイアウトは、dim、および ux のサイズによって決まります。

    出力 jac(N+1) 次元の配列です。ここで、Nx の次元数です。出力 jac のサイズは [szU,szX1,szX2,...,szXN] です。ここで、szUsize(u,dim) に対応し、[szX1,szX2,...,szXN]x のサイズです。

    jac の各要素は、x の要素に関する u の要素の偏微分を表します。

    • dim1 である場合、jac(i,j1,j2,...,jn) は、x(j1,j2,...,jN) に関する u(i,jk) の偏微分に対応します。ここで、jkx のバッチ次元のインデックスです。

    • dim2 である場合、jac(i,j1,j2,...,jn) は、x(j1,j2,...,jN) に関する u(jk,i) の偏微分に対応します。ここで、jkx のバッチ次元のインデックスです。

    バージョン履歴

    R2024b で導入