前回の続き。
BishopLearningに限らず教師なし学習において、成功の秘訣は、いかに正解に近い指し手を用意するかである。
BishopLearningでは即詰みのある局面では、その探索結果で詰みまで読みきれているなら、そこに至る指し手は正しいものとして用いることが出来るということを利用している。
BishopLearningでは学習のスタート時付近で、序中盤の指し手は学習させても意味がないのではという意見もあるが、そうとも限らない。具体的に言うと探索の結果、駒得になる局面が出現する場合、そこに至る手順が正解手順(最善手)の可能性が高い。そこで、駒得になる場合の指し手も使える(かも知れない)。そうでない場合は使えない気がするが…。
そう考えると、ある程度の探索深さで探索させたときに、現局面とPVの終端局面との評価値の差が大きい局面ほど学習に適していると言える。あるいは、singularであるか(ベストの指し手で進めたときの評価値が、他の指し手の評価値がより著しく高い)などをその(学習対象にするかの)判定の基準とするのは合理性がある。
あと、探索深さもかなり深めにしないと探索の結果駒得になるような局面に遭遇しないので、探索深さも決め手になる。ゆえに、この探索深さを深くしたいが、時間がかかって仕方がないのでなかなか…。
ギリギリの妥協点として、とりあえず探索深さ7とした。
以下にアルゴリズムを示す擬似コードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const Ply depth = 7; // 深さ7で探索したスコアを棋譜の指し手、スコアとみなす。 recordScore = search(depth); recordMove = pv[0]; for(現局面でのすべての指し手mについて) { score = search(mで進めた局面,depth-1); // 特徴因子の勾配を加算 incParam(score-recordScore , recordMoveで1手進めた局面と、mで進めた局面との差の特徴因子に対して); } |
見てわかる通り、比較しているスコアはPV終端(7手先)であり、比較しているノードは、1手進めた局面同士。NDFの「深い探索での結果と浅い探索での結果とが一致する方向に評価関数パラメーターを動かす」というのは、こういう意味である。
さて、こうやってみたところ、なかなか入力棋譜との指し手一致率が上がらない。繰り返しになるが、入力棋譜自体は直接的には用いていなくて、単に指し手一致率が上がるかどうかの統計情報のためだけに用いている。
入力棋譜との指し手一致率が上がらないということは、強くなっていないということだ。8時間ほど学習を回したのちに対局させてみたところ、次のことがわかった。
・玉は囲う(7八がお気に入りのよう)
・銀は7七がお気に入りのよう。
・銀を前に移動させたり、大駒を打ち込まれないような金の移動をする。
・桂の活用をしようとする
・大駒の価値が若干低い気がする。(終盤の指し手から学習させたため?)
・大駒をすぐに打ちたがる
・と金を敵玉から離れた端に作りたがる。
玉は一応、囲っているので、ひようら王(ひよこ将棋)からは大きく進歩していると言える。そして、銀を前進させたり桂の活用をしたりする。なぜそこまでやって、ひようら王に勝てないのか。不思議でならない。
大駒をすぐに打ちたがるのは、終盤では手番が回ってこないために手駒にしていても活用を見込めず、駒をとにかく盤上に打つことが好手につながりやすいからかも知れない。
大駒の価値が低いのは、終盤から学習させると角を金と換えて頭金で詰ませるというような筋がよく出てくるからかも知れない。比較的、tacticalな指し手ばかりを学んで、それが悪い影響を及ぼしているような気はする。
と金を敵玉から離れたところに作るのは、初期の評価関数が駒得しか見ていないため、7手ほど読んだときに大きく評価値が変わる手には、と金製造が含まれているためだ。あちゃー。
そんなわけでBishopLearningで学習させるときは、敵玉から離れたと金の価値を事前に手調整で下げておく必要があるのではないかと思った。
長時間学習させれば自然とそのへんも学習するのかも知れないが、そんなに長い時間待っていられない。
ともかく、玉も囲って、桂や銀を攻めに活用しているのにひようら王に力負けするというのは何とも悲しいものがある。ときどき致命的な悪手があるためか。対して、ひようら王は全体的に指し手の質は低いが、駒得になる手ではあるので、そこまで祟らないことが多い。なかなか将棋の世界は奥深い。
もう少し条件を変えて実験をしてみる。次の報告は2日後。
お疲れ様です。
このような実験を積み重ねる事により、ある時突然に、別の世界が見えると思います。
続報を楽しみにしております。
ビショップラーニングって面白い名前ですね。僧侶学習法ですか?
持ち駒については、温存しすぎても損ですし活用できるときに我慢できなくて使っちゃう感じでしょうかね。忍耐力が足りないですね。
こういうのの代替え案の検索って行わないのですか?
明らかに今使っちゃダメなのに我慢ならずに使ってしまう節がたぶんあると思います。そういう明示的にダメな時の代替え検索または2番目を選ぶとかそういうなんていうか経験則がないんですかね。
屋根さんなら知ってると思いますが、2分法って方法があります。
まずおおざっぱに評価を付けた棋譜を詠ませて学習させ、評価をどんどん細かくしていきます。
最終的に収束して区間内に答えがあれば正当にたどり着くというのは可能でしょうか?
実態を知らず妄想を書いてるのですが、当たってますでしょうか。
と、いうわけで自分の中の仮定を総合すると、マルチpvにしてみたらいいかもという結論に達しました。
まぁ、役には立たないですよね。
今日はこの辺にしておきます。
マルチpvの根拠ですが、棋士先生のお歴々の放つ一手というのは、ある程度の複数手に対するメモ化の結果を返しているとみることはできますか?
つまり、その手は一意に見えて複数手をつまり人間的マルチpvによって得た知見の中で評価の高いものを採用している。ということってありますでしょうか。
お歴々に匹敵する歴史を倒そうっていうんですから、一辺倒の方法ではたぶん何らかの弱点が生まれるのだと思います。屋根さんの思考ですら穴があることって少ないですがあると思います。
棋士の歴史でその穴を発見したら突きますよね。それをある程度抑制する意味でマルチpvというのはたらくのではないかと詠んでいます。
ひまうら王は行ってしまえば上質な乱数ですがメルセンヌツイスタほどの精度はないといえますでしょうか。
あそこまで穴をなくすというのは相当な研究が対価として必要なのは想像に難くないのでまぁ大変な道のりだと思います。
あぁ、妄想炸裂してしまった。
バンしないで!お願いプリーズ。
> まずおおざっぱに評価を付けた棋譜を詠ませて学習させ、評価をどんどん細かくしていきます。
評価値のstep(1回の移動量)を収束してきてから小さくするというのは、手調整か、あるいは、RMSpropとかで皆さんやってます。(たぶん)
>BishopLearningでは即詰みのある局面では、その探索結果で詰みまで読みきれているなら、そこに至る指し手は正しいものとして用いることが出来るということを利用している。
ひまうら王で従来の人間の棋譜を検討させた場合、終盤で詰みを発見するのが早かったり、必至をかけるのがうまかったりするのでしょうか?
まだ学習段階なので何とも…。ただ、終盤は駒得する指し手がベストである確率はかなり高く、駒得する指し手より高い精度にならなければいけないのですが、なかなかそれが難しいようです。
>自己対戦でいくら勝率が上がろうと、アプローチの手法が正しいかどうかは判断がつきにくいが、棋譜との指し手一致率が上がっているなら、そのへんは安心である。
「自己対戦」方式・・・プロ棋士の棋譜などいらぬ。強いのが正義、、、方式。
「棋譜との指し手一致率」方式・・・やっぱり強くするにはプロ棋士文化を参考にしないとね。
・・・個人的には、そして最終的には「強いのが正義」が好ましいのであります。
擬似コードについて質問があります。
私の勘違いなら申し訳ないです。
(1) 9行目、mで1手分進めた局面から6手先を探索しているように見えます。そうすると9行目は現局面から見て合計7手先の探索に見えます。
だとすると、12行目は、1手先の全合法手を経由した合計7手先のスコアと「PV終端(7手先)」のスコアを比べることになるので、「深い探索での結果と浅い探索での結果とが一致する方向」にならないのでは?
つまり、9行目のsearchの第2引数は、0〜5のいずれかでは?
(ボナメソっぽくするなら、2とか3?)
(2) 12行目、(m == recordMove || score > recordScore) が成り立つ時だけ、12行目を実行すべきでは?
4行目が7手深さで調べているので、9行目では1手進めたあと6手深さ(=7手深さ)で調べています。ゆえに、スコアとしては7手深さのPVのleaf同士を比較していることになります。
そのスコアの差を、1手進めた局面に出現している特徴因子に対して反映させるのが大事なんです。その特徴因子が将来的に働くことが言えるので。
> (2) 12行目、(m == recordMove || score > recordScore) が成り立つ時だけ、12行目を実行すべきでは?
recordScoreは7手深さでのベストのスコアなので、(枝刈りを考慮しないなら)これを上回るスコアである指し手は存在しないです。
マリオのこの動画みたいに、プログラムが(コンピューターが?)ゲームを徐々に学習していく過程を見れたら面白いですね
http://www.nicovideo.jp/watch/sm25217283
動画の 投稿者の名前を見て びっくり したんだぜ☆wwwwwwwwwwwwwwwwwwwww m9(^▽^)
ああ、nodchip = tanuki-さんなんやね…。
色々やってはんねんなー。
> BishopLearningでは即詰みのある局面では、その探索結果で詰みまで読みきれているなら、そこに至る指し手は正しいものとして用いることが出来るということを利用している。
これって前からどうなのかなと思っていました。というのも、詰ましにいく打ち方は、通常の駒運びとかなり異なった異色のものですよね?
膨大な棋譜とある程度以上の質の評価関数から教師ありでスタートすればそれほど悪影響は受けない気がしますが、まっさらな段階から学習させると副作用も強い気がします(大駒を気前よく使うのも?)。
人間の学習過程を振り返ってみると、悪くなったと気がついて、そのあたりの駒運びを反省しつつ(「相対」に一般化して)強くなっていく気がします(前にやねさんがおっしゃっていたように将棋は悪手の地雷原ですよね?)
なので、学習の初期には激指の実現確率(自動対局で勝率が高い手等)で枝刈りを強めにして、評価が急落(ここも定義とノウハウが必要そうですが…)したポイント周辺で探索長さを伸ばしつつ枝刈りの程度を落とし、より良い手を選んではどうでしょうか?
将棋(3級ぐらい?)も機会学習も専門外なのでバカなことを言ってるとは思いますが…
> 評価が急落(ここも定義とノウハウが必要そうですが…)したポイント周辺で
だから、それをやると、と金製造ばかり学習したという…。
評価関数急落局面の抽出に、と金軍団を作った場合など駒得を中心としたケースを除くなどの、ノウハウが必要なのかなぁと…
歴史って面白いですよね。
駒得っていうのも、誰かが誰かと戦って得た知見の集合から見出したある種の発見なんだと思います。
フラットだった価値が研磨されて偏っていく。
その駒得でさえ知らなければ負けてしまう。勝負ってそんなもんなのかもです。
屋根さんはたぶん歴史という名の車輪の再発明をしているんだと思います。
こういう言い方されるとすごい気持ち悪いかもですけど、コンピュータが棋士の歴史を再発明してそれを上回るって相当ロマンを感じますよ。
でも車輪のこと知りたかったら再発明するのが手っ取り早いとは思っています。
その道に光がささんことを祈ります。
ひまわりの開発者の山本です。
ひまうら王の動向には期待しております。
気になることがあるのでコメントさせていただきます。
まず、学習が進行している指標として棋譜の指し手との一致率を見ていますが、学習の目的がルートと末端を近づけることであれば平均二乗誤差等も気になります。
(そのあたり、測定されていたら是非次の記事には!)
次に、出現局面に過剰にフィットしていないか気になります。
棋譜の局面しか使っていないのであれば、学習内で局面を水増しする必要があるのでは、と思います。
2日後の記事も期待しています!
> 平均二乗誤差等も気になります。
指し手一致率が上がるときは平均二乗誤差等も下がるので、まあ、指し手一致率だけときどき確認する程度でいいかなと思っています。その肝心の指し手一致率がなかなか上がらないんですけど…。