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

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

面白そうな論文見つけた

 http://aiwww.main.ist.hokudai.ac.jp/contents/research/activities/thesis/M_23_kimura.pdf

 強化学習において、いきなりゴール(将棋の場合だと勝敗)に辿り着くのは難しいので、途中にサブゴールを設定し、そこに到達すると報酬を与えるという事は結構されているみたいです*1

 ただ、大抵の場合は強化学習の設計者がサブゴールを設定します。将棋の場合だと、「矢倉に組めたらx点、穴熊ならy点の報酬」みたいな感じで。

 んで、この論文はそうではなくて、強化学習エージェント*2の経験を元に自動的にサブゴール・報酬の設定をしてしまおうというものです。

 論文では迷路脱出が例として書かれていますが、それだとエージェントが入口から出口まで到達する間に通った場所何個かをサブゴールとし、次回学習時にサブゴールに到達すると報酬を与えるみたいです。

 サブゴールの自動設定以外で目新しいと思ったのは、各サブゴールに対応するエージェントを使い分け、i番目のエージェントはi番目のサブゴールからi+1番目のサブゴールまでの経路を学習する構成になっている所でしょうか。これだと、各エージェントの学習する範囲が狭くなり、比較的学習しやすくなりそうです。これは、将棋の場合だと序盤・中盤・終盤で評価関数を切り替えて使う事に相当しそうですね。

 この論文の手法自体は、将棋みたいな状態数が多い問題では使えなさそうです。少なくとも、中盤や終盤の局面をサブゴールに設定しても、そこに到達するケースは殆ど無いはずです。

 ただ、指し手をサブゴールの判定に使うってのは出来そうなので、一度試してみたいですね。

 ざっと考えた感じだと、指し手を移動後の位置81箇所×移動後の駒の種類14種×取った駒の有無・種類14種で約1万6千通りに分類し、「直前の指し手が2二角成で角を取った局面をサブゴールに設定する」とかやると、そこそこ上手く行かないかと思っています。

 例えば上記の例だと、「角交換する」という手(と言うか、角交換した後の局面)がサブゴールになる感じです。他にも、敵陣に飛車が成り込む手とか玉が端に寄る手とかがサブゴールになれば、上手く学習してくれそうな気はします。

 問題はサブゴール到達時の報酬設定ですね。論文では本当のゴールに到達した場合と同じ値で初期化、とされていますが、将棋の場合はそれだとやり過ぎな気がします。

 という訳で、TD法みたく全サブゴールの初期値は適当に小さな乱数なり0なりで初期化し、後は後続のサブゴールの報酬に近付けるなり、終局時の報酬に近付けるなりしてみようかと考えています。

 それから、サブゴールの報酬を全部足してから終局時の報酬に加算すると、無駄に手数を伸ばしてサブゴールでの報酬を稼ぐ様に学習してしまう可能性もあります。ですので、サブゴールの報酬の合計ではなく平均を使うってのも検討中。まぁ、これは色々実験してベストな方法を探ってみます。

 そんな訳で、色々夢は広がって行った訳ですが、GPW杯までに成功してウハウハになるか、失敗して_| ̄|○になるか、乞うご期待。

*1:私自身はほとんどサブゴールを使った経験が無いので、ひょっとしたら間違っているかもですが…

*2:学習の主体となるモジュール