勾配降下法の
最適化アルゴリズム
(Adagrad, Adadelta, Adam)
2016-10-07
サイボウズ・ラボ
西尾泰和
このスライドの目的
• 勾配降下法はDeep Learningの学習で重要な役
割を果たす最適化手法
• Deep Leaningに限らず応用分野の広いツール
• ここ数年でアルゴリズムの改良が提案されて
いるのでそれについて整理する
2
勾配降下法
最適化(関数の最小値を求めること)の方法の一つ
関数が微分できることが条件
各点での微分(=勾配)をみて、一番勾配が急な方
向に降りていく*
3
* 一番原始的な「最急降下法」の場合
勾配が0の点
3通りある
4
すべての軸で二回微分が負
勾配0の点から遠ざかる
方向に動くので、
この点にハマって動けな
くなることは確率的には
とても起こりにくい。
5
すべての軸で二回微分が正
勾配0の点に近づく方向
に動き、ここに集まる。
この点が関数の定義域
全体で最小値なのかは
わからないのだけど、
それは勾配法ではどう
しようもないので気に
しない*
6
* 対処法:焼きなまし法とか初期値を変えて何度も計算とか
二回微分の符号が異なる
関数の定義域が高次元
の場合、このパターン
が圧倒的に多い。*
これをうまく避けたい
7
* 10次元の時、99.8%ぐらい
Identifying and attacking the saddle point problem in high-dimensional non-convex
optimization
https://arxiv.org/pdf/1406.2572v1.pdf
Alec Radfordによる可視化
8
Alec Radfordによる可視化
9
各アルゴリズム解説
• 最急降下法
• モメンタム
• Nesterov accelerated gradient
• Adagrad
• Adadelta
• Adam
10
最急降下法
1. 現在位置𝑥𝑡での勾配𝑔(𝑥𝑡)を計算
2. その勾配に学習率𝜂を掛けたもので位置を更新
11
𝑥 𝑡+1 = 𝑥 𝑡 − 𝜂𝑔(𝑥 𝑡)
モメンタム
アイデア「慣性を付けたらいいんじゃない?」
1. 現在位置𝑥𝑡での勾配𝑔(𝑥𝑡)に学習率を掛ける
2. 前回の更新量に0.9ぐらいの減衰率を掛ける
3. 両方使って位置を更新
12
𝑥 𝑡+1 = 𝑥 𝑡 + 𝛾(𝑥 𝑡 − 𝑥 𝑡−1) − 𝜂𝑔(𝑥 𝑡)
Nesterov accelerated gradient
アイデア「一歩先の地点の勾配を使おう」
13
上: モメンタム
下: NAG
青矢印が矢印根元
での勾配
図の簡略化のため
学習率や減衰率は
1にした
Nesterov accelerated gradient
数式的には 𝑣𝑡 = 𝛾 𝑥𝑡 − 𝑥𝑡−1 として
モメンタム
𝑥𝑡+1 = 𝑥𝑡 + 𝑣𝑡 − 𝜂𝑔(𝑥𝑡)
NAG
𝑥𝑡+1 = 𝑥𝑡 + 𝑣𝑡 − 𝜂𝑔(𝑥𝑡 + 𝑣𝑡)
14
Adagrad
ここまでの話はいったん全部忘れて
「そもそも学習率がどの軸でも同じって
おかしいんじゃないの?」
特に確率的勾配降下法と組み合わせて
使うことを考えた場合
「まれにしか観測されない特徴」
→「その軸方向の勾配が多くの場合ゼロ」
まれな特徴が観測されたときには
その軸方向には大きく学習したい
15
Adagrad
そこで各軸方向の勾配の二乗和を溜めておいて
学習率をその平方根*で割ることで
まれな特徴に対して学習率を高めにする。
学習率は他の方法と比べて10倍くらい大きくし
ておく。ゼロ除算を避けるために分母に小さい値
を足す。
16
* RMS: Root mean square
Adagradの問題点
勾配の二乗は常に非負なので
学習率は単調非増加。
学習初期に勾配のきついところを通ると
それ以降ずっとその軸方向の学習率が
小さくなってしまう。
これでいいのか?
17
Adadelta
アイデア1「過去の勾配の二乗和全部を使うん
じゃなくて、最近のだけ使おう」
最近n件を取っておくのはメモリ消費が大きいの
で指数平滑移動平均を使う
18
ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
https://arxiv.org/pdf/1212.5701v1.pdf
Adadelta
アイデア2「単位を合わそう」
Adagradに限らず、SGDやモメンタムでも
「単位があっていない」
19
単位とは?
例えば1次元の関数fで、xの単位がメートル(m)
yの単位がキログラム(kg)である場合を考える。
fの勾配の単位はもちろん kg/m
SGDの更新式ではmにkg/mを足していておかし
い。Adagradではkg/mをkg/mで割って無単位量
になっててやっぱりおかしい。
20
ニュートン法
ニュートン法の場合は
「yの値をfの勾配で割ったもの」
をxの更新に使う。
先ほどの例なら「kg を kg/m で割ったもの」
でmの値の更新をすることになる。
これなら単位はおかしくない。
21
Adadeltaの単位合わせ
「過去のxの更新差分の平均」を
「過去の勾配の平均」で割って
今の勾配を掛けたものを
xの更新差分とする。→単位OK
22
* RMS: Root mean square
単位合わせのメリット
単位のあってないSGDでは関数fの最適化と
fを単に10倍した関数の最適化とで
振る舞いが違う(後者が10倍大きい幅で更新する)
この差を吸収するのが「学習率」なる値で
後者の関数の最適化において
更新幅が大きくなりすぎないようにするためには
10倍小さい学習率にする必要がある。
Adadeltaではyの単位が影響しないので、この目
的で学習率をチューニングする必要がない
23
学習率不要
論文中の数式、上から最急降下法、モメンタム、
Adagrad、Adadelta。Adadeltaだけ学習率ηがな
いことに注目。
24
Adam
adaptive moment estimation
勾配の1乗を溜めこむモメンタム
勾配の2乗を溜めこむAdagrad
これって要するに1次と2次のモーメント推定
じゃないか!というのがAdamのアイデア
25
ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION
https://arxiv.org/pdf/1412.6980v8.pdf
アルゴリズム
26
抜粋
𝑚 𝑡 ← 𝛽1 𝑚 𝑡−1 + 1 − 𝛽1 𝑔𝑡
𝑣𝑡 ← 𝛽2 𝑣𝑡−1 + 1 − 𝛽2 𝑔𝑡
2
𝜃𝑡 ← 𝜃𝑡−1 −
𝛼 𝑚 𝑡
𝑣𝑡 + 𝜖
27
mが1次のモーメント(モメンタム相当)
vが2次のモーメント、これの平方を分母に置くのが
Adagradの「勾配のRMSを分母に置く」に相当。
* RMS: Root mean square
Adamは単位おかしい
AdamはAdagradとRMSPropから派生しているの
で、Adadeltaが指摘した「単位おかしい」問題は
そのまま引き継いでしまっている。
28
実験
Adam著者ら「AdaDeltaよりNesterovがよい」
29
Adam筆者らによる解釈
なぜNesterovがAdagradよりよいのか?
CNNの実験では2次のモーメントがゼロにvanish
2次のモーメントしか使ってないAdagradは無力
1次のモーメントが収束の高速化に寄与したので
はないか。
一方1次のモーメントを使っているNesterovより
もさらに性能が良いのは「軸ごとの学習率」が効
いているのではないか
30
疑問点
「 CNNの実験では2次のモーメントがゼロに
vanish」
それβが小さいとかαとεの比がおかしいとかじゃ
ないのか……?
βが小さいと過去のデータを素早く忘れすぎる。
2次のモーメントがεに比べて小さい件は、εを小
さくしてαも同率で小さくすれば済む話。
そもそも初期値依存の激しい問題で1回の実験結
果を見て議論してもアレなので初期値とパラメー
タを変えて何度も実験してほしい。
31
感想
Adamはモメンタム系とAdagradの「各軸ごとの
学習率」の良いとこどりをしているが、Adadelta
の「単位正しく」は取り込んでいない。
そこも取り込んだ手法が今後生まれるのかもしれ
ない。
32

勾配降下法の 最適化アルゴリズム