技巧2改造記録(中間報告)

オープンソースのわりにあまり弄られていない気がする技巧ですが,

うちでは以前よりスパーリングパートナーとして教材として遊ばせて頂いております。

 

bleu48.hatenablog.com

 

前回の続きで教師局面を作成し強化学習を試みました。

計算時間はi9-7980XEをもってしても1週間以上かかる大作です。

強くなったかなぁとオリジナルと対戦させてみたところ15勝23敗程度まで進んだところで諦めて切ってしまいましたが,考えてみたら今までで一番まともな戦果です(笑)

学習用の棋譜が最近のfloodgateなので結構モダンな差し回しが見られました。具体的なところでは,後手番角交換拒否からツノ銀雁木風に組みながら右玉に展開したのち,交換した駒を駆使して玉頭戦を挑むような一局が印象的でした。3三や7七に銀が上がらないのがオリジナルとの絶対的差異です。

もう一段強化学習を仕掛けてみます。

 

で,タイトルが改造記録になってる辺りで気づいたかもしれませんが,本体に本格的に手を入れ始めております。以前は学習部について教師局面を総括して管理する部分を改造していたのですが,今回は探索部を少し弄ってみました。

具体的には前向き枝狩り部分の変更が大半で,土日を使って相当の変更を施しました。ざっくりオリジナルと比較対戦をしているところ,現在47勝40敗13分で気持ち強くなったかなぁという辺りです。また,時間が出来れば更新しようと思います。

具体的にどの変更がどういった効果を及ぼしたかについてはデータを取るだけでも膨大な計算時間が必要だとやね師匠も仰っております。どうしたもんかねぇ。

 ---

4/5追記

その後,追加の強化学習を2パターン行ったら両方とも6割程度の勝率でオリジナルを上回った。これで,評価関数・探索部ともにオリジナルより強くなったと言える。

具体的には36スレッド2分切れ負けで60-0-40および61-1-38である。技巧エンジン同士なのに引き分けが激減しているのが面白い。詳細はボチボチ調べて行こうと思う。

レーティング的にはelmo@wcsc27と並べるかどうか微妙ってところだろうか。

省リソース戦なら優位かな。

コンピュータ将棋の調べもの(主に自分用メモ)

新しい取り組みをするときに先行者の成果を調査します。

研究者だとサーベイと言われるやつです。(今頃ですんません)

 

ハードウェアの話。

電王トーナメントと異なりコンピュータ将棋選手権ではハードウェアが統一されていないため色物のハードウェアを持ち込むことが可能です。

今回コンピュータ将棋のネタでFPGAを使おうと思ったのですが,既に相当の完成度のものをボンクラーズやPuella αで有名な伊藤さんがA級リーグ指し手1号として実装されています。ということでアルゴリズム的に全然違うとしてもぱっと見ウケのFPGA実装はあんまり面白くないってことで。(そういえばSDT5の懇親会でPuella αのソース見ておいてはどうかとどなたかにアドバイス頂いてた。)

A級リーグ指し手1号

(今まで知らんかったんかと言われそうw)

 

探索部の話。

Stockfishってのがチェス界ではレジェンドでしてこのソースを参考にするのが将棋でも相当有効ってことで随分引っ張ったようです。近頃はそうでもないらしく,やねうら王はかなり独自の進化を遂げているようです。(大変荒い説明)

Stockfishがもたらさなかったもの | やねうら王 公式サイト

Stockfish DD – search 探索部 | やねうら王 公式サイト

 

1月の勉強会でも話したネタなんですが,チェスと囲碁と違って将棋はちょっと人間とコンピュータで違う雰囲気になっています。チェスについては駒の動かし方程度しか知らなかったのですが,最近少し学んだところ結構争点の作り方の難しいゲームでうっかりすると盤上の駒が減って引き分けが多くなるようです。囲碁は盤上に石が詰まってきて終局です。それに比べ将棋は駒の数が40枚で終始変わりません。

つまりチェスと囲碁は比較的単調に終局に向かい,ある程度手数が予測される。将棋は状況次第では手数が伸びて,場合によっては終盤に見えたものが中盤に戻るなどの展開も珍しくない。取った駒を打つルールのためです。特に攻め駒を相手の守り駒と交換し自陣を堅める展開は長期戦になりますね。

