CLOSE

機械学習におけるハイパーパラメータ最適化の理論と実践(全2記事)

機械学習におけるハイパーパラメータ最適化の理論と実践 Part.2

2019年9月16、17日、日本最大のPythonの祭典である「PyCon JP 2019」が開催されました。「Python New Era」をキャッチコピーに、日本だけでなく世界各地からPythonエンジニアたちが一堂に会し、さまざまな知見を共有します。プレゼンテーション「機械学習におけるハイパーパラメータ最適化の理論と実践」に登壇したのは、株式会社サイバーエージェント/産総研特定集中研究専門員の野村将寛氏。講演資料はこちら

グレーボックスの最適化

野村将寛氏:続いて、グレーボックス最適化の説明に入ります。まずはブラックボックス最適化のおさらいなんですけど、ブラックボックス最適化は完全に関数の情報を利用しない問題でした。

それに対して、グレーボックス最適化では関数の中身を覗きます。つまり、ブラックボックス最適化にはなかったヒントを使えるようになったので高速化が可能になるということですね。

グレーボックス最適化をどうするのかという説明をしていきます。まずDeep Neural Networkの例について説明するんですけど、ブラックボックス関数最適化において、Deep Neural Networkのチューニングをするときに使っていたのは最終的なエポックの評価値のみでした。

例えば、あるハイパーパラメータがこのようにあったときに、横軸がエポック、縦軸がバリデーションエラーとしたときにはエポックに対してどんどん探索を進めていって、このように最終的に得られた評価値というのをブラックボックス最適化における評価値f(x)として利用してました。

なので、これを使って違うハイパーパラメータをサンプリングして、評価をして、それでまた違うハイパーパラメータをサンプルして評価をするということを繰り返していました。

ただ、これは明らかにこの真ん中の部分を使っていないということで、ブラックボックス関数最適化だとこの部分は完全にブラックボックスとしてみなしてしまっていたという問題があります。

この情報を使って探索をもっと効率化できるんじゃないかということを考えた手法があります。

中間の評価値を使ったSuccessive Halvingという手法

それがSuccessive Halvingという手法で、先ほどのセッションに参加されていた方は「枝刈り」という言葉と同義だと思います。このSuccessive Halvingという手法の基本的なモチベーションというのは、経験上、中間の評価値がよかったら最終的な評価値もいいことが多いよねという、経験上の観測に基いています。

具体的にどういうことをするかについて、今は3つのハイパーパラメータがあると仮定します。それを1エポックだけ右の図では進めています。

この1エポック目の段階で、この一番上のオレンジの線でこの一番下の線よりも超えないだろうということを仮定して、これを切ります。それ以外の2つについて、ある一定のポイントまで進みます。

進めたらその真ん中の線についても切ります。ということを繰り返して、最終的には残ったハイパーパラメータの探索を最後のエポックまでするということですね。

ちょっとアルゴリズムを省略しているんですけど、実際には、指数的に選択肢の数を絞り込んでいって指数的にリソースを割り当てるということをしています。

ただ、このSuccessive Halvingには問題点があります。どういう問題点かと言うと、この今の学習率のラーニングレート0.01というものと0.2というものがあります。ここで、学習率みたいなパラメータは大きいハイパーパラメータを設定したときに、序盤はけっこう下がるんだけど、そこからあまり下がらないみたいなことがあったりします。

具体的にはこの紫のほうがラーニングレートが大きいんですけど、右の図で言うと最初はけっこういいんだけどそこからあまり下がらないみたいなことがあったりします。その一方で小さい学習率を持つハイパーパラメータというのは、序盤はあまり良くないんだけど探索をだんだん進めていくと最終的には良好な評価値になるといったケースがあったりします。

Successive Halvingを改善した他の手法

なので、こういったケースに対してどう対応するのかというので提案された手法がHyperbandという手法になります。Hyperbandというのは一言で言うと、先ほどの絞り込み方を変更しながらSuccessive Halvingを行うという手法です。なので、どんどんアグレッシブに、1エポック目だけ進めたらすぐに絞り込むというアグレッシブなターンと、だんだんゆっくりにしていくターン、まったく絞り込まないターンというのをどんどん繰り返すことによって致命的に失敗するケースを防ぐという手法になります。

右の図が論文のCNNのCIFAR-10の結果になるんですけど、一番下の黄色と黒の線がそれぞれHyperbandとSuccessive Halvingの性能になっていて、最終的には変わらない性能になっているんですけど、Successive Halvingでは、その致命的な失敗がある可能性を持っているのに対して、Hyperbandではそこを緩和できているという感じですね。

続いて、BOHBについて説明します。BOHBという手法は、このHyperbandとベイズ最適化を組み合わせた手法になります。

