はじめに
深層学習では、損失関数の値を小さくするパラメータを見つけることが必要です。このプロセスは「最適化」と呼ばれます。
深層学習における最適化の手法にはさまざまなものがありますが、現在は「Adam」という手法が広く使われています。今後もAdamをさらに高速で高精度にする手法が研究されると予想されます。そのため、Adamを理解しておくことが今後提案される最適化手法を学ぶ上で役立つと考えられます。
この記事では、基本的な最適化手法である勾配降下法から、どのようにしてAdamに発展してきたのかをまとめます。
結論
基本的な最適化手法である勾配降下法には、パラメータが最適解に近づいても、更新幅が大きすぎたり小さすぎたりして、収束しにくいという課題があります。その結果、深層学習モデルの学習時間が長くなったり、最適解に到達できなかったりする場合があります。
この問題を改善するために、以下の二つのアプローチが提案されました。
- パラメータの更新時に、過去の更新履歴を反映させる
- 学習率を変化させる
1つ目のアプローチを用いた手法が「モメンタム」であり、2つ目のアプローチを用いた手法が「AdaGrad」やそれを改良した「RMSProp」です(図1)。
「Adam」はこれら「モメンタム」と「RMSProp」を組み合わせることによって、勾配降下法の問題の改善をはかっています。
次の章では、最適化手法である「勾配降下法」「モメンタム」「AdaGrad」「RMSProp」についてまとめます。
各手法の説明
勾配降下法
勾配降下法は、損失関数の勾配に沿ってパラメータを更新していく手法です。
損失関数を、パラメータの初期値を、回更新した後のパラメータを、その成分をとします。また、損失関数の勾配をとします。
このとき、勾配降下法によるパラメータの更新式は次のようになります。
ここで、は学習率と呼ばれる定数で、パラメータをどの程度更新するかを決めます。
勾配降下法は、最適化手法の中ではシンプルな手法です。しかし、先に述べたようにパラメータが最適解に近づいても、更新幅が大きすぎたり小さすぎたりして収束しにくい場合があります。次に紹介するモメンタムはこの課題を、「パラメータの更新時に、過去の更新履歴を反映させる」というアプローチによって改善した手法です。
モメンタム
モメンタムは、勾配降下法の更新式に「慣性項」を加えた手法です。この慣性項は、で表され、これによりパラメータの更新に前回の更新情報が反映されます。モメンタムの更新式は次のようになります。
ここで、は定数で、実務上は0.5から0.99の範囲で設定されることが多いようです。
モメンタムの特徴を理解するために、勾配降下法との違いを比較します。
まず、勾配降下法とモメンタムがどのようにパラメータを更新しているのか図で比較します(図2)。
図2からわかるように、勾配降下法では回目と回目でパラメータの更新方向が大きく変わることがあります。これにより、パラメータが最適解を飛び越えてしまい、収束しない場合があります。(ただし、このような更新が有効な場合もあります)。
一方、モメンタムでは回目の更新方向が回目の更新方向に影響を与えます。これにより、極端な更新方向の変化が抑えられ、パラメータが最適解の周囲で更新を続ける可能性が高まります。このため、勾配降下法では収束しにくい場合でも、モメンタムを使うことで安定して収束することが期待されます。
勾配降下法とモメンタムの違いを別の視点から考えてみます。
勾配降下法の更新式((1)式)を変形すると、
となります。この式は、パラメータの更新に最新の勾配のみを使用していることを意味します。
一方、モメンタムの更新式は、後で証明する命題1から
となります。つまり、モメンタムでは過去のすべての勾配を重み付けしてパラメータの更新に反映させます。これにより、勾配降下法では損失関数の谷底を往復するようにパラメータが更新されてしまう場合でも、モメンタムでは谷底に沿うようにパラメータが更新されます。これも、勾配降下法では収束しにくい場合でも、モメンタムでは安定して収束する理由の一つです(図3)。
ここで先述の命題1を証明します。
モメンタムの更新式から、次の式が成り立つ。
(証明)
数学的帰納法で証明できます。
(i)のとき
1回目の更新は勾配降下法と同じです。したがって、
となり、命題1が成り立ちます。
(ii)のとき
回目の更新時に命題1が成り立つと仮定します。このとき、
です。この仮定とモメンタムの更新式((2)式)を用いると回目の更新時には、
となり、命題1が成り立ちます。
(i)(ii)より、命題1が証明できました。
本節では、モメンタムと勾配降下法を比較することで、モメンタムの特徴を説明しました。勾配降下法ではパラメータの更新方向が大きく変わることがあり、最適解に収束しにくい場合があります。しかし、モメンタムでは更新式に「慣性項」を加えることで、更新方向の極端な変化を抑えます。これにより、勾配降下法で最適解に収束しにくい場合でもモメンタムでは安定して収束することが期待されます。
次節では、勾配降下法の課題を二つ目のアプローチ「学習率を変化させる」によって改善した「AdaGrad」とそれを改良した「RMSProp」について説明します。
AdaGrad
AdaGradは、勾配降下法における学習率を、更新回数に応じて変化させる手法です。更新式は次のようになります。
ただし、です。は学習率、は分母が0になることを防ぐための微小な数です。なお、の添え字のはAdaGradの頭文字です(後述のRMSPropとの区別のためです)。
AdaGradの特徴を理解するために、パラメータの効率的な更新方法を考えてみます。
まず、更新回数と更新幅を決める係数の関係について考えます。
初期段階(が小さいとき)では、パラメータが最適解から大きく離れている可能性があります。そのため、初期段階ではパラメータを大きく更新したく、は大きくなるように設定すべきです。
逆に、後期段階(が大きいとき)では、パラメータが最適解に近づいている可能性があります。そのため、後期段階ではパラメータを小さく更新したく、は小さくなるように設定すべきです。
感覚的には、初期段階では大雑把でよいから勢いよくパラメータを更新し、後期段階では微調整しながらパラメータを更新するイメージです。つまり、更新幅を決める係数は更新回数の増加に伴って減少することが望ましいです。
次に損失関数の勾配との関係について考えます。過去の勾配が小さい場合(つまり損失関数が平坦な場所でパラメータが更新されてきた場合)、パラメータの変化に対して損失関数の値はそれほど変化していないはずです。したがって、損失関数を大きく減少させるにはパラメータを大きく更新したく、は大きくなるように設定すべきです。
逆に、過去の勾配が大きい場合(つまり損失関数が急峻な場所でパラメータが更新されてきた場合)、パラメータの変化に対して損失関数の値は大きく変化しているはずです。したがって、パラメータを大きく動かしすぎると最適解を飛び越えてしまう可能性があるため、は小さくなるように設定すべきです(図4)。つまり、過去の勾配が小さければは大きく、過去の勾配が大きければは小さく設定すべきです。
以上をまとめると、パラメータを効率的に更新するためにはを以下のように定める必要があります。
- 更新回数が増えるにつれて、更新幅を決める係数を減少させる。
- 過去の勾配が小さければは大きく、過去の勾配が大きければは小さくする
このような状況を表現するため、更新幅を決める係数はと定義されました。これにより、以下の性質が成り立ちます。
- 更新回数が増えると、更新幅を決める係数は減る
- ならば、が成り立つ
- 過去の勾配が小さい場合、は大きくなる
- ならば、が成り立つ
ちなみに、勾配降下法は2を満たしていません。勾配が小さいときはパラメータが少ししか更新されず、勾配が大きいときは大きく更新されてしまいます。勾配降下法では、効率的なパラメータ更新とは逆の方針でパラメータが更新されていましたが、AdaGradではこの課題が改善されているのです。
ここまで、AdaGradは効率的にパラメータを更新できると書いてきました。しかし、AdaGradにも弱点があります。それは更新回数の増加に伴い、が過度に減少し、パラメータの更新が進まなくなることです。これは、が更新回数とともに増加し続けるためです。
この弱点を克服するために、次に紹介する「RMSProp」では、効率的なパラメータ更新の条件を次のように調整しました。
- パラメータが順調に更新されているとき:更新回数の増加に伴い、更新幅を決める係数を大きくする
- パラメータが振動しはじめたとき:更新回数の増加に伴い、更新幅を決める係数を小さくする
RMSProp
RMSPropは、AdaGradのが過度に減少し、パラメータの更新が進まなくなる弱点を改善した手法です。更新式は次のようになります。
ただし、を用いて
です。つまり、は勾配の二乗の重み付き平均です。
RMSPropとAdaGradを比較するため、について考えます。
まず、について、後で証明する命題2からが成り立ちます。これにより、RMSPropとAdaGradの更新幅についてとなり、AdaGradの更新が進まなくなるという弱点がRMSPropでは改善されています。
次に、パラメータが順調に最適解に近づいているときと、振動しはじめたときを考えます。
通常、最適解に近づくにつれて勾配は小さくなります(二次関数などを思い浮かべてください)。したがって、パラメータが順調に最適解に近づいているときは、は減少し、は増加します。パラメータが順調に更新されているときは、もっと更新幅を大きくしても問題ないだろうということです。
逆に、パラメータが振動しはじめたとき(つまり、パラメータが最適解から離れてしまったとき)は、勾配が大きくなります。したがって、は増加し、の値は減少します。パラメータが振動しはじめたときは、更新幅を小さくしたほうが良いということです(図5)。
RMSPropでは、パラメータが順調に更新されているときには更新幅を大きくし、振動しはじめたときには更新幅を小さくすることで、効率的な更新が行われます。
ここで上の説明中に出てきた命題2を証明しようと思います。
(証明)
の定義((7)式)から、について、
が成り立ちます(このことは、命題1と同様に数学的帰納法で示せます)。また、であることを用いれば任意のについて、
が成り立ちます。よって、(9)式の両辺をで和をとると、
です。これと、(8)式を用いることで命題2が成り立ちます。ちなみに、命題2の内容をグラフにすると図6のようになります。
以上によって、RMSPropは次の性質をもつ手法であることがわかりました。
- パラメータが順調に更新されているとき:更新回数の増加に伴い、更新幅を決める係数を大きくする
- パラメータが振動しはじめたとき:の増加に伴い、を小さくする
AdaGradでは、更新回数の増加に応じて一律にを減少させていましたが、RMSPropでは状況に応じての増減が決まるのです。
最後に、「モメンタム」と「RMSProp」を組み合わせた「Adam」について説明します。
Adam
Adamは「モメンタム」と「RMSProp」を組み合わせた手法です。更新式は次のようになります。
ただし、を用いて
です。は前述の(7)式で定義されたものと同じです。
私は、Adamについて勉強する際に以下の2つの疑問を持ちました。
- Adamは本当にモメンタムの仲間なのか?
- なぜ、わざわざをに、をに変換しているのか?
以下は、以上の2つの疑問に対する私なりの考えです。
まず、1について説明します。(13)、(14)式を用いるとで
が成り立ちます(これも数学的帰納法で示せます)。したがって、Adamの更新式((10)式)を変形すると
となります。この式からわかるように、Adamは過去の勾配すべてを使ってパラメータを更新します。これにより、Adamはモメンタムと同様に、過去の勾配情報を取り入れているため、モメンタムの仲間であると言えます。
次に、2つ目の疑問「なぜ、わざわざをに、をに変換しているのか?」に答えます。この疑問に対する答えは、これらの変換によりとがそれぞれとの(おおまかな)不偏推定量になるためです。つまり、次の命題3が成り立ちます。
(証明)
(16)、(17)式の両方を証明することは面倒なので、(16)式だけを証明します。
まず、とすると、となります。したがって(8)式を用いると、
となります。ここで、パラメータが順調に更新されているとき、各について次の表のような関係性があります。
更新回数が1に近いとき | 更新回数が1から離れているとき | |
---|---|---|
の値 | 0に近い | 1に近い |
の値 | 0から離れている | 0に近い |
の値について補足します。一般的にパラメータが順調に更新されていれば、よりのほうがに近い値をとる可能性が高いです。したがって、その場所での勾配の二乗についても、よりのほうがに近い値をとる可能性が高いです。このため、の増加に伴い、は減少していく傾向にあると考えられます。これが、の値が上記の表のようになる理由です。
以上より、(パラメータが順調に更新されれば)すべてのについてと近似できます。それゆえ、と近似できます。これと(18)式を用いると、(16)式が成り立つことがわかります。
これでAdamに関する2つの疑問「Adamは本当にモメンタムの仲間なのか?」「なぜ、わざわざをに、をに変換しているのか?」を説明できました。
次章で本記事をまとめます。
まとめ
本記事では、深層学習における最適化手法「勾配降下法」がどのように「Adam」へと発展したのかについてまとめました。
勾配降下法ではパラメータの更新が不安定であるという課題がありました。この課題を改善するために、次の二つのアプローチが提案されました。
- パラメータの更新時に、過去の更新履歴を反映させる
- 学習率を変化させる
1つ目のアプローチを用いた手法が「モメンタム」であり、2つ目のアプローチを用いた手法が「AdaGrad」やそれを改良した「RMSProp」です。「Adam」はこれら「モメンタム」と「RMSProp」を組み合わせた手法です。
「モメンタム」の特徴は過去の勾配情報をパラメータの更新時に利用することです。これにより、勾配降下法でよく見られたパラメータの更新方向の急激な変化を抑えることができ、安定したパラメータの更新が可能になりました。
また、「AdaGrad」はパラメータの更新を進める際に学習率を減少させることで、パラメータが安定して収束するようにした手法です。さらに「RMSProp」では「AdaGrad」の課題(学習率が小さくなりすぎてパラメータの更新が進まなくなる)を改善しました。具体的には、パラメータが順調に更新されているときは学習率を大きくし、振動をはじめてしまったときは小さくします。
最後に、「Adam」は以上で説明した「モメンタム」と「AdaGrad」の両方を取り入れた手法です。これにより、「Adam」は安定してパラメータ更新を進めることができます。そのため、多くの深層学習タスクで最適化の「最初の一手」として「Adam」が選ばれることが多いようです。