(そういえばプロの対局でも何か壮絶なヤツがこの前ありましたね)

コンピュータの場合,疲れを知らないので長期戦でのミスというと残り時間が不足して探索が甘くなる展開が考えられます。まぁ,そういうのを狙ってやってるのが昨今のコンピュータ将棋の争点のひとつになります。

有効な手筋のみを選んで深く読むのが枝狩り,序盤中盤終盤の時間配分の制御も重要な課題です。極論時間さえ無限にあればこれらは不要となります。

 

評価関数の話。

ここは色々とあるのですが,ざっくりBonanza以前以後で切って良いと思います。

そもそも探索と評価は対になるものです。終局まで読める探索があれば途中評価は不要で,一手先の完璧な評価が可能であれば深い探索など不要なのです。で,妥協点を探すわけなのですが,玉形,駒の働き・・・と人間の知見に基づく数値化の歴史にかなりドライな評価を入れたのがBonanzaで三駒関係と言われるものです。上記にあるとおり将棋は40枚の駒で局面が作られます。このうち玉を含めた三駒の位置関係に評価値を与え総和を取ったものがBonanzaの評価関数です。現在のコンピュータ将棋においてもこの考えが引き継がれて,これに手番を加えた形で利用されています。

次にこの評価関数の作り方ですが,Bonanzaにおいてはプロのデータに基づいて数値を定めていたようです。NDFが深く読んだ評価値を浅い評価値で予測可能とする手法で革新を起こし,さらにwcsc27のelmoがこれに勝敗補正の項を追加したものになっているようです。現在では補正項の入れ方や学習用の局面の準備法などが争点となっているようです。そういえば,読み太さんは進行度入れてますね。

この辺の最新事情はかっぱさんのブログが詳しいですね。

qhapaq’s diary

 

クラスタリングの話。

計算機を束ねることで速度アップを図ろうとする試みですね。随分前から半分仕事半分趣味で取り組んでいるのでちょっと詳しいおじさんなわけですが,木探索においては使いにくいですね。

実際wcsc27において,さくらインターネットの高火力サーバを用い総計1092CPUコア・128GPUを動員したPonanza ChainerやAWSで64並列でc4.8xlargeを動員した技巧であっても,elmoのm4.16xlargeの1ノードに及ばなかったわけです。

(クジラちゃんは何と表現したらいいんだろう。)

まぁ,うちは少しはアイデアがあるんで上手に使えたら少しは役に立つような気もします。問題はクラスタリングで強くなるかどうかのテストを行うには膨大な金がかかるってこと,というか当日の対戦だけでも諭吉さんがフライアウェイな感じでしょ。物量の勝負したくないなぁって感じですね。

 

ブログに書いてるけど,これアピール文書書く前の頭の整理だよなぁ。

まだ,何か抜けてる気がするが追記する予定でww

(間違いの訂正に関してツッコミ大歓迎)

技巧2の学習部調べ(i9-7980XE編)

bleu48.hatenablog.com

 

昨年夏以来である。

i9-7980XEのマシンにメモリ増強したついでに上記でやれてない部分を試してみた。

--learn-probability

最大でメモリ100GB程度使用していたが余裕の完走である。2時間程度であろうか。

圧巻と言っていい。

出村さんの愛機がCore i7-3930Kだとの話であるが,こいつだとメモリ上限64GBなので恐らくクラウドで絞ったんだろうと推察される。

こうなると俄然学習部の改良を試みる気になるね。

 

また,今回は学習データを最新のfloodgate棋譜を追加して試した。必要データ数に対して十分な数が揃ったのでレーティングの低い対局などを大幅に削除してみた。

つーか,出村さん公式戦51000局もどこで棋譜集めたんだろう?

 

bleu48.hatenablog.com

 

確認してみたら前回は1割も勝ててないらしい。

今回は100戦して21勝77敗2分け(5分切れ負け,定跡・ponderなし)

負けるにしてもまだ少しマシな感じ。

特に引き分けが激減している。

