自分が深層学習の理論勉強段階にあって、実装に関してはまったく”文明未開”の状態で鬱陶しい毎日。
例えば、
mini batchでNNのparametersを更新するには2種類の方式:mini batch単位で目標関数の【誤差の累積】を取るか、各NNのparamterが各サンプルデータ毎の目標関数の誤差に対する【gradientの累積】を取るか
のいずれかで実現できると思いますが、
実際どの方式で実現されるのでしょうか。
具体に
方式1.
訓練目標関数の誤差をmini batchで累算して、累算した目標関数の誤差に対してoptimizer.backward() callか, model.backward() callによって【💛注】, loss.backward() callによってNNの各parameterのgradientが算出され、NNの各parameterのgrad 変数に【加算せず】セットされる。
💛注:NN model 自体がNN parametersを保持しているはずだし、optimizer.step()の実行によって全NN parametersの更新もできるので、optimizerを通してもNN parametersのgradient値の更新もできるはずだが、やはりloss関数情報を持たないと行けないので、loss classでNN parametersのgradientを更新するのは自然。
方式2.
mini batchの個々サンプルデータに関する訓練目標関数の誤差を算出して(累算せず)、loss.backward() callでNNの各parameterに対するgradientを計算し、NNの各parameterのgrad 変数に【加算】する。
=============
上記処理の後、optimizer.step() で、(mini batch単位での)一括更新が実行される。
さて、果たして実際はどの方式でしょうか。
この辺明るい方ご説明お願い致します。
あなたの回答
tips
プレビュー