
勾配降下法に代表される最適化手法には様々な手法があります。ここではAdaGradの弱点を改善するRMSPropの概要を説明し、PythonのNumpyで実装、他の手法と比較してみます。
こんにちは。wat(@watlablog)です。ここでは機械学習最適化手法の1つ、RMSPropを学習していきます!
RMSPropの概要
RMSPropに至るまでの変遷
この記事を読んでいる方はおそらく勾配降下法がどんなものか、MomentumやAdaGradがどんなものかある程度把握している方と予想します。RMSPropもこれら機械学習で使われる最適化手法の1つです。
まだこれらの手法が曖昧な方は、是非以下の3つの記事を順番に読んでみて下さい。それぞれの最適化手法のメリットとデメリットを知ると、このページで学ぶRMSPropの改善点がより理解できると考えられます。
①「Pythonで1変数と2変数関数の勾配降下法を実装してみた」
②「勾配降下法に慣性項を追加するMomentumをPythonで実装」
③「Python/Numpyで機械学習の最適化!AdaGradを実装」
①の記事は基本中の基本となる勾配降下法(GD)の内容です。非常にシンプルな式で関数の勾配を下っていく有名な手法です。この勾配降下法は機械学習以外の様々な分野で使われていますが、緩やかな勾配にさしかかった途端に学習が遅くなるというデメリットがありました。
②はMomentumという勾配降下法の式に慣性項を追加した手法です。Momentumは前の更新情報を現在の値の更新にも使うので、あたかも運動方程式中の質点のような振る舞いをします。しかし、その学習率は重みにかかわらず一定で、さらにハイパーパラメータが2つ必要で調整が困難というデメリットがありました。
③はAdaGradという手法で、それぞれの重みに適応させた学習率になるように勾配降下法の更新式を変更した画期的な発想を持っていました。しかし学習が進むにつれ更新量がどんどん小さくなっていき、場合によっては学習が全くされない状況となるデメリットを持っていました。
RMSPropはAdaGradの改善を狙った手法で、過去の情報を「忘れる」というコンセプトを持っています(RMSPropはCouseraの講義でヒントン氏が提案した手法で、正式に論文はないとか?)。
RMSPropの更新式とメリット
RMSPropの更新式を式(1)、式(2)に示します。
こうしてみると、最終的な更新式である式(2)はAdaGradと全く同じですが、式(1)の
式(1)は
AdaGradはどんどん更新量が小さくなっていきますが、RMSPropは適度な
RMSPropをその他手法と比較するコード
全コード
先ほど紹介した3記事と同じコードなので詳細な説明は省きますが、このRMSPropをGD、Momentum、AdaGradの下に追記しました。
実行結果
以下が実行結果です。
…GDやMomentumと比べるとAdaGradやRMSPropは降下方向が違うので、重みそれぞれに適応しているというのがわかりますが、静止画だとAdaGradとRMSPropの違いはいまいちわかりませんね。

しかし動画にすると一目瞭然でした。同じ学習率を設定していますが、AdaGradが慎重に降下している最中にRMSPropがダントツでゴールに到達しました。

まとめ
本ページでは最適化手法のRMSPropを試してみました。
RMSPropは「忘れる」ということを式の中で表現したユニークな適応的降下法で、Numpyで書いたコードでもAdaGradと比べると改善傾向が見られました。
ちょっとした式変化でこんなに挙動が変わるということに毎回驚かされます!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント