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

今回、新たに評価関数をゼロベクトルから学習させた。elmo絞りを使うと意外と簡単にApery(WCSC26)相当の棋力を持つ評価関数にまで出来るようだ。追試できるように記事の前半に手順を記しておく。また、記事の後半には何回目のelmo絞りでどの程度の強さであったかも示す。

elmo絞りを知らない人のために簡単に説明すると、今回、将棋ソフトが人間の棋譜を用いずに勝率の高い形を強化学習でソフト自らが自動的に覚えたということである。今回、1回に生成している教師の数は5億局面。対局回数で言うと400万局程度であろうか。それだけの対局を終局までこなすことで、どういう駒の位置関係だと勝ちやすいのかを学習したということだ。

私は以前、elmo絞りを用いずにある程度の強さまでは到達出来たのだが、計算資源を湯水の如く消費するので途中で断念してしまった。今回はそのリベンジである。題して「Re : ゼロから始める評価関数生活」、略して「リゼロ」だ。

あらかじめ書いておくが、今回作った一連の評価関数ファイルはすでにやねうら王のGitHubのほうで公開した。興味のある人は評価関数のダウンロードのところにある「リゼロ」からダウンロードして試してもらいたい。

私は棋風を語るほどよく見ていないので本当に強いのかもよくわからないが、ちらっと技巧(2015)相手の対局を見た限り、見たことのない変な囲いから攻めて、よくわからないけど攻めを繋いで、詰みを見つけるのが数手早かった。これがこの評価関数の特徴なのかも知れない。将棋に詳しい人は、是非使ってみて、この記事にコメントをもらえると嬉しい。

人間の棋譜を用いずにプロ棋士レベルの棋力を持つ評価関数を生成するのはかねてより私の研究対象であったが、今回は追試できるように手順を詳しく書き、かつ、そのためのソースコード一式を用意できた。また条件も緩いので普通のPCでも時間さえかければ簡単に再現できるはずだ。このような形で公開できることを嬉しく思う。そして、これは、もしかすると歴史的快挙なのかも知れない。

再現手順

Step 1. 評価関数をゼロにリセットする。評価関数パラメーターの値がすべて0である評価関数ファイルを用意すべし。これはKK/KKP/KPP配列をゼロで埋めるコードを書いてそれを保存してもいいし、中身が0であるファイルを所定の長さだけ書き出すだけでも良い。やねうら王で評価関数を読み込む前にsave()関数を呼び出して保存する、というのでも良い。

追記 2017/6/20 10:00 やねうら王のGitHubのほうに「リゼロ評価関数epoch 0」のところからダウンロード出来るようにした。

Step 2. やねうら王(V4.66)のgensfenコマンドでその評価関数から教師局面を生成。定跡ファイル未使用。depth 6で5億局面。eval_limit = 32000。(これには40c80tのPC 1台で半日かからない)

Step 3. やねうら王(V4.66)のlearnコマンドで学習させる。更新式 = AdaGrad eta = 30.0 , 絞り方 = elmo_method , mini batch size = 1M局面。1周。, lambda = 0.5。(40c80tのPC 1台で1時間強)

※ 上記の教師局面の生成(Step 2.)と教師局面からの学習(Step 3.)に用いたのは以下の時点のものだ。これより新しいバージョンでも古いバージョンでもこの記事に書いてある挙動と異なる可能性がある。
https://github.com/yaneurao/YaneuraOu/tree/b6e096cd323ae59d3089996cacb3095271c2abbe

Step 4. ここで出来た評価関数をもってStep 2.に戻る。(Step 2.〜4.を納得いくまで繰り返す)

ここで用いたPCは動作クロック2GHz程度のものであるから、いまどきの家庭用PC、例えば4c8t 4GHzのものを用いた場合、ここで書いた5,6倍程度の時間で完了するものと思われる。

評価関数ファイルの呼び名

以下では、ゼロベクトルの評価関数ファイルをepoch 0と呼ぶ。そして1回目に出来た評価関数ファイルをepoch 1と呼ぶ。N回目のものは、epoch Nだ。

epoch 0の棋力

epoch 0はゼロベクトルであり、駒割りは有効であるから、駒得のみの評価関数(駒割りしか考慮しない)相当である。その棋力は、以前の計測によると定跡使用でfloodgateにてR2200程度であった。定跡を用いないならもっと弱いだろう。R1800ぐらいと考えておこう。

epoch 1の棋力

最初、私はelmo絞りで少しでも強くなるのかな?ぐらいの気持ちでやってみた。

