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