optunaでCNNのパラメータチューニングしてみる。MNISTコンペ精度向上添え。

Kaggle

概要

ハイパーパラメータのチューニングめんどくさくないですか?

ということで、機械学習モデル作成の際に避けては通れないハイパーパラメータのチューニングを自動化するツール、「optuna」を利用してみました。

kaggleなどでも一般的になってきているツールなので使えるに越したことはなさそうです。


optunaとは

クソ適当に箇条書きします。

  • 機械学習モデルのハイパーパラメータ自動最適化フレームワークだよ
  • 株式会社Preferred Networksが開発したMade in Japanのフレームワークだよ
  • 最適化したいパラメータとパラメータの範囲を決めておけば、範囲内のパラメータの最適値を探索してくれるすごいやつだよ
  • ベイズ最適化を利用してるらしいよ

公式リファレンスは下記を参照ください。

optuna公式チュートリアル

21/6/11 追記

想像以上に多くの方に読まれてるので、ソースコード公開します。

githubにしようかと思いましたが、kaggleの公開Codeに載せたのでこちらをご参照ください。

MNIST CNN(Keras) with optuna visualization【日本語あり】
Explore and run machine learning code with Kaggle Notebooks | Using data from Digit Recognizer


使ってみた

利用するデータセット

利用するデータセットは以前記事にした、kaggleのMNISTデータセットを利用したDigit Recognizerのコンペのデータを利用して、CNNのパラメータ最適化を実施したいと思います。

Digit Recognizer | Kaggle
Learn computer vision fundamentals with the famous MNIST data



下記に前回の記事を載せときます。この時はパラメータのことを考えないまま適当にモデル作ったので、どれだけ精度向上が見込めるか期待です。

【Digit Recognizer】Kerasを使ってCNN作ってMNISTの識別精度向上した話
しぃ たけKerasでCNN(畳み込みニューラルネットワーク)を作成してMNISTデータセットの識別を行ったら99%近い識別率が出せたので記事を書きました。概要前回、MLP(多層パーセプトロン)を使って、Kaggleの...


データインポート&前処理

データインポート、前処理については、過去の記事と同様の処理を行います。

割愛しようかと思いましたが、念のため。


最適化するパラメータの範囲を決定

ここから本題のoptunaを使ってみます。

前回のモデルを参考にモデルを構築しますが、最適化したいパラメータを変数にしておきます。

  • 畳み込み層の深さ(num_layer)
  • 各畳み込み層のフィルターの形状(num_filters)
  • 全結合層のノード数(mid_units)
  • Dropout率(dropout_rate)
  • 最適化手法(optimizer)

前回の記事では畳み込み層2層のモデルであったので、もう少し層を深くした方が精度が上がるのではないかと思ってます。


次に、探索するパラメータの範囲を決定します。

今回主に使う関数は下記の4点です。

関数名対象の型説明
suggest_intint型指定した範囲の実数値の最適値を探索(実数値)
suggest_uniformfloat型 など指定した範囲の最適値の最適地を探索(浮動小数点あり)
suggest_discrete_uniformint,float型 など指定した範囲、間隔で最適値を探索(100~500の範囲を、100刻みで探索 など)
suggest_categoricalカテゴリ変数指定したカテゴリ変数の最適値を探索(”sgd”, “adam”どっちが最適か など)
optuna関数まとめ

これで最適化の準備完了です。


最適化

最適化をする際は、「create_study」を利用してstudyオブジェクトを生成、「optimize」関数で最適化を実行の2STEPを踏む必要があります。

最適化は指定した範囲のパラメータをランダムに振ったモデルを、optimize関数の「n_traials」数だけ作成し、一番評価値が高かったパラメータを最適値とする。

という方法で実施されます。


30回の探索が終了したので、studyオブジェクトのbest_paramsを使って、選ばれたベストパラメータを確認していきます。

上記が今回のベストパラメータでした。畳み込み層の層数(num_layer)が5になっています。前回のモデルは2層のCNNであったので、一番効いているパラメータである層数を適当に設定しまくったみたいです。

ちなみに上記の最適化をローカル環境で行ったところ、3時間くらいかけてもepochが2回しか回ってなかったので、GPU環境は必須です。

最適化モデル作成

最適化後のパラメータを利用して、新しいモデルを作成していきます。

コードは下記です。

accuracyが0.9966(99.66%)でした。

ちなみに前回の記事のモデルも同等の精度でしたが、正直これ以上上がりにくいのでこんなもんかなと思います。

学習曲線

最後に過学習(overfitting)、学習不足(underfitting)を確認に学習曲線を図示してみます。

lossの学習曲線
accuracyの学習曲線

過学習などの傾向はみられませんでした。というよりもtrainデータとtestデータの精度がほとんど一致してるので、前回よりいい気がします。

提出

さあ、結果を確認しましょう。出力用のコードは前回の記事をまるパクリです。



提出結果

99%超えたなう

Score:99.028% 順位:943位/2335位中

以前作成したモデルと比較するこんな感じです。

modelscore
MLP(scikit-learn)0.95971
CNN(Keras)0.98814
CNN(Keras) with optuna0.99028

ちょっと精度上がった。

まとめ

機械学習のハイパーパラメータ最適化ツールoptunaを利用して、KerasのCNNモデルの精度が向上することを確認しました。

計算コストは膨大ですが、kaggleなどの精度が求められる分野では武器になりそうなので、今後も使っていきます。

関係ないけど

こんな記事見つけました。なんでCNNの記事書いた瞬間にこんなこと言うの。今度使お。

画像認識の大革命。AI界で話題爆発中の「Vision Transformer」を解説! - Qiita
2020/10/24: 公式実装の追加オミータです。ツイッターで人工知能のことや他媒体の記事など を紹介していますので、人工知能のことをもっと知りたい方などは @omiita_atiimoをご覧…

参考文献

ありがとうございます。

Optuna+KerasでCNNのハイパーパラメータを最適化 - Qiita
#はじめに2018/12/2にPreferred Networksからハイパーパラメータ自動最適化ツール「Optuna」が公開されました。本記事では、ざっくりと使い方を確認しながらfashion …

コメント

タイトルとURLをコピーしました