しかしepoch 1でもそこそこ強かった。角道を開けたり、飛車先を突いたりする。こいつ、どうやってそれを覚えたのか…。ちらっと対局を観戦した限りは、定跡で中飛車に振っても、居飛車が好きらしく居飛車に振り直したりしているようであった。

ここで、epoch 1の棋力を計測しようと思ったのだが、epoch 0とやらせてみると1手2秒で200局中199局勝った。差がありすぎる!これでは棋力の計測は不可能である。おそらくR500以上棋力が向上しているのだろう。

試しに、epoch 1をApery(WCSC26)とやらせてみたところ、5%ぐらい勝つようである。あのApery(WCSC26)に対して5%でも勝つだけ凄いと思うが、それでもこれでは棋力の正確な計測は出来ない。

epoch 0がR1800で、このソフトに99%以上勝つということはおそらくR2600以上であって、Bonanza 6と同じぐらい(少し弱いぐらい?)の棋力なのではないかと思う。

なお、ここでは評価関数の質だけを問題としているので、探索部は常にやねうら王の最新版(V4.66)を用いている。この記事に「Apery(WCSC26)」と書いてあっても、断りがない限りそれはやねうら王の最新版の探索部 + Apery(WCSC26)の評価関数ファイルの意味である。

epoch 2の棋力

こうなってくると必然的にepoch 2への期待が高まる。

epoch 2とApery(WCSC26)とを対局させてみると、1スレッド1手2秒で25%程度勝つようである。レーティング差で言うとR200程度。R3000程度あるのだろうか。

uuununnnさんのサイトによると、Apery(WCSC26)は、いまのところR3277らしい。epoch 2にして、Apery(WCSC26)が射程圏内に入ってきた。凄すぎ。Bonanza6のプロの棋譜からの学習とは何だったのか…。プロの棋譜なんて最初から要らんかったんや〜。

ちなみに上の追試手順では5億局面に対して学習を1周回すことになっているが、2周回すともう1,2%勝つようである。レーティング差R20程度。Apery(WCSC26)とR180の差。

まあしかしここで手順をころころ変えると追試しにくくなるので、上に書いてある手順通り1周回したものからまた教師局面を生成することにした。

epoch 3の棋力

Apery(WCSC26) vs epoch3。

1スレ2秒と1スレ4秒での計測は以下のようになった。まだApery(WCSC26)にR80程度負けている。

T1,b2000,609 – 20 – 371(62.14% R86.1) win black : white = 51.22% : 48.78% T1,b4000,593 – 25 – 382(60.82% R76.4) win black : white = 51.38% : 48.62%

Apery(WCSC26)とやねうら王の最新版(V4.66)とだとやねうら王の探索部のほうが優れているので、やねうら王の最新版(V4.66) + epoch 3は、Apery(WCSC26)の探索部 + Apery(WCSC)の評価関数との棋力の比較だと、同等ぐらいか、やや前者のほうが優れていると言えるだろう。

それでも評価関数同士の比較としてはまだApery(WCSC26)に負けているので実験を続けていこう。

epoch 4の棋力

Apery(WCSC26) vs epoch4。

1スレ2秒、4秒の戦績は以下の通りで、ほぼ互角と言えるだろう。

T1,b2000,543 – 20 – 437(55.41% R37.73) win black : white = 52.24% : 47.76% T1,b4000,472 – 11 – 457(50.81% R5.61) win black : white = 53.07% : 46.93%

わずか4回目にしてApery(WCSC26)のレベルに到達した。

NDFの手法であるKPP相対[2014]とか、AWAKEの手法であるKPE次元下げ[2015]とか、一体何だったのか…。この瞬間にすべてが過去の遺物となったと言えるだろう。

epoch 5…

epoch 5以降の実験も継続しているが、いったんこうして記事にしておく。

まとめ

一言で言うとelmo式の効果が凄すぎた。プロの棋譜を使わない評価関数の栄誉はelmoの作者である瀧澤さんに捧げられるべきである。

また、やねうら王の教師局面の生成部、学習部も今回きちんと書きなおした。今回の実験が成功した背景にはそのへんの事情も大いに関係している。記事が長文になってきたので、その詳しい解説は機を改めて行なうが、この、「きちんと書く」というのがとてつもなく大変な作業だった。