繰り返しになるんですけどHyperbandは絞り込み方を変えながらSuccessive Halvingを実行してました。ただ、この積極的に絞り込みをする後にもう少しゆっくり絞り込みをするターンとかで、Hyperbandではランダムサンプリングで、絞り込みをするターンが終わったらランダムサンプリング、少しゆっくり絞り込むということを繰り返しました。

ただ、このランダムサンプリングというのは効率が悪いよねという話があって、それに対してベイズ最適化で効率化をしようとしたものがBOHBになります。右図が論文の結果になっているんですけど、これは横軸が時間で縦軸が評価値ですね。

序盤に関しては緑色が提案手法のBOHBで、オレンジ色の線がHyperbandになるんですけど、序盤に関してはHyperbandとBOHBは一緒です。ただ後半になると、ベイズ最適化によってサンプルをしているので、有望な領域に解を生成することができていて、結果的には一番良く評価値が下がっていってます。

シーケンシャルな探索とランダム探索の良いとこ取りをした手法PBT

続いて、PBTという手法について説明します。このPBTという手法はシーケンシャルな探索とランダム探索の良いとこ取りをした手法になります。シーケンシャルな探索とは何かと言うと、これは何かベイズ最適化を含む評価をして、その評価値を使って次のサンプルを作るというものですね。

この図の説明をしておくと、丸がハイパーパラメータで、下のこの四角がウェイトで、例えばNeural Networkで言うと重みパラメータですね。上の四角のところがパフォーマンスと言って、性能を見ているものですね。

シーケンシャルサーチでは、まずランダムだったり何かしらの方法でハイパーパラメータをサンプルしてウェイトをサンプルして、これに対して学習データを使ってトレーニングします。するとウェイトは変わって、ハイパーパラメータは学習しているだけなので変わらなくて、パフォーマンスについては上がります。この結果を使って新しいサンプルを作るというのがシーケンシャルサーチです。

この方法は、前の情報を使っているという点で効率的なんですけど、デメリットとしては、必然的に前の情報に依存しているので並列化が難しく時間が掛かるという点があります。それに対して、ランダムサーチのメリットとしては、並列化が容易なんですけど、デメリットとしては前の情報を使わないので効率が悪いという問題があります。

これに対してPBTでは、この2つの良いところを組み合わせたものになります。

具体的には、今の例だと2つなんですけど並列化をして、まずはランダムサンプリングします。ランダムサンプリングをしてある程度のところまで進めたら、この段階で良いほうですね。今の段階だとパフォーマンスが大きいのは上のほうになるので、この上のハイパーパラメータとウェイトをそのまま丸ごと下のやつにコピーします。なので今の状態だと、下のハイパーパラメータとウェイトを持ったものが2個あります。

その次に、ここの部分でハイパーパラメータに対して若干変更があります。例えばラーニングレートが0.01だったらそれを0.02にしたりとか、少しの変更を加えます。それをそのまま上のやつと並列で進めるというアルゴリズムになっています。なので、遺伝的アルゴリズムを知っている方であれば、けっこうそれに近いと思われるかなと思います。

マルチタスクベイズ最適化(MTBO)

ちょっとここでは問題を変えて、マルチタスク設定について説明します。これのモチベーションとしては似た問題に対するデータが存在するときに、今のデータに対して効率的な最適化をしたいという問題になります。

例えば、1週間に1回チューニングをしている機械学習サービスがあります。基本的に先週の結果と今週の結果はそんなに変わらないはずなんだけど、今週の最適化をゼロからやるのはちょっと効率が悪そうだなというのが直感的にはあります。そういうときに、過去のデータを使って今回の最適化をいかに効率化するかという設定です。

これに対して提案されている手法として、マルチタスクベイズ最適化、MTBOという手法があります。この手法の考え方自体はすごいシンプルで、先ほどのGP-EIと比べて変わっているところとしては、複数のタスク間に対する関係性もガウス過程GPによってモデリングするという点が異なっています。

例えば、緑色の線が先週の結果ですね。この緑色の線に対する観測結果が得られているとします。今週の最適化したい関数というのは3番の青色の線だとします。もしここで仮に先週の緑色の結果を使わなかった場合というのは、当然青の結果に対して何も情報がないので、真ん中のこちらの図のように真ん中はまったく情報がないということで、分散が高く見積もられてしまいます。

この一方で、もし先週の情報を使った場合ですね。それに関しては、先週のタスクと今週のタスクに相関があるということをGPが学習してくれるので、その結果を踏まえて真ん中の部分に関しては何も探索をしていない。今週のタスクに対しては何も評価をしていないんですけど、すでに分散が小さい状態で見積もることができています。これによって、先週のタスクと今週のタスクというのがマルチタスクになっているという設定をうまく利用できています。

