ディープラーニングの学習曲線について、epochを増やして学習を重ねているのに、なぜlossが上がったりすることがあるのでしょうか?
例えば、以下の図では、train_lossも、test_accuracyも単調減少、単調増加ではなく、たまに上下しています。自分なりに考えた仮説は以下ですが、他にも理由はありますでしょうか?(図はイメージなので、この図を出した学習方法に依存した回答でなくて問題ありません)
1、SGDを使っている場合、勾配更新が選択したミニバッチに依存するため、真の微分係数とは別の方向に更新されてしまうことがある (train_lossがばらつくのもこれが主原因?)
2、損失関数の底での振動
3、損失関数が多峰性であり、局所解を抜ける途中
また、この例だと、test_accuracyは下にスパイク(外れ値)を出していますが、逆に上にスパイクを出す場合、最終的なパラメータはスパイクしたものも含めてtest_accuracyの一番高い値を選択すべきでしょうか?それとも、(判断基準は必要ですが)スパイクしていないものの中で最大値を取得するべきでしょうか?
考え方として、汎化性能が高いパラメータを選択する、という意味合いでスパイクも含めてパラメータ選定すべきかと思いますが、スパイク値となっているパラメータを採用するのがどうも気持ち悪いです(例えば、全体の学習曲線の傾向に関係なく、1つだけtest_accuracyの高いスパイクが発生している場合など)。
※図は以下からお借りしています。
DeepLearningの学習曲線をmatplotlibで可視化
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/14 00:00