コンピュータ将棋纏めサイトの設立と記念評価関数(R4330)の公開
コンピュータ将棋の纏めサイトを設立しました。
コンピュータ将棋に関する様々な情報を纏めることを目的としており、現在レーティング、wiki機能が実装されています。
また、公開を記念してillqhaシリーズを改造した評価関数orqhaを公開します。
ダウンロードはこちらから。
【成績】
dolphin1/orqha vs dolphin2/illqha2 145-104
dolphin1/orqha vs dolphin2/nnuekai6 418-398
nnuekai6とは拮抗していますが、illqhaにはnnuekai6より良いスコアで勝てているようです。
総合的には現時点までに公開されている評価関数よりレート20〜30程度上のようです。
今後もQhapaq Research Labは様々なコンテンツを公開していきます。どうぞ応援してください。
orqha絡みの棋譜は棋譜ダウンローダのページから取得できます。
ロタさんの棋譜(測定を依頼した)のQh18xxxxシリーズがorqhaです。ファイル名のtypoの影響で名前が統一されていないですが、バイナリを調べることで問題ないことを確認しています。
# ソシャゲよろしく皆様の協力が集まるほど強い評価関数が公開されるシステムです。その気になれば4370ぐらいまでは出せるんじゃないかな....... wcscまでに4400の大台を超えたいですね
豊島棋聖と永瀬七段の強さの秘訣をAIに聞いてみた
将棋星人が攻めてきたら地球代表を誰にするか。この問に「豊島棋聖」と答えると「こいつ将棋通だな」と思われることでしょう。というのも、豊島棋聖は非公式の棋士レーティングに於いて長らく頂点に君臨し続けているからです。
豊島棋聖は長きにわたって勝ち星を積み重ね続けていますが、その棋風は掴みどころが難しく、あえて言うなら「最後は勝ってしまう」(豊島の将棋 実戦と研究 (マイナビ将棋BOOKS)より)「序盤中盤隙がない」と評されるぐらいです。
そこで今回は次世代の将棋星人である豊島棋聖の強さの秘訣を将棋ソフトを使って解析してみます。
【評価方法】
評価値毎の悪手率(手を指す前の評価値と後の評価値の差から求められる悪い手を指す確率)を計算しています。粘り強さが重要となる劣勢局面での悪手率、研究の深さが重要となる互角局面での悪手率、詰めの腕が重要となる優勢局面での悪手率を比べることでプレイヤーの棋力を可視化していきます。詳細は中学生棋士のレーティング考察をご覧ください。
今回は豊島棋聖、豊島棋聖の対戦相手(の平均)に加え、ソフト同士の1手1秒の自己対局、レーティング3位で負けない将棋に定評がある永瀬拓矢七段の解析を行いました。
解析は最新のQhapaq(レーティングサイト基準でレート4300超)で行っています。
【勝ちが見えた局面での差し回しが大事】
以下に豊島棋聖、永瀬七段、その対局相手、ソフト(nnue)の自己対局の悪手率を示します。横軸が手を指す前の評価値、縦軸が悪手を指す確率(厳密には手を差した前後での評価値の減少分の平均)です。端的に言って低いほど強いです。
結果を比べると豊島棋聖、永瀬七段ともに、対局相手に比べ、勝ちが見えている局面(評価値0-2000程度)での悪手率の低さが目立ちます。有利な局面での差し回しの正確さがレーティングと強い相関を持つという結果は 中学生棋士のレーティング考察と同じです(注:解析ソフトを変えたので豊島棋聖/永瀬七段と中学生棋士と定量的な比較をすることはできません)。
豊島棋聖はソフトと比較しても0〜200点程度の序盤の差し回しが正確であること、永瀬七段は評価値が悪い局面全体での粘りが特に優れて居ます。さすがは負けない将棋。
【ソフト指しをしても勝てない豊島/永瀬将棋の恐ろしさ】
「ソフトや検討の言うとおりに局面が進んだのに気がついたら決着が付いている」という展開は今のソフトをもってしても起こることです。そこで、各プレイヤーについて「解析ソフトと手が一致した局面だけ抽出した悪手率」を計算してみました。普通に考えれば全てのプレイヤーの結果は同じになるはずです。が、しかし......
豊島棋聖/永瀬七段の対局相手の悪手率の分布はソフトと同じような結果になっている一方で、豊島棋聖/永瀬七段の悪手率は他よりも低くなっています。これはソフトが推奨する手(≒悪手でない自然な手)を指すことで良くなりやすい局面に相手を誘導できているからであると考えられます。
【考察】
上位棋士の強さの秘訣が有利な局面で間違えないことにあることが改めて確認されました。加えて、ソフトの言う通りの手を指しても評価値が悪くなりやすい局面へ相手を誘導する序盤の構想力が求められていることが示唆されました。
【筆者のポエム】
将棋ソフトは大体の局面で99点程度の手を指すことができるし、終盤は基本間違えません。それ故に、嘗て神の一手と言われるような手は減りつつありますが、ソフトからすれば人間が生み出した定跡こそが神の一手だと思います。
【最後に宣伝】
マイナビ 将棋神 やねうら王にQhapaqも搭載されます。対局相手のレベル調整や考察向けの機能など、将棋ソフトを使い尽くす上で便利な機能が搭載されています。やねうら王はたぬきやQhapaqなどの上位ソフトや、将棋ソフトを使って棋譜解析を行っている有志にも用いられており、今後もどんどん機能が追加されていくと思われます。是非、検討していただければ幸いです(そして、仮に購入するならこのリンクから買うのです。買うのです......多分sdtでQhapaqがちょっと強くなります)
技術書典5に出ます。サークル名は河童2.0です。ソフトを使った棋風解析や最近のNNUE関数の学習方法について何かを述べるつもりです(そう、まだ何もできていないのだ)。
CentOS 7 でblas(cblas)を使う方法
CentOS(wiki)はそのサポート期間の長さから、企業や大学のサーバによく用いられるOSです。
CentOSはパッケージ一つ入れるだけでも検索戦争に耐えねばなりません。というのも、シェアが少ない故に情報に乏しいことに加え、tensorflowなどの近代的なパッケージはubuntuでの利用を想定していることが多いからです。故にCentOSを個人が使う理由はないと思っているのですが、残念ながら上の人間(組織)からCentOSを使うことを強いられるシーンは多々あります。
以下のシンプルなcblasのc++用のサンプルコード(sample.cpp)を動かすことを考えましょう。
因みに筆者はこれで3時間ぐらいを溝に捨てました。
#include <cblas.h> #include <stdio.h> // based on https://github.com/xianyi/OpenBLAS/wiki/User-Manual int main(){ int i=0; double A[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double B[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double C[9] = {.5,.5,.5,.5,.5,.5,.5,.5,.5}; cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans,3,3,2,1,A, 3, B, 3,2,C,3); for(i=0; i<9; i++){ printf("%lf ", C[i]); printf("\n"); } return 0; }
【openblasを使おう】
悪いことは言いません。以下のコマンドでopenblasを導入し、ライブラリとヘッダファイルへのリンクを貼りましょう。
sudo yum install openblas*
g++ sample.cpp -lopenblas -I/usr/include/openblas
【個人的アドバイス:atlasを使うのはよそう】
CentOS cblasで検索するとatlasを使う方法の記事が沢山でてきますが、atlasはオススメしません。
ベンチマークで負けていることが多く、CentOSのバージョンによって名称が変わってくれたり、undefined referenceを頻発するからです(私の手元のCentOS7ではsatlasやtatlasをリンクしてもundefined referenceが出続けた)。
【間違ったcblasをインクルードしていないか気をつけよう】
運悪く(または何らかの圧力、必要性に屈して)atlasを入れてしまった人はこれに気をつけなければなりません。openblasのcblas.hは/usr/include/openblas/cblas.h に、atlas由来のcblas.hは/usr/include/cblas.h に配置されます。openblasを使う際にatlas由来のcblas.hをインクルードしてしまうと(例えば上述のコンパイルから-Iを除去すると)コンパイルの最後でundefined referenceが出てきて心を砕かれる羽目になります。-Iでちゃんとどのディレクトリからcblasをインクルードするかを明記しておくと良いでしょう。
undefined referenceの一例
sample.cpp:(.text+0x1c1): `cblas_dgemm(CBLAS_ORDER, CBLAS_TRANSPOSE, CBLAS_TRANSPOSE, int, int, int, double, double cons\ t*, int, double const*, int, double, double*, int)' に対する定義されていない参照です collect2: エラー: ld はステータス 1 で終了しました
次世代の将棋思考エンジン、NNUE関数を学ぼう(その2.改造/学習編)
前回の記事からかなり時間が空いてしまいましたが、引き続きNNUE関数について議論していきます。
現在、まふ氏が作成したNNUE型の評価関数がQQR(KPPT型)とならび、将棋ソフトの評価関数で最強の座についています。学習パラメタなどについては、まふ氏の解説も参考になるでしょう。
ここではNNUE関数のネットワークの弄り方や、改造の大まかな指針について解説いたします。
NNUEはKPPTに比べ改造が加えやすい(おかげで開発者の計算資源がマッハで削れる)ので、工夫の入れようが多々あるでしょう。
【NNUE関数はやねうら王本家にマージされています】
NNUE関数がやねうら王にマージされたことで、やねうら王でNNUE関数の学習、対局が出来るようになりました。
今後の探索部の拡張や評価関数の解析機能などの追加機能はやねうら王で行われる可能性が高いため、NNUE関数はやねうら王上で扱うことをお勧めします。マージに伴い、本稿のファイル名、関数名もやねうら王基準に変更します。
【ネットワークサイズガチャのやり方】
ネットワークのサイズは以下のコードを書き換えることで変更できます。
【1. /source/eval/nnue/architecture.h を改造する】
// NNUE評価関数で用いる入力特徴量とネットワーク構造 // 中略 // 入力特徴量とネットワーク構造が定義されたヘッダをincludeする // ここのファイル名を変える #include "architectures/your_network.h" // 元のファイルをコメントアウト //#include "architectures/halfkp_256x2-32-32.h" //#include "architectures/k-p_256x2-32-32.h" // 以下略
【2. eval/nnue/architectures/your_network.h でネットワークのサイズを定義する】
// architectures/halfkp_256x2-32-32.h をコピペした後に以下を書き換える // kp -> 128x2 -> 32 -> 32 -> 1 のネットワークを構築 // 変換後の入力特徴量の次元数 constexpr IndexType kTransformedFeatureDimensions = 128; namespace Layers { // ネットワーク構造の定義 using InputLayer = InputSlice<kTransformedFeatureDimensions * 2>; using HiddenLayer1 = ClippedReLU<AffineTransform<InputLayer, 32>>; using HiddenLayer2 = ClippedReLU<AffineTransform<HiddenLayer1, 32>>; using OutputLayer = AffineTransform<HiddenLayer2, 1>;
【2.5 (optional) . extra/config.h を編集する】
#if defined(YANEURAOU_2018_TNK_ENGINE) #define ENGINE_NAME "YaneuraOu 2018 T.N.K." #define EVAL_NNUE # USE_BLAS を追加することでblasが使えるようになる(学習が高速になる。探索は高速にはならない) #define USE_BLAS
【3. Makefileを編集する】
# デフォルトではKPPTになっているので、以下のコメントアウトを外す YANEURAOU_EDITION = YANEURAOU_2018_TNK_ENGINE # gccの場合、フラグにlblasを足さないといけない(筆者計算環境の場合) ifeq ($(findstring g++,$(COMPILER)),g++) OPENMP = -fopenmp -lblas OPENMP_LDFLAGS = endif
【4. ビルドし直す】
make evallearn
【5. 学習させる】
./YaneuraOu-by-gcc # SkipLoadingEvalをtrueにしないと評価関数のフォルダがないよと怒られる # このオプションはEVAL_LEARNがonじゃないと動かない様子 setoption name SkipLoadingEval value true setoption name Threads value 8 learn shuffled_sfen.bin ....
【ありがちな学習の失敗】
ネットワークの形を変えるとゼロから再学習になるため、それなりの計算資源が必要です。
例のごとくQhapaqチームにはそれを回す元気はないので、評価関数はあんまり強くなっていないです。
なお、よくある失敗としてtest_cross_entropy(ちゃんと教師データの外からvalidation用のデータを用意している)
は、デフォルトとさほど変わらない一で、move accuracyが落ちるパターンがあるようです。例えば私が用意した教師データに対し、tttakさんの評価関数では一致率が38%前後になるところ、小さいネットワークをゼロから学ばせると31%前後になります。
cross_entropyは据え置きにしながら手の一致率が落ちる理由は幾つか考えられますが、私自身はNNUEの学習にはランダムムーブによる局面の分散がKPPT以上に重要なのではないかと予想しています。
この予想を支持するデータ、理論は幾つかあるのですが、QhapaqはNNUEの実験に現状乗り遅れているので、秘密にしておきます。
【学習パラメタに関する議論】
詳しい解説はtttakさんの記事、透さんの記事、まふさんの記事をご覧頂きたいのですが、学習パラメタについてbatch_size_nnをどのぐらいにするか、教師をどのように作るか、lambdaをどうするか、newbob_decayを幾つにするかについて議論がされています。
画像認識の業界ではbatch_size_nnを大きくしすぎると精度が落ちることが報告されているようです。ただ、NNUE関数は通常のディープラーニングに比べてニューロンの数が少ないので、画像認識と同じ発想が使えるかは謎です。
次世代の将棋思考エンジン、NNUE関数を学ぼう(その1.ネットワーク構造編)
update 18/06/03 12:00
NNUE評価関数とは将棋ソフトの思考エンジン(もとい、局面の良し悪しを評価するための関数)です。NNUE関数は今流行りのニューラルネット(ディープラーニングの小さいやつ)を盤面評価に取り入れており第28回コンピュータ将棋選手権で多くの既存評価関数ユーザをぶちのめしてきた新機軸評価関数です。
2018年6月時点で多くの開発者、有志がNNUE関数をイジって遊んでいます。公開されてから未だ日が浅いため、もしNNUE関数の学習で大当たりを引けば、次の電王の座を手に入れられるかも知れません。
というわけで、このゴールデンカムイに乗っかろうとする皆様のために、NNUE関数の成り立ちについて解説していきます。今回はネットワークの構造と、学習のルーチンの仕様について紹介していきます。
開発者による解説文書(正直結構難しい)
tnk-のgithub (現在NNUE評価関数はやねうら王にマージされており、ファイル名がtnk-とは異なるなどの違いがあるようです。本稿ではファイル名は暫定的にtnk-を基準としています)
やねうら王のgithub (NNUEが既にマージされています。)
【1ページで解るNNUE関数】
NNUEのネットワーク構造は以下のような浅いニューラルネットワークになっています。ニューラルネットやディープラーニングについては此方の本などを参照してください。
この辺の実装はeval/nn/architectures/halfkp_256x2-32-32.h などに書かれています。
NNUEの強さの秘訣は点線で囲んだ最初の層の計算をCPUベースで高速に行なえるようにした(SIMD計算と差分計算を使えるようにした)ことです。また、NNUEのコードはテンプレートを上手く使いこなし、高速且つ拡張性が高い形になっています。
【NNUE関数を自前で作る】
NNUE関数はCPUベースで動くように作られているため、基本的にやねうら王の学習方法を使い回すことが出来ます。例えば以下のようなコマンドで学習が出来ます。
(NNUE開発チームの一人であるnodchipさんの呟きからインプットの例を復元しました)
# 学習前の評価関数を決める setoption name EvalDir value nn_20180519 # 学習させる learn teacherdata.bin lambda 0.5 eta 0.1 newbob_decay 0.5 batchsize 1000000 nn_batch_size 1000 eval_save_interval 100000000 validation_set_file_name varidationfile.bin
これをやると例えば以下のような出力が得られます。
各インプットの意味は#以下に書き記しておきます(実際の出力ファイルにはでてきません)
# gensfenで作った教師データ learn from teacherdata.bin, # 過学習回避のためのバリデーションデータ # 各iteration毎にvalidationの中身は全て読むので巨大なファイルにしないこと! validation set : varidationfile.bin # 学習ファイルを何らかのフォルダにまとめて入れる場合 base dir : target dir : # 学習のループ回数 loop : 1 # 学習データとして用いる評価値の上限 eval_limit : 32000 # 保存を一度だけするか save_only_once : false # 学習時に棋譜のシャッフルを飛ばすか # 教師データをデフォでシャッフルしてるなら多分意味はない no_shuffle : false # 使う目的関数。elmo型を使う Loss Function : ELMO_METHOD(WCSC27) # lossを表示し評価関数を更新するinterval # 実効的にこいつはミニバッチサイズではないことに注意 mini-batch size : 1000000 # 真のミニバッチサイズに相当。 nn_batch_size : 1000 # ニューラルネットに特殊なオプションを送る nn_options : # 学習率 learning rate : 0.1 , 0 , 0 # 学習率をiteration毎に変える場合の係数。詳しくはやねうら王のドキュメント参照 eta_epoch : 0 , 0 # lossを見張り学習率を動的に動かすためのパラメタ newbob = 1.0で無効化される scheduling : newbob with decay = 0.5, 2 trials discount rate : 0 reduction_gameply : 1 # elmo学習のlambda LAMBDA : 0.5 LAMBDA2 : 0.33 LAMBDA_LIMIT : 32000 # 盤面の鏡像化の頻度 mirror_percentage : 0 # 保存する頻度を指定 eval_save_interval : 100000000 sfens # mini-batch-sizeと同値 loss_output_interval: 1000000 sfens
【重要な注意点】
NNUE型を回す際に特に以下の点に注意する必要があります。
・validation_set_file_name をちゃんと作る。かつ大きくし過ぎない
validationファイルは過学習をしていないか確かめるためのデータで、教師データとは異なる(教師データにはない局面を使う)必要があります。
また、validationファイルは各iteration毎に全て読み込まれるようなので、これを大きくし過ぎると学習時間が伸びます。
・実効的なミニバッチサイズはnn_batch_sizeである
パラメタにbatch_sizeとnn_batch_sizeがありますが、実効的なbatchsizeはnn_batch_sizeです。
どういう原理で動いているかを時系列で表すと
1.読ませた局面数がbatch_sizeになったら評価関数の更新を行う
2.評価関数の更新ではbatch_size個の教師をnn_batch_size個毎の教師グループ
(即ち、グループ数はbatch_size / nn_batch_size個になる)に分ける
3.教師グループ0を用いて、評価関数の勾配を求める
4.勾配を用いて評価関数を更新する
5.教師グループ1,2,について同様の処理を行う
という設計になっています。(eval/nn/evaluate_nn_learner.cpp、および、eval/nn/trainer/trainer_affine_transform.h を参照)
本家やねうら王のbatch_sizeがbatch_sizeとして機能していないことに注意しましょう。
KPPTと比べるとかなりbatchsizeが小さいですが、開発者曰く、ニューラルネットワーク的にはnn_batch_sizeの1000は大きめの値だそうです。そして、大きくしすぎると学習が上手く行かなくなるそうです。
なお、NNUEでは学習時はblasを使い複数の局面の評価値を並列的に求めて高速化しているため、nn_batch_sizeは大きくしたほうが学習が早くなるようです。ただし、nn_batch_sizeを大きくした分だけメモリも消費することにはご注意ください。
・学習率の調整オプションがKPPTと異なる
NNUEには現時点ではadagradなどのadaptiveな学習ルーチンは実装されていません。学習が進むに連れてネットワークの変化量が少なくさせるためにnewbob_decayというパラメタを使います。
これは評価関数を保存する(eval_save_interval)毎にvalidation用のデータに対するlossを観察し、lossが大きくなった場合は学習率を下げる(newbob_decay倍する)と同時に、評価関数を最もlossが少なかったものに戻す機能を持っています。
ただ、newbob_decayの効果がどのぐらいあるかは不明です。tttakさんが作ったNNUE関数ではoffにされているようです。
(リストアを一時的にoffにするというのがコレに相当すると予想。本人に聞いたわけではないので定かではありません)
newbob_decayではvalidation用のデータのlossを参照するので、validation用のデータはちゃんと用意する必要があります。
データの数を大きくしすぎると評価に時間がかかりますが、小さくしすぎても学習に悪影響をもたらします。
newbob_decayは1.0にすることで無効化出来ます。
ただし、newbob_decayを1にしてetaを一定とした場合、ネットワークの変化量が少なくなるということはありません。
newbob_decayを無効化し、かつ動的に学習率を下げたい場合は、iteration毎に学習率を変える必要があります。
これは、やねうら王に実装されている動的学習率変化を用いて実現可能です。
・nn_optionsという魔境
learn nn_options hoge とすることで、各ニューロンに命令を送ることが出来ます。
ただし、nn_optionsの用法については謎が多く(今公開されている評価関数群で使われた形跡がない)、
その効果も定かではないので現在調査中です。
# 高度な構文解析機能を用いて様々な命令を遅れるようにしてるみたいですが、c++の文字列制御コード読むの怠いんよ
【ここまでの纏め】
NNUEは良くも悪くも新しい関数であり、その学習のさせ方についても不明な点が多いです。
本稿ではネットワークの構造と新しく増えたパラメタ、その使い方や注意点について解説しました。
具体的にどの程度の深さの棋譜がどのぐらい必要か、エントロピーの減少を見る以外に
学習の進度を見る方法があるか、学習パラメタは何を選べばいいのか、などは今後検討していかねばならない
内容であり、私自身は最終的には数の力で全部試すことになるのだろうと思っています。
ただ、各パラメタの意味を知っておくことで、同じガチャでも無駄な引きを避けられるのではと期待しています。
次回はNNUEの内部構造と改造に仕方について紹介する予定です。
コレ長編になるぞ..... orz
Qzilla-Qhapaq-Roll関数(Qzilla9比でレート+50前後)を公開します
表題の通り、今期もコラボ関数を公開します。
Release qhapaq学習機によるコラボ関数群 · qhapaq-49/qhapaq-bin · GitHub
qqr_rel.7z が今回の作品です。
関数の正式名称は「クジラのかっぱ巻き関数」です。アルファベット表記ではQzilla-Qhapaq-Roll(略してQQR)となります。クジラちゃんにかっぱ巻きを加えさせた(誤変換ではないぞ。念の為)のか、クジラちゃんをかっぱ巻きの具にしているのかはユーザの皆様の解釈に任せます。
【レーティング】
たぬき互角局面、8スレッド、探索部やねうら王、1手1秒、投了値3000の条件でQzilla9の関数に対して
310-34-217 (勝率58%。レート差 57)
【 レーティングサイト準拠のルールでの対局結果】
定跡on / off の依存性を加味し、レーティングサイト基準での測定も行いました(こちらはQzilla9の探索部はくじらちゃんのクライアントを利用しています)。本測定はロタさん(twitter,ブログ)にご協力いただきました。この場を借りてお礼申し上げます。
264-24-215(勝率55%。レート差34)
【作り方】
Qzilla9の関数にQhapaq WCSC28の学習をいれています。教師データを互角局面からの自己対局としているので、オールラウンダーな棋風であると期待しています。
【Qhapaqの今後】
Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できるという、Amazonアソシエイト・プログラムに参加してみました。上手く行けば今期はAWSが回せるはず......!
とはいえ、何を書けばいいのかわからないので、私が持ってるものをチマチマ紹介します。
コンピュータ発! 現代将棋新定跡 (マイナビ将棋BOOKS) ...... コンピュータ将棋の棋譜や戦型解説サイトでお馴染みのsuimonさんによる将棋の戦型を纏めた書籍です。sdt6のQhapaqの定跡はこの本の知見をベースに作られる(かもしれません)。
金芽米(無洗米) 10kg【5kg×2袋】 ...... 最近の米は殆ど研がなくていいとは言いますが、10キロの米を研ぐのに使う時間を考えると無洗米は外せません。
3手詰ハンドブック ...... 詰将棋のおなじみ本です。WCSC28の打ち上げで行われた詰将棋カラオケで3手詰が解けたのもこの本のお陰かも知れません。
プログラミングコンテストチャレンジブック [第2版] ...... 競技プログラミングのバイブル的な本です。atcoderで青まで来られたのは大体この本のおかげです。
sdt6が行われるのか、割と不安ではありますが、開催されれば参加します。大会があること、それを見てくれる人が居ることは、将棋ソフトが強くなる上でとても大事なことです。Qzilla-Qhapaq-Roll関数が公開にこぎつけられたのも、コンピュータ将棋を見続けてくれている皆様のおかげです。今後ともよろしくお願い申し上げます。
妖怪惑星Qhapaqの定跡も公開しました
此方からダウンロードできます。今回は定跡は2種類あります
Release 定跡のページ · qhapaq-49/qhapaq-bin · GitHub
【Qhapaqが考えたWCSC28の定跡のメタゲーム】
WCSCは計算資源が無制限であるため、長い定跡を作るのはリスキーであると考えていました。序盤の局面についても長く読ませることで、ソフトは自身が勝ちやすい戦型に誘導することが出来ることがわかっていたからです。より具体的には、最初の30手だけ持ち時間を倍にした場合、30−60手目の持ち時間を倍にするのとほぼ同等のレート上昇が得られることを実験的に確認していました。
これを踏まえ、WCSC28の妖怪惑星Qhapaqでは初手10手程度だけを定跡として用意し、あとは当日のマシンパワーに任せる方針を取りました。
しかし、初手10手と言っても油断すると33金角換わりのような脆弱な戦型を選ぶ可能性があります。そこで、戦型毎に勝率を測定し(※)先手なら横歩か角換わり、後手なら相掛かりか角換わりを狙いに行くのを基本とすることにしました。
より具体的には相手の手によらず先手は76歩、26歩を、後手は84歩、85歩を指すようにすると同時に、角換わりや横歩の入り口でその他の手を指さないように定跡を調整しました。
※:なお、この研究成果は将棋本で再利用しています
この調整だけでもresivn value 200の試合で book offのQhapaqに対して55%弱勝てることを確認しています。
2次予選でのQhapaqは角換わりありの定跡(kusokora3.db)を使っています
【決勝での心変わり】
決勝リーグでも同じ定跡を使う予定でいましたが、他の対局者も似たようなことに気付いた結果か角換わりが大会全体で多かったこと、定跡巧者の開発者が多く、角換わりで長い定跡に持ち込まれることが多かったことを加味し、角換わりの局面で角道を塞ぐ定跡を新たに用意しました(あまりに突貫すぎて角道閉じる先の手がないという糞仕様)。
決勝リーグで使った定跡( kusokora6.db )はあまりよい成績を残すことが出来なかったので其の是非は微妙だと思います(一番対策したかったPALにはガッツリ対策されてたし)。ただ、大会全体の戦型のバリエーションの増加には貢献できたと思います。
【定跡の今後】
WCSC28の決勝リーグソフトの多くが評価関数で似たようなレートになっていることを加味すると、評価関数を今以上に強くするのは楽ではない(KPPTにせよ、NNUEにせよ)と思います。
私自身はKPPTがレートの上限を迎えたとは思っていませんが、限られた資源でソフトを強くする上で、評価関数に投資するのがベストであるという状況は今後必ずしも続かないだろうと考えています。
より具体的に言えば、評価関数はライブラリや有志開発に頼り、其の資源を定跡に回すほうが大会的に勝てるソフトが作れる可能性が有ると思っています。特に将棋が強い人がソフトを使って定跡を監修すれば、まふ定跡がsdt5で大暴れしたような現象が起こりうると考えています。
定跡は評価関数に比べると検討用途で使いにくいなどのユーザ視点では美味しくない点はありますが、コンピュータ将棋の大会が今まで以上に人間臭い大会になる事自体は、それはそれで面白いのではないでしょうか。
私も定跡本を買って勉強しなければ...!