やねうら王開発実況用スレッド その2


■ 2014/10/24 22:30 ETV特集「棋士VS将棋ソフト 激闘5番勝負」


明日のNHKで、以下の前回の電王戦の特集があります。以前、私が取材を受けたときの映像を再編集したものらしく、今回は1時間番組なので前回の『サキどり』のときより詳しく取り上げてもらえるようです。


【番組概要】
NHK Eテレ ETV特集「棋士VS将棋ソフト 激闘5番勝負」
放送日時:2014年10月25日23時
(再放送:2014年11月1日0時 ※10月31日深夜)
http://www.nhk.or.jp/etv21c/file/2014/1025.html


■ 2014/10/24 24:00 Bonanzaのmake_listの38要素化


Bonanzaのmake_listの38要素化について解説記事を書いたので興味のある人は御覧ください。


Bonanzaのmake_listの38要素化
http://d.hatena.ne.jp/LS3600/20141024


Bonanza方式の評価関数 ≡ やね裏評価関数 ≡ make_listの38要素化 となる。(ここでの“≡”は、相互変換可能という意味)
以前、私はこれを数学的に証明した。Aperyの平岡さんが、先日ファジー学会誌にコンピュータ将棋について寄稿するときに「Bonanza方式の評価関数 ≡ make_listの38要素化」について書いてくれた。


ここに俺様の大変エレガントな証明を書いて皆様に堪能していただきたいところだが、このブログの余白はそれを書くには狭すぎる。(とか言って逃げる)


■ 2014/10/25 17:00 人間とコンピューター将棋との違い


よくプロ棋士の方は「将棋ソフトはコンスタントに80点の指し手を出せる。だから強い。」みたいなことを言いますね。また、「人間は100点に近い手を指せるが、たまに0点の指し手を指してしまう。」と。


この意見には賛否あるようですが、勝率が人間とソフトで等しい状況においては、正しいと私は考えます。そのことを以下で簡単に説明します。


人間は短手数の読みを見落とすことがあります。プロでも3手詰めや5手詰めを見落とすことがあります。一方、将棋ソフトは0.1秒の思考時間でも7手詰め以下を見落とすことはないでしょう。


人間には短手数での見落としがあるにもかかわらず、ソフトと勝率が等しいということは、長手数の読みや大局観において人間が短手数での見落としを補うだけの力が総合的見てあるということですね。(勝率が等しい状況においては、です。)


なので、勝率が互角ぐらいの人間とソフトが相対したときに冒頭のような発言が人間側から出てくるのは、これはまことに正しいのです。


ところが、最近は、ソフトのほうが勝ち越すということもあって、そうなってくると「長手数の読みや大局観」においても人間のほうが優れているのか何とも言えなくなってきます。人間のほうがソフトより正確に形勢を判定できるかどうかは、その局面の性質次第と言えるのかも知れません。(例 : 実際に先を読まないと形勢が判断できないような局面だと人間は相対的に苦手である。)


■ 2014/10/26 16:00 これちゃんと動くんか?


いま棋譜からの学習部を一から作ってます。棋譜からの学習部、あとは棋譜読み込みとPV(最善応手列)求めるところを書けばだいたい完成。たぶん今日の深夜ぐらいに完成。それできちんとパラメーターが収束するかどうかはワカラン…。


今日は私の誕生日なので誕生日祝い(?)に一発で動いて欲しいものだが…。


誕生日と言えば11月3日が息子の誕生日なので決勝で上位に入賞して息子の誕生日プレゼントを買ってやりたいのだが、いまのままでは上位に入賞どころか、予選を突破できるかどうかすら怪しい。というか、こんな状態で参加できるかどうかすら怪しい。



■ 2014/10/27 20:00 学習部の並列化


とりあえず棋譜からの学習部は9割ぐらい出来た。AWSを借りようと思っていたが仮想32コアマシンが1時間4,5ドル程度。物理16コアでしかも2.8GHzなのでCorei7 4771 3台分ぐらいの価値しかない。


棋譜からの学習部を並列化したほうがよろしい。並列化するためには別PCとデータの送受信をする必要があるが、もっとお手軽にやるにはWindowsの共有フォルダ上で棋譜からの学習の実行ファイルを動かせば良い。


1. (2PCで学習させるとして)棋譜を2つに分ける。
2. 実行ファイルをネットワーク共有しているフォルダ上に置く
3. それぞれのPCで棋譜からの学習のための実行ファイルを起動する。
4. 片側はmaster、もう片側はslaveだとする。
5. イテレーションごとにslave側はKPP,KKPの値をどう動かすかという勾配値(derivative)をファイルに書き出す。master側はそのファイルを見つけたら丸読みして、その値を自分のderivativeに加算。
6. master側、イテレーションの最後にKPP,KKPの値をファイルに書き出して、derivativeファイルを削除。
7. slave側、derivativeファイルが削除されていたら、(共有フォルダ上にあるmasterが書きだした)KPP,KKPのファイルから読み込んで次のイテレーションへ。
8. master側も次のイテレーションへ。


