技巧2の学習部調べ(中間報告)

 

ゆるゆる進行中の私的な技巧2調べですが,

私用メモ程度でも誰かの役に立てばと思って公開しておきます。

 

技巧2

github.com

 

注意)技巧2以前のものはほとんど触っていないので比較などはしていません。

まず,公開されている実行ファイルでは学習ルーチンは無効化されているので自分で学習させるにはビルドする必要があります。Linux環境が必要になりますが,Windows10であればBash on Windowsでも対応可能です。

うちではBash on Windows(Ubuntu 16.04)環境下でmakeとg++をインストールすれば問題なく実行ファイルを作成できました。

 

棋譜ファイル

学習には 棋譜ファイルが必要です。ドキュメント上にはkifu.txtと書かれていますが,ソースを少し読めば分かるようにkifu_db.txtの誤りです。

また,このファイルのデータ形式はコメントにもあるのですが実際は何かのファイルから自動生成するのが適当ですので,うちではfloodgateのCSAファイル二年弱分から変換しました。変換ソフトはオープンソースのものを数バイト程度改造しましたのでgithubに置いておきます。

github.com

 

 

--learn-progress

kifu_db.txtから51000データ読み込み,progress.binを学習する。(約3時間)

読み込む棋譜のうち1000データは検証用。

これは棋譜から局面の進行度を評価する際に使用する。

 

--learn

kifu_db.txtから31000データを読み込み,params.binを作成する。

ただし,title_matches_onlyとなっており順位戦とタイトル戦のみを扱うように厳しく選定されている。うちではこの行を削除してfloodgate棋譜で学習した。

4コアのマシンで40時間程度要した。

 
--learn-probability

kifu_db.txtから31000データを読み込み,probability.binを作成する。

何故かメモリ消費量が半端でなく多く,最大で90GB程度使用した模様。

うちでは最大64GBのメモリしかないためスワップしながら3日ほど要した。

メモリ消費量が少ない段階での進行見込みでは3時間程度とあったので,メモリが充分なマシンでは3時間程度で終わるのかもしれない。

 

--create-book

kifu_db.txtからtitle_matches_onlyの手を確認しながら定跡化する。

出力されるファイルはbook.bin。

ただし,技巧2のデフォルトはこれで作成されたものではなく「まふ定跡」

 

--generate-positions

教師局面を作成する。
出力ファイル名はteacher_positions.bin。局面数30M。(30,000,000)

一局面のデータは40byteで局面と指し手と評価値。
4コアのマシンで一週間強必要。

 

--generate-games

ロジスティック回帰学習用の教師局面を作成する。

出力ファイル名はteacher_games.bin。

ソースを読んだ感じで,3M試合をして10%局面サンプルをする模様。

実行時間は4コアのマシンで20000分(二週間強)との予測値

これはうちで完走してない。(できない)

 

--learn-with-rootstrap
--learn-with-regression

これらにおいてもkifu_db.txtを読み込んでいる様子。

teacher_positions.binやteacher_games.binは追加で必要となる。

params.binのみを更新する。

 

現状雑感

progress.binおよびprobability.binの学習は上記の一回だけ。

params.binは初期の絞りのみ実行。

progressファイルのみオリジナルから変更したものは特に強いとも弱いともない。

probabilityファイルのみ変更したものは当初オリジナルを上回る戦いを見せたが,有意差と言えるほど強くはなっていない。

params.binを変更したものはオリジナルから相当劣化した。オリジナル同等までもっていくためには恐らくルートストラップやロジスティック回帰を用いた追加絞りが相当必要なのではないかと思われる。

 

また,ソースを読む限り学習部は試行錯誤の跡があり,現状で完成されたものと言うイメージは皆無。効率化や高速化など手を加える余地が多い印象。

たとえば学習局面データのkifu_db.txtおよびteacher_positions.binやteacher_games.binは統一的に扱う方が望ましいように思う。また,より効率的な生成も可能ではと見込む。

最近話題のkkpとかkppとかいうやつ

オープンソースなので起こすまでもないんだが

python練習中のソースを一部晒しますね

import numpy as np
 
with open('KK_synthesized.bin', 'rb') as f:
kk = np.fromfile(f, dtype='int32').reshape(81, 81, 2)

with open('KKP_synthesized.bin', 'rb') as f:
kkp = np.fromfile(f, dtype='int32').reshape(81, 81, 1548, 2)

with open('KPP_synthesized.bin', 'rb') as f:
kpp = np.fromfile(f, dtype='int16').reshape(81, 1548, 1548, 2)

こいつらの演算は以下のようになります。

eval = e_mat # 駒得分
 
kkp_sum=[0,0]
for i in fv38f:
kkp_sum += kkp[k0][k1][i]

kpp_sum0=[0, 0]
kpp_sum1=[0, 0]
for i,j in itertools.combinations(fv38f, 2):
kpp_sum0 += kpp[k0][i][j]
for i,j in itertools.combinations(fv38e, 2):
kpp_sum1 += kpp[80-k1][i][j]
 
