dlgradient
自動微分を使用したカスタム学習ループの勾配の計算
説明
dlgradient
関数は自動微分を使用して微分を計算します。
ヒント
ほとんどの深層学習タスクでは、事前学習済みのニューラル ネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、Retrain Neural Network to Classify New Imagesを参照してください。または、関数 trainnet
と関数 trainingOptions
を使用してニューラル ネットワークを作成し、これにゼロから学習させることができます。
タスクに必要な学習オプションが関数 trainingOptions
に用意されていない場合、自動微分を使用してカスタム学習ループを作成できます。詳細については、カスタム学習ループを使用したネットワークの学習を参照してください。
タスクに必要な損失関数が関数 trainnet
に用意されていない場合、カスタム損失関数を関数ハンドルとして trainnet
に指定できます。損失関数が予測とターゲットよりも多くの入力を必要とする場合 (たとえば、損失関数がニューラル ネットワークまたは追加の入力にアクセスする必要がある場合)、カスタム学習ループを使用してモデルに学習させます。詳細については、カスタム学習ループを使用したネットワークの学習を参照してください。
タスクに必要な層が Deep Learning Toolbox™ に用意されていない場合、カスタム層を作成できます。詳細については、カスタム深層学習層の定義を参照してください。層のネットワークとして指定できないモデルの場合は、モデルを関数として定義できます。詳細については、モデル関数を使用したネットワークの学習を参照してください。
どのタスクでどの学習手法を使用するかについての詳細は、MATLAB による深層学習モデルの学習を参照してください。
[
は、変数 dydx1,...,dydxk
] = dlgradient(y
,x1,...,xk
)x1
~ xk
に対する y
の勾配を返します。
dlfeval
に渡された関数の内部から dlgradient
を呼び出します。自動微分を使用した勾配の計算とDeep Learning Toolbox での自動微分の使用を参照してください。
[
は、勾配を返し、1 つ以上の名前と値のペアを使用して追加のオプションを指定します。たとえば、dydx1,...,dydxk
] = dlgradient(y
,x1,...,xk
,Name,Value
)dydx = dlgradient(y,x,'RetainData',true)
は、後続の dlgradient
の呼び出しで再利用できるように、勾配の中間値を保持します。この構文を使用すると時間を節約できますが、より多くのメモリが使用されます。詳細については、ヒントを参照してください。
例
入力引数
出力引数
制限
カスタム逆方向関数をもつカスタム層が含まれる
dlnetwork
オブジェクトを使用している場合、関数dlgradient
は高次微分の計算をサポートしません。以下の層が含まれる
dlnetwork
オブジェクトを使用している場合、関数dlgradient
は高次微分の計算をサポートしません。gruLayer
lstmLayer
bilstmLayer
関数
dlgradient
は、以下の関数に依存する高次微分の計算をサポートしません。gru
lstm
embed
prod
interp1
詳細
ヒント
dlgradient
は関数の内部で呼び出さなければなりません。勾配の数値を取得するには、dlfeval
を使用して関数を評価しなければなりません。また、関数の引数はdlarray
でなければなりません。Deep Learning Toolbox での自動微分の使用を参照してください。勾配を正しく評価するため、引数
y
にはdlarray
をサポートしている関数のみを使用しなければなりません。dlarray をサポートする関数の一覧を参照してください。名前と値のペアの引数
'RetainData'
をtrue
に設定すると、微分の計算後、直ちにトレースが消去されず、関数dlfeval
の呼び出し中はトレースが保持されます。この保持により、同じdlfeval
呼び出し内の後続のdlgradient
呼び出しが高速になりますが、より多くのメモリが使用されます。たとえば、敵対的ネットワークに学習させる場合、'RetainData'
を設定すると、学習中に 2 つのネットワーク間でデータと関数が共有されるため、便利です。敵対的生成ネットワーク (GAN) の学習を参照してください。1 次微分のみを計算する必要がある場合は、
'EnableHigherDerivatives'
オプションがfalse
になっていることを確認してください。これにより、通常、処理時間が短縮され、メモリ使用量が節約されます。複素勾配はウィルティンガーの微分を使用して計算されます。勾配は、微分する関数の実数部が増加する向きで定義されます。これは、関数が複素数であっても微分する変数 (損失など) は実数でなければならないためです。
拡張機能
バージョン履歴
R2019b で導入