局面はちょっと見た感じだと流行りの雁木形を好んでいる様子で時々右玉とかしてる。

技巧の棋風も学習データ次第ってことね。

続・cudnnをWindows環境に入れるコツ

bleu48.hatenablog.com

 

 前回の続き。いつのまにやらtensorflow-gpuがバージョンアップして,CUDA9.0を要求してきたのでCUDAのバージョンアップ。

今回入れたのは以下の3つ。

cuda_9.0.176_win10.exe

cuda_9.0.176.1_windows.exe

cudnn-9.0-windows10-x64-v7.zip

上から,CUDA9.0SDK,それのパッチ,cudnn7.0.5 for CUDA9.0 

CUDA9.1も出てるけど今のところtensorflowで要求されるのはこいつら。

インストール手順は前回と同じ。

特に難しいことはないが,カスタムインストールで入れるときGUIが重いのが気になる。

NVIDIA社はなにしとるんだろう。 

  

pyaqはGPUあってもなくても似たようなところでこけてるみたい。

pyaq on windows

囲碁はよく分からないので練習問題にも適さないと思ってたのですが

まぁ,こういう話ならちょっと触ってみます。

  

github.com

本家はpython 2.7 on ubuntu 16.04 らしいんですが,そんな環境作るのもあれなので

うちのpython 3.6 on windows10 でやってみます。

結論から言うと探索なしまでは簡単に動きました。

 

以下,メモ。

tensorflowのWindows版もpython3.6に対応したので今では難なくインストール可能。

learn.pyの中のxrangeを二か所rangeに。(python2->3あるある)

learn.pyの中でlog吐くところでopenオプション"aw"を"a"に。

これはpython2系ならワーニングも出ないんだろうか?

 

学習は時間かかりそうなので少し走らせて負荷がかかることを確認して打ち切った。

メモリは1.3GB程度しか使ってない感じ。(--cpuで)

 

既学習データを用いての探索なし自己対戦は問題なく動く。

探索を入れるとエラー。

search.pyの117行目でdivision by 0である。

python2系は容認するらしいのだけど3系はスルーしてくれない。

np.seterr(all='ignore') # 3系で走らせるおまじないを宣言部に置く

 

それからもスタック不足とか色々

もしかして演算系の結果違いとかが出てるんかなぁ・・・

rate[np.isnan(rate)] = 0.0

とか行足してもどうもダメっぽい。

ってところで今夜は終わりにします。

---

2/14 追記

探索させると,numpyの実装が悪いんでしょうけどignoreしてもoldstateとかで内部で状態確保してるらしくスタック溢れて止まるようだ。

最悪2手目。たまに5,6手まで進む。

エラー前に分岐させるか・・・ #後でやる

 

2/16 追記

python3での不具合はhash衝突っぽい

board.pyに

import hashlib して

def hash(self):
return (int(hashlib.md5(self.color.data).hexdigest()[:4], 16) ^
int(hashlib.md5(self.prev_color[0].data).hexdigest()[:4], 16) ^ self.turn)

とhashを書き換えてやると遅くなるが衝突しなくなる。

もっとエレガントな方法があるとおもうが

python歴1年程度なので,hashについて詳しくは知らない。

 

2/17 追記

公式の方がエレガントに対応したので私の役割は終わりました。pyaqはいい玩具なので皆で遊びましょう。

まぐれ度の検証

え~っと,第5回電王トーナメントでは相当なまぐれってことになってます。

すっかりアレなんですが,選手権の方の準備も兼ねて「まぐれ度」を計測しておきました。

 

negishiroom.hatenablog.com

 

対戦相手は上記サイトを参考に公開されているものから,決勝に残った

えるも,はにわ,かっぱ,たぬき,よみた,と5つ選びました。

計測器はi9 7980XEで5分切れ負けにしてあります。(15時間100戦ペース)

ちょっと変則ですがponder入れたかったのでスレッド数を同数に比例配分。

相手のHash 8192,うちの調整は予選仕様の打ち切り。

各やねうら王エンジンは今後の方針を決める未来志向な意味で大会後公開された4.80を使用しました。

 

対よみた

