Optimization algorithms
CouseraのDeepLearningコースの学習メモ続きです.
Mini-batch gradient descent
MachineLearningのプロジェクトは反復的にモデルを育てていくような進め方になるので,早く学習を進めることができる仕組みはとても大切になる.
これまで見てきた最急勾配法は明示的なfor文を取り払い,素早く学習が進むようにベクトル化して最適化が効きやすいようにしていた.
とはいえ,サンプル数が大きいと,やはり時間がかかってしまう.
全てのデータを学習の1step毎に使うのはサンプル数の増大に合わせてかかる時間が大きくなりすぎる.
これを解決するために,一度に全てのデータを使う方法ではなく,小さい単位に分けて,ちょっとずつ使っていくような方法がある.小さい単位のことをミニバッチ(mini-batch)とよび,これを活用して勾配法を行うものをミニバッチ勾配法と呼ぶ.なお,これまで通り一度に全てのデータを活用する方はバッチ(batch)と呼ぶ.
50000件データが存在している場合に1000データずつ分けたイメージを図1に示す.
なお,ミニバッチのインデックスを表す変数としてはtを使う.
ミニバッチを用いた勾配法のアルゴリズムを図2に示す.
図2の中で,for文がt=1toTまで繰り返されると,全てのデータについての1回の学習が完了する.全てのデータについての1回の学習を行うことを1epochと呼ぶ.
Understanding mini-batch gradient descent
コスト関数の特徴について
全てのデータを毎回使う方法であれば,コスト関数は単調減少するが,ミニバッチ法は毎回ミニバッチに対してのみ処理を行うため,コスト関数は単調減少しない. トレンド的には下がるが,毎回必ず下がるわけではなく,図3のような違いが出てくるという特徴がある.
ミニバッチサイズの決め方について
ミニバッチのサイズがデータ総量と等しいように設定すると,それはバッチで行う最急勾配法と同義になる. ミニバッチのサイズを1とすると,全てのデータが独立してミニバッチになり,学習1step毎に1つのデータのみを扱うことになる.これを確率的勾配法と呼ぶ.
最急勾配法は全てのデータを1stepに使うので当然時間がかかるという問題がある. 一方で,確率的勾配法であれば1stepに1データしか使わないので,一見すると早そうだが,この状態ではベクトル化の恩恵を得ることができず,逆に時間がかかるといった問題を引き起こす.
なので,ミニバッチサイズは大きすぎず,小さすぎず,いい感じに調整する必要がある. いい感じにミニバッチサイズを決めるためのガイドラインとしては,以下の通り.
- 小さいデータ量(m<2000程度)であればバッチで行う
- それ以上であれば,64,128,256,512くらいのサイズから選択する
64,128,256,512はそれぞれ2の累乗であり,計算機で扱う上で最適化が行われ計算速度が上がる可能性があるため,この値を選んでいる. なお,処理するコンピュータの性能と相談しながら,1度に使いたいデータがメモリ上で処理できることも重要な要素となる.メモリ上で保持できない場合はI/Oが走るため,処理が遅くなるためである.
Exponentially weighted averages
勾配法による学習自体を効率化するための方法を以下数章で説明する.
まず,この章では,そのための基礎となるExonentially weighted averages(指数加重移動平均)という考え方の説明を行う.
指数加重移動平均は図5の式で与えられる.
この式の意味について考えるために,例としてとある地域の気温グラフ(図4)を考える.
このグラフに対して指数加重移動平均をとると,図4'のように平均気温の推移が得られる.
Understaning exponentially weighted averages
t=100の場合を考えると,図6に示すように,過去のデータを減衰させながら少しずつ取り入れるような仕組みになっている.
このように.指数加重移動平均は過去のデータの寄与を取り入れて値の推移を滑らかに表すことができる指標と言える.
なお,指数加重移動平均の最初の方は著しくデータが小さい値になるという問題がある. v0=0として初期化しているので,ある程度tが進むまでは「これまでの値」が存在しないためである. これをいい感じに補正するためにBiasCorrectionという処理を行う. これは単純に,指数加重移動平均の値に図7に示す式を掛け算して補正してあげることを示す.
Gradient descent with momentum
指数加重移動平均を使って,普通の勾配法より早く学習が進む方法,Momentumを紹介する. 通常の勾配法では,パラメータの更新にコスト関数の微分した結果をそのまま用いていたが,これを指数加重移動平均に置き換える.つまり図8のようなアルゴリズムになる.
こうすると学習が図9のようになる.勾配の平均が更新に大きく関わってくるので,常に存在する水平方向への学習は加速され,常に符号が反転する垂直方向への学習は行われなくなるのである.
これによって,学習効率が上がる.
RMSprop
Momentumと似たようなもので,RootMeanSquareProp(RMSprop)という方法もある. アルゴリズムを図10に示す.
この方法によっても,学習の効率をあげることができる.
Adam optimization algorithm
MomentumとRMSpropを組み合わせた方法をAdam(Adaptive moment estimation)と呼ぶ. アルゴリズムを図11に示す.
Adamのhyperparameterを図12にまとめる. このうち,αは実装者によるチューニングが大切になるが,他の値はだいたいデフォルトの値を使っておけば間違いはない.
Learning rate decay
学習の最初の方では学習率を大きく設定することで,学習スピードを高め,学習がある程度進んだら学習率を小さくしてちょっとずつ進みたいと言ったようなこともできる.
学習率に,学習回数をパラメータとした値を掛け算してあげるような式であればこれが実現できる. いくつか種類があるようだ.
The problem of local optima
最適化を進めるなかで,コスト関数が鞍状だった際に学習スピードが遅くなるという問題がこれまであったが,Adamのように,移動平均を用いて同一方向への学習が加速していくような仕組みを採用するとその問題は気にしなくて良くなるので便利というお話.