次世代の将棋思考エンジン、NNUE関数を学ぼう(その2.改造/学習編)

前回の記事からかなり時間が空いてしまいましたが、引き続きNNUE関数について議論していきます。
現在、まふ氏が作成したNNUE型の評価関数がQQR(KPPT型)とならび、将棋ソフトの評価関数で最強の座についています。学習パラメタなどについては、まふ氏の解説も参考になるでしょう。

ここではNNUE関数のネットワークの弄り方や、改造の大まかな指針について解説いたします。
NNUEはKPPTに比べ改造が加えやすい(おかげで開発者の計算資源がマッハで削れる)ので、工夫の入れようが多々あるでしょう。

qhapaq.hatenablog.com

【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のネットワーク構造は以下のような浅いニューラルネットワークになっています。ニューラルネットディープラーニングについては此方の本などを参照してください。

f:id:qhapaq:20180603123332p:plain

この辺の実装は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で大暴れしたような現象が起こりうると考えています。

定跡は評価関数に比べると検討用途で使いにくいなどのユーザ視点では美味しくない点はありますが、コンピュータ将棋の大会が今まで以上に人間臭い大会になる事自体は、それはそれで面白いのではないでしょうか。

 

私も定跡本を買って勉強しなければ...!

 

 

妖怪惑星Qhapaqの評価関数を公開しました

長らくおまたせ(?)しましたが、WCSC28で7位入賞を果たした妖怪惑星Qhapaqの評価関数を公開しました。

 

DLは此方からどうぞ

Release qhapaqの評価関数群 · qhapaq-49/qhapaq-bin · GitHub

 qhwcsc28.7zが妖怪惑星Qhapaqの評価関数です。

 

【レート測定結果】

手元では1手1秒12スレッド、狸互角局面集で8手目を初期局面にレート測定を行っています。

 vs aperypaq

243 - 8 - 179(57.58% R53.1)

 

vs くじらちゃん

178 - 8 - 204(46.6% R-23.68)

 

aperypaqには有意に勝ち越せていそうです。クジラちゃんは微妙に負け越してる気がしなくもないです。

 

Qhapaqの評価関数は上記環境でのレートを最大化するように最適化しています。検討用ソフトとしての利用に耐えられるよう、オールラウンダーな棋風を目指していますが、スレッド数が極めて多い場合や定跡offでの挙動は怪しいかも知れません。

 

# レートの下馬評的にしては大会で勝てなかったのを根に持ってるだけという説も

# くじらちゃんも大会で苦戦してましたし。

 

 

第28回コンピュータ将棋選手権の感想戦(雑談編)

2018.05.08に修正

第28回世界コンピュータ将棋選手権に妖怪惑星Qhapaqとして参加しました。悲願の決勝リーグ進出を達成し、最終的な順位は7位入賞となりました。応援してくれた方、大会を支えてくれた方、大会を楽しんでくれた方全てにお礼申し上げます。

 

本稿では御礼に変えて実況などでは出てきにくい、Qhapaqから見た舞台裏のうち技術と関係ない話(技術的な話はもう少し検証が必要なので)をしていきます。

 

Crazy shogi、マジでCrazy:

本大会の注目株の一つであったCrazy shogi。海外勢としては2人目なのですが、日本語を話せない参加者が来るのは本当に久々で英語対応に苦慮しました。基本的にYSSの山下さんが対応をしていましたが、山下さんが大会運営に出ているときは代わりに私が説明をしたりもしました(中継ブログの画像でやたらRémiさんと一緒に写ってるのはそれだ)。

開発者のRémiさんは本当に将棋を知らないらしくCrazy shogiが矢倉を指したのを見て「Foooo,ゼロから学ばせたDNN将棋が矢倉指してるゥウ」と喜ぶ観戦者を尻目に「Hey,河童、未だ始まったばかりだが彼らは何を喜んでるんだ。もう決着ついたのか?」と呑気な様子でした。

Crazy shogiは対局毎に評価関数を差し替えていました。曰く「Alpha zeroの学習で強くし続けている」とのことです。

私「Rémiさんは強くなってるだろうと言ってますが、将棋強い民的にこの棋譜はどうです」

強い民(誰だかは忘れた)「序盤戦略は悪くないんだろうけど、人間的にはちょっと奇妙ですね」

私「あ、でもCrazy shogiってCGP(レート3500級のソフト)に勝ったみたいですよ」

強い民「それ、人間的には一番手に負えないやつですね」

 

将棋民怖い:

大会終了後に詰将棋カラオケをやろうと思っていたので、10分で解ければ2段の17手詰めなどが記載された書籍を持ち込みました。カラオケをやりながら倒すのであれば平常時で1分ちょいで解ける問題が適切だろうと考え、会場にいた将棋が強そうな人たちに解いてみてもらいました。

私「どうです?」

PALの山口さん(東大将棋部)「N分で解ければM段ってのは結構適当ですからね。あ、解けました(大体1分ぐらい)」

私「東大将棋部パねえですね。ちなみにこれをプロがやったらどうなります」

山口さん「一瞬じゃないですかね」

私「と、いうわけで千田先生どうです」

千田先生(指で駒を動かすモーションをする)

千田先生「解けました(大体30秒ぐらい)」