対局数100 先手勝ち57(61%) 後手勝ち35(38%) 引き分け8
shot_gun 0.81
勝ち75(81%) 先手勝ち45(90%) 後手勝ち30(71%)
Yomita_kppt4.61
勝ち17(18%) 先手勝ち12(28%) 後手勝ち5(10%)

負け試合を3つほど見てみたけど、全部切れ負けてた(笑)

 
対えるも

対局数100 先手勝ち42(47%) 後手勝ち47(52%) 引き分け11
shot_gun 0.81
勝ち21(23%) 先手勝ち10(21%) 後手勝ち11(25%)
elmo.sdt5
勝ち68(76%) 先手勝ち32(74%) 後手勝ち36(78%)

 
対はにわ

対局数100 先手勝ち57(60%) 後手勝ち38(40%) 引き分け5
shot_gun 0.81
勝ち61(64%) 先手勝ち35(74%) 後手勝ち26(54%)
honeywaffle.sdt5
勝ち34(35%) 先手勝ち22(45%) 後手勝ち12(25%)

 
対たぬき

対局数100 先手勝ち54(56%) 後手勝ち41(43%) 引き分け5
shot_gun 0.81
勝ち22(23%) 先手勝ち14(29%) 後手勝ち8(16%)
tanuki.sdt5
勝ち73(76%) 先手勝ち40(83%) 後手勝ち33(70%)

 
対かっぱ

対局数100 先手勝ち48(51%) 後手勝ち45(48%) 引き分け7
shot_gun 0.81
勝ち19(20%) 先手勝ち9(20%) 後手勝ち10(20%)
qhapaq.sdt5
勝ち74(79%) 先手勝ち39(79%) 後手勝ち35(79%)

  

なんか結構切れ負けてるので,とりあえずこの計測はここまで。

elmoが上がってきたり,トーナメントが反対の山なら全然ダメだった感じ。

想定内とはいえ極端な相性問題がありますなぁ(笑)

切れ負け対策はフィッシャールールならなんとかなりそうだけど,

選手権のルールでは相性悪いチームを避けるのは不可能だから何かしないとねぇ。

年末年始で評価関数を完成させてないのが厳しい。

 

EPYC手に入れて,「POP TEAM EPYC」でエントリー出来なかったのも結構悔しい。

---

2/19 追記

その後のチェックで切れ負けの原因がなんとなく掴めました。sdt5で発生しなかった理由も含めて。

同時にやはり相性問題が極端出る理由と上記計測法ではやはり公平ですらないことも確認できました。ponder入れてHT有効でマシン内対戦させたら分かると思います。

別件で少し新しいアイデアが浮かんだので3月末までに実装して強くなればwcsc28の新ネタになると思いますが間に合うことやら。

 

飛べる人の話

その昔,高校の時,進学校だったんだけど一応体育の授業とかあった。

体力測定で100m走とかそういうのを計測してたんだけど,三段跳びの計測の時に結構面白いことが起きた。

飛距離が不足で砂場に入らないやつと過剰で整地してないところに着地するやつだ。

前者は笑いをとってやり直し。7,8m程度だったと思う。

後者は結構ガチな雰囲気でやり直し。13m台が出てたと思う。

あぁ,高校の体育の授業で普通の運動靴での記録だ。

 

授業が終わった後,体育教師はインターハイ予選記録などを参照したらしく,急に陸上部を作って高校陸連に登録したそうな。

そして運動場の一番端に陸上スパイク用に舗装された三段跳び用のレーンが作られた。

 

その後,たぶん二人で競技会に行ったらしい。後に聞いたのは陸上用のスパイクに慣れるのは半年くらいじゃ無理ってことだ。

 

その後の体育の授業はサッカーボールひとつ放り込んで教師が居眠りする感じ。

彼はとんでもないクリアボールをトラップしひとりでコーナー付近からセンターリングをする活躍が記憶に残ってる。

 

そういえば卒業後は知らないな。

あれが進学校じゃなかったら,中学校だったら,陸上選手にでもなったんだろうか。

サッカー選手ってこともあったかもしれない。

 

 

適正って試さないと分らんよ。