おすすめのソフトウェア

ということで、今の話を踏まえておすすめのソフトウェアを紹介していきます。ちなみに今回紹介した手法に関してはすべてPythonOSSが紹介、存在する手法について紹介しました。なので全部探していただけると、全部Pythonとして使えるものになっています。

いくつかピックアップさせていただくと、まずはOptunaですね。Optunaは、ここにあるTPEとかSuccessive Halvingは実装されていて、これ以外でもGP-EIとかCMA-ESに関しても実装がされています。これが今のインターフェースだったりという点で、ログもすごい綺麗で使いやすいのでおすすめです。

これはけっこう知らない方が多いかなと思うんですけど、Ax、BoTorchというツールがFacebookからリリースされています。これは今年の5月にF8というFacebookのデベロッパー・カンファレンスで発表されたツールなので比較的新しいんですけど、このAxというのはAdaptive Experimentation Platformになるということを言っていて、ハイパーパラメータ最適化よりも広い問題クラスを解くツールになっています。

なので、今のここだとMTBO、マルチタスクベイズ最適化が使えるよと書いているんですけど、ABテストを効率化するためにバンディットアルゴリズムを使うみたいなときにも、そういう実装がこの中に入っていたりするので、ハイパーパラメータ最適化よりも1段階広い問題を解いているものになったりしています。ちなみに、今のMTBOに関してはMTGP、マルチタスクガウス過程の実装がBoTorchに入っているので、それを使って実装することができるという意味合いです。

続いてRayですね。このRayというのは強化学習のRLlibというものも含んでいて、それと並列のものとしてRay Tuneというものがあります。このRayというツールは分散環境を想定したツールになっていて、先ほどちょっと紹介させていただいたPBTに関しては、PBTは最初にランダムにまいてそこである程度探索を進めてそこで良いやつをコピーしてということをするので、かなり並列化向けなんですけど、そういったものが簡単に実装できたりします。

あとはRayにはHyperbandも実装されていて、こちらに関しては非同期の並列化に対応した実装も入っていたりするので、気になる方はぜひ見てもらえるといいかなと思います。

それではまとめに入ります。今回の発表では問題の構造を利用できない場合としてブラックボックス最適化、問題の構造を利用できる場合としてグレーボックス最適化という枠組みと手法について紹介しました。

今のハイパーパラメータに関しては、先ほども言ったようにユーザが探索空間を定義できるというものもあったりして、手法に対する妥当な評価というのがけっこう難しいという現状があったりします。

なので、研究としてもこのあたりの妥当性の評価みたいなところは、今活発に行われてたりしています。この辺りの研究が進んでくると、僕らが今解きたい問題に対してどういった手法を選んだらいいのかということがけっこう選びやすくなるので、そういった研究について期待したいなと思います。

以上で発表を終わります。ありがとうございます。

(会場拍手)

ハイパーパラメータ最適化のためのハイパーパラメータは考えるべきか?

司会者:発表ありがとうございました。時間まであと10分ほどございますので、質疑応答の時間とさせていただきます。質問ある方はいらっしゃいますか? 質問がある方は挙手をお願いいたします。

質問者1:お話ありがとうございました。とてもよくまとまっていて、最適化の問題についていろいろな方法をとても勉強になりました。質問なんですけど、こういった最適化アルゴリズムそのものについてもパラメータはたくさんありますよね。例えば、Successive Halvingをどれぐらいでやるかとか、そういったものの最適化はあまり気にしなくていいんですか? それともハイパーパラメータ最適化のためのハイパーパラメータは考えないといけないんでしょうか?

野村:ありがとうございます。確かに手法によってはそもそもハイパーパラメータ最適化のためのハイパーパラメータはしんどいみたいなのはあったりするんですけど、ここにある手法だけで言いますと、ここについては基本的にそんなに考えなくて良いようになってます。

ちょっと詳しい話をさせていただくと、CMA-ESについては確かにここの正規分布のパラメータを更新するために設定されているパラメータがいくつもあるんですけど、それは全部ライブラリで推奨値を持っていて、それはCMA-ESの開発者が膨大な実験をして選んだ推奨値があります。なので僕らが選ぶべきものというのは、ここのサンプル数ぐらいですね。

このサンプル数をどう選べばいいのかと言うと、基本的にこれは一個一個並列化できる数が対応しているので、基本的にはもし今はその並列化できる数が10個だったらサンプル数10と選ぶというように選んだらいいかなと思います。また、例えばTPEであればTPEに関してはユーザパラメータというのは僕らがオープンソースを使う上では存在しないです。

