読者です 読者をやめる 読者になる 読者になる

Aestetica

コンピュータ将棋Selene(セレネ)を作っています。名前は西海枝昌彦(さいかいし まさひこ)と読みます。

評価関数と学習部分を少し書く

今、だし醤油がアツイ!!
冷やっことか湯豆腐とか、豆腐系に特に美味しさを感じず、出てきても「はい、豆腐」くらいのこと。
だったのが、だし醤油をかけたらめちゃくちゃ美味しい!
調味料はだし醤油だけで良い。
ダメなやつはあるかな?うーんと、納豆OK。お刺身、うーんNG。普通のやつで良い。まさかのふたつめでNG。


まだ本体がぜんぜんできていないというのに、評価関数と学習部分をつらつら書き始める。
特徴はとりあえず駒割り、持ち駒、絶対2駒のみで、一回大量データ数で動かしてみて、新方式の各種パラメータの値を調べたい。
機械学習と言っても、例えば、

Aperyはボナンザメソッド
AWAKEはボナンザメソッドだけどミニバッチ。
技巧はRMSpropにFOBOS。
ponanzaはオンライン学習。
NDFは、NDFはうーんと、ボナンザメソッドだけど対象が違う。
習甦はNNみたいな、何度聞いてもよくわからない方式。

とかなんとか、用語が多い!だいたい、なにがなんだとボナンザメソッドなのか?

変わった機械学習をやっていると聞いた場合、その人に聞きたいことはおおまかに3つあって、
①更新対象となるノード
②勾配(報酬)の求め方
③パラメータの更新方法
があって、

①について。
「76歩を良しとするとき、どの局面に点を足すの?」ということです。
え!?そりゃあ、76歩の局面でしょ。と、思いきや、実は違います(あ、いや、そういう人もいるかも)。

まずはボナンザメソッドの場合だと、数手探索した局面が更新対象。
なので、まだ学習がはじまったばかりだと、▲76歩△14歩▲96歩△24歩みたいな局面に点をつけたりします。学習がすすんでくると、▲76歩△84歩~みたいなところに点をつけます。
さらに、ここが重要なのですが、棋譜の手以外の指し手にはマイナスの点をつけます。こちらも同様に数手すすんだ局面です。

他には、棋譜の指し手のところだけ点をつけたり、なんだり。
なぜ76歩の局面ではなく、数手すすんだ局面に点をつけるのかというと、私は機械学習の専門家じゃないのでわかりません!(開き直る笑)少し探索しただけで各段に効果が変わります。仕組みを誰か教えて。深く探索すると過学習になるっぽい?激指はなってないけど?

※実際には静止探索のことがあったり、ボナンザの場合、定跡の場合はわけあって違うことをやっていますが割愛。

②について。
じゃあ、良いときって何点つけたらいいんだよ!とキレ気味に言うところ。
例えば、良かったら1点、ダメな手はマイナス1点。とかにしてくれれば話は簡単なのですが、1点ずつだとダメなようです。
まずは目標が大事!ボナンザの場合は棋譜の指し手の評価値との差です。
棋譜の指し手が150点、ダメな指し手が200点だとしたら、棋譜の指し手をぐいっと上げるために、まずはダメな指し手をへこませます。50点分のダメージを与えるのですが、50とかは引きません。
もっと小さい値をごちゃごちゃ足していくのですが、目標の値に向かってがーしがし近づいていってほしいので、適当な関数を使います。
シグモイド関数とか、tanh、ヒンジ損失関数、なんとかかんとか、「関数」がどうこうという話であれば、まず間違いなくここの話をしています(乱暴)。まあ、どの関数使っても、そこまで変わらないんですけど(さらに乱暴)。

シグモイド関数ってなんだ?
⇒下のリンクから右にある「標準シグモイド関数」という図を2秒間だけ見て帰ってきてください。
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E9%96%A2%E6%95%B0

S字カーブになっていますが、その傾き具合を使って、目標値に近づけます。傾きなので微分した値。
tanhだとそのまんま。

そして、ダメな指し手から引いた分を合計して、棋譜の指し手に足します。
ここが合わないと、例えば76歩の局面の場合、ダメな手、例えば16歩にマイナス1点、26歩にマイナス1点・・とかやると、初期局面は30手選べるので、57歩の位置なんかはマイナス29点になります。76歩で1点入れても、マイナス28点です。57歩はなにも悪いことをしてないのに・・。
なので、76歩では合計のプラス29点を入れます。そうすると57歩の位置は差し引き0点。16歩、26歩・・の位置はそれぞれマイナス1点。

③について。
更新する局面がわかった。足すべき点もわかった。
で、どうやって更新するのか。

ボナンザの場合だと良いとき悪いとき、何万局分の点を作業用スペースにいったん入れておき、最後に作業用スペースの符号(プラスかマイナスか)だけ見て、本物の局面(から数手すすんだところ)に対して1~2点を足したり引いたりします。
バッチ学習と言い、これだと収束に数か月かかるとのこと。

しかし、少ない棋譜数だとすぐに収束するので、小分けにして学習して、後でくっつけるのがAWAKEのミニバッチ。
「オンライン学習」といって、作業用スペースを用意せずに、ダイレクトに局面のところに点を足せる方式があり、ponanzaはアルゴリズムは不明だけどやっていて、技巧はFOBOSとPMSpropというアルゴリズムでやっている。
これらは1~2日で学習完了です。

なので、ひとくちに「オンライン学習」と言っても、更新方法のことなので、どこの局面を対象としてるとか、勾配どうしてるとか、そのへんの情報がないとわからないのです。

が、①についてはほぼ間違いなくボナンザと同様。②は人によって多少は違うけど、ほぼシグモイド関数
なので多分、最後の③、更新のところだけ言っておけば通じるのでしょう。

また、ボナンザでは、勝ったプレイヤーにも負けたプレイヤーでも棋譜で指した手ならプラス、違うならマイナス。と、ある意味男らしい点のつけ方なのですが、強化学習の場合は勝ったプレイヤーはプラス、負けたプレイヤーはマイナスをつけます。

あー、前置きが長い。
いやでも、まとめとしては「ボナンザメソッド」と言ったときは、
◆勝っても負けても棋譜の指し手がプラス、それ以外はマイナス、数手すすんだ局面(leafと言ったりする)を更新、バッチ学習。
ということです。
本当は、いろいろあります(笑)機械学習の専門の人から見たら「それは説明になってない!」とか言われそうだけど、だいたいこういうことだ。ということです。詳しく知りたい方はいろいろ見てみてください。

例えば、AWAKEは、
◆勝っても負けても棋譜の指し手がプラス、それ以外はマイナス、数手すすんだ局面を更新、ミニバッチ学習。

最後のところだけ「バッチ学習」から「ミニバッチ学習」になっている。

技巧は話を聞いてないから完全に推測で間違ったらマズイけど、たぶん、
◆勝っても負けても棋譜の指し手がプラス、それ以外はマイナス、数手すすんだ局面を更新、オンライン学習(RMSprop、FOBOS)。

こちらも最後だけ。

といった感じです。
そして、これから私がやろうとしていることは、
◆勝った指し手はプラス、それ以外はマイナス、負けた指し手はマイナス、それ以外はプラス、数手すすんだ局面(leafと言ったりする)を更新、勾配出すのは方策勾配法だけど報酬を足したり引いたりところを独自方式で試したくて気がはやっている。
ということです。
これが言いたかった・・。