SGDについて
はじめに
SGD(Stochastic gradient decession)について、設定した目的関数に対してどのようにパラメータを更新しているのかシミュレーションを行い調べた。
実装環境
- Google Colaboratory
ついでにPytorchでのSGDの挙動を調べるためPytorch版とnumpy版を作成して、ステップの更新を調べた。
SGD
SGDは目的関数を最小化する手法。の導関数を求め、入力の勾配に応じて更新する度合を設定する。
モーメントを使用しない時、
momentumを使用するとき、
momentumを使用かつnestrovを適用する時、
結果
- パラメータ設定
SGD:momentum = 0.9, nesterov = True
初期点:
学習率:
- 目的関数:
図1に示す目的関数はで極小値を持つ。
目的関数の平面上におけるSGDのパラメータの軌跡を図2に示す。勾配が0となる点に向けて移動するため、の負の方向にパラメータが更新されている。
次に、iterationと勾配、および損失の関係を図3に示す。iterationが15の時、勾配は0となり損失は最小値をとった。その後の勾配は負であるため、目的関数の最小点を超えて坂道を駆け上っているような状態であると思われる。
- 目的関数:
図4に示すようにで鞍点を持つ関数である。
目的関数の平面上におけるSGDのパラメータの軌跡を図5に示す。勾配が0となる点に向けて移動するため、の負の方向にパラメータが更新されている。また、今回のような初期値の取り方では鞍点から抜け出せず、モデルに最適な最小値をとれていない。
次に、iterationと勾配、および損失の関係を図6に示す。鞍点にはまっているにも関わらず損失および勾配は図3と同様な傾向を示している。
従って、損失が0に近づいたとしても目的関数の最小値であるとは限らない。つまり、iterationにおける損失をみただけでは、目的関数が最小となる値を求められているかわからない。
- PytorchとnumpyのSGDの比較
パラメータの更新式はPytorchのReferenceを参考に構成したため、異なる点は勾配の計算方法であると思われる。Pytorchでは中心差分で計算してるのかな?うまく再現できなかったため不明である。