【連載】評価関数を作ってみよう!その10

前回の続き。今回は、王様にとって安全な場所(升)を探します。

このソフト、実は、すでにたけわらべより強いんですけど…

計測してみると、前回の評価関数で、すでにたけわらべよりR70~R100ぐらい強いです。

たけわらべ、マシンによっては(かなりハイエンドPCでは)、floodgateでR3000近くあるようで、ギリギリ、プロレベルと言えるのだそうです。

ということは、それより+R70~+R100も強ければ、プロレベルであると言っても批判は殺到しませんね。(←何に怯えてるんだ)

亀仙人「この連載は、もうちょっとだけ続くんじゃ」

数十行程度で、プロ棋士レベルの将棋ソフトの評価関数を作るという連載の目的自体は達成しました。← 意図せず達成していました😅

わりと短いコードで評価関数が1から書けるというのがわかっていただけたかと思います。また、それと同時に、評価関数を設計する時に、どんな特徴量を持たせると効果が高いかが理解していただけたかと思います。

「将棋の形勢判断は簡単な計算式で導き出せる」というのは私が小学校に入学したころに漠然と思い描いた大予想です。それを実証するのには科学技術の進歩を待たなければならなかったので、実に40年もの歳月がかかってしまいました。

それに、今回の評価関数によってプロ棋士の棋力に匹敵する将棋ソフトが作れたとは言っても、最新の将棋ソフトとは棋力に大きな隔たりがあります。それは、まだこの連載では明らかにされていない大切な特徴量が欠けているからです。それは一体、何なのでしょうか。

ここからは、行数制限を取り払って、もう少しだけ強い評価関数を作っていきます。

王様の段ごとのボーナス

「居玉は避けよ」とよく言われますが、この連載の評価関数、居玉のまま戦いがちです。
どうせ入玉した時の王様の段に対して加点するので、まずは玉の段ごとのボーナスを求めて加算してみました。

optimizerによると、玉の段ごとのボーナスは以下のようになりました。1段目から3段目(入玉)はそれぞれ600点、400点、375点の価値があるということです。

興味深いことに8段目の玉に130点の点数がつきました。9段目よりは寄せにくそうなので、それくらいつくのかな、というところですが。

実際に対局させると、初手58玉とか指してきます。

うーん。そうじゃないんだよな…。😅

確かに59と58とでは130点増えます。130点増えるので初手58玉!そりゃそうなるでしょう。59よりは58のほうが寄せにくいでしょうから、勝率も以前よりは悪くないです。そりゃoptimizerが8段目の玉に対して130点の点数をつけるのも無理はありません。

でも、そうじゃないんだよな…。😅

王様の升ごとのボーナス

そんなわけでして、王様の段ごとのテーブルでは初手58玉になってしまう(なりがち)という問題があることがわかりました。

きちんと玉を囲うソフトにするにはどうすれば良いでしょうか?

盤上で、王手がかかりにくい場所とか、囲いやすい場所が存在してしまうのは、初期陣形とか駒の特性とかから考えて、仕方がないことなので考えるのを諦めて、升ごとにどれだけボーナスを加算すれば良いのかoptimizerに尋ねてみました。

59の升のボーナスを0点として考えるとマイナスの升があったので、59の升を200点としました。

そのマイナスの升とは、どこなのか…。

王様には居玉よりまだ悪い場所がある

optimizerが返してきた、王様のいる升ごとのボーナスは以下のようになりました。

盤面、左上(91)が875点、右上(11)が755点、左下(99)が255点、右下(19)が200点というわけです。

29とか居玉(200点)より悪い点数(70点)がついてますけど、まあ、振り飛車にしているとは限らないので居飛車のままここに持って行けばそりゃひどいことになるわな、ぐらいの感じではあります。

これで実際に囲うの?

68の升が255点、78の升が385点なので、78の升をめがけて一目散に囲うようになりました。これでは、どう見ても棒銀の餌食です。しかし、前バージョンの評価関数のソフトは短い時間だと棒銀をしてきません。Oh..

そんなわけで、optimizerは勝率を最大化するパラメーターを発見してくれるのではありますが、その対戦相手がきちんと咎めにきてくれないと話にならない感じではあります。
かと言って、あまり強いソフトを対戦相手に持ってくるとほとんど勝てなくなってしまい勝率が最大化するところを発見しづらくなります。オールラウンダーで、どんな戦型も指しこなす大局観のとても優れた弱いソフトが必要です。(わりと難しい注文です)