これなら1時間もあれば実装できる。台数が増えたときもこのやり方を少し変えるだけで対応できる。


■ 2014/10/29 0:00 今日がタイムリミット?


とりあえず棋譜からの学習部は書けた。学習に使う棋譜は64個でテスト中。


駒割りだけだと深さ3の探索において、棋譜との指し手一致率は26%。1回目のイテレーション後、深さ3の探索において指し手一致率32%に上がったので学習自体はうまく書けているようだ。(過学習するかとかちゃんと収束するかとかそのへんは知らん…)


Bonanzaでは指し手一致率は40%ぐらいになるので、最終的に数万棋譜に対してそれぐらいの一致率にならなければならない…が、時間がないな…。


あと、さっき走らせてたら、アクセス違反で落ちた。原因調べるのにデバッグモードで走らせないといけないが、デバッグモードだと100倍ぐらい遅いんだよ…。助けてくれー。


今日中に並列化までやってうまく学習が回せる状態になってなければ、もう駄目ですわ…。
せっかく面白くなってきたのになぁ…。


■ 2014/10/29 3:00 デバッグは終わった


並列化はまだだがデバッグは一応終わった。PC並列化は、もう少しの間、手作業で値をある程度のところまで収束させてからにしようかと思う。


それで私の対局棋譜からのみ(!)学習させてみた。棋譜の数は16局。ちなみに私の棋力は将棋ウォーズで3,4段。


・学習に使った棋譜 = 16局。棋譜の内容 = 私 vs 私。
・depth = 3 , iteration = 16 , step = 4
※ Bonanzaではrootで1手進めてからdepth分読むのでdepth = 3だと4手読みの意味になるが、ここではrootから数えて3手の意味。
・学習に要した時間 15分ほど。


やねうら王側の棋力、いまの状態でたぶん初段〜3段ぐらい。ちゃんと王を囲ったりするので見ていて面白い。独創的な囲いをする。KPの左右対称で同じ点数をつけているためか、初手38金(たぶん78金と同じように思っているのだろう)とか指すことがある。


試しにBonanza6とやらせてみたら、形勢の評価がまるで違う。もちろん、Bonanza6のほうが正しい。しかし、面白いことに入玉だけは、このバージョンのやねうら王のほうが明らかに強い。Bonanza6が全く入玉しないのに対して、やねうら王はうまく入玉して、自玉の周りを固めながら駒得を果たして逆転してしまった。



これは、次元を極限まで下げて学習させた成果だろう。入玉将棋のような未知の局面に対してもそれ相応の指し手が指せることが証明された。


わずか16局の棋譜(それも私の棋譜!)から学習したのに入玉将棋がきちんと指せるというのはなかなか凄い。これをもって、やねうら未来学習メソッドの有効性が示せたと思う…が、いささか過学習ぎみになっている気もする。このへんの調整が当日までに出来るかどうかは正直わからん…。


■ 2014/10/29 7:00 AWS使うよ!


