棋風を覚える将棋ソフトが完成してた件

リゼロ評価関数のほう、ようやくepoch11にしてelmo(WCSC27)と並んだのだが、穴熊に全然囲わない。穴熊超嫌い。どうやっても穴熊に囲わない。

もちろん、穴熊は優秀なので相手に一方的に穴熊を許すと作戦負けになる。穴熊を自ら封印してelmo(WCSC27)と互角に渡り合えるというのも凄いと言えば凄いのだが、何か思っていた方向性と違うような気もしている。

ここから学習を繰り返していく過程で自然と穴熊の優秀性を発見するとは思うのだが、いま教師局面を作るのに丸2日要するので、教師局面生成の条件を色々変更して実験するというのがとてもやりにくい状態である。

一方、まふ定跡のまふさんが定跡として四間飛車の定跡を教師局面の生成のときに用いて評価関数を学習させると(その定跡の半分は穴熊に進行するので)、居飛車穴熊を自然と指すようになったとこのブログのコメント欄で書かれている。

定跡を与えるだけでその棋風を学習する(その戦型を指しこなす)ソフトって画期的だと思うのだけど、それに近いことがすでにユーザーの手で実現しているというのに驚きである。流れが早すぎて私自身も情報にキャッチアップ出来ていないぐらいだ。

ここで何故定跡を与えるだけでその戦型を指しこなせるようになるのか、いままでの記事を読んでいない人のために改めて解説しておく。

1. 教師局面の生成のときにランダムムーブを入れている。

ランダムムーブというのはその局面の合法手からランダムに一つ選び、それを指すことだと思って欲しい。

2. 教師局面の生成のときに定跡ファイルを指定できる。

教師局面の生成時に定跡ファイルを指定できる。やねうら王で使える形式の定跡ファイルなら何でも良い。(やねうら王では、Apery形式の定跡ファイルも使える)

3. 定跡よりランダムムーブが優先される

教師局面の生成時には、まず、この定跡に添って局面を進めるのだが、しかしランダムムーブのほうが優先される。

例えば、教師局面生成時に「16手目から32手目の間でランダムムーブを5回入れる」というように指定できる。

gensfen random_move_minply 16 random_move_maxply 32 random_move_count 5 depth 3

そうすると、定跡の途中であってもこのランダムムーブが入る。(その結果、普通はその指し手以降、定跡の局面から外れることになる)

4. 定跡の局面が学習対象ではない

定跡の局面自体を学習させているのではなく、定跡の局面周辺の局面を開始局面として、そこからdepth 3(上の例なら)で探索するのを繰り返し、終局まで普通に指す。そして勝ったほうの指し手はすべて良い指し手であったと仮定してボーナスを与える。(elmo式の勝敗項による影響)

そうすると、定跡周辺の局面での良い形を自然と学習する。良い形であるなら勝率が高いはずだからである。定跡として与えた局面の評価値がゼロになるわけではない。その周辺の局面を教師生成時の開始局面としてプレイアウトまでやっているだけである。

なので、究極的には定跡ファイルなしでも穴熊が本当に優秀な囲いであるなら、ランダムムーブをそこそこ入れていれば自力で穴熊を発見し、その優秀性にソフト自らがいずれは気づくと私は信じているのだが、それまでにどれだけの計算資源が必要なのかは定かではないので、定跡を使って手っ取り早く穴熊を学習させなければ俺の電気代がヤバイ。

結論 : 定跡を与えるだけでその戦型を指しこなすようになる

ともかく、このような仕組みであるので定跡を与えるだけでその定跡周辺で出現する局面での良い形を自動的に学習し、その定跡を指しこなすようになるわけである。「指しこなす」と言うと異論もあるかと思うが、uuunuuunさんの記事によるとdepth 3で教師局面を生成している場合であれ、浮かむ瀬クラスにはすぐになるようなので「指しこなす」と言っても過言ではないと思う。

関連記事

興味のある人は以下の2つの記事を読めば自分でも評価関数ファイルの学習に挑戦できる。(depth 3ならば家庭用PCでも1回の教師局面の生成〜学習に1日かからない。)

人間の棋譜を用いずに評価関数の学習に成功

従来手法に基づくプロの棋譜を用いない評価関数の学習

追記 [2017/6/26 8:30]

雑巾絞りの自動化ツール(?)を用意しました。

『Shivoray』(全自動雑巾絞り機)公開しました

棋風を覚える将棋ソフトが完成してた件」への6件のフィードバック

  1. 以下のようにランダムムーブを指定すると、バグるようです。(シボレー)

    YaneuraOuV471learn.exe threads 8 , hash 128 , bookmoves 32 , bookfile numas.db , evaldir eval_zero_epoch0 , gensfen random_move_minply 17 depth 3 loop 10000000 eval_limit 32000 output_file_name generated_sfens.bin , quit
    YaneuraOuV471learn.exe threads 8 , hash 16 , evaldir eval_zero_epoch0 , evalsavedir new_eval , evalshare false , learn save_only_once batchsize 300000 eta 30 lambda 0.5 generated_sfens.bin , quit

    • gensfenのときにrandom_move_minplyに1以外を指定すると落ちることがあるようですね。修正しておきました。次のバージョンのやねうら王もしくは、次のShivorayで修正されています。

  2. 私の評価関数も穴熊を覚えたから、もうその局面の学習は不要だろうと比率を下げたところ穴熊をしなくなりました。
    いままでこのパターンの変化があった場合、相手にその戦法の対抗手が生まれたときとかだったのですが、穴熊にはそれがありませんでした。
    なので評価関数のパラメタを確認したところ面白いことが判明しました。

    それは、9九玉は類似局面の合計がとても高い配点を持っていましたが、
    相手の角のラインに玉が入る局面パラメタは非常に大きな減算がありました。
    つまり、4四歩等で角道が閉じていないと8八玉と移動する手はあまり良くない判定をされるようです。(ちゃんと学習が出来ていたら当たり前)

    しかし、4四歩と角道が閉じていても穴熊にしなくなります。
    今度は学習が進むに連れて、穴を塞ぐ8八銀が類似局面の壁銀判定と減算されていて、微妙な配点になっています。

    すると今度は類似局面の高い配点を探し、銀冠を見つけます。
    その結果、銀冠穴熊をやりだします。

    穴熊の類似局面を学習していくとこんな変遷があるようです。

    3駒の表現力のみでは類似局面に大きなマイナス評価を含む囲いをひどく嫌うようです。
    (どうしてもやりたい場合は別のパラメタを作らないとダメかもしれません)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です