メカ女子将棋julia tokyo#1

39
メカ女子将棋 メカ女子将棋部 メカきむりん(@kimrin1

Upload: takeshi-kimura

Post on 14-Jun-2015

5.135 views

Category:

Technology


2 download

DESCRIPTION

JuliaTokyo #1 で発表した、メカ女子将棋についてのスライドです

TRANSCRIPT

Page 1: メカ女子将棋Julia tokyo#1

メカ女子将棋💙メカ女子将棋部 メカきむりん(@kimrin)

1

Page 2: メカ女子将棋Julia tokyo#1

お品書き自己紹介(@kimrin)

メカ女子将棋部の紹介

なぜ#JuliaLangでコンピュータ将棋を?

コンピュータ将棋システムの仕組み

Magic Bit Board と #JuliaLang の128bit Integerとの蜜月

動かしてみよう(論より証拠w)

2

Page 3: メカ女子将棋Julia tokyo#1

自己紹介(@kimrin)組込みエンジニア(メイン:OpenGL関係, 某Game機, 某歩く人など)

コンパイラ(COINSのお手伝い、AspectJ静的解析系)

自然言語処理(修論は形態素解析)

ゲーム木探索(海外発表あり)

ソニー子会社勤務などを経て、現在某SIer勤務(主にSなんとか、とかに常駐してます)

Mecha Lady Shogi Blog: http://mechawooser.blogspot.jp/

絶賛転職活動中です3

Page 4: メカ女子将棋Julia tokyo#1

@kimrinの主な成果(1)@mechawooser (メカウーサーCC)

3時間に一回つぶやく、@wooserさんのtwitter bot

「うーさーのその日暮らし(覚醒編)」にも「メカウーサー」として登場しました

自然言語処理技術を使っています

現在約2,000名のフォロアー

4

Page 5: メカ女子将棋Julia tokyo#1

@kimrinの主な成果(2)メカ女子将棋(@mechajyo)   ←メカジョさん

女流棋士2名を含む(!)女性メンバーによるコンピュータ将棋システム

メカきむりんは小六女子のおっさん、ということで一応女子ということになってます(^_^;)

世界初、#JuliaLangによるコンピュータ将棋システム!

(今日はこちらを詳しく、詳しく!)

5

Page 6: メカ女子将棋Julia tokyo#1

メカ女子将棋部メンバー

竹部 さゆり 女流三段(メカさゆりん)

渡辺 弥生 女流初段(メカみおたん)

メカりえぽん(広報、女子大学院生)

メカみゅーん(お裁縫担当)

メカきむりん(ただのPCヲタw)

6

Page 7: メカ女子将棋Julia tokyo#1

なぜ#JuliaLangでコンピュータ将棋プログラムを?他のコンピュータ将棋システムは、C/C++を使ってるのがほとんど

C/C++やFortranに迫る性能を#JuliaLangが出している

ちょうど#JuliaLang、興味があって覚えたいしー

将来評価関数の機械学習もしたいし

じゃぁ、#JuliaLangで将棋ソフト作ったら、うっしっし(*^_^*) w

7

Page 8: メカ女子将棋Julia tokyo#1

#JuliaLangでコンピュータ将棋ソフト開発

スクリプト言語チックなので、色々楽w C++もある程度コンテナとかあるけど、#JuliaLangの方が楽(なにぶん直感的)

ポインタないしw

その場で実行開始できるので (JIT Compilation)開発効率もよい!

8

Page 9: メカ女子将棋Julia tokyo#1

コンピュータ将棋システムの仕組み

現在はネットワーク対戦で勝敗を決めることがほとんど

将棋エンジン

UI (盤面表示)

ネットワーク通信部

全部自分で作ると結構な量のコードに

9

Page 10: メカ女子将棋Julia tokyo#1

将棋GUIソフトの登場将棋所

ShogiGUI

上記二つのソフトウェアはGUIやネットワークの部分を提供してくれる。コンピュータ将棋プログラム作者は将棋エンジンと呼ばれる標準入出力を使ったEXE Fileを作るだけで、将棋の対局を実現できるようになった

コンピュータ将棋エンジン作成者はより将棋エンジンのロジックの設計に集中できるようになった

10

Page 11: メカ女子将棋Julia tokyo#1

将棋エンジンとはGUIソフトウェアからの起動され、次のデータをASCIIでGUI側から受信・あるいは送信する

ソフトウェア名[Send]

対局準備OK[Recv]

対局準備OK[Send]

対局開始[Recv]

現在局面[Recv]

思考開始指令[Recv]

現在の探索深さと読み筋(複数)[Send]

自分の着手[Send]

投了[Send]

勝敗[Recv]

11

Page 12: メカ女子将棋Julia tokyo#1

具体例:▲7六歩 △4二王を指すところ

>1:position startpos moves 7g7f

>1:go btime 1499000 wtime 1500000 byoyomi 0

<1:info time 62 depth 1 nodes 51 score cp 11 nps 827 pv 3c3d 8h2b+ 8b2b

<1:info time 122 depth 2 nodes 135 score cp -69 nps 1102 pv 3c3d 5g5f 2b8h+ 2h8h

<1:info time 177 depth 2 nodes 313 score cp -205 nps 1770 pv 3c3d 5i6h 2b8h+ 7i8h

<1:info time 279 depth 3 nodes 2812 score cp 54 nps 10079 pv 5a4b 3i4h 3c3d 8h2b+ 3a2b

<1:info time 397 depth 4 nodes 4788 score cp 91 nps 12069 pv 5a4b 3i4h 3c3d 8h2b+ 3a2b

<1:info time 550 depth 4 nodes 11286 score cp 118 nps 20507 pv 5a4b 5g5f 3c3d 5f5e 2b5e

<1:info time 1077 depth 5 nodes 46579 score cp 188 nps 43256 pv 5a4b 5i6h 3c3d 8h2b+ 3a2b

<1:info time 2635 depth 6 nodes 136954 score cp -229 nps 51967 pv 5a4b 5i6h 4b3b 3i4h 3b4b 5g5f

<1:info time 7257 depth 6 nodes 501384 score cp -295 nps 69089 pv 5c5d 2g2f 8b5b 2f2e 5a6b 2e2d

<1:bestmove 5a4b

12

Page 13: メカ女子将棋Julia tokyo#1

盤面と指し手position startpos moves 7g7f

初期盤面から▲7六歩まで

以下、指し手を連ねていく

7g7f: (移動元)(移動先)になってる

7: 7筋(これは棋譜と一緒)

g , f: 7段、6段(aが1段)

駒台から打つ手の場合

P*7f のように、打つ駒の名前、”*” 、打つ場所、と表記する

13

Page 14: メカ女子将棋Julia tokyo#1

そもそも将棋エンジンとは、何を計算するのか?

Pseudo Code で書いてみた:

Algorithm S(p::Position)

lis = generate_moves(p)

move = choice(p,lis)

return move

choiceがキモ!

実際は、Alpha Beta Search(後述)というのを行う

14

Page 15: メカ女子将棋Julia tokyo#1

Algorithm Choice

for id_depth = 1:ID_MAX

val = AlphaBeta (p, -Infinity, Infinity, id_depth, 0, teban)

report_to_UI( PV) (後述)

if timedOut

return PV[1,1] # 指し手(後述)

end

end

Algorithm AlphaBeta( p::Position, alpha::Int64, beta::Int64, depth::Int64, ply::Int64, teban::Int64)

こんな感じの関数をひたすら再帰で実行する

15

Page 16: メカ女子将棋Julia tokyo#1

Alpha Beta Search(1)Algorithm AlphaBeta(p,alpha,beta,depth,ply,teban)

if depth <= 0

return evaluate(p,teban)

end

lis = generate_moves (p,teban)

if length(lis) == 0

return -Infinity + ply

end

(続く。。。)

16

Page 17: メカ女子将棋Julia tokyo#1

Alpha Beta Search(2)for m in lis

(本体は次ページ)

end return alpha

end !!!!

17

Page 18: メカ女子将棋Julia tokyo#1

(本体)make_move (p, m, teban)

val = -AlphaBeta( p, -beta, -alpha, depth-1, ply+1, teban*(-1))

move_back(p, m, teban)

if val > alpha

alpha = val # alpha update

update_pv( p, m, val) # update Principal Variation

if val >= beta

break # beta cutoff

end

end

18

Page 19: メカ女子将棋Julia tokyo#1

Alpha Beta Search(3) 謎関数について

evaluate: 評価関数

局面の価値を計算する関数

メカ女子将棋ではbonanzaプログラムの素性値を利用

generate_moves: 可能手生成関数

局面から指せる手をすべてリストに列挙する

後述のMagic BitBoardはここの話

legal/pseudo legal の二種類がある(この例ではlegal)

以上二つがCPUのかなりの時間を使う(※重要)

19

Page 20: メカ女子将棋Julia tokyo#1

Alpha Beta Search(4)make_move/move_back:

一手指す(mを)そしてpを更新する

move_backは一手戻す

update_pv:

最善応手手順(PV)を更新する

関数が手を返すのではなくここでPVを更新するケースが多い

このPVの結果の1手目を指し手とする

実際は三角な行列を更新することが多い

PVをtransposition table と呼ばれるハッシュテーブルから取得する場合も (Stock Fishなど)

20

Page 21: メカ女子将棋Julia tokyo#1

Alpha Beta Search(5)注目すべきは beta cutoff

これ、途中でSearchを止めている

しかし、このcutoffを行っても、最後に計算されるval(ゲーム木の値)は変わらない[Knuth 75]=つまりサボれる=もっと深く探索できる

実際にはmove ordering という指し手リストの並べ替えを行って、できるだけ最初の方でbeta cutoffが起きるようにしている

最も最適な並び替えられたtree全体のことを、optimal treeと呼ぶ

![Knuth 75] An Analysis of Alpha-Beta Pruning(Artificial Intelligence 6(1975), 293-326)という論文にこの点についての考察がある

21

Page 22: メカ女子将棋Julia tokyo#1

メカ女子将棋GitHub repo.第24回世界コンピュータ将棋選手権出場プログラム(そこそこの強さ、原始的)

https://github.com/kimrin/WCSC23

現在開発中のNextGenバージョン(Magic BitBoard搭載、まだ未完成)

https://github.com/kimrin/NextGenMechajyo

22

Page 23: メカ女子将棋Julia tokyo#1

Magic BitBoard と #JuliaLang 128bit 整数

まず、bitboardとは、を説明します

Chessでは、64bit変数のそれぞれのbitで、各squareの駒の有無を表現する

Whites, Blacks, AllPieces, WhiteBishopsなど、用途に応じて色んなbitboardを作る

将棋は9x9なので、さて、困った。。。(続く)

23

Page 24: メカ女子将棋Julia tokyo#1

NextGen MechajyoではStockfish(Chess program)の64bit bitboardをそのまま128bitに拡張して、下位81bit(=9x9)を使用する

#JuliaLangでは、128bit 整数の演算をサポートしている(LLVM由来)ので、ロジックそのままに若干修正するだけでbitboardを将棋にも導入できます!

#JuliaLangまんせー\(^o^)/

ほかのソフトは32bit x 3とか、64bit+32bitとかやって、C/C++で頑張って計算しています。。。

24

Page 25: メカ女子将棋Julia tokyo#1

BitBoard基本、駒の可能手を、次の関数で計算する(表引き)

B = F(original_position,piece_kind)

例:B= F(7七,先手歩)   Bは7六だけbitが立ったBitBoard

25

Page 26: メカ女子将棋Julia tokyo#1

BitBoard続き自分の駒のいないマスとANDを取るつまり自分の駒は取れない

算出したBitBoardについて、各bitの位置をtrailing_zerosなどで求める

すべての1になっているbitを拾い出し、可能手を生成する(可能手は32bit の整数で表現)

26

Page 27: メカ女子将棋Julia tokyo#1

Magic BitBoardとは

Sliding Pieces(香車、飛車、角、竜、馬)などの可能手を高速に求める方法

なんと、かけ算使って、効きを求める!!!(なんだってー!!!)

27

Page 28: メカ女子将棋Julia tokyo#1

解説しようSliding Piecesの効き(=可能手の行き先)は、前述の場所と駒種類の関数にはならない!

Slidingは自分や相手の駒が有ると止まるので、効きはcontextに依存する(contextとは、効きの途中にある駒たち)

28

Page 29: メカ女子将棋Julia tokyo#1

例:指し手生成祭り!

!

!

!

9八の先手飛車は上の後手歩や香を取れない

9七の先手歩があるので、そこで効きが止まる

29

Page 30: メカ女子将棋Julia tokyo#1

よって、効きを求める関数は

C =

G(original_position,piece_kind, context)

となる ここで、contextは効きの状態を駒の有無でbit化した整数

30

Page 31: メカ女子将棋Julia tokyo#1

Programming Chessの仙人が考えた斬新な方法とはcontextを高速に求めたい。例えばcontextの長さが10bitで、すべてのマスに駒がいる場合、1023という数字を、高速に求めたい

Bishop, Rookのそれぞれで、縦横斜めの連続したbit列を集めてこないといけない

そこで、以下の式でcontextを求めちゃう

uint((((occ & Masks[s+1]) * Magics[s+1])) >>> Shifts[s+1])

詳しくは次ページ

31

Page 32: メカ女子将棋Julia tokyo#1

uint((((occ & Masks[s+1]) * Magics[s+1])) >>> Shifts[s+1])

occが全部の駒のbitboard

Masksは、駒がsの位置に有った場合の、行き放題の効き

で、それにhashを求めるべくMagicsを掛けると縦横斜めのbit達が連続した領域に入る♡

で、Shiftsで寄せて、contextのできあがり♡

32

Page 33: メカ女子将棋Julia tokyo#1

contextが求まれば、こっちのもの

先ほどの関数Gの表引きを実現するだけ!

飛車と角の二通りがある

馬は角、竜は飛車に、1マスの効きをORしたBitBoardで表現

香車は飛車の前方向マスクを取ったもので表現

!

でも、どうやってMagics計算するの?(真っ当な疑問w)

33

Page 34: メカ女子将棋Julia tokyo#1

Magicsの求め方♡希薄な乱数(1のbitが少ないという意味)をひたすら生成して、条件を満たすMagicsを計算? するw

すいません、ローテクかもしれませぬ

とりあえずNextGen Mechajyoでは10分くらいMacBookProでごりごりやると計算できます。serializeしておいて、実行時にファイルから読み出してます

基本NextGen MechajyoはStockfishの真似しっこです(^_^;)

34

Page 35: メカ女子将棋Julia tokyo#1

動かしてみよう!

(時間が余ったらね。。。//////)

35

Page 36: メカ女子将棋Julia tokyo#1

ご清聴ありがとう ございました きゃぴっ♡

質問はこの場で言っていただくか、twitter: @kimrin まで!

36

Page 37: メカ女子将棋Julia tokyo#1

メカ女子将棋 (愛称:メカジョさん)の棋風ファンシーな指し手w

飛車 角を先に取られる(T_T)

とにかく、成らないw

なぜか相手のマシンがハング・反則をするw

第24回世界コンピュータ将棋選手権一次予選 22チーム中 19位

棋力は不明だけど、強いと感じさせる手もある

37

Page 38: メカ女子将棋Julia tokyo#1

将棋盤(棋譜)9一 8一 7一 6一 5一 4一 3一 2一 1一

9二 8二 7二 6二 5二 4二 3二 2二 1二

9三 8三 7三 6三 5三 4三 3三 2三 1三

9四 8四 7四 6四 5四 4四 3四 2四 1四

9五 8五 7五 6五 5五 4五 3五 2五 1五

9六 8六 7六 6六 5六 4六 3六 2六 1六

9七 8七 7七 6七 5七 4七 3七 2七 1七

9八 8八 7八 6八 5八 4八 3八 2八 1八

9九 8九 7九 6九 5九 4九 3九 2九 1九

38

Page 39: メカ女子将棋Julia tokyo#1

将棋盤(USI)9a 8a 7a 6a 5a 4a 3a 2a 1a

9b 8b 7b 6b 5b 4b 3b 2b 1b

9c 8c 7c 6c 5c 4c 3c 2c 1c

9d 8d 7d 6d 5d 4d 3d 2d 1d

9e 8e 7e 6e 5e 4e 3e 2e 1e

9f 8f 7f 6f 5f 4f 3f 2f 1f

9g 8g 7g 6g 5g 4g 3g 2g 1g

9h 8h 7h 6h 5h 4h 3h 2h 1h

9i 8i 7i 6i 5i 4i 3i 2i 1i

39