もちもちしている

おらんなの気まぐれブログ

Deep Learningのハイパパラメータの調整

この記事はDeep Learning Advent Calendar 2015 23日目の記事です.

はじめに

コンピュータセキュリティシンポジウム2015 キャンドルスターセッションで(急遽)発表したものをまとめたものです.

また,私の体力が底を尽きてるので,後日に大幅な加筆・修正します.

Deep Learning Advent Calendar 21日目の記事はすいません,しばらくお待ちください...

Deep Leaningの光と闇

Deep Learningが様々なタスクにおいて大きな成果を上げています.また,各種フレームワークの登場によって,Deep Learningの導入や実践する敷居が大幅に下がりました.このことから,Deep Learningを活用していこうと考えてる,あるいはすでに活用している企業や研究者が増えてきています.

Deep Learningによって従来の手法を大きく上回る性能を発揮したり,今まで実現できなかったことが実現できたりと脚光を浴びてる一方で,「あるタスクにDeep Learningを導入したものの,所望の効果が得られない」あるいは「従来の手法に性能で負けてしまった」などと,うまくいかないこともあると思います.

高いポテンシャルを秘めてることは確かのですが,Deep Learningは深いアーキテクチャなだけに深い考察が必要です.そのため,以下のことを考えなくてはなりません.

  1. タスクごとにネットワークの構成を考えなくてなはらない

  2. 最適な(あるいは最適に近い)ハイパパラメータを求めなくてはならない

1に関しては,例えば画像認識をやる場合はCNNを使うと思います.CNNにも色々な構成があるので,問題に応じて色々構成を変えると性能が良くなることがあります.タスクに応じてstate-of-the-artな構成が公開されていることがあるので,それを用いるのが良いでしょう.

一番問題なのは,2のハイパパラメータの調整だと思います.

機械学習アルゴリズムは基本的に調整が必要なハイパパラメータが存在します.これをデタラメに調整したかと厳密に調整したかどうかで性能は雲泥の差があります.

学習させる全てのタスクにおいて共通の最適なハイパパラメータがあれば,1回だけ厳密に求めてあとは使い回せば良いのですが,基本的にタスクごとに求める必要があります.

AROWやSCWなどのオンライン線形分類器はハイパパラメータが1・2個しかないのに対して,ニューラルネットワークで構成されていることが多いDeep Learningでは,ハイパパラメータはとんでもない数になります(学習係数,隠れ層のユニット数,層の段数,epoch,dropout,momentum,weight decay,batch size...etc.).

これを探索する手法はグリッドサーチがよく用いられます.しかし,ハイパパラメータが1つ増えるたびに組み合わせの数が爆発的に増えるため,1回の試行時間が長いかつ組み合わせ数が多いDeep Learningでグリッドサーチを行うのは現実的ではありません.

では,このたくさんのハイパパラメータをどうやって調整するのでしょうか.

ランダムサンプリング

ランダムサンプリングとは,文字通り無作為にパラメータを抽出していく方法です.

f:id:olanleed:20151223151040p:plain

パラメータには重要なパラメータとそうでないパラメータが存在します.グリッドサーチではこの重要なパラメータが探索から漏れてしまうことがありますが,ランダムサンプリングだとこれを拾えるだけでなく,探索の分布や幅などを変えるといったことが可能です.

他にも探索が高速,いつ計算を打ち切ってもよい,並列化が容易などでグリッドサーチよりも大きなメリットがあります.

詳細は以下の論文に書かれています.

http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf

Bayesian Optimization

http://papers.nips.cc/paper/4522-practical-bayesian-optimization-of-machine-learning-algorithms.pdf

関数の最適化問題とみなして,学習器を最適化していく手法が存在します.ハイパパラメータをx,学習器の誤差関数をf(x)として,このf(x)を最小にするxを求めていきます.

ただし,Deep Learningの関数の形はわからないため,BlackBox関数の最適化問題となります.

BlackBox関数の最適化手法には遺伝的アルゴリズムや差分進化法*1がなどが有名でしょう.

この項で紹介するBayesian Optimizationでは,"BlackBox関数の事前分布を仮定し,事後分布を見て最適化する"という手法をとっています.

Bayesian Optimizationの流れは以下のとおりです.

  1. f(x)を何かしらの手法で事前分布を仮定する
  2. ランダムに生成したサンプル点のf(x)を評価し,f(x)の事後分布を決める
  3. 得たf(x)の事後分布と,サンプル点の候補としての良さを測る

Bayesian Optimizationを実行する際に行われなければならない二つの主要な項目があります.

第一に,BlackBox関数の事前分布を仮定する必要がありますが,このBlackBox関数は直接最適化が難しいため,何かしら計算しやすい形で近似します.論文の著者は,柔軟性と扱いやすさから"Gaussian process "という手法を用いています.

Gaussian processについては以下の記事が参考になります.

naoyat.hatenablog.jp

Gaussian processは平均と共分散をパラメータとして受け取りますが,共分散を計算するためにはカーネルが必要です.

論文では ARD Matern 5/2と呼ばれるカーネルを利用しています.

f:id:olanleed:20151223170843p:plain

第二に,GPでBlackbox関数を近似した後,次に調べるサンプル点を決める必要があります.これを闇雲に決めるのではなく,いくつかサンプルする候補を作って「候補の良さ」を測ります.

これに"Acquisition Function"というものを使います.これはサンプル点がf(x)を最小にするような期待値を算出するもので,算出した期待値を「候補としての良さ」とします.

Acquisition Functionには以下のようなものがあります.

Probaiblity of Improvement (PI)

f:id:olanleed:20151223171646p:plain

これまでのベストを更新する確率が最大となる点を次のサンプル点とする.

Expected Improvement (EI)

f:id:olanleed:20151223172128p:plain

これまでのベストに対してどれだけ更新できそうかの期待値を最大化する点を次のサンプル点とする.

GP Upper Confidence Bound(GP-UCB)

f:id:olanleed:20151223172418p:plain

平均と分散の和がもっとも大きなところを次のサンプル点とする.

論文ではEIが一番性能が良いとされています.ただし,Acquisition Functionも多峰性の関数なので,ランダムに生成した候補点を用いてx_t = argmax(a(x_m))となる候補x_mを次のサンプル点x_tとします.

上記より,Bayesian Optimizationではx_t = argmax a(x_m)x* = argmin f(x_t)という過程を繰り返して目的関数を最小化していきます.

おわりに

まとめです.

  • 気軽に探索したいのであればランダムサンプリングを使う
  • 少し気合を入れて探索したいのであればBayesian Optimizationを使う

Bayesian Optimizationも実装がかなり出回っているので,そのうち試してみようと思います.

最後の方がかなり適当になってしまったので,後日加筆します.