機械学習のアルゴリズムを実行する際に、データから直接決めることのできずユーザがあらかじめ決めておく必要があるハイパーパラメータがあります。ハイパーパラメータは最終的な精度に影響するため、ある程度良い値を設定しておく必要があります。
このハイパーパラメータを探索する方法はいくつかあります。
昔からある手法で、格子状の空間で最適なパラメータを探索する方法です。 格子の範囲を総当りするため、膨大な計算時間がかかるという課題があります。
無作為にパラメータを抽出して探索します。 グリッドサーチよりも計算時間が短くて済むというメリットがあります。
- ベイズ最適化 (Bayesian Optimization)
最初は無作為にパラメータを抽出して探索しますが、その結果を使って次に探索する点を確率的に選ぶ方法です。 ディープラーニングを含む機械学習の手法で、比較的良いハイパーパラメータを探索できることが知られています。
特に、低次元のデータで大域的な解を求めたい場合や、グリッドサーチなどで時間がかかっている場合に有効な手法です。
ハイパーパラメータを自動的に探索する方法は R2016b から Statistics and Machine Learning Toolbox に導入されています。
2通りの方法があり、機械学習の関数によってどちらかを使用します。
1. 関数オプションを使用する方法
"fit" から始まる分類/回帰の関数のいくつかでは、'OptimizeHyperparameters' オプションを 'auto' に設定することで、ベイズ最適化を使ったハイパーパラメータ探索が行われます。デフォルトの探索方法はベイズ最適化に設定されていますが、グリッドサーチやランダムサーチに変更することも可能です。
例えば、二項サポートベクターマシンの fitcsvm 関数でグリッドサーチを使ってハイパーパラメータサーチをしたい場合、以下のようにオプション 'HyperparameterOptimizationOptions' に対して struct として 'Optimizer' オプションを 'gridsearch' と設定します。
Mdl = fitcsvm(X, Y, 'OptimizeHyperparameters','auto',...
'HyperparameterOptimizationOptions', struct('Optimizer', 'gridsearch'))
2. bayesopt 関数を使用する方法
ディープラーニングなどの、'OptimizeHyperparameters' オプションが用意されていない関数の場合にベイズ最適化を使用したい場合は bayesopt 関数を使用します。 ベイズ最適化についてより詳細が知りたいという場合は、以下のワークフローをまとめたドキュメントをご覧ください。
- ベイズ最適化のワークフロー