AWSで32コアマシンを借りたよ!計算資源としてはコスパ悪すぎると思うけど、1分、1秒が惜しいので仕方がない。AWSの料金回収メソッド(なんじゃそりゃ)が現地で炸裂するといいですなぁ…(´ω`)



少ない棋譜から学習する能力はあるので、とりあえず相対KPPのほうがある程度収束するところまで棋譜の数は64ぐらいで回して、そこが収束してから指し手一致率を確認しながら棋譜の数を徐々に増やしていく作戦。



■ 2014/10/29 19:40 AWS高いよ…


AWS借りたけど、iteration思ったほど回らないよ…。1回のiterationに結構時間がかかって、全然回せないよ…。回数まわさないと収束しないというのに…。


今晩並列化して、AWSを100台ほど借りれば2,3日で収束するのかも知れないが…。1時間400円だとして、


400円×24時間×100台×3日 = 288万円


かぁ…。電王トーナメントの1位の賞金超えてるんですけど…。


■ 2014/10/30 5:00 うわっ…私の次元、低すぎ…?


ここで残念なお知らせがあります。


評価関数パラメーターの次元下げですが、どうも学習に時間がかかりすぎることに気づきました。KPP、1つのパラメーターを128に分解していたのですが(NDFは4つに分解)、これだと学習におおよそ128倍の時間がかかります。探索している時間とかもあるので実際は128倍よりは小さな数字のはずですが、仮に50倍程度だとしても本来棋譜からの学習にはハイエンドのマシンで2週間程度はかかるので、50倍はやっぱり大きい数字です。


そこまで次元を下げると、人間のようにわずかな棋譜から学習できて、その人間っぽさに(指し筋のへたれさも含めて)ちょっと興奮していたのですが、いかんせん時間がかかりすぎます。


そこで次元下げは128から16に変更します。これでも通常の16倍近くの時間がかかるのでどうなるかはわかりませんが…。とりあえず初期値を以前のやねうら王の評価関数の値から無理やり次元下げしたものを与えたので、0から回すよりは収束するのは早いかと思います。


・AWS(仮想CPU 32コア)
・thread = 32 , depth = 3 , step = 32
・1回のiterationが7時間程度 → その後、高速化して6時間弱になりました。


ソフトの改良はこれにて終了。当日、余力があればブログに何か書きます。
いまの状態だと決勝に残れるかどうかすら怪しいですが…。


■ 2014/10/30 14:00 並列化は辛いよ…


AWSで10台ぐらい借りて並列化しようかといままさに考えているところですが(30万円ぐらいかかりますが…)、学習用の評価関数ファイルが大きくて、これをネットワークごしに送り合わないといけなくてPCを分けてもそんなに効率が出ない & 実装が結構手間がかかる & ネットワークの転送量に対して料金が課せられるところでやりたくない、みたいな理由で今回は見送り。


代わりに学習を少し高速化しました。20%ほど速くなりましたが…誤差です…。


今回は、棋譜からの学習をいろいろやったので、こうやれば強くなるのかな、というのはわかってきました。評価関数の形だけ適切に設計すれば、あとはやねうら未来学習メソッド(この名前いい加減うざいな!)で自動的に強くなるので、ここまでくればあとは開発にそんなに時間を費やさなくとも(評価関数の形が適切であれば)強くなるのでしょう…。


そんなわけで適切な評価関数の形をコメント欄で大募集してます。


■ 2014/10/30 16:20 やねうら未来学習メソッドの詳細


なんかtwitterで「このヒントでは全然わからん」という意見が多かったので、詳しいことを書いておく。隠すつもりはなくて、私としては「これだけ書けばわかるだろう」と勝手に思い込んでいたわけであるが。私が勝手に思い込んでいるだけなので、これがあのヒントでわかったから賢いとか、わからなかったから頭が悪いだとか、そういう類のものではない。(と思う)


ヒント)
・KPPを絶対と相対で128通りに分解
・NDFの手法(4通りに分解)を一般化


私は次のように考えて欲しかったし、また次のように考えてもらえると勝手に思い込んでいた。


3駒相対は3駒絶対から並行移動させて重なる関係にある。3駒絶対のほうの次元を下げると同じ要領で3駒相対のほうの次元を下げることが出来る。
NDFの手法はKPPという三駒関係を4つに分解してあるが、PPを2駒と捉えるのではなく3駒の枠組みで捉えるならば、これはKPPのKが任意の場所にあるものと捉えることが出来る。いま任意の筋、任意の段にあるKをK**と表記しよう。


つまり、NDFの手法は、絶対KPP + 絶対K**PP + 相対KPP + 相対K**PPという4つに分解してあるわけだ。


一方、私がヒントとして書いた128と言えば2^7(2の7乗)である。KPPを分解するときに絶対と相対とで2倍になるから、絶対のほうが2^6通りあって、相対のほうも同じ数である2^6通りに分解できるということである。KPPという3駒を分解して2^6通りにするのだから、1駒2^2ずつ割当たる。NDFからの連想で、言うまでもなくこれは段と筋である。


つまり、いま絶対K78P76P67のような関係があるとして、絶対K7*P*6P6* と書けば、これは7筋目にいる王と6段目にいる歩と6筋にある歩による関係を意味するとしよう。段と筋を表す場所が3駒で6箇所あるから、ここが * (ワイルドカード)になるか否かという2通り^ 6 × 2(絶対・相対) = 128通りなわけだ。


これにより、NDFの手法がより一般化され、より細かく分解されることとなる。こうなっていることで少ない棋譜からそれなりに学習することが出来る(かも知れない)という理屈である。


ただ、相対KPPに関しては結構難しい話があって、これはこの手法が成功したらどこか向けの論文として書こうかと思う。


しかし、細かく分解されすぎていて、これに対して適切に学習させるのはボナメソのままでは結構難しい。ボナメソをいくつかの点で改良するか、あるいはボナメソより優れた学習メソッドが必要だと思う。これについては、一応解決したつもりだが、まだよくわからない。きちんと解決できていたら、これもどこか向けの論文として書こうかと思う。