【Excelでアルゴリズムを実装】モーメンタム法を使って最小二乗法を解いてみる

2021年9月11日

前回は最小二乗法を解くために、確率的勾配降下法のアルゴリズムをExcelで試してみました。

>> 【Excelでアルゴリズムを実装】確率的勾配降下法を使って最小二乗法を解いてみる

 

最終的には全サンプルデータでパラメータを更新する最急降下法と同じ値に収束しましたが、その過程でパラメータが激しく振動していました。

例えばこのような感じです。

 

でも、こんなに振動してモタモタしていると収束に時間がかかるので、次のようになってもらいたいのです。

つまり振幅を抑えたいのです。

 

そのための改良方法がモーメンタム法です。

確率的勾配降下法ではランダムにデータを選んできて、そのデータと直線との差(勾配)に応じて直線のパラメータを変更するというやり方でしたね。

この勾配が毎回大きく変わると振幅が大きくなります。

でも、ランダムに選んでくるデータによって勾配は決まるため、自分ではコントロールできません。

ランダムに選ばれるデータを選り好みはできませんからね。

 

そこで、毎回計算される勾配をそのまま100%使ってパラメータを変えるのではなくて、10%くらいしか使わないようにして、代わりに90%くらいは前回の勾配を使ってパラメータを更新しようというのがモーメンタム法の考え方です。

 

確率的勾配降下法では次式でパラメータを更新しました。

an+1=an-η∂Qi(a,b)/∂a

bn+1=bn-η∂Qi(a,b)/∂b

 

これがモーメンタム法では次式になります。

an+1=an-η{前回の∂Qi(a,b)/∂a×β+今回の∂Qi(a,b)/∂a×(1-β)}

bn+1=bn-η{前回の∂Qi(a,b)/∂a×β+今回の∂Qi(a,b)/∂a×(1-β)}

 

簡単ですね。

例えばβを0.9とすれば、今回の勾配は10%しか反映させず、前回の勾配を90%反映させることになります。

 

ではなぜこれをモーメンタム法と言うのか?

 

モーメンタムとは英語で勢いのことで、物体が動き続けようとする見かけの力のことです。

例えば、バスに乗っている時に急ブレーキを掛けられると前につんのめりますね。

これは自分の体はバスの速度で動いていたのに、急ブレーキによって床についている足の裏だけ止まってしまったけれど、体の上の方はそのまま動こうとするためです。

このように動いている物体は何もなければ、そのまま動こうとします。

この力がモーメンタムです。

確率的勾配降下法では、計算された勾配に従ってパラメータを動かしますが、前の勾配がプラスだったのに今回の勾配がマイナスだと凄いモーメンタムを感じます。

それがパラメータの大きな振動となって観察されるわけです。

このようなモーメンタムには逆らわずに、例えばモーメンタムは90%生かして、10%だけ今回の勾配を使おうというのがモーメンタム法の考え方です。

 

それではモーメンタム法をExcelに実装して試してみましょう。

今回も単回帰で、xとyのサンプルデータは次のように100組あるとします。

 

これらのデータの中からランダムに一組ずつ選んで勾配を計算するのは確率的勾配降下法と同様です。

モーメンタム法の場合は次のようにExcelに入力します。

自分で決めるハイパーパラメータ学習率ηモーメンタム率βで、それぞれ0.002と0.9に設定しました。

 

確率的勾配降下法から追加されているのは、「修正勾配a」と「修正勾配b」だけです。

an+1=an-η{前回の∂Qi(a,b)/∂a×β+今回の∂Qi(a,b)/∂a×(1-β)}

bn+1=bn-η{前回の∂Qi(a,b)/∂a×β+今回の∂Qi(a,b)/∂a×(1-β)}

の式における青字部分を計算しています。

 

初期値はa=b=30としていますが、8,242回目で収束しました。

グラフにすると次の通りです。

 

それでは同じことを確率的勾配降下法でやったらどうなるでしょうか?

果たして振幅は小さくなっているのでしょうか?

 

初期値を同じa=b=30で確率的勾配降下法で行うと、10,762回目でほぼ同じ値に収束しました。

つまりモーメンタム法の方が早く収束しました。

振幅はどうでしょうか?

確率的勾配降下法の収束の様子をグラフにすると次の通りです。

 

これだとスケールが小さすぎて振幅の差が分かりませんね。

そこで、aだけ抜き出して比べてみましょう。

モーメンタム法

 

確率的勾配降下法

 

モーメンタム法の方が振幅が小さくなっているように見えます。

 

もう少し拡大してみましょう。

最初の50回の更新の様子をグラフにすると次のようになります。

モーメンタム法

 

確率的勾配降下法

 

やはり振幅が抑えられている様子が分かります。

モーメンタム法の方が確率的勾配降下法より振幅が抑えられ、その結果収束も早くなることが確認できました。

 

振幅を抑えるための改良版として、RMSProp法というのもあります。

こちらは学習率を調整して振幅を抑えにかかります。

詳しくはこちらをどうぞ。

>> 【Excelでアルゴリズムを実装】RMSProp法を使って最小二乗法を解いてみる