私「プロ棋士パねえっすね。あと、詰将棋解くときに指って動くものなんですね」

千田先生「いや、今回のは解けた後に手数確認するためにやっただけです」

私(アカン)

 

ライバルソフト強い:

今回のQhapaqはシード組。此方はaperypaqよりも強い評価関数を用意していた(そして、floodgateを観る限りaperypaqを大いに引き離す関数はないように見えた)ので、それなりに勝つ気でいましたが、ライバルソフトの強さに終始圧倒されていました。個人的に一番記憶に残ったのはPAL(二次予選で席が隣だったので色々話したのもありますが)です。

 

決勝リーグにて

私「昨日は後手角換わりで負けたので、今日は意表をついて角換わり拒否にしてみました。定跡巧者相手に角換わりは危なそうなので。」

山口さん「いいんですか、銀は78ですよ?」

私「Qhapaqの評価値的にはそこまで問題はないです。定跡外れてくれたようで何よりです」

山口さん「いや、これは先手が速攻を決めれば結構勝てるので定跡優先度が低いからそんなに作ってないってのが...」

私「ふぇ?」

(宣言通りQhapaqが一方的にボコられて爆死する)

 

ちっ

 

HER○Z大人気:

※:開発のデスマ故か記憶がパラレルワールドに飛んでいたので修正。

 

大会1日目の打ち上げでの話

私「評価関数ガチャに失敗しましたが、HEROZのIPO参加ガチャにも失敗しました」

打ち上げ参加者「あれ、めっちゃ株価上がったらしいですね」

私「でも平岡さん、今期もサンダル参加でしたよ」

打ち上げ参加者「そういえば平岡さんって何株持ってるんでしたっけ」

mtmtさん「8000株。ちなみに山本さんは...」

参加者(こ、この人全部覚えてやがる)

 

2次予選のQhapaq vs たぬき戦にて

たぬき「ちょっとたぬきが悪くなってきたかも」

私「Qhapaqの評価関数は良くなってきてます。このままHER○Zの株価並みに上昇してくれれば大成功です」

観戦者(名前失念)「30000超えたらMateですね」

平岡さん「それ安定してないやつやん」

(たぬきが唐突に河童玉の頓死を発見。その後Qhapaqも大反省)

私「hrokてめえええええええええええ」

 

修正前の間違った原稿も置いときます。

設営日から数えて大会2日目=一次予選ってのが何処かで飛びぬけ、

大会2日目=二次予選と勘違いした様子......

2次予選のQhapaq vs たぬき戦にて

たぬき「ちょっとたぬきが悪くなってきたかも」

私「Qhapaqの評価関数は良くなってきてます。このままHER○Zの株価並みに上昇してくれれば大成功です」

観戦者(名前失念)「30000超えたらMateですね」

平岡さん「それ安定してないやつやん」

(たぬきが唐突に河童玉の頓死を発見。その後Qhapaqも大反省)

私「hrokてめえええええええええええ」

---その後、2次予選後の打ち上げ---

私「と、いう暴言を吐きましたが、敬愛する平岡さんの財産形成のためにもHEROZの株価は高みを極めて欲しいですね」

打ち上げ参加者「平岡さんって何株持ってるんでしたっけ」

mtmtさん「4000株、ちなみに山本さんは...」

参加者(こ、この人全部覚えてやがる)

 

入賞スピーチの焼き直し:

本大会では決勝リーグでクラスタの準備が間に合わなかったりしたことをお詫び申し上げます。同時に、便宜を図ってくれた運営および視聴者の皆様に感謝申し上げます。

今回のQhapaqはそれなりに強くできたと思っていました。特に4月なんて本当に地獄でした。桜前線を観る代わりに評価値推移の前線を眺め、5月の旅行先を悩む代わりに飛車の行き先を決めることを悩むのは本当にクソゲーで、私はこんなクソゲーは一日でも早く滅んで欲しいと思っています。

しかし、私はこのクソゲーが大好きです。指す人や観る人をドキドキさせる力が将棋にはあります。そして、その魅力の運び手は400年前の名人であり、今のプロでありココで私と凌ぎを削ったライバルたちです。だから、私はみなさんが大好きです。

ですが、Qhapaqを倒した者共を私は決して忘れません。次こそは報復します。そのために、二つのお約束をします。一つは、Qhapaqをもっと強くして持ってくること、そしてもうひとつは私自身が強い将棋指しになって帰ってくるということです。Qhapaqにはまだ大きな弱点があります。開発者の棋力が低いことです。次はこれを乗り越えてみせます。勿論、棋力の高い人を加えて解決するのではなく、Qhapaqの力を使って私を強くすることで解決してみせます。

次の大会、ぜひ、Qhapaqとだけでなく、私とも将棋を指してくれれば幸いです。これからもよろしくお願いします。

 

 

なお、実際はこんなにうまく喋れてはいない。

【締めきりました】技術書典で頒布した電子書籍のweb販売のお知らせ

技術書典4で頒布した「科学するコンピュータ将棋」のweb販売を行います。

締めきりました。注文された方の中で、DLコードが届いていない、

ダウンロードできないなどの不具合がありましたら、お手数ですが

f:id:qhapaq:20180424225620p:plain

までご連絡ください([atmark]は@に変換してください)。