GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

超適当なTD法の解説

 選手権でも布教してきたんですが、TD法の解説が意外と受けが良かったのでここで解説してみます。

 まず、制御問題への応用はザクっと切り捨てて、下記の様な単純な条件下での動作を説明します。

 また、基本的に専門用語については解説しませんが、これはググるなり森北出版の「強化学習」を読むなりして調べて下さい(意味不明な用語は無視して読んでも大丈夫な様に、努力はします)。

  • 報酬は終局時に勝った方のプレイヤーに+1.0、負けた側に-1.0を与える。引き分けなら双方に0.0を与える。
  • 対局途中は報酬を与えない。

 んで、今「i番目の局面で最善手を指したらi+2番目*1の局面になり、その評価値は+0.7だった」と仮定します。

 それではi番目の局面の評価値はどの程度の値かというと、多分2手先の評価値である+0.7に近いはずです。

 という訳で「i番目の局面の局面の評価値を+0.7に近付ける」という様にパラメータ修正をすると、以前よりちょっと精度の良いパラメータが得られるはずです。

 ただ、これだけではせっかく与えられた報酬を無視する事になりますので、「j番目の局面で最善手を指したら、その直後に自分の勝ち(負け)になった」場合を考えます。

 この場合、「j番目の局面の評価値を(報酬である)+1.0(または-1.0)に近付ける」と、これまた精度が向上するはずです。

 ここでのキモは「近付ける」やり方で、いきなり+0.7とか+1.0にするんじゃなくて、ちょっとだけ(学習率の分だけ)近付けていって、徐々にパラメータを修正する事です。こうしないと、直近の対局の結果に過剰にパラメータが反応するので、大きく修正するのは好ましくありません*2

 上記のやり方を別の言い方をすると、「評価関数の出力する評価値が、その局面から対局開始した場合の報酬の期待値を近似する様に、評価関数のパラメータを調整する」という事です。

 なお、評価関数の実装・パラメータ修正のルーチンに関してはここでは説明しません。

 線形関数近似を用いる場合は「強化学習」のP.209〜219に(あるいはここに)書いてあります。

 また、ニューラルネットワークを評価関数にするという手もありますが、強化学習もニューロも複雑ですので、両方いっぺんに手を付けるのはオススメしません。どうしてもそういう構成にしたいなら、まず個々のアルゴリズム・特性をしっかり理解してから着手すべきだと考えます。(と言うか、Suttonさんの受け売りなんですが気にしたら負けです。)

 ついでに書くと、上記のアルゴリズムはTD法とかTD(0)と呼ばれるものですが、TD(λ)という手法もあります。

 これは、2手先の局面だけでなく4手・6手・8手…と、どんどん先の局面の評価値も考慮した上で評価値の目標値を決めるやり方です。

 ただ、これについて書きだすと長くなるんで、詳細は「強化学習」を参照して下さい。

*1:次の自分の手番

*2:と言っても、小さすぎると今度は学習が遅くなるので、バランスを取るのが大事です