グリッドサーチより効率よく最適なパラメータをサーチしたい。その1

時間をかかる計算において、最適なパラメータをサーチするのは結構めんどくさい。

Pythonだと、hyperoptとかoptunaとか良いツールが使える訳だが、Python以外の言語においては、代替のものを探すか、パラメータサーチはPythonに任せるか、あるいは自力実装するかということになる。

異なる言語を混ぜるのはシステムが複雑になるし、メンテナンスも面倒になりがちである。 また代替の物を探す場合、簡単に見つかれば良いが実際はなかなか骨が折れる。 今回は実装が簡単で、グリッドサーチよりは頭の良い方法を探ってみる。

マルチアームドバンデッド問題(multi-armed bandit problem)

選択すると報酬が得られるレバーがN本ある時に、一定の試行回数で最大の報酬が得られるように、レバーを選択する問題である。強化学習の教科書などに載っている。

サーチするパラメータが離散的なのであれば、マルチアームドバンデッドとして効率的に解くことができそう。

UCB1アルゴリズム

この問題に対して、期待値が高くなる戦略としてUCB1アルゴリズムが知られているらしい。UCB1アルゴリズムでは、レバーを選択するたびに、全てのレバーに対して以下の評価値を求めて、評価値が最大となるレバーを選択する。(報酬の値のレンジって任意でいいのかなぁ?)

\bar{x_j} + \sqrt{\frac{2\log{n}}{n_j}}

  • {n}は、レバー全体を選択した回数。
  • {n_i}は、レバーiを選択した回数。
  • \bar{x_j}は、レバーiで得られた報酬の期待値。

UCB1アルゴリズムの評価値は、理論的には上記が最適らしい?が、実際には定数項Cを使って、期待値項とボーナス項の比率を補正して使うことも多い。

\bar{x_j} + C\sqrt{\frac{2\log{n}}{n_j}}

これくらいなら簡単に実装できる。気が向いたらもう少し調べたい。