学習アルゴリズム

今年の一月に、Bonanzaソースコード込みで公開されるようになったので、最近読み始めた。
コンピュータ将棋選手権使用可能ライブラリ

棋譜データを使って、評価関数のパラメタを学習する部分を一通り読んだ。
学習を実行するコマンドは、以下のようになっている。

> learn [ini/no-ini] nsteps max-games max-iterations nworker1 nworker2

[ini/no-ini]は、評価関数のパラメタを初期化してから学習するか、現在の値から開始するかを指定。
max-gamesは、棋譜データファイルに登録されているゲームの中で、最大何個まで学習に使用するか指定。
学習は二つのフェーズに分かれている。その全体をmax-iterations回繰り返す。
nworker1とnworker2は、第一フェーズ、第二フェーズで処理を実行させるスレッド数。(指定しなければ1スレッド)


第一フェーズは、

  1. 棋譜で実際に指した手以外の全ての合法手を生成
  2. 合法手の局面から1.5手探索して評価値を得る。実際に指した手の評価値からFV_WINDOW以内の評価値の合法手について、探索から得た最善応手手順をファイルに記録

を、全てのゲームの全ての局面について実行する。(評価値が「詰み」の局面は除外)

第二フェーズは、

  1. 最善応手手順をファイルから読み込んで、実際に指した手と、他の合法手の評価値の差を計算
  2. 評価値の差から最適制御の目的関数Jの勾配(dJ/dν)を計算
  3. 評価関数のパラメタを更新

を、何回かのstepとして繰り返す。
第二フェーズのstepによる繰り返しでは、最善応手手順は変わらない。第一フェーズと弟二フェーズを合わせた全体のiterationの繰り返しでは、評価関数のパラメタが更新されているので、対象となる合法手、最善応手手順が変わる可能性がある。

面白いのは、計算で得た目的関数の一次微分値dJ/dνを、評価関数パラメタνの更新の大きさに直接反映していないことである。

ν <= ν -h * dJ/dν

としているのではない。
dJ/dνの符号、あるいはパラメタ間でソートした順序を利用して更新値を決定している。
Bonanzaの方法を最急降下法と分類していた論文もあったが、このようなものも最急降下法と呼ぶのだろうか?