【学習率を調整する】AdaGradとRMSPropの仕組みを比較してみた

深層学習における最適化アルゴリズムの定番である勾配降下法についてExcelに実装してきましたが、AdaGradが抜けていました。

>> 【例題をExcelでわかりやすく】最急降下法で単回帰の最小二乗法を解いてみる

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

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

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

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

 

今回は、学習率を調整するという点でRMSPropと大変良く似ているAdaGradをExcelで試してみて、RMSPropとの違いを明らかにしたいと思います。

比較し易くするために、今までと同じ下記のデータを使い、最小二乗法で損失

Σ{yi-(axi+b)}2

が最も小さくなるようなaとbを求めます。

 

AdaGradとRMSPropは思想が全く異なる

RMSPropの更新式は次式でした。

【aの更新式】

An+1=βAn(1-β)(∂Qn+1(a,b)/∂a)2

an+1=an-η/√( An+1+ε)×∂Qn+1(a,b)/∂a

 

【bの更新式】

Bn+1=βBn(1-β)(∂Qn+1(a,b)/∂b)2

bn+1=bn-η/√( Bn+1+ε)×∂Qn+1(a,b)/∂b

 

AdaGradでは青字部分を抜いて、次のようになります。

【aの更新式】

An+1=An+(∂Qn+1(a,b)/∂a)2

an+1=an-η/√( An+1)×∂Qn+1(a,b)/∂a

 

【bの更新式】

Bn+1=Bn+(∂Qn+1(a,b)/∂b)2

bn+1=bn-η/√( Bn+1)×∂Qn+1(a,b)/∂b

 

主な違いは、An+1とBn+1の計算を加重平均から単純な和に変えたことです。

これは些細な違いに見えますが、その思想は全く異なります。

双方に通じる基本的な考え方は、勾配Qの大きさによって学習率ηを自動調整したいということです。

そのためにRMSPropでは、勾配が大きい時には学習率を小さめにして、パラメータの変化の振幅を抑えにかかります。

対してAdaGradでは、学習の初期には大きく学習するが、後半は小さな学習になるはずなので、学習率を徐々に小さくしましょうという考え方です。

 

この違いは次のアナロジーでも説明できます。

従業員1,000名、平均年齢50歳の会社があるとします。

全社員の年齢を足すと50,000歳です。

RMSPropのやり方は、1,000人のうち毎年100人の高齢社員を退職させ、代わりに100人の若手を採用するようなものです。

そうすることによって、毎年少しずつ合計年齢は下がります。

 

対してAdaGradのやり方は、定年がなく退職者がいない一方、若手は毎年100人採用するようなものです。

すると、この会社の合計年齢は毎年着実に上がります。

 

RMSProp社では、年齢(勾配)の低い社員が増えるので学習率が上がります

AdaGrad社では、どんどん高齢社員が増えるので学習率がどんどん下がります

但し、RMSProp社でも新卒が採れずに高齢の中途しか採れなくなると、平均年齢が上がって学習率が下がります。

このように、社員をどんどん入れ替え社会情勢に合わせて学習率を変えられるのがRMSProp社会情勢を無視して社員がゾンビ化し学習率がどんどん下がっていくのがAdaGradと言えます。

 

そんな例えをするとAdaGradは良くないアルゴリズムのように聞こえますが、うまく収束する優秀なアルゴリズムと言われているようです。

また設計者が決めなければいけないハイパーパラメータが1つしかなく、2つあるRMSPropより使い勝手が良いとも言われています。

 

Excelに実装する

それでは実際にExcelに実装して確かめてみましょう。

アルゴリズムの式に従って、次のように入力しました。

 

 

100個のデータをランダムに採択しているため毎回結果は異なりますが、6,476回目で収束した例を示します。

 

この時、過去の勾配を足している二乗和Aiはどのような挙動を示しているのでしょうか?

An+1=An+(∂Qn+1(a,b)/∂a)2

の値の推移は次のようになっていました。

 

最初の30回くらいの更新期間中に急速に400万くらいまで立ち上がり、その後はパラメータaが収束するまでゆっくりと増え続けています。

最初に急速に立ち上がるのはAiの初期値をゼロにしているためでもありますが、同時に最初の30回の間の勾配が大きく、急速にパラメータが調整されたことを示しています。

そしてその後も二乗和Aiは増加し続け、学習率は一度も大きくなることなく小さくなり続けます。

 

これをRMSPropの挙動と比べてみましょう。

下図は5,846回目で収束した様子です。

 

この間の二乗和Aiの挙動は次のようになります。

 

最初の頃に急速に立ち上がるのはAdaGradと同じですが、170回目くらいでピークアウトし、その後は急速に小さくなります。

まるでコロナが感染爆発して、その後、急速にピークアウトするようです。

これはAiの初期値をゼロにしているためで、感染が行き渡るまでは増え続け、集団免疫になると急速に減り始めます。

学習率はAiの平方根で割られますので、Aiが小さくなるということは学習率を大きくする方向に働きますが、その頃の学習率は小さくなっているため打ち消し合ってほとんど大きくなりません。

RMSPropの学習率の推移は、次のようになりました。

 

最初の勾配が大きい時には学習率を小さくしてパラメータの振幅を抑え、後半の微調整期間では学習率をいい感じの大きさに調整しています。

対してAdaGradの学習率の推移は、次のようになっていました。

 

最初の頃に学習率が大きいのはAiをゼロからスタートさせているためで、30回くらいで落ち着いてからは徐々に学習率が小さくなっています。

これは学習後半は学習率は小さくて良いはずだという理由からですが、すべてのパラメータの学習率を一律に小さくするのではなく、個々の累積勾配量を元に小さくしているので、パラメータごとに小さくなるスピードは異なります。

このように各パラメータに適応(adaptiveして勾配(gradientを調整するので、Adaptive Gradient (AdaGradと呼ばれるようです。

 

また今回試してみて気づいたのは、AdaGradで設定する学習率ηは大きくしないといけないということです。

RMSPropではη=0.007で設定しましたが、AdaGradではη=1で設定した時が一番うまく収束しました。

これは、勾配の累積二乗和のルートで学習率が割られるため、大きくないと学習率が小さくなり過ぎて学習しなくなってしまうためです。

RMSPropは勾配の二乗の加重平均ですので、このようなことはありません。