アルゴリズムのハイパーパラメータの調整って難しい。Optunaというものがあるらしいのでちょっと使ってみたいんだ。
Optunaはハイパーパラメータを自動的に調整してくれる便利なソフトなんだね。すごいね。
scikit-learnを使って、機械学習プログラミングを学んできましたが、基本的な部分は勉強できても、より良いアルゴリズムのチューニングを行うという点については、経験というか、場数というか、ひたすら試す根気が必要なのかもしれません。しかし、その点もOptunaをはじめとするソフトウェアによって、より早く最適なアルゴリズムのチューニングができるように改善されているそうです。今回は、Optunaを利用してアルゴリズムをチューニングできるようになるためにOptunaのチュートリアルをやってみました。
こんな人の役にたつかも
・機械学習プログラミングを勉強している人
・機械学習アルゴリズムのハイパーパラメータ調整に苦戦している人
・Optunaを利用したい人
Optunaって何だろう?
Optunaは、機械学習アルゴリズムの「ハイパーパラメータ」を自動的に探索してくれるオープンソースソフトウェアです。
機械学習アルゴリズムには、あらかじめ人が手動で設定すべき「ハイパーパラメータ」があります。
「ハイパーパラメータ」の設定値を探るには、設定値を変更して交差検証を繰り返したり、グリッドサーチというパラメータを順番に機械的に変更してスコアの変化をみる手法がありますが、最適なチューニングを探すことは時間的なコストや、人の経験的な知識に頼ったりと、難しくなりがちだと思います。(初学者が感じた雰囲気です^^;)
Optunaはそのような難しさを解消するために、いい感じにパラメータを変更して最適な設定値を探ってくれるようなソフトらしいのです。(実際には、ベイズ最適化という手法などを利用しているらしいです。)こんな便利なもの使わない手はないと思い、今回はOptunaのチュートリアルを読み解いて、基本的な利用法を調べたいと考えました。
Optunaのインストール
まずは開発環境にて、Optunaが利用できるようにします。
Anaconda
「pip」コマンドでインストールできるようです。Anaconda環境であれば、以下のようにターミナルからインストールができます。
pip install optuna
Google Colaboratory
以下のコードを実行することで、ColaboratoryのNotebookで利用できるようになります。
!pip install --quiet optuna
バージョンの確認
Optunaの準備ができたら、バージョンの確認を行っておきましょう。
import optuna
optuna.__version__
'1.5.0'
Optunaの使い方
まずは、チュートリアルサンプルのプログラムを例に、Optunaをどのような手順で利用するか、見てみます。チュートリアルでは、「(x-2)**2」の式に最小となるようなxの値を探す、というものになります。
チュートリアルはこちらです。↓
import optuna
#1.目的関数の定義
def objective(trial):
#1-1探索するべきパラメータの設定
x = trial.suggest_uniform('x', -10, 10)
#1-2最適化するスコア
return (x - 2) ** 2
#2.Optunaオブジェクトを作成
study = optuna.create_study()
#3.Optunaでパラメータ探索
study.optimize(objective, n_trials=100)
#4.ベストパラメータ表示
study.best_params
サンプルコードにコメントアウトでメモ書きを入れました。次からの記載は、コメントアウトの番号と対応しています。
1.目的関数の定義
「objective(trial)」という関数を作成して、ここに探索するハイパーパラメータを定義しています。
trialという仮引数に対して「1-1」のようにパラメータ設定するようです。書き方には慣れる必要がありそうです。普通の関数だと、仮引数をobjective(x)と定義して、このxに外部からのパラメータを入力するのですが、この部分を「trial」とまとめて、関数の内部で自由に追加できるようなイメージでしょうか。とても便利な仕組みに感じます。
例えば、x+y-2という式に最小化したい式を変更したとします。パラメータyが増えますので、本来はobjective(x,y)というように関数の定義や、この関数を呼び出す場所全てを変更しなければいけないのですが、Optunaの場合、objective関数内部にyを追加するだけでOKなので、とても画期的です。
「1-2」の関数の戻り値であるreturnの値は、Objectiveが呼び出された時に返す結果になる部分です。
2.Optunaオブジェクトを作成
「study = optuna.create_study()」のように、create_studyという機能を利用してOptunaをプログラムで使えるようにします。
ここでは、パラメータに何も指定していないので、Optunaオブジェクトは最小化を行おうとします。分類問題の正解率などをできるだけ高めたい場合、「direction=’maximize’」とすることで、最大化に変更することができます。
3.Optunaの「optimize」メソッドでパラメータ探索
optimizeに、「1」で定義したobjective関数と、「n_trials」パラメータに、何回試すかを与えてあげます。今回は100回のハイパーパラメータを試します。
Optunaは機械的に-10から10へ順番に試しているのではなく、頭のいい探索を行ってくれています。
4.ベストパラメータ
「study.best_params」のようにすることで、Optunaの実行で得られた最適なパラメータを表示することができます。
先ほどのチュートリアルプログラムを実行すると、だいたい2前後のxとなるはずです。optunaは、毎回同じ値にはならないのですが、より早く最適なハイパーパラメータを見るけるのに有効です。
{'x': 2.015493001151997}
これからは、Optunaも使っていこうかな