科学的な実験において、理論が間違っているのか実験手法が間違っているのか実験装置に不備があるのか判然としないことが多々ある。今回の成果も、探索部、教師局面の生成部、学習部、それぞれがきちんと動作していることが大前提なのであるのだが、この前提条件を満たすのがそもそも簡単なことではなかった。それらのパーツを精巧かつ丁寧に、そしてミスなく作り上げるために多くの協力者のもと非常に多大な時間を費やしたことをここに付しておく。

またこの場をお借りして、やねうら王のプロジェクトに協力してくださっている方々に感謝の意を表したい。elmo式の発案者である瀧澤さんと、やねうら王の学習部に関する一番の功労者であるtanuki-さん(およびtanuki-チームのメンバーの皆様)に厚くお礼申し上げたい。

質問等はコメント欄でお願いします

実験手法などに関する質問等はこの記事のコメント欄にて受け付けています。ツイッター上での個別の質問にはお答え出来ません。(ツイッターでは同じ質問を何度も受けるため) 何卒、ご理解ください。

人間の棋譜を用いずに評価関数の学習に成功” への32件のコメント

  1. これから試してみようと思うのですが,lambdaは局面生成ではなく学習時のパラメータですよね

  2. こんにちは、色々とお世話になっております。
    以前の駒得だけの評価関数生成では、一部の囲いを強制的に(駒の配置を勝手に弄って)覚えさせていた記憶があります。そういったことはしているのでしょうか。また、する予定はありますか?
    終盤の学習を行って評価関数を調整することを以前していた記憶があります。今回もする予定はありますか?
    質問ばかりで申し訳ないのですが、駒の置き換えで雑巾絞りの教師局面を作ったり、ランダムムーブを入れて教師局面を作ったりしているというようなことをsdtの時に言っていたと思います。効果の程はどうなんでしょうか。
    最後に、評価関数を左右対称に調整することもありますか?左右対称になるように学習させるという意味ではなく、学習してしまった後のものを左右対称に直すという意味です。
    elmoが振り飛車を低く評価しすぎている(続けて指すと途中で反省する)という話を聞いたので気になっています。

    一度に多くのことを聞きすぎているような気がしますが、もしお時間ありましたらお答え頂けると幸いです。

    • > 一部の囲いを強制的に(駒の配置を勝手に弄って)

      序盤にランダムムーブが入っています。もっと頻度を増やしたほうがいいような気はしています。
      https://github.com/yaneurao/YaneuraOu/blob/b6e096cd323ae59d3089996cacb3095271c2abbe/source/learn/learner.cpp#L608

      > 終盤の学習を行って評価関数を調整することを以前していた記憶があります。今回もする予定はありますか?

      ないです。eval_limit = 32000なので終盤も学習対象になっているのでは。

      > 駒の置き換えで雑巾絞りの教師局面を作ったり、ランダムムーブを入れて教師局面を作ったりしているというようなことをsdtの時に言っていたと思います。効果の程はどうなんでしょうか。

      2駒の入れ替え、コードがバグりやすい&KPPTの汎化能力はそんなにないので実現しそうにない局面を覚えさせるの、仇になるかと思ってそのコードは削除しました。またランダムムーブは入れないと玉自体動かさないので、たぶんまずいですね。

      > 最後に、評価関数を左右対称に調整することもありますか?左右対称になるように学習させるという意味ではなく、学習してしまった後のものを左右対称に直すという意味です。

      KPPのミラーは常に考慮していて同じ値が書き出されるようになっています。

      https://github.com/yaneurao/YaneuraOu/blob/b6e096cd323ae59d3089996cacb3095271c2abbe/source/learn/learning_tools.h#L330

      これをしたほうが最終的に良いのかしないほうが良いのかはいまだよくわかりません。とりあえず、最初のうちはこれをしないと5億局面では学習棋譜が足りないです。(教師局面がおおよそ2倍必要になりますので…)

  3. おめでとうございます。
    本文の書き方から、興奮が伝わって来ます。

  4. アルファ碁なんかもそうらしいのですが、未来を見て打つ場合、木探索で駒の利きが最大になるように打つのが強いらしいです。
    囲いは進路妨害をしますが短期的に必要なわけではないので長い目で効果を発揮すればOKって感じのようです。
    しかし、5億局面って、重複なしでスタックに詰むとき何バイト位になるんやろ。。。むー。

    • > しかし、5億局面って、重複なしでスタックに詰むとき何バイト位になるんやろ。。。むー。

      何故stackに積むのか知りませんが、純粋に局面だけなら1局面32bytes×0.5G局面 = 16GBですね。

      • ありがとうございます。
        いつか将棋木のルックアップやりたいと思ってるんですが、コンパイルタイムにやりたいなーと思っててそれがどれくらいになるか試算したかったんです。
        16Gですか。なかなかヘビーですね。
        しかも、それはまだ細片でしかないという。
        むむむ・・・。

          • 趣味です。Orz
            constexprの練習しないとなーと思ってるんですよねぇ。
            気を引かれた題材がたまたまそれだったんです。
            まぁやるかわからないですが。

  5. これから改善されるのでしょうけど入玉宣言狙いに気が付かずに負ける直前に突如mate+2とか慌て出しますね
    指し手は変態すぎて理解不能でした

  6. 地下室に子供を閉じ込めてひたすら将棋をさせたらどんな戦法が生まれるか…何て夢想したことがありますが、
    人間の棋譜や固定観念に汚染されない純粋な棋理の追求ですね。

    プロ棋士には不可能なコンピュータ将棋だから可能な研究と思いますです。
    異次元の戦法が生まれるのを期待します。
    くさり鎌銀とか嬉野みたいな変態戦法が他にも生まれると愉快なんですが。
    穴熊やミレニアムが発明されたかも気になります。

    コンピュータ将棋開発では、技巧以外似たようになっちゃった3駒関係に異系統を持ち込んだのも大きい!

    駒割も全部100からスタートできると良かったんですが、駒割の微調整はともかく、全く0から学習させるのが大変ということでしたっけ。

    • > 駒割も全部100からスタートできると良かったんですが

      駒割の値、全部0からでもきちんと学習すると思いますよ。評価関数のソースコード修正するとKPPTの評価関数ファイルとしていままでのものと互換性がなくなるのでやりませんでしたけども。

  7. ここここここここここれはすごい。
    理論上は「中将棋」から「ごろごろどうぶつしょうぎ」まで、この世に存在するありとあらゆるゲームで人間に勝つ手法発見か!!

  8. 名前がリゼロなのに、1週間待っても主人公と青髪が少し駄弁っただけで1話が終わることもあったリゼロとは全く逆ではないかと思ったリゼロアニメリアルタイム視聴組。

  9. これは素晴らしい!人間教師抜きの「純粋コンピューター培養」ソフトですね。是非今話題の藤井四段との対局を見てみたいです。ドワンゴかabemaTVに企画を持ち込んでは、いかがでしょうか?

    • このあと学習を繰り返して行ったとき、結局、elmoと同じような指し手しか指さないものになるなら、それほど面白いものでもないでしょうし…。

  10. やねうら王4.70で評価関数の作成をしようとしているのですが、sse4.2版で教師局面を作って学習させようとすると、作成したgenerated_kif.binの読み込みに失敗してしまい、元と同じevalが出力されます。設定はuuunさんのとあわせているのですが、、、
    どのような原因が考えられますでしょうか?

    • SSE4.2版だからというのは関係ないと思いますよ。動作的にはまったく同じではないかと。画面にはどう表示されているのでしょうか?

      • 教師局面を2つ作っていまして片方はdepth 3 1億局面で作成。(3.72GB)
        学習させようとするとフリーズして落ちる。

        もう一つはdepth 1 500万局面で作成。(190MB)
        こちらは最後まで動作しますが途中でエラーのような表示がでて、元の評価関数そのままの空のが出てきます。

        エラーの表示は
        Error! read packed sfen , failed.

        私のPCの環境は
        Windows7 ult 64bit
        i7-2700K , mem 12GB , HDD 2TB
        です
        メモリはやねうら王を起動した時点で空きが5GB以上あるので大丈夫と思うのですが

        • すいませんフリーズして落ちた方の表示が抜けていました。

          ハンドルされない例外が0x0000000000488E68(YaneuraOu-2017-early-sse42.exe)で発生しました:
          0xC0000005:場所 0x000000007B183C2Cの読み取り中にアクセス違反が発生しました。

          • たぶん次のバージョンで修正されてると思います。ご自分でビルド出来るのであればGitHubの最新版をビルドしていただければと。

            あとデフォルトでは1000万局面を先読みするので、1000万局面ないと局面の読み込みエラーになります。500万局面なら、loop 4とか指定すればこの条件はクリア出来るかと。

          • 対応ありがとうございます。
            無事フリーズせずに動作しました。これでささやかな日曜評価関数ライフをすごせそうです。

  11. 0フォルダに保存されている
    前に作成された評価関数を消して学習すると
    違いがありますか?
    ただ上書きされてるだけですか?

コメントを残す

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