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

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

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

 

ハードウェアの話。

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

今回コンピュータ将棋のネタで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台が出てたと思う。

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

 

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

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

 

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

 

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

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

 

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

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

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

 

 

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

自作AIの会

職業柄この時期多忙で少々報告遅れな感がありますが

1月20日に自作AIの会ってのをやってました。

ai-okayama.connpass.com

 

機械学習とかディープラーニングとか人工知能とか色々用語があるんですが,正直入門1年未満で言葉の定義も怪しい者が主催するのでハードルの低い感じの看板にしたかった。(それと金の匂いをさせないように心掛けてます)

 

で,不思議なことに60名近い登録者(ドタキャン数名居られたみたいですが)で,直前になって但馬先生が「どうせ半分くらいですよね」と確認に来られる程度。

私も年末からチェックしてなかったので2,30人がいいところだろうと思ってたので驚きました。「まぁ,東京は半分しか来ないですが岡山は8割以上来ますよ」との予想は合ってエントリー数くらいは居るに見えました。

 

どんだけすごいって?

sakura.doorkeeper.jp

さくらインターネットの大阪本社で行われた機械学習ナイトより多いんですよ(笑)

(これに行ったのに自分のイベントを宣伝忘れる始末でしたが)

 

で,岡山のイベントでは二人で4時間弱話ました。(休憩特に多めで) 

歴史の話や技術デモなど二人で準備した割には幅広いネタになったのではないかと思っています。コンピュータ将棋の話もしたのですが,背景が無い人ではついて来れないだろうなぁと流し気味になりました。職を奪うAIの話では以下のようなことを話題に出しました。

 その昔,炊飯は専門職だった。マイコン炊飯器(おそらく当時4ビットマイコン)が家庭の主婦の仕事も奪い,飲食店から炊飯専門職を奪い多くの仕事が奪われたであろうこと。マイコン炊飯器の人工知能とは温度(の時間履歴)管理程度であるが,それですら多くの仕事を奪ってきている。監視カメラが警備員の仕事を奪ってる。自動改札が駅員の切符切りの仕事を奪ってる。

 それから炊飯器は多種の炊飯メニューに対応し,監視カメラは動態検知に対応し,自動改札がICカードに対応し,どんどん職が奪われております。人類の危機ですねぇ。

 

 ということで,次回は少々枠を減らしてもくもく会を開催します。

是非ご参加下さい。

ai-okayama.connpass.com