要点
この記事では、ベイズ最適化がモデルの性能を向上させるハイパーパラメータを探索する最も効果的な方法であることについて説明します。ディープラーニングにおけるハイパーパラメータの最適化には、手動探索、グリッド探索、ランダム探索、ベイズ最適化など、さまざまな方法があります。
注意!この記事の対象者:
- ディープラーニングアルゴリズムの仕組みや、正則化などの手法を基本的に理解している人
- PythonとTensorFlowの基礎を理解している人
この記事の目標は、ベイズ最適化について理解を深めることではなく、むしろディープラーニングモデルにおけるハイパーパラメータ最適化にシームレスに適用できるよう、ベイズ最適化について基本的な理解を提供することにあります。したがって、ベイズ最適化の一般的な原理を説明する際には、ディープラーニング以外の数学への言及はできるだけ避けていますが、説明をサポートするために数学が登場する可能性があることにご注意ください。
はじめに
ハイパーパラメータ最適化とは、最適なハイパーパラメータ値(学習を行うためにあらかじめ設定しなければならない値)を探索する問題を指します。この場合の最適なハイパーパラメータ値とは、トレーニング済みの学習モデルの汎化性能が最高になるハイパーパラメータの値を指します。
たとえば、ディープラーニングモデルをトレーニングする場合、学習率、ミニバッチサイズ、L2正則化係数などが典型的なハイパーパラメータとなります。もちろん、それらのハイパーパラメータは、厳密に言えば学習アルゴリズムや正則化に関連するものであり、場合によっては、ディープラーニングモデルの構造を決定する要素(層の数、畳み込みフィルターサイズなど)もハイパーパラメータとみなし、探索の対象物に加えることができます。
手動検索
少なくとも一度でもディープラーニングモデルをトレーニングしたことがあれば、これらの主要なハイパーパラメータの値を決定する際に、間違いなく多くの試行錯誤を経験しているはずです。たとえば、AlexNetモデルの実装を完成させるとき、通常、元のAlexNet論文で紹介されたハイパーパラメータを採用し、それを学習に適用することから始めます。しかし、たいていの場合、元のAlexNet論文で使われているデータセットと、使いたいデータセットは異なるため、元の論文で紹介されているハイパーパラメータ値が、解決しようとしている問題の完璧な解になることはまずありません。
このような状況に直面した場合、通常は直感や一般的なノウハウに頼って、次に試すべき候補のハイパーパラメータ値を選択し、その値を用いて学習を実行し、検証セットに対して測定した性能結果を記録することになります。このプロセスを数回繰り返した後、おそらく最終的な提出用にディープラーニングモデルをトレーニングするため、それまで実行したすべての試みの中で検証セットに対して最も良い結果を出したハイパーパラメータ値を選択していることでしょう。最適なハイパーパラメータ値を探索するこの方法は、手動検索として知られています。
手動検索はハイパーパラメータ最適化の最も直感的な方法ですが、いくつかの問題があります。1つ目は、「最適な」ハイパーパラメータを見つけるプロセスが、やや運に左右されることです。例として、ディープラーニングモデルの最適な学習率を見つけるための手動検索を行うプロセスについて説明します。このプロセスには時間制限がある場合が多いことから、おそらくあなたはとても焦り、次のように考えるでしょう:
このディープラーニングモデルを迅速に実行させなければならないのに、教授や上司が絶え間なくプレッシャーをかけてくる。時間がない...。どうしよう:'(
限られた時間の中でディープラーニングモデルのトレーニングを行い、9つの異なる学習率値0.01, 0.05, 0.03, 0.02, 0.025, 0.0225, 0.0275, 0.015, 0.04を順次適用してその性能を測定してみます。その結果が上図にある上位の結果であることから、最終的な学習率値として0.0025
を選択します。この探索プロセスは、おそらく学習セッションごとに自分の直感を注意深く適用していったものであり、そのような骨の折れるプロセスの結果が最良の結果であることを否定するのは、誰にとっても非常に難しいことです。
しかし、「学習率に対する関数としての(未知の)汎化性能関数」が、実際には上記の2番目の画像のようなものだったらどうでしょうか? 0.0025は実際には学習率の最適値(最適値は、0.003から0.0035の間の値)ではありませんでしたが、あなたの焦りと既存の手動による探索プロセスのバイアスが、残念な結果につながったと推測できます。過去に犯したかもしれないミスを無意識のうちに指摘してしまったかもしれませんが、このミスは全くあなたの責任ではありません。主観と直感を頼りに手動検索を行うことの欠点は、上の例で示したように、見つけた最適なハイパーパラメータ値が「実際に」最適であることを保証することが比較的難しいことです。
手動検索の2つ目の問題は、複数の種類のハイパーパラメータを一度に探索したい場合、より複雑になることです。その最たる例が、学習率とL2正則化係数の関係です。
L(W)=1N∑i=1NLi(f(xi,W),yi)+λ⋅R(W)
上記の損失関数の第2項はL2正則化項であり、L2正則化係数λの値を変えると、(ディープラーニングモデルのパラメータ W空間全体において)損失関数 L(W)の形状も変化します。このため、性能を最適に発揮するための学習率の最適値も当然、変化すると考えられます。
これらのハイパーパラメータには相互に影響し合うものもあるため、同時に複数のハイパーパラメータを探索する場合、それぞれのハイパーパラメータに既存の直感を適用するのは非常に難しくなります。
グリッド検索とランダム検索
手動検索に比べて、グリッド検索とランダム検索は、ハイパーパラメータ最適化を実行する上で比較的体系的な方法です。
グリッド検索は、探索する特定の範囲内で一定間隔で候補のハイパーパラメータ値を選択し、それぞれについて測定された性能を記録し、最も良い性能を示したハイパーパラメータ値を選択します。この方法でも、検索する区間数や区間の長さなどの設定など、人間の手を必要とすることに変わりありませんが、手動検索に比べ、より均一で広範な探索が可能になるという利点があります。しかし、この方法では、ハイパーパラメータの探索対象数が増えるにつれて、全体の探索時間が飛躍的に増加するというトレードオフが生じます。
一方、ランダム検索は、グリッド検索と大まかに似ていますが、探索対象区間内の候補のハイパーパラメータ値をランダムサンプリングで選択する点が異なります。ランダム検索は、グリッド検索よりも素早く最適なハイパーパラメータ値を見つけることが知られています。これは、指定されたグリッド間にある値を確率的に探索しながら、不必要な繰り返しを大幅に削減できるからです。
のランダム検索プロセスの例(Pythonのrandom.random関数を区間
[0.01,0.05 | ; random.seed=0] で10回実行した結果)
とはいえ、ランダム検索でさえ「まだ少し不必要な探索に思える」という感覚を拭い去るのは難しいかもしれません。これは、グリッド検索とランダム検索のどちらにも、次に試す候補のハイパーパラメータ値を選択するプロセスに、以前の調査でのハイパーパラメータ値の性能に関する事前知識が反映されないためです。一方、手動検索では、あらゆる面で暗黙のうちに事前知識が適用されます。
[Bergstra and Bengio (2012)]。
ベイズ最適化は、毎回新しいハイパーパラメータ値を効果的に調査するために十分な事前知識を反映させながら、探索プロセス全体を系統的に実行できる手法です。
ベイズ最適化
要するに、ベイズ最適化は、未知の目的関数fについて、ある入力値x∗が与えられた際の関数
f(x)を最大化する最適解
xを求めることを目的としています。通常、目的関数の式が不明(すなわち、ブラックボックス関数)で、1つの関数値f(x)の計算に長時間かかると仮定します。このような場合の主な目標は、できるだけ少ない候補入力値に対して関数値を逐次検討することで、f(x)を最大化する最適解x*を迅速かつ効率的に見つけることです。
ベイズ最適化には2つの重要な要素があります。まず、サロゲートモデルは、これまでに調査された入力値と関数値の点 (x1,f(x1)),...,(xt,f(xt))に基づき、未知の目的関数の形状を確率的に推定します。次に、獲得関数が、目的関数の現在の確率的推定に基づき、次の「最適な入力x∗を見つけるのに役立つ可能性が最も高い」候補入力xt+1を推奨します。
サロゲートモデル
これまでに検討した入力値と関数値の点 (x1,f(x1),...,(xt,f(xt))に基づき、未知の目的関数の近似形を確率的に推定するモデルをサロゲートモデルと呼びます。サロゲートモデルとして最もよく使われる確率モデルは、ガウス過程(GP)です。
ガウス過程
通常の確率モデル(任意の変数に関する確率分布を表す)とは異なり、GPは関数の集合に関する確率分布を表し、その構成要素間の同時分布がガウス分布に従うという特徴を持ちます。GPは、平均関数μと共分散関数kを使って、関数上の確率分布を表現します。
f(x)∼GP(μ(x),k(x,x′))。
GPを正しく理解し使用するためには、ベイズ確率の基礎知識を有し、かつ複雑な確率論的/線形代数の式を理解できなければなりません。この記事では、これ以上詳細には触れませんが、GPの動作特性と、ハイパーパラメータ最適化にGPをどのように使用できるかに焦点を当てていきます。
これまでに調査された入力値-関数値の点(x1,f(x1)),...,(xt,f(xt))が与えられると、GPは下図のように目的関数の確率的推定を行います。
(黒破線:実際の目的関数、黒実線:推定平均関数、青斜線:推定標準偏差、黒点:これまでに調査された入力値と関数値の点、下部の緑実線:獲得関数) [Brochu他。(2010)]
上図において、横軸を入力値
xとし、縦軸を関数値f(x)とすると、黒実線は、これまで検討した点 (x1,f(x1)),...,(xt,f(xt))に基づき推定されたもので、各μμ(x)位置における「平均」xを示し、青斜線は各σσ(x)位置における「標準偏差」に対応します。μ μ(x)の場合、形状はこれまで調査された点(x1,f(x1)),...,(xt,f(xt))を必ず通過するように決定され、σ(x)は調査された点に近い位置ほど小さく、σ σ(x)は遠い位置ほど大きくなります。xが調査された点から遠ければ遠いほど、その点について推定される平均値の「不確実性」が大きくなる、ということがこのことから自然に導かれます。
上図では、t=2の場合、2つの入力値の点しか調査されていないため、この2点から一定の距離以上離れているほとんどの領域ではσ(x)が大きいことが観察できます。一方、t=3 t=4と調査された点の数が徐々に増えるにつれて、大きなσσ(x)を持つ領域の大きさは徐々に小さくなり、実際の目的関数の推定は徐々に圧縮されていきます。これは、調査された点の数が増えるほど目的関数の推定に関する不確実性が減少することを示しており、この傾向が強くなればなるほど、目的関数の分子を最大化する入力値X∗を見つける可能性が引き続き高くなると考えられます。
GP以外のサロゲートモデル
GPだけでなく、これまで調査された入力値と関数値の点から目的関数を推定する際の不確実性をカバーできるモデルであれば、どのようなモデルでもサロゲートモデルとして使用できます。GP以外にも一般的に使用されるサロゲートモデルには、Tree-structured Parzen Estimator(TPE)やディープニューラルネットワークなどがあります。
GPの場合と同様、これらのサロゲートモデルについて深い知識がなくても、ベイズ最適化について大まかに理解していれば、関連ライブラリを使用してベイズ最適化を実行することができます。
獲得関数
サロゲートモデルのこれまでの目的関数の確率的推定に基づき、次に調査すべき候補入力値xt+1
を推奨する関数を獲得関数と呼びます。すでに述べたように、xt+1の選択は、目的関数に対する最適な入力値x∗を見つける上で最終的に「最も有用」です。ここでいう「有用」について考えてみましょう。説明のために、GPを使用した目的関数推定プロセスのt=2の状況を示した図を再掲します。
これまでに調査された点が(x,f(x))だけであるとすると、真の最適な入力値x∗は、より大きな関数値を持つ点(図の右側の点)の近くに見つかる可能性が高いと推測されます。当然ながら、次に試すべき合理的な戦略は、これまで調査された点の中で関数値が最大となる点の周辺領域をテストすることです。これは正式には「活用(exploitation) 」と呼ばれます。
今回は別の視点から考えてみましょう。直感的には、これまで調査された2点間に位置し、かつ標準偏差(=不確実性)ΣΣ(X)が大きい領域については、この部分の推定平均関数値が実際の目標関数値に近いことを保証することは非常に難しいと感じられます。その観点から、「この不確かな領域に最適な入力値X*が存在する可能性があり、それをさらに探索すべきだ」と考えるのはもっともであり、したがって、これまでに推定された目的関数に対する標準偏差が最大となる点を次に試すのは合理的な戦略です。これは正式には「探索(exploration)」と呼ばれます。
最適な入力値x∗を効果的に見つけるためには、探索戦略と活用戦略が同様に重要なアプローチとなりますが、問題はこの2つの戦略の性質がトレードオフの関係にあることです。したがって、探索/活用のトレードオフの相対的な強さを適切に調整することは、実際の目的関数に対して最適な入力をうまく特定するために非常に重要です。
期待改善量(EI)
期待改善量(EI)関数は、探索戦略と活用戦略の両方の側面を含むように設計されており、獲得関数として最も頻繁に使用されます。これまでに推定された目的関数に基づき、任意の候補入力xについて、これまで検討された点の最大出力 f(x+)=maxif(xi) よりも大きい関数値 f(x1),...,f(xt) を生成する改善確率(PI)と、その関数値と F(X+) との差の大きさを考慮して、EIはその入力値xの「有用性」を表す数値を出力します。ここで、PIの概念を理解するために下図を見てみましょう。
上図では、これまで調査された点の中で最大の関数値f(x+) が右端の点で発生しています。ここで、さらに右側にある候補入力値x3について、確率的推定に基づく
f(x3) の確率分布(縦軸に沿って)は、図のように歪んだガウス分布として表されます。
一方、f(x3) の確率分布のうち、f(x+) よりも大きな値に対応する領域は、図では緑斜線で示されています。この領域の大きさがより大きいことは、f(x3) がf(x+) よりも大きい可能性が高いことを示しています。このことから、x3を次の入力値とした方が、既存の点よりも大きな関数値を得られる可能性が高く、目的関数に対する最適な入力x*を見つける上で、x3が「最も有用」な候補であるという結論に至ります。
入力値x3に対して計算されたPI値は、関数f(x3) に対して平均μ μ(x3) とf
(x+) の差、つまりf(x3)-f(x+) で重み付けされ、最終的にx3に対するEI値が計算されます。既存の点よりも大きな関数値が得られる確率が高い点を見つけることは重要ですが、その確率が存在するとして、実際にどの程度大きいのかを考えることも重要です。この計算はそれを反映させるためのものです。
参考までに、GPを使用した場合のEIの式をまとめると(長い導出プロセスを経て)次のようになります。次の式では、
Φとϕϕは、それぞれ標準正規分布の累積分布関数(CDF)と確率分布関数(PDF)を表し、ξは探索と活用の間の相対的な強さを制御するパラメータです。ξが大きいほど探索が強く、小さいほど活用が強いことになります。
上記のGPを使用した目的関数推定プロセスにおいてt=4の場合、各入力値xに対するEIの値EI(
x) を、上記EIの式を用いて計算した結果が、下図の下部の緑実線で示されています。
実際、EI値はこれまで調査された点の中で最大の関数値を持つ点x+の周辺で大きいこと(活用戦略)、またこれまで推定された目的関数で最大の標準偏差σσ(x)を持つ点の周辺でもEI値が大きいこと(探索戦略)が、図から同時に観察できます。
EI(x)=E[max(f(x)−f(x+),0)]={(μ(x)−f(x+)−ξ)Φ(Z)+σ(x)ϕ(Z) ifσ(x)>00ifσ(x)=0
EI以外の獲得関数
改善確率(PI)とは、EIよりも前に提案された獲得関数で、EIの検討事項の中で、これまでに調査された点の最大関数値よりも大きな関数値が導出される確率のみを反映するものです。他の一般的に使用される獲得関数には、上限信頼区間(Upper Confidence Bound:UCB)やエントロピー検索(Entropy Search:ES)があります。
ディープラーニングモデルのハイパーパラメータを探索するためのベイズ最適化の実行
ここまでは、ベイズ最適化の本質的な要素と、それが基本的にどのように機能するかについて説明してきました。では、実際にディープラーニングモデルのハイパーパラメータを探索する際に、ベイズ最適化が適用されるシナリオをより詳細に可視化してみましょう。ここでは便宜上、探索するハイパーパラメータとして学習率のみを取り上げます。
(区間 [0.01,0.09] に対する最初の3ラウンド (n=3) の結果、合計11点 (N=11)
上:GPによる目的関数f(x) の確率的推定の結果、下:確率的推定に対するEI関数の計算結果、
ベイズ最適化ライブラリを使用、random_seed=1)
- 入力値、目的関数、その他の設定を定義する。
- 入力値x:学習値 目的関数f(x)
- 設定された学習率を適用して学習したディープラーニングモデルの検証セットにおける性能結果(例:精度)
- 入力値xの探索対象区間:(a,b)。
- 最初に調査する入力値と関数値の点の数: n
- 最終ラウンドまで調査される入力値と関数値の点の最大数:N
- 設定された探索対象区間 (a,b) 内で、最初に選択されたn
個の入力値がランダムにサンプリングされ選択されます。 - 選択されたn個の入力x1,x2,...,xnのそれぞれに学習率値を設定してディープラーニングモデルをトレーニングした後、検証セットを用いて学習済みモデルの性能結果を計算します。これらの各々は関数値f(x1),f(x2),...,f(xn) とみなされます。n個の入力値はランダムにサンプリングされ選択されます。
- 確率的推定は、入力値と関数値の点 (x1,f(x1)),(x2,f(x2)),...,(xn,f(xn)) の集合に対して、サロゲートモデルを用いて実行されます。
- 検査された入力値と関数値の点の合計がNN個に達するまで、以下のプロセスがt=n,n+ 1,...,N - 1について繰り返されます。
- 既存の入力値と関数値の点の集合 ((x1,f(x1)),(x2,f(x2)),...,(xt,f(xt)) に対するサロゲートモデルの確率的推定結果に基づき、入力区間 (a,b) 内のEIの値を計算し、最大値を持つ点を次の候補入力値xt+1として選択します。
- 学習率値として次の候補入力値xt +1でディープラーニングモデルをトレーニングした後、検証セットを用いて学習済みモデルの性能結果を計算し、それを f(xt+1) 値とみなします。
- 新しい点 (xt+1, f(xt+1)) を、入力値と関数値の点の既存の集合に追加し、更新された点の集合に対して再度サロゲートモデルで確率的推定を実行します。
N個の入力値と関数値の合計点に対して確率的に推定された目的関数の結果に基づき、平均関数μ μ(x),x*を最大化する最適解を選択します。その後、その x∗値を学習率として用いてディープラーニングモデルでトレーニングを行えば、汎化性能が最大化されたモデルを得ることができます。
結論
ディープラーニングにおけるハイパーパラメータ最適化とは、ハイパーパラメータの最適値(ディープラーニングモデルで学習を行うためにあらかじめ設定する必要がある値)を探索する問題を指します。ディープラーニングモデルのトレーニングに必要な典型的なハイパーパラメータには、学習率、ミニバッチサイズ、L2正則化係数などがあります。
ハイパーパラメータ最適化のための最もシンプルかつ直感的な方法は、一般的に使用される手動検索です。手動検索では、各ラウンドで試す候補のハイパーパラメータ値を主観的に選択し、それを用いて学習し、検証セットに対して測定された性能結果を記録します。この方法には、最適なハイパーパラメータを見つけるプロセスで実験者の暗黙のバイアスがかかるため、最適なハイパーパラメータ値を見つけるのが比較的難しいという欠点があります。グリッド検索とランダム検索は、手動検索の欠点を補うことができますが、ハイパーパラメータ調査中に得られた事前知識が反映されないという点で限界があります。
ベイズ最適化は、ハイパーパラメータ最適化の手法であり、毎回新しいハイパーパラメータ値を調査する際に十分な事前知識を反映させながら、全体的な探索プロセスをより体系的にすることができます。ベイズ最適化の2つのコンポーネントの1つであるサロゲートモデルは、これまでに検討された入力値と関数値���点に基づき、未知の目的関数を確率的に推定します。その典型的な例がガウス過程(GP)です。一方、獲得関数は、目的関数の現在の確率的推定に基づいて最適な入力値を見つけるのに役立つ可能性が最も高い入力値を次の候補として推奨します。その典型的な例が期待改善量(EI)です。
ディープラーニングモデルのハイパーパラメータ最適化に対してベイズ最適化を使用します。これは、ベイズ最適化の入力値として最適値を探索するためにハイパーパラメータを適用し、かつ目的関数の関数値として特定のハイパーパラメータ値を適用して学習したディープラーニングモデルの検証セットの性能結果を用いて行われます。
*次のパートでは、これまでに得た理解を基に、ベイズ最適化(実世界のベイズ最適化のためのPythonライブラリ)を使用し、単純なサンプル関数の最適解を探索するプロセスを経て、実世界のディープラーニングモデルの最適なハイパーパラメータを探索します。
参照
- Shahriari, Bobak他。『人間をループから取り出す:ベイズ最適化に関するレビュー』 Proceedings of the IEEE 104.1 (2016):148〜175。
- Brochu, Eric、Vlad M. Cora、Nando De Freitas。『高価なコスト関数のベイズ最適化に関するチュートリアル。アクティブユーザモデリングと階層的強化学習への応用』 arXiv preprint arXiv:1012.2599 (2010)。
- Bengio, Yoshua。『ディープアーキテクチャの勾配ベーストレーニングに対する実践的提言』 ニューラルネットワーク:商売の秘訣。Springer, Berlin, Heidelberg, 2012。437〜478。
- Goodfellow, Ian他。ディープラーニング。Vol. 1. Cambridge: MIT press, 2016。
- Bergstra, James、Yoshua Bengio。『ハイパーパラメータ最適化のためのランダム検索』 Journal of Machine Learning Research 13. Feb (2012):281〜305。
- Fernando Nogueira、ベイズ最適化:ガウス過程によるグローバル最適化のPython実装。
- Hunting Optima、ベイズ最適化のための期待改善量:導出。