とりあえず、玉をうまく囲うかどうかはともかく、入玉に対しては上のテーブルでそこそこうまく加点できているので、入玉模様の将棋での勝率は上がりました。

+R30ぐらい強くなりました。

王様は、58と88、どちらが安全か?

58は295点、88は370点なので88のほうが良いと出ました。これは、正しいのでしょうか?
下段玉(9段目の玉)が良くない位置であるというのは、
・将棋には前に利く駒が多いので下段玉は攻められやすい(つかまりやすい)
・王様の下側が壁(盤外)なのでそれ以上、下に逃げられない
からだと思われます。

であれば、88の玉も、背(左と下)を壁にしている分だけ58より少ない駒で捕まるはずです。これ自体は正しい(と思う)のですが、実際はその周りに城壁を築くことができます。前回書いたように、88の玉に対してその左上、左と左下、下、右下から遠方駒を離しての王手はできませんから、必然的に、それ以外(上、右上、右)からの攻撃となります。守る方角が3方向だけで済むので、そこに城壁を築くならば、城壁を築くための資源(駒)が58の時よりも節約できます。

つまり、88の玉は58より少ない駒で捕まるというのは正しい(と思う)のですが、城壁を築きやすいというメリットがあるので、一般的には88のほうが58より守りやすいと考えられます。(対して、58玉型は、守りよりは、王様の広さ、捕まりにくさを主張する囲いです。)

初心者は矢倉囲いなどで88玉に入城するほうが安全と思ってしまいますが、安全なのではなく、守りやすいだけであって、58よりも少ない駒で捕まりやすい升であることは忘れてはなりません。

この連載で作った将棋ソフトで遊んでみたい人へ

この連載で作ったソフトの実行ファイルは以下のところからダウンロードできます。

実行ファイル名に”Material”とついているのがそれで、MaterialLv1は単純な駒得のみの評価関数。そこからLv2,Lv3,…とLevelが上がるごとに強くなっていきます。良かったら遊んでみてくださいね。

https://github.com/yaneurao/YaneuraOu/releases

また、このLevelと連載の第何回目が対応するかについては以下のソースコードにあります。

https://github.com/yaneurao/YaneuraOu/blob/master/source/eval/material/evaluate_material.cpp

今回のソースコード

次回予告

次回「将棋は上からの攻めと横からの攻め、どちらが受けにくい?」です。お楽しみに!

つづく

10 thoughts on “【連載】評価関数を作ってみよう!その10

      • てっきり連載を最後まで進めてから、読者課題でLv999のたけわらべを目指してみよう!みたいなシステムかと思ったら、たけわらべは本連載のレベルシステムとは別のユニークジョブだったんですねw

        それにしてもほぼ盤上の評価だけでプロ棋士レベルになるとは驚きです。N枚目の手駒にM点とか盤外の項目も調整しないと届かないのかぁとか思ってました。

        • しかも、positionalな評価、ほとんどしてない状態でこれです。探索部が頑張ってるからではあるんですけど、さすがにもう少し書いてからでないと終われませんw

  1. こんにちは。

    特徴量が追加されてきましたが、これによって初期に決定した特徴量のパラメータが変わっていないか知りたいのですが、いかがでしょうか。

    勿論すべての値を確認するのは大変と思うので、1~2つでも。

    大きく変わるのであれば、順に何回かループを回す必要がありそうですが。

    • 例えば、利きの価値は盤上の駒にのみ発生するので、このように盤上の駒によって発生する価値を上げていくと、盤上の駒と手駒との価値の差がなくなってくるので、手駒の価値をもっと上げないと!(or 盤上の駒の価値をもっと下げないと!)みたいな感じにはなりますね。ただ、微差なので正確な値を求めるのに3万対局ぐらい回さないといけなくて、それだけやってもレーティングにはほとんど寄与しないので、まあいいか…という感じでございます。

  2. めちゃめちゃ面白いです!

    typo:28→29?
    >28とか居玉(200点)より悪い点数(70点)がついてます

  3. こんなところまで研究に来てるリアル人間の棋士の方がいたら、王様を945のところにぶち込んだりする戦法をやってくれたりするかな?w

コメントを残す

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