if turn == BLACK:
eval += (kk[k0][k1][0]+kk[k0][k1][1])/32
eval += (kkp_sum[0]+kkp_sum[1])/32
eval += (kpp_sum0[0]+kpp_sum0[1])/32
eval += (-kpp_sum1[0]+kpp_sum1[1])/32
else:
eval += (kk[k0][k1][0]-kk[k0][k1][1])/32
eval += (kkp_sum[0]-kkp_sum[1])/32
eval += (kpp_sum0[0]-kpp_sum0[1])/32
eval += (-kpp_sum1[0]-kpp_sum1[1])/32
 

 

 vscodeから貼ると間延びするみたい。

面倒だから放置する。

 

検算ツール:

局面の3駒関係

Bash on Windowsの方が速いとき

Windowsでちょっとした実行ファイル作るんだけど

何故かBash on Windowsの方が速いときってあるんで

そういうときは

bash -c "Bash on Windowsの実行ファイル" 

 ってなbatファイル作ってる。

エレガントじゃ無いなぁ。

狼将棋の局面図の挿入テスト

【先日の一戦にて5三桂の場面】
後手:増田 
後手の持駒:飛 銀 歩三 
  9 8 7 6 5 4 3 2 1
+---------------------------+
|v香v桂 ・ ・v玉 ・ ・ ・v香|一
| ・v飛 ・v銀v金 ・v銀 歩 ・|二
|v歩 ・v歩v歩 桂 ・v金 ・v歩|三
| ・ ・ ・ ・v歩v歩 ・ ・ ・|四
| ・ ・ 角 桂 ・ ・ ・v歩 角|五
| ・ ・ 歩 ・ ・ ・ ・ ・ ・|六
| 歩 歩 ・ 歩 歩 歩 ・ ・ 歩|七
| ・ ・ 金 ・ ・ ・ ・ ・ ・|八
| 香 ・ ・ 玉 銀 ・ ・ 桂 香|九
+---------------------------+
先手の持駒:金 
先手:藤井 

狼将棋のところのSVGが出来がよかったのでテストしてみる。

流用してください的なことが書いてあるが,個別に回答頂いたわけじゃないので問題あれば削除します。

ーーー

7/13追記

MITライセンスで公開だそうな

http://www.geocities.jp/ookami_maasa/shogizumen/

rawバイトリテラルで地雷

にわかpythonユーザである。

コメントアウトしたところでユニコードうんたらとエラーが出て,謎が解けたのでメモっておく。

問題となったのは以下のようなコード

'''

p=func(r'C:\Users\xxx\Documents\work')

'''

コメントアウト前はrawバイトリテラルで ファイルパスの区切りの¥をエスケープするのが面倒で使ってた。

コメントアウトしたら普通の複数行文字列のリテラル扱いなので「\U」のところが16進ユニコードリテラル扱いされてエラー(笑)

こういうのどうしたらいいのかねぇ。

皆一行ずつ#つけてるの?

Windowsで地雷になりがちなところ

Windows苦手な人が嫌がるところを見てみましょう。

習作として以下のElixirのサンプルをWindows環境で実行してみます。

当然地雷臭がしますが、Windowsネイティブバイナリを入れていきます。

 

employment.en-japan.com

 

まず、iexがPowerShellだとInvoke-Expression のエイリアスになってる。

最低です。Creators Update以降はPowerShellがデフォルトになっているのに、基本的なコマンドが別のエイリアスで規定されています。エイリアスを外すかコマンドプロンプトを起動しましょう。

 

日本語が文字化けします。

ありがちです。Elixir含めて最近の処理系はUTF-8がデフォルトですが、Windowsは歴史あるShif-JIS系のコードをしようしています。

Windowsではchcpというコマンドを使いましょう。引数はUTF-8にするには65001としていします。つまり「chcp 65001」と打てばいいのです。

また、ありがちなのですがWindowsではエディタで作ったファイルがShif-JIS系になりがちです。確認してUTF-8にしておきましょう。

以上の対応をしても一か所ダメでした。

MS-IMEの出力はどうしてもUTF-8にできませんでした。

つまり、コマンドラインの漢字は入力しても化けて読まれます。

どうしたらいいものかなぁ。

#敢えて地雷を踏みに行ってますので、それほど危惧してません。

 

Bash on Windowsと色々かぶる。

まぁ、解決策としてUbuntu系のバイナリが使えるBash on Windowsに逃げるのが今風なのですがCreators Update以降は素敵なことにbash中でWindowsバイナリも動きます。ええ、Windows側で指定したパスに実行ファイルがあるとそれが動きます。ということで上記で入れたWindowsバイナリをアンインストールしましょう。残ってると色々奇妙な現象にクラクラします。

 

今日はこれくらいにしてあげましょう。

RYZEN写真集

RYZEN仕入れてました。

開封の儀

ん!?

本体ちっさ!!

CPUファンが入ってない1800Xなので,これだけ売ってくれればいいのよ。

なんか,黒いです。(カラー写真です,悪しからず)

適当に見繕って貰ったファンでかっ!!

BIOSの誤字が人柱感満載でいい。

 

こんなものも激しく無駄な多層梱包で別送されてまして

がっつり厳つい感じになります。

上の方がRYZEN用のファンで下がビデオカードです。

上が95Wで下が250Wと言えば,基本的に熱設計間違えてると思いますよね。