実際にライブラリ上ではどうなっているかと言うと、例えばHyperoptであれば最初にランダムに15点まくだったり、Optunaであればランダムに10点まくだったりというのはあるんですけど、そこまでセンシティブじゃなくてロバストなのでそんなに気にしなくていいかなと思います。

あとはTPEに関してはこのγをどうするんだというのはあったりするんですけど、ここもけっこういろんな実験をして決定されてたりするので僕らがそんなに気にしなくても……まぁ、気にする人はそんなにいないかなという認識を持っています。

GP-EIに関しては、ここのカーネルの設計はセンシティブだったりするのでけっこう難しいんですけど、ここもカーネルのハイパーパラメータというのは周辺尤度を最大化することによって最適化できるので、ある程度ランダムサーチをしたあとにGP-EIを使うということをすれば、致命的に失敗することはない印象を持っています。

なのでここは手法ごとにハイパーパラメータがあって、それがロバストかどうかというのはけっこうその手法のセンスにかかっているという感じですね。

ガウシアンプロセスが有効なケースとは

質問者2:チートシートのスライドをいただけますか? これだけ見るとガウシアンプロセスを使う理由って何なんだろうって、やった経験がないので思っちゃうんですけど、たぶんこのあとのスライドの個別的なパラメータの探索空間の話と関係してくると思うんですが、とくにガウシアンプロセスが有効なケースというのはどういう状況かを教えていただけるとありがたいです。

野村:ガウシアンプロセスが良いケースというのは探索空間がそれなりに難しくて……。すみません、ここに良い例がないんですけど、例えば多峰性がすごい関数を考えたときにCMA-ESというのは基本的に1個の正規分布で探しに行くので期待評価値が良い穴に入っていっちゃうんですけど、それに対してGP-EIでは探索空間をすべてをモデリングするので、そういった場合でも成功したりするんですね。

なので、ざっくり言っちゃうと探索空間が狭く次元数も低くて評価回数がそれなりにある場合、かつ、関数があって多峰性が強いという場合に関しては、非常に良い性能を示したりします。ただ実際に使う場合で、多峰性かどうかってわからないので「じゃあこの問題はGP-EIでいいね」と言うのはけっこう難しいかなというのは僕の個人的な印象として持っています。

質問者2:じゃあ他の手法を使ったときに、なんか局所解に入っている可能性が高そうだなと思ってGP-EIを使うみたいなケースでないとそんなに……ということですかね?

野村:そうですね。その失敗が怖いケースとかで、低次元かつ評価回数がそれなりにあったときに安心して使えるのはGP-EIかなというのはあります。実際に僕が実験している感じでも、ベンチマーク関数とかに対してはすごいうまくフィッティングできるんですけど、実問題に対してやると性能が出るケースと出ないケースがあったりするので、利用用途はけっこう選ぶかなという印象です。

質問者2:ありがとうございます。

局所解にはまりそうな場合

司会者:あと1つほど質問できる時間があるんですけど、何か質問がある方は挙手をお願いいたします。

質問者3:発表ありがとうございました。CMA-ESの話で、ある条件を満たすときにそのパラメータの更新量というのが自然勾配と一致するというお話があったと思うんですけど、例えばこれは局所解にはまりそうだなというときに意図的にノイズみたいなものをデータの中に加えてあげて局所解から脱出するみたいな研究はあったりするんですか?

野村:そもそも局所解に入ってるかどうかというのがわからないので、それに対して評価値を上乗せするということ自体がけっこう難しいケースが多いかなと思います。ここに書いたように、基本的に期待評価値で見ちゃうので、例えば広い領域に対しては緩くて、一番良い領域はこっちの狭い領域にあるよみたいには、期待値で見ちゃうと広いほうがよかったりするんですね。

こういった場合については、期待評価値で見ちゃうと悪いほうに入っていっちゃうと。しかもCMA-ESは、そこの領域内しか見ないので一番良い穴かどうかというのが判別できないという難しさがありますね。

質問者3:ありがとうございます。

司会者:では質疑応答の時間を以上にさせていただきます。改めてスピーカーの方に大きな拍手をお願いいたします。

(会場拍手)

続きを読むには会員登録
(無料)が必要です。

会員登録していただくと、すべての記事が制限なく閲覧でき、
著者フォローや記事の保存機能など、便利な機能がご利用いただけます。

無料会員登録

会員の方はこちら

関連タグ:

この記事のスピーカー

同じログの記事

コミュニティ情報

Brand Topics

Brand Topics

  • 大変な現場作業も「動画を撮るだけ」で一瞬で完了 労働者不足のインフラ管理を変える、急成長スタートアップの挑戦 

人気の記事

新着イベント

ログミーBusinessに
記事掲載しませんか?

イベント・インタビュー・対談 etc.

“編集しない編集”で、
スピーカーの「意図をそのまま」お届け!