アレックスネットワークの重みの更新について

6 views (last 30 days)
創 尾崎
創 尾崎 on 25 Jan 2022
Commented: Kenta on 26 Jan 2022
アレックスネットワークのパラメータの更新の仕方について質問です。
添付させていただいた画像のようにアレックスネットワークを利用しました。データセット全150枚のうち、105枚(70%)を学習用に、
45枚(30%)を検証用データとして、ミニバッチサイズを10枚、エポック数を10としています。したがって、画像のように1エポックあたりの反復回数は105/10→10回となっています。
ここで分からないこととしては、ミニバッチあたりの重みの更新の仕方についてです。
私の認識としては、
まず学習用データ1枚分について、逆伝播によって何回かの重みの更新を行う→次の2枚目に重みを引き継ぎ、何回か更新を行う→バッチサイズ10枚分で同じ事を行い、最終的にミニバッチ1単位での重みを決定する。→次のミニバッチに重みを引き継ぐ→・・・
というものなのですが、合っていますでしょうか。また、もし合っている場合、下線部の回数がいくつなのかを知ることは可能でしょうか。
説明がわかりにくく申し訳ないですが、よろしくお願いいたします。

Accepted Answer

Kenta
Kenta on 25 Jan 2022
こんにちは、以下私の理解で恐縮なのですが、
10枚分(ミニバッチの数)のデータで推論=>10枚分のクロスエントロピー誤差を計算(損失の計算)=>逆誤差伝搬にてネットワーク全体の重みを更新(回数でいうと1回、というのがよいでしょうか)
という感じではないですかね。
スクリーンショットを見る限り、trainの関数で学習させてると思うのですが、
カスタムループで書く版のドキュメントを見ると参考になるかもしれません。
例えば、以下の関数で入力Xと正解Yがあったときにforwardさせて、さらにそこからロスを計算させて、勾配を求めているのがわかると思います。
質問者さまのおっしゃるように、1枚ずつ勾配を出して更新するのではなくて、10枚の結果をもって更新させています。
10枚だと10枚分の結果が平滑化されるのですが、1枚だとノイジーになって、学習曲線が非常にガタガタした感じになると思います。
function [gradients,state,loss] = modelGradients(dlnet,dlX,Y)
[dlYPred,state] = forward(dlnet,dlX);
loss = crossentropy(dlYPred,Y);
gradients = dlgradient(loss,dlnet.Learnables);
loss = double(gather(extractdata(loss)));
end
https://jp.mathworks.com/help/deeplearning/ug/train-network-using-custom-training-loop.html
  2 Comments
創 尾崎
創 尾崎 on 26 Jan 2022
ご回答ありがとうございます!
理解できました!
Kenta
Kenta on 26 Jan 2022
よかったです。細かくて申し訳ないですが、AlexNetと表記した方が、のちに検索に引っかかりやすくなって他の方に有用かもしれません。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!