こんにちは。kzです。

久しぶりに欲しいものができたんですよね。無印の「軽量オーストラリアダウンポケッタブルマフラー」なんですけどオンラインでも全部在庫がないみたいで入荷を心待ちにしています。

そんなことはおいておいて、本日はハイパーパラメータ最適化についてです。

ハイパーパラメータとは

ハイパーパラメータの前にパラメータがありますよね、違いはなんでしょう?LassoとRidgeを例に取りましょう。

上の記事で解説したのでそちらもみていただきたいのですが、モデルを定義する際に学習させる変数がありますよね。よく\thetaで表されるやつです。例えばRidgeの場合だと
となり、Lassoの場合だと
となりました。このように学習(よくfitやtrainと言われる)において学習される変数をパラメータといいます。ではハイパーパラメータとはなんでしょう?これは我々が手動で設定する必要があるパラメータのことです。例えば次のLassoの目的関数を見てみましょう。
先ほど通り、\thetaがパラメータです。一方で、\lambdaがありますよね。これは我々が決めるパラメータなのでハイパーパラメータになります。

これでパラメータとハイパーパラメータの違いが理解できたと思います。真相学習や機械学習の問題の一つはこのハイパーパラメータの最適化です。例えばニューラルネットワークにおいて活性化関数に何を使うかや決定木において深さをどうするかめっちゃ悩みますよね?それを最適化したいんです。

Grid Search

よくある手法の一つがグリッドサーチです。これは格子状にハイパーパラメータの候補を作り、総当たりしてその結果を見てハイパーパラメータを選ぶという手法です。sklearnにあるのでみてみましょう。
いいんです、これでもいいんですけど「探索の最適化」したいですよね?紹介しましょう。オプチュナを。

Optuna

あの最強のPreferred Networks, Inc.さんが開発しました。
Optuna はハイパーパラメータの最適化を自動化するためのソフトウェアフレームワークです。ハイパーパラメータの値に関する試行錯誤を自動的に行いながら、優れた性能を発揮するハイパーパラメータの値を自動的に発見します。現在は Python で利用できます。
Optuna は次の試行で試すべきハイパーパラメータの値を決めるために、完了している試行の履歴を用いています。そこまでで完了している試行の履歴に基づき、有望そうな領域を推定し、その領域の値を実際に試すということを繰り返します。そして、新たに得られた結果に基づき、更に有望そうな領域を推定します。具体的には、Tree-structured Parzen Estimator というベイズ最適化アルゴリズムの一種を用いています。

これがすごいんです。論文にもなったようです。

使い方

テンプレは上の感じです。超シンプルなんですよね。ちなみに最後にgistsを貼りますが、出力も多く、plotもplotlyを用いているのでnotebookでは表示されませんので注意です。
例えばSVCのパラメータ探索をしたいときのコードは上の感じ。
時にはLightGBMとXGboostのように異なるアルゴリズムで比較したいときもありますよね。できるんです。
で、このOptunaの最大の魅力だと個人的に思っているのがPlotでして、plot自体が魅力的ではなくて、plotからOptunaが使っているアルゴリズムがすごいということがわかるんです。
これをみていただくとわかるかもしれませんが、ベイズ最適化を使っているんですよね。デフォルトだとTPEと呼ばれるアルゴリズムを使用されているようです。僕もベイズ最適化あたりは勉強しないといけないので良さそうなリンクを上げておきます。

で、まだ特徴があってデータベースに学習記録が保存できるらしいです。使い道はよくわかりませんが、、コメントください、

Code

Optunaはすごいですね、これからさらに追加される機能も気になりますし、gitからベイズ最適化のアルゴリズムの勉強もさせてもらえそうです。勉強頑張りましょう。でわ

References