15/11/19 14:23:44.03 W/V+CKXD.net
定石部分もクラス化が終わりました。クラスなんての扱うの初めてなので、もうちょっと
綺麗にできたかなと思う面もありますが、C++習得が目的ではないので。
終盤確定読みは0.05秒刻みで速度アップ。FFO#40で2.3秒になりました。
今まで、速いプログラムでは30手目くらいから勝敗判定を始めると言う記述を読んで、
なんて速いんだと思いつつ、何に使うんだろうと思っていましたが、ようやく腑に落ちました。
オセロというゲームは勝敗だけが問題で、勝つんなら2石差で十分。「少なくとも負けない
手」というなら、(-1,0)のNull windowで探索してβカットされた手を選べば良い。評価値は
不定(これより良いという値)でも負けない手であるという点では「確定」手順です。moveorder
が正確なら、極端に石差を減らす手も選ばない。これなら現状でも25手ちょいくらいは行けそう。
ただ、これは勝勢の時の話で、敗勢の時の評価値は「これより悪い」という数字だし、
逆転は相手のミスに期待するしかなく、相手も同等のロジックのAI相手だと必敗となる。
結局定石段階で勝負がつく事になります。
今、定石DBは30手を前提に組んでいますが、31手目から勝敗判定ができるんなら、定石
を外れない限り中盤探索が不要になり、定石から外れた時にのみ中盤探索が必要になる。
つまり中盤探索は対PC戦では重要度が低く、定石が切れたら、即、終盤探索が始まる。
そもそも評価関数が良ければ、中盤もあまり深く探索する必要がないわけで。
深く読む意味って、なるべく評価が正確なステージを使いたいからなんだなぁと。
というわけで、次はそろそろ中盤探索です。Multi Prob Cutの英語論文を読まねばならぬ・・・。
346:310
15/11/21 00:05:47.02 WWzrsUCT.net
定石DBを使って30手目まで着手した盤面の予想石差が2で勝ち判定だったので、
試しに31手目から勝敗判定をしてみました。
(-1,0)のNull windowで7分30秒ほどで解けました。
(参考)勝ちと引き分けを区別するために(-1,1)で計算すると9分30秒ほど。
探索ノード数がintではオーバーフローしてしまった・・・。
これから、33~4手目(残り26~7手)くらいで、10秒程度で解けると予想されます。
勝勢ならこれで良いのですが、敗勢の時は、初段がβカットされないので10倍程度
時間がかかる。そうすると、残り25~6手目くらいが勝敗読みの限度かなと。
もっと高速化が必要なのか。それとも、何か発想の転換ができるのか。
347:310
15/11/23 21:01:42.47 24rahmZ0.net
ProbCutとMultiProbCutのBUROさんの論文あらかた読み終えました。
最初、MPCの方から読んでちんぷんかんぷんだったので、ProbCutを読んで、
戻って来て、ようやく実装のイメージが湧くところまで来ました。
というか、この発想に至る道具立てや考え方は、既に揃ってた感じ。例えば>>323とか。
これ>>345-346の勝敗判定の高速化に使える気がする。相手側の手番では
前向きカットしないようにすれば、相手の反駁手を見逃さないからいけるんかなと。
あまり深い読みで使用するとパラメータ作りでしばらくPCを占有しそうだけど。
カットペアは結構アドホックに決めているのかな。各組合せを総当たりで調べても、
σにそんな差があるとは思えないし、特異的に良い組み合わせがあるとも思えないし、
むしろ読む深さの差が増えるにつれてダラダラとσが大きくなって行くだけじゃないか
と思う。毎深さごとにMPCしてもオーバーヘッド負けになるだろうし、再帰的に使う事を
考えたら、2^n+αで4,8,12,16,20,24ってな感じで良いのかな。
348:310
15/11/25 22:32:57.73 APRE5Y1F.net
条件を決めて簡単にMPCパラメータの計算プログラムを作って検証してみました。
30手目の時点(深さ30)の時の浅い探索0~10手でMPCパラメータを計算してみました。
例の300万件棋譜の30手目以後完全読み(らしい)190万件ほどのデータからランダム
に200件ほど抽出して使用。
結論)δが10石、R-2が0.7未満という状態で、とても使えたものではないという事に。
ただ、35、40、45手目時点からのカットを試す価値はあるかも知れない。
一方、30手目の時点で、深さ10の探索に対して、浅い探索6までで計算すると、
浅い探索4手でδが2石、R-2が0.931、浅い探索6手でσが1.5石、R-2が0.962
程度と、まずまずの結果に。これが、論文通りの使い方。
当たり前だけど、こちらは十分使えそう。ただ、結局深い探索に対して浅い探索の深さを
決めるのに、全パターン試すしか無いという。まあ、BUROさんのマネしちゃえば良いけど。
あと、中盤読みのプログラム、やっつけで、終盤探索の手順作成用の浅い読みプログラム
転用したんだけど、これnegaMaxなのよね。negaScout+MTD(f)にするなり、もう少し、
素の高速化をしないとパラメータ計算が大変。
349:名前は開発中のものです。
15/11/29 22:05:16.61 gx8DmdDE.net
googleとかfbが囲碁のAI作ってるが、どんなもんなの
350:310
15/12/02 23:21:25.70 Xp/MZwxE.net
とりあえずMPCの仕組と終盤探索用のパラメータだけ作り、終盤探索と勝敗判定に
適用してみました。
勝敗判定は31手目から。浅い探索は残り手数の1/3。T=1.5で時間短縮が微妙な感じ。
終盤探索はFFO#40でテストしたところ、T=1.5だと途中で正解着手がカットされている
模様で、T=2.0で正解。T=2.0だと時間変わらずみたいな微妙な結果に。
もう一度、MPCの論文を良く読んでみましたが、どちらかというと評価関数の精度の差
の方が大きい様子で、もともと標準偏差が倍近いので、そこを何とかしなきゃならんと。
論文を良く読むと・・・評価関数に確定石はおろか、mobilityも使っていない。使っている
のは、パリティー(手番)だけで、ここは自分の方が精度が良い方法のはず。という事で、
急きょ評価関数の説明変数をパターンだけにして再計算に着手しました。
とはいえ、書いてある学習係数があまりに違いすぎるので、自分がバグってる可能性も。
また、ネットでBUROさんのパワポ資料(2002年)みたいなのを見つけて読んでみると、
「selective endgame search」と称して、MPCの終盤探索への応用がサラっと書かれて
いて、「いまどきの強いオセロプログラムはみんなやってる」との事。iterative deepingを
前提にしているのでmoveorder作成で使ってるのかなぁ。正解着手だけ与えても速度アップ
は限界があり、正解以外着手のnull window searchの時間がバカにならないので。
あと、中盤探索は(17,5)というカットペアの記載あり。zebraのFFOのログでは中盤探索が
2.5kNPSなのに対して、僕のは250MPSと、速度が1/10なので・・・深さ17はしんどいかなと。
ちょっと期待しているのは、前述のとおり確定石計算を評価関数で使用しなくなったので
その分は速度アップしていないかなぁと。
評価関数の再計算を始めてしまったので、しばらくは中盤探索が動かせません。
というか、本当にLRの計算があっているのか、バグは無いのか、不安になる…
351:名前は開発中のものです。
15/12/02 23:37:59.26 Xp/MZwxE.net
>>349
囲碁オセロ板の該当スレで聞いた方が良いかなと。
コンピューター囲碁ソフトについて語るスレ30 [転載禁止]©2ch.net
スレリンク(gamestones板)
352:310
15/12/04 23:35:12.62 DNSRUk3b.net
結局、確定石が評価関数の誤差の大きさと、収束性の悪さの原因だったみたいです。
前半から中盤はmobilityのウェイトが大きそうなので、とりあえず復活させてみました。
あと、スムージングは、あるステージで出現しなかったパターンが隣接ステージにある
可能性も考慮し、ウェイトがゼロのパターンを減らす目的もあるようです。
実際、200試行ちょっとでかなり誤差が減ったのですが、FFO#40で試すと途中の評価値
のバラツキというか、極端に0に近い局面が現れて、2σ以上の差異が簡単に出てしまい
ます。そこで、ちょっとだけスムージングを入れて、かつデバッグ段階ではウェイトゼロの
出現をアラームできるように改造しようかと思っています。
評価関数の重要性を痛感しています。しばらくは、ここで悩む事になるのかなぁ。
最低でも300試行するとなると3日かかる。
353:310
15/12/05 23:27:03.86 VLRyPTJJ.net
モビリティーも収束悪化の原因でした。
確定石の数にしても、モビリティにしても、ある程度大きな数字が出るものがダメっぽいです。
評価パターンとウェイトを確認できるようにして、FFO#40~41の完全読みに登場する盤面を
チェックしましたが、ウェイトゼロのパターンは出現していないようです。
評価値が大きくぶれるところがありますので、スムージングを入れてみて計算開始です。
354:310
15/12/07 10:00:41.29 JSVZKjkd.net
スムージングも外してみたら、Buroさんの論文なみ(か、それ以下)のσが出そうな
感じになってきました。収束が良いのでβも大きくできたし、その後の計算でも工夫を
入れたので、Buroさん論文みたいに300回試行で十分なレベルになりそうです。
ウェイトゼロのパターンはありました。FFO#40の50手目のCORN2x5に1つ現れます。
現在selective endgame searchがどんなものなのか、想像を膨らませています。
iterative widening endcutのイメージがなんとなくつかめてきました。
ソースを探して見ちゃえば早いんだろうけど、面倒だし、想像だけで頑張る。
MPCが動いたら、solver改造して、本当に速くなるのか確認する。
355:310
15/12/10 23:16:49.62 lQAJMVKx.net
結局、評価関数は1000回試行までやってます。
β・1/Nでやってるけど、それだと収束が遅いので、100回試行ごとにβを倍々に。
1000試行目で発散するステージが出たので、βを下げて最後の100試行を実行中。
その間、反復深化などで使えるように、置換表を改造。前回評価範囲をmoveorderで
再利用します。いちいち消しているとメモリ解放で時間がかかるし、全データを入れたまま
用途をキーで区別すると、使用時に選択する事になりオーバーヘッドが気になるので、
一番新しい評価値をひたすら上書きし、置換表として使用する時のみ、今回探索か
区別するようにしました。moveorderで若干割り切った作りです。
同時に中盤探索(MPCなし、反復深化)をちゃんと作ってみました。MPC計算で、結構深い
深さまで探索する予定なので、反復深化が上手く機能するようなMPC計算ロジックを考え
ようと思っています。
それができたらiterative wideningのテストをしてみようと思います。
356:310
15/12/11 22:32:36.55 c1YdnEjo.net
あちゃ。ウィンドウ幅1でiterative wideningやると、正解着手もβカットされた手も
置換表の値が全部同じになって、次の探索でmoveorderが意味なしになって、
速度が大幅低下する事が発覚。
仕組み考えないと・・・。
357:310
15/12/13 23:14:55.34 RUGsIY6w.net
一応回避したけど、MPCの速度向上は限定的。
中盤探索というか評価関数が驚くほど遅いのだろうという結論に。
放置していた中盤探索の素の高速化に入ります。
1か所ネタはあるんだけど。
358:名前は開発中のものです。
15/12/18 00:28:56.19 ht2BaviT.net
中盤探索で2か所改良して、速度は2倍にアップ。まだzebraの6掛け程度の速度です。
終盤探索のiterative wideningを想像しながらテストするも、いまいち速度向上が望めない。
MPCのカット基準を緩めながら(widening)、置換表にmoveorderを貯めていく事でβカット
をどんどん起こさせて、最後の完全読み時点ではほぼ完ぺきな順序に並び変える事で
高速化を実現する方法だと想像しているんだけど、違うのかなぁ。
そんなこんなでやけくそ気味に、浅い探索(11手読み)+negaScout(-∞,+∞)を試したら
FFO#40で1.93秒という最速タイムが出てしまった。MPCもMTD(f)も意味なしorz
#41,#42もこの方法でかなり高速化したけど、それでもまだzebraの方が速い。
359:310
15/12/20 17:21:06.88 UpZkem/K.net
中盤探索で改良をしたらかえって遅くなるを繰り返してます。
で、やけくそ気味にmoveorderの「置換表がない時」の計算値を、簡素化してみたら
中盤探索の速度そのままに、終盤探索部分の探索ノードが減少して高速化。
終盤探索部分も同様に簡素化したら、FFO#40で1.75秒以下になりました。
それでも相変わらず#41/42はzebraがずーっと早い。
で、MPC使うと遅くなる理由を考えていたら、いま使っているMPCのセットは終盤探索用に、
残り手数と浅い読みのセットを独自パターンにして計算した奴だと言う事を思い出した。
深い探索のスコア=終局のスコアとなり、深い探索が不要になるので。
中盤の高速化するネタももう出てきそうにないし、先に進むか・・・
360:名前は開発中のものです。
15/12/23 11:41:36.91 Acs4Om0o.net
iterative wideningって詰め碁用のアルゴリズムっぽいけど違うの?
310の言ってるのってただのAspiration Searchか何かに見えるけど
てか置換表にmoveorderを溜めるとはどういう意味だ
361:310
15/12/23 16:26:13.00 MLtsaD3t.net
どもです。
Buroさんのパワポっぽい資料に名前しか書いてないので中身がわかりません。
わかっているのはMPCと併用するらしいことくらいです。
iterative wideningで検索すると確かに碁の関連の英語論文がヒットしますね。
関係なさそうだと思って放置していましたが、ちょっと見てみようかなぁ。
置換表云々は、僕の想像です。
αβを前提にしたアルゴリズムで高速化するネタの一つに、moveorderを工夫して
βカットが起きやすくするってのがあると思います。
反復試行する際、置換表には前回の評価の範囲が入っています。
それを今回探索のmoveorderの並べ替えに利用しようというものです。
反復深化なんかと同じ考え方です。
逆に言うと、反復を前提としたアルゴリズムで高速化するネタが、それくらいしか
思い浮かばないのです。
362:名前は開発中のものです。
15/12/23 20:37:25.92 Acs4Om0o.net
ああ、オーダリングに以前の探索の結果を置換表から引いて使うってことか
置換表に順列か何かを放り込んでいくのかな?とか思ってしまった
bitboard + NegaScout + 置換表 + MPC + 評価関数とマージンの学習
をやってるっぽいのはわかったけど、とりあえず定番どころは全部入れてるのかな
NegaScoutで最初のノードを探索するときに、
探索窓を(-inf, inf)で探索せずに、前回の評価値eを使って
(e - d, e + d)で探索して、失敗したときに限り窓を広げて再探索するのがAspiration Searchだけど
もうやってるかな
あとCPUのSIMD命令使ったり、並列化したりとかはめちゃ効果でかいよ
363:310
15/12/23 22:38:37.71 MLtsaD3t.net
>>362
ご助言ありがとうございます。
MPCはまだ途中ですが、そんな感じです。
終盤n手高速化の類もしています。中盤探索だと葉に近いところで置換表外すと、
著しく速度が低下するので、最後まで置換表を使っています。
で、中盤の速度がいまいちで12手読みくらいが実用範囲って感じです。
MPCでd計算に100棋譜くらい試して一晩で計算できる範囲は13~14手くらいが
限界な感じです。そろそろMPC計算しちゃおうかと思いつつ、まだ悶々と中盤探索で
どこか高速化できないかトライ中です。
SIMD命令はコンパイルオプションでそれらしい場所があったので、設定してみましたが、
速度変わらずで放置しています。どうやって使うものなのでしょうか?
そもそも、組込関数のpopcountとかbitscanで64ビット版が使えずに放置してる状況です。
並列化はMPCが終わって、一通りオセロの形にしてから、次ステップで勉強しようかと
思っています。
アスピレーションサーチは、1σは±7~8手なので試しに±8の幅にしてテストしてみた
ところ、確かに若干高速化できている様子です。mtd(f)は下から寄っていく時はβカットが
効くのですが上から寄っていく時は遅いので、一発目で探索できる確率を上げつつ、
ある程度幅を絞るには、このくらいがちょうど良い感じですね。
364:310
15/12/24 20:33:24.09 zDiJT168.net
ちと調べてみました。SIMD命令はx64でコンパイルしている時は、設定しなくても自動的に
使うようになっているみたいな説明を見つけました。
並列化とかベクター化とかもコンパイラが自動でやってくれるみたいですが、レポート出し
たら確かに一つも対象になっていませんでした。評価値算出とmobilityの2関数は、なんか
効きそうな気がしますので、少し悶々とトライしてみます。
また、_mm_popcnt_u64と_BitscanFoward64は、今やってみたら、何故か使えました。
色々とコンパイラのオプションをいじったのが原因かなぁ。謎。
多少速度アップした模様です。
アスピレーションウィンドウはdの計算しなきゃと思っていましたが、よくよく考えたら、
評価関数の計算時の誤差ログが残っていますので、そいつでパラメータ作成してみます。
と、久々にFFO#43まで時間計測したところ、#43で答えが違ってる。
数か月前に最終2手高速化をいじった時にバグを仕込んだ模様です。
調べようとdebugモードにしたら64ビット組込関数が使えない。
やっぱりコンパイルオプションのどこかみたいですが、わからない。
だんだん問題が発散してきて、頭の切り替えが追い付かなくなってますorz
365:名前は開発中のものです。
15/12/24 20:53:24.01 DG4HDn4P.net
pop_cntはめちゃめちゃ速度上がった経験あるが(三割アップ)
オセロだとそうでもないのかな。
366:310
15/12/24 22:56:29.36 zDiJT168.net
_mm_popcnt_u32()はすでに使っていました。u64が使えなかっただけです。
u32→u64で3~5%くらいの高速化になっています。
困った事に、debugビルドの側では、まだ64bit版が使えていません。
debugを使いたい時は32bitに直さないといけない。
コンパイルオプションをいろいろ見比べていますが、どこなのかいまだにわかりません。
#43は最終2手なのか1手なのか、どちらにバグがあるのか切り分けようとして
ソースいじっているうちに直ってしまいました(汗)。
367:名前は開発中のものです。
15/12/25 15:25:23.28 skIhqDAd.net
>>364
コンパイラの自動ループ展開(あんま賢くない)に限らず、
手動でAVXだのSSE命令だの使えるところは使ったらという話
あとMPCは本質的に前向き枝刈りなので、過激に刈りすぎると答えがずれる可能性はあると思うけど
(バグの原因は当たりがついているようなので関係ない気がするが
368:310
15/12/26 11:23:54.66 2a5cp76f.net
どもです。バグったところはMPC使って無い箇所でした。
コンパイラの自動ループ展開は上記2か所で試してますが、なかなかうまく行きません。
なんとか依存関係を解消してループ展開強制すると劇的に速度低下する状態です。
その代り、いろいろググっていたら、BMI命令を見つけて、BLSIとPEXTを使ってみました。
速度バランスが変わったのでパラメータで置換表適用範囲を狭めるなどもしましたが、
FFO#40で1.55秒前後まで高速化できました。中盤探索も高速化はしているはずですが、
数%程度の改善というところでしょうか。まだ50%は高速化したい状態です。
色々アドバイスいただいたお蔭で、ようやくSIMDまわりの使い方がわかってきました。
ここまで来ると、BITBOARD操作の関数の見直しをしたくなりますね。
中盤探索の一番重い部分なので。
369:310
15/12/28 10:45:49.88 i0yT273K.net
デバッグモードでu64系の関数が使えない件、解消しました。
MTD(f)に代えてアスピレーションウィンドウを採用しました。
中盤探索は、隣の評価値をたどっていくと、かえって遅くなるのでnegaScoutだけで
探索していましたが、これでMPC計算が多少高速化できそうです。
MPC計算はまだしていません。反復深化でどのくらいの深さの探索で、どのくらいの
件数なら実用的に計算できるか試行しています。14手読みまでは行けそうですが、
15手だと厳しいかなぁという状態。20手付近では盤面によっては、探索ノードが爆発的
に増えて、時間のバラツキも大きいです。
また、FFO#40-44の完全読みを計測しました。zebra比で#40は圧勝、#41-42は引き分け
ですが、#43-44は完敗。理由は#43-44は正解となる初手が2つあるためで、#43は10秒
以上かかってます。むむむ。
370:名前は開発中のものです。
15/12/28 21:28:38.25 kMgyHY3u.net
オセロ完全解析は何年後くらいになりそうですか?
371:310
15/12/29 02:31:09.04 F/Ba7yoX.net
ちょっと一括変換操作を誤って大変な事になっていました。一通り直していたところ、
FFO#40で1.45秒程度が出るようになってしまいました。多分、修復がてら置換表登録・
検索関数の変数の並びを、整列したのが効いたのだと思っていますが、びっくりポンです。
前回課題の正解着手が複数あるケースですが、MTD(f)のような評価値決め打ち系の
探索では、ぴったりの答えが見つかった時点で、ほかの手を探索する必要が無い事に
気づき、直してみたところ、FFO#44は速度アップしました。が、#43はまだ駄目です。
とはいえ、#43は浅い探索の評価値が外れすぎて時間がかかっているような感じなので、
浅い探索の深さを残り手数で調整すると直りそうな気がしています。
あと、FFOテストの全データをテストできるように登録しましたが、#59を見て、はたと、
途中全滅時のスコア計算が違う事に気づきました。自分のは一番単純なアメリカルール
です。ここを直すと、確実に時間が遅くなるような気がしますが、明日直してみます。
てな事をやって、一晩に0.1秒(比率にして7%前後)も短縮していると、まだなんか
やる事があるんじゃないかと・・・。
372:名前は開発中のものです。
15/12/29 03:05:56.17 rs+91GZQ.net
結局MTD(f)をやってるのかやってないのか意味わからんな
373:310
15/12/29 10:25:40.74 F/Ba7yoX.net
って、βカットしない事を確認しなきゃきゃいけないから、ぴったりの答えがあっても
全手を探索しないとダメじゃん。すんません。
374:310
15/12/29 10:52:28.77 F/Ba7yoX.net
>>372
やったりやらなかったりで、いろいろ比較して試してます。
MTD(f)では、ワーストケースではウィンドウ中心が評価値の最少単位で動く関係で、
1石以下の少数計算をする中盤探索では、よけいに時間がかかる事が多いです。
そのため、アスピレーションウィンドウ導入前はただのnegaScoutにしてました。
終盤探索は、最少単位が1石になりますので、許容範囲です。
MTD(f)もアスピレーションウィンドウも、所詮本チャンのnegaScoutを呼び出すための
ドライバーにすぎないので、どちらも用意して、何かの折に速度比較しています。
今回は、ボツりましたが、ぴったりの値が見つかったら後の探索を省略する際には、
MTD(f)の方がマッチングが良かったので、そうしました。
ボツになりましたので、またアスピレーションウィンドウに戻りましたが。
#40ではzebraよりはるかに高速化できましたが、#43など遅いケースでは、数倍の時間が
かかります。こういうタイプの時間差は、単純な高速化じゃなくて、何らかのアルゴリズム
の違いがあるのかなと想像しています。
375:310
15/12/30 00:01:33.75 lfikhn/D.net
結局、本日は探索速度アップばかりやってました。
中盤探索というか評価関数の計算でBMI2命令を徹底的に使ってみました。
また、ボードの回転操作系も見直しました。
10%程度は高速化できたと思います。でも、期待したほどではなかった。
あと、速度アップするなら、ボードの対角線転置かなぁ。あと効果は微妙だけど、180度
回転がビットオーダーの逆転なので、これも何か組み込み関数があったらうれしいなと。
終盤探索では、FFO#59問題に対処。
スコア計算の修正と、全滅など64石の差がついた時に、βカットと同様に後続の探索を
パスして時短。minMaxで言うところのα値の更新があり得なくなるからです。
浅い探索が11手だと3秒程度で解けるのに、15手だと60秒かかったりと、いまいち動き
に納得がいかないので、まだ何か問題があるかも知れません。
中盤探索をあと50%は高速化したいなぁ。というか、zebra見てるとできるはず。
376:310
15/12/31 21:04:10.05 i5TR43+g.net
2015年の年の瀬は、MPC計算のメモリーリークの原因探しで更けていく・・・
置換表クラスあたりっぽいんだけど、デバッグの仕方が良くわからないという・・・
377:310
15/12/31 23:46:42.84 i5TR43+g.net
ギリギリ12時前に直った。
メモリリークではなく、不正なアクセスでした。
多分直ったと思う・・・
来年の抱負は、MPCの計算をする事と、GUIを作る事です。
元々VBのGUIからDLLで呼び出すつもりでしたが、なんとなくC++でやってみようか
という気になってきています。
378:310
16/01/03 11:08:48.54 3YPfF+nL.net
バグは解消してました。なんとも不可思議な事になっていました。
スタック領域を破壊していて、破壊された箇所がたまたまdepth(残り探索深さ)だったため、
探索深さがマチマチになってました。計算時間やメモリ使用量が異常になる以外は、そこそこ
それっぽい探索結果が出ていたため、メモリリークだと思ってしまったという。
中盤探索の置換表適用範囲も、ちゃんと効くようになって深さ11~12まで置換表を使用
するのが効果的と出て、探索値のバラツキもそこそこ揃って、探索時間も予想できる範囲に。
メモリ使用量も安定しました。
ある棋譜に対し、20手目から終局まで順に、深さ1~17の探索を、反復深化を活用しながら
探索値を求めるプログラムを用意して、14棋譜を対象に実行したところ凡そ7時間で完了。
速度的にはこんなものかなぁという感じ。もっとも、深さ17だと結構、探索時間・ノード数の
バラツキが大きいので、10件前後だと終了時刻もバラツクはず。
とりあえず、棋譜からランダムに10件程度を抽出し、この探索結果を貯めていくところまで
作りました。トータル100件程度集めれば、MPCパラメータ計算には十分だと思う。
探索結果を貯めてあるので、毎晩10件くらいづつ追加し、直説法で都度パラメータ再計算
して精度を上げていく事ができる。
379:310
16/01/04 22:22:10.63 1p46+Vgy.net
MPCのための探索データ蓄積の間に、並列処理について調べてみました。
VC++だとopenMPとPPLってのが使えるみたいです。
?concurrent_unordered_mapが便利そうなので、PPLにしよううかなと。
で、脳内コーディングであれこれ考えていたら、AIの中でBoardクラスを参照渡しして、
差分型で盤面を進めたり戻したりしているのが、とても並列処理と相性が悪い事に
思い至りまして・・・。コピー型に戻して、何をクラス化するのかとか見直してみようかと
言う事に。
多分数日がかりになるかなと。
380:名前は開発中のものです。
16/01/04 22:36:46.74 iMclxIQO.net
Boardはスレッドごとに持てばいいんでない
スレッドを生成するときだけコピーすれば
381:名前は開発中のものです。
16/01/05 01:07:47.45 UyX0E5Wd.net
自分の場合は将棋作ってて、並列にしたけどstockfishのソースとか参考になるよ
スレッド待機させてノードの終わりの方で判定して、OKなら分割させて
そこで上でも言われてるけど、盤の情報をコピーして走らせるの
自分は盤面作成とか更新巻き戻しなどを最初スレッドとか考えてなく直にアクセスしてて
全てポイントにからに変更するのが、かなりだるかった
382:名前は開発中のものです。
16/01/05 20:35:26.92 zrGyzNpa.net
へーこのスレって意外と人いるんだなぁ
将棋作ってる人がいるとは驚き
383:310
16/01/09 02:12:28.10 GhyCVx1P.net
どもです。
とりあえず、コピー方式に変えてましたが、変にバグを仕込んだりして、時間がかかって
ました。ようやくデバッグもあらかた終わったのですが、まだ原因不明・解釈不能な速度
差があって、終盤探索のみ速度が10%以上低下した状態です。
というか、コピー版を書きながら気づいた箇所を、ボードクラス版にも反映すると、ボード
クラス版が高速化して、差が広がるという。
で、クラス版がFFO#40で1.40~1.42秒になりました。
>>380さん
おっしゃる通りですorz
プログラム直しながら、ネットでVC++の解説をつまみ読みしながらのコーディングに
限界を感じたので、オライリーさんの出番という事で、アマゾンに本を数冊注文しました。
到着待ちの間にやるなら、適当に作っていったクラスの整理統合かなぁ。
あと、openMPのお勉強。
384:名前は開発中のものです。
16/01/09 02:32:30.66 Uphigh+6.net
最近のvc++使ってるのなら普通にstd::threadでやるのもいいかも
385:310
16/01/10 01:14:26.88 F6Uvkb4b.net
うわ。色々やり方あるのね。
VC++だとPPL、openMP、std::threadか。
PPLについては、逐次処理のまま置換表で使っているunordered_mapをconcurrent版に
変えてみたところ、置換表付探索の速度がおおよそ半分になってしまったので、結構
微妙な印象を持っています。
とりあえずopenMPでどこまでできるか試してみて、気に入らなかったらstd::threadで
細かく制御できないか考えてみます。
先ほど、コピー版で置換表登録に影響するバグ発見。直したところ、FFO#40が1.26秒
とかになってしまいました(汗)。不可思議な速度差の原因はこれで間違いないと思います。
edaxまであと10倍の速度アップかぁ。並列化で3倍くらいまで詰められないかと期待。
一応、Boardクラスのポインタ渡し版(差分方式)も試してみましたが、今のところ、若干
速度低下しています。もともとの差分方式は、Boardクラスを継承したAIクラスのメンバ
関数として実装してます。
これらの一見無駄な作業も、バグ探し&逐次探索の速度アップに有効だったという事でorz
386:310
16/01/11 20:31:40.39 IrhGHm3u.net
とりあえずopenMPで並列化トライしてみましたが、コンパイル中に内部エラーになる。
ネットで見ると最適化オプションがらみらしいけど、なんかよくわからなかったのでパス。
PPLを使って、とりあえず並列化のテスト。オセロでは標準的と思われるn段YWBCに
してみました。forループみたいな特定の形ではPPLは結構簡単という印象。
バグは一通りとれた状態だと思いますが、FFO#40で1.25秒が0.85秒程度になり
30%強の高速化。あと少しだけソース修正するつもり。
使ってるパソコンは2コアでした。昨夜まで4コアのつもりでいましたが(汗)、2コアなら
こんなものなのかな。
387:名前は開発中のものです。
16/01/11 21:53:26.50 oLh2eOse.net
2コアYBWCにしてはまあまあ並列化されてるような感じ
もちろんもっと効率化はできるけど
388:310
16/01/13 13:02:44.01 Yd1pcfW8.net
どもです。
コア数2だと、理屈の上では2倍近くまでは速度アップできるのかなぁと思います。
一般的にはどのくらいの倍率をターゲットにしているのでしょうか。
YBWCの適用のパターンをいくつか試しましたが、タスクマネージャーで見たCPU使用率
は、ほぼ100%になってるので、単純にはスピードアップは難しい感じがしてます。
PPL自身のオーバーヘッドなのか。
PPLは楽ちんだけど、チューニング箇所がなさすぎな感じ。
あと、YBWCやってる以上、YBの着手をmove orderingする意味が無い感じなので、
sortが一つ省けるかなぁというところ。ルートに近いので、あまり効果は無いと思うけど。
ここまで来ると、8コアのパソコン持ってきたら・・・
SIMD拡張命令だBMI命令だを使っておきながら、コア数2で頑張るのもどうかみたいな。
389:310
16/01/16 09:10:45.76 mjTPCiWE.net
PPLはMicrosoftのDeveloper Networkくらいしか情報が無いので、ひたすらリンクを
たどって情報収集してますが、ほとんど機械翻訳で、結局カーソルあてて英文読ま
ないと意味が分からないという・・・
で、排他制御とかいい加減にしていたノード数カウントなどをきちんとして、ソースの見易さ
と効率を上げようと色々と細かく修正。combinableとかcritical_sectionとかInterlockedとか。
と・・・思ったら・・・中盤探索で確率10%程度で違う答えが返ってくる・・・
並列探査のバグはわかりにくくて時間を食ったのですが、どうもcombinableの動作が変。
期待した動作をしていない。でも、情報が無さすぎで、どこを直せば良いのかわからず、
結局同等の機能を動的配列にしてしまった。
390:310
16/01/16 11:37:48.70 mjTPCiWE.net
中盤探索を1万回程度回して、違った答えが返ってこない事を確認できました。
ノード数カウントはInterlockedIncrementを使っているんだけど、やはり排他待ちロスが
大きいようで、ノードカウントありだと0.8秒前後、無しだと0.7秒前後になる。
使えなかったcombinableみたいな形にして、一つの再帰関数内はローカル変数で加算
して、最後にまとめて1か所で排他加算するようにしてみようかな。
並列タスクの起動順で、探索ノード数が違ってくる関係で、実行時間のバラつきが±0.5
秒くらいになっている。
391:310
16/01/18 09:54:27.64 ED4vwFCp.net
結局、ノード数・リーフ数カウントは、戻り値を構造体にして返す方向にて検討。
普段の探索には不要だけど、solverだと表示したいので。
これで完全にローカル変数になり、排他ロスを気にする必要がなくなる。
デバッグ用の置換表回りの統計は、所詮デバッグ用なので、一旦全削除。
必要になったら、こちらは#ifdefで囲って、排他加算する。
で、構造体の形であれこれ悩んでいたら、戻り値をクラスにできる事に気が付いて・・・
あらためてC++すげーと感心中。
けど、かなり全面的な修正になるので、時間食ってます。
まずは中盤探索を修正して、ノード数がおかしくない事を確認。
終盤探索の修正はこれから。探索を使う系の統計処理も変更しなきゃならないけど、
MPC以外は、次いつ使うかわからないw
392:310
16/01/19 00:13:53.27 Dh1WPUXC.net
終盤探索の修正完了。
0.8秒±0.05秒と、結局、Interlockedでグローバル変数のノード数を加算するのと、
大して時間が変わらないか、もしかしたら微妙に遅くなったかも。元に戻すのが面倒
なので、他で改良点を探すしかないかなと。
393:310
16/01/21 10:04:20.88 c00KCFqr.net
YBWCでは、最適着手手順(PV)のラインで置換表でmoveorderする意味が無いという事
を突き詰めていくと、いちいち前回探索の置換表を引くループを回して、都度最善の着手
を求めるのではなく、前回探索で得たPVを渡せば、時間が短縮できそうな気がしてきま
した。ツリーの浅い部分なので、全体にどれくらい効くのかはわかりませんが。
また、浅い探索などで最適着手手順を取得する時、negaScout+置換表だと正しいscoutmiss
が発生した時に、nullサーチ時の置換表が適用されて、それ以後のPVが得られないという
事で、悩むところではあります。
まずは戻り値の構造体でPVを返すように改造して、効果を見たうえで、YBWCを適用する
深さでnegaScoutをやめてnegaMaxにするか、それともnullサーチは置換表適用外とするか
どれが良いか試してみようかなと思っています。
できるだけ高い位置で並列化した方が良いという指摘と、置換表もなるべく高い位置で
効かせた方が良いという指摘の、どちらを優先するのかですね。置換表はばっさり探索
をカットできるけど、並列化はカットせずに時短するので、置換表優先かなという気もして
いますが、高い位置でどれくらい置換表が効いているのかもわからないですし・・・。
394:310
16/01/23 01:31:00.95 0OQfWIYl.net
パソコン再起動すると、何かのタスクがCPUを30%くらい占有してしまいます。
昨日まで快調に動いていたのが突然遅くなって、悩んでいましたが、これが原因のようです。
というわけで、本日は色々改変したソースの速度が計測できずに悶々としてました。
色々すったもんだ挙句、PVラインを渡す形にしましたが、効果があったかどうかは微妙。
色々付け足した事で生じた速度低下はペイしたかなぁという感じで、#40で0.78秒前後。
本格的にネタが尽きて来たので、ここから先は、MPCをきちんと実装してiterative widening
にかけるしかないかなぁという感じです。あと、定数で渡している置換表適用高さなどの
パラメータを、空マスや使用条件で作ると、実用的になるかな。
395:310
16/01/27 01:18:29.98 IVwAw5rN.net
オライリーの並列化本が来たので拾い読みしながら並列プログラミングの勉強。
PPLの各アルゴリズムが何を目的とするものなのかが、少しずつ分かってきました。
抽象化度が高いので、最初のとっかかりとしては良いかも。何故かcombinableが
上手く動かないとか、parallel_reduceの中身がよく分からないとかありますが。
で、並列化できるところを探して速度が上がるか試したり、同じ処理をより綺麗に書き
換えしたりして、微妙に速度アップし、0.70~0.75秒くらい、ノード数が15M、NPSが21M
nps程度になりました。たまに0.68秒台が出ます。
Edax4.3のFFOベンチの結果を確認したところ、ノード数で1.5倍、NPSで4倍、計6倍の
差があります。NPSをコア・クロック換算しても1.5~2倍の差があり、ノード数は別として、
まだ速度アップの余地があるのではないかという事で、単品速度アップに走ってます。
ノード数はMPC導入後のiterative wideningである程度追い付けるかなと淡い期待。
いくつか速度アップネタがありますが、サッカー日本代表見ながらでははかどらず。
続きは明日。
396:310
16/01/29 11:31:08.14 trvaxUQ+.net
先日の速度アップネタはすべて不発でしたが、その際にノード数のカウント漏れを見つけ
て、修正したところ、ノード数は17~8Mという感じでした。その際に、最終2手高速化の
箇所でもカウント漏れがあり、まずは正確なノード数を簡便に把握しようと外してみたところ、
意に反して速度低下しないところか、どうも微妙に高速化したように見えまして(汗。
最終3手高速化を試してみたり、最終1手高速化も外してみたり、moveorder適用とか、
そもそもmobilityを求めずに空マスを順に着手してみるとか、その辺の適用深さを変えて
みたりいろいろとやって現時点の最適パラメータにしてみたところ、0.63~0.68秒、最速で
0.60秒が出るようになりました。
αβカットの効きが悪くなっているため、ノード数は24~25Mとなりました。
その分NPSは37~38Mと速くなっていますが、こんな方向で高速化してて良いのか?
というわけで、ノード数が違う段階でNPSを比較しても意味が無いという事に気が付きました。
397:310
16/01/30 20:51:37.62 yCKBToEa.net
囲碁がすごい事になってますね。オセロで一通り勉強したら小さい盤の囲碁をやって
みようと思っていたので、モチベーション低下中。とはいえ、ああいうのをオセロに応用
しようとしたら、あそこまでマシンパワーいらないんじゃないかとか・・・。
ここのところ、もっぱらSTLやPPLの機能を綺麗に使う方向での改良ばかりしてました。
pararell_reduceの使い方もわかりました。negaScoutの繰り返しループが綺麗に並列化
できたんじゃないかと。ただ、MAPする件数がしれているので、parallel_reduceではなく
逐次版のaccumlateの方が速いという結果に。あと、時間計測が結構飛び飛びの値に
なるので時間計測関数を精度1msのものに変更。
色々やった結果、若干高速化したうえで、時間のバラつきが消えてくれました。
100回試行で計測すると610ms±15ms(1σ)となり、逐次処理のほぼ2倍の速度に。
ノード数は同程度で、NPSは40M超えて来ました。このNPSのままノードを半減できれば
良いのに。
398:310
16/02/07 21:48:19.14 xNqeS9Ve.net
ここら辺で、EDAXとかとの速度差の原因を考えたところ、次の2点が考えられました。
1.評価関数の精度が悪い可能性
2.個々の関数で速度アップの余地がある可能性
という事で、1は熟考が必要なので後回しで、速度アップの対象として、flipとmobilityの
高速化を検討。とはいえ、良い知恵があるわけでもないので、ネット徘徊。
現在、ポインタ関数で分岐して処理しているflip関数を1発で処理するopenCLのソースを
発見。Master Othelloの作者のものでEDAX4.3のflip関数を参考にしているらしい。
中身を解読するとベクターを使っている。とりあえず処理を真似て逐次処理で組んでみたら
結構速度アップしました。
解読の過程で、ようやくベクタ化の意味がわかったので、mm256系の命令を使って、
ベクタ化してみましたが、若干速度低下。原因は恐らくlzcntで一回ベクタを抜けてしまう
所だと思うので、ハッカーのたしなみを読んでベクタ演算で組み直してみる予定。
合わせてmobility関数もベクタ化。若干速度アップしたかなという程度。
組み込み関数は使い方が面倒臭いので、演算子のオーバーロードしまくってみました。
flip関数は非ベクタの分岐無しバージョン、mobilityはベクタという状態で、500msを切る
数字が出るところまで来ました。flipのベクタ化ができて、パラメータ調整するともうちょい
良い数字が出るかなと期待。
399:310
16/02/09 01:09:41.58 MeGl+gwc.net
flip関数続き
・lzcntを自前で組んでみましたが、やはり処理が重く速度低下。ボツ。
・右方向と左方向で処理が違うので、片側+180度回転で、同じ処理にしてlzcnt不使用
にしてみたが、180度回転×4が重くて速度低下。ボツ。
・できるところまでベクタ化して、lzcnt以後はスカラ計算で、速度若干改善。
・上記からlzcnt後、再度ベクタ化してみたら、速度若干低下したのでボツ。
・64bit×4の値を代入する関数を変更したら、意に反して結構速度改善。
・闇雲に__declspec(align(32)) してみたら若干速度改善してバラツキ減少。
これらにより、450msくらいになりました。
ベクタ化はまだ何かありそう。
ちゃんと書いてなかったですが、途中からノート数カウントを外してます。入れると100ms
程度の速度低下になります。一応、デバッグ用に#ifで切り替えられるようになってます。
が、そんな状態なので、nps計算に意味が見いだせないという・・・。
続いて評価関数をベクタ化できないか考えましたが、BMI命令使っているので厳しい。
計算楽にするため、でかい配列を何回も引いているので、ここを何とかしたい気がする。
黒・白・空の3を基数とする3進数でナンバリングしているんだけど、高速で計算する方法
が見つからず。
平衡3進法を手早く計算する方法があると、黒を1、白を-1、空を0にして、定数足すとか
できるんだけど、どんなに調べても、基数変換に王道なしという言葉しか見つからない。
400:名前は開発中のものです。
16/02/15 00:14:34.50 2rfyeFpJ.net
高速化については一旦棚上げ。何やっても速度が上がらない。
ひたすらノード数カウントの速度低下を抑えて、カウントのバグ取りして。
色々発見はあったけど、結局ソースを綺麗にしただけだった。
後は、いずれゆっくり時間をかけて、評価関数を作り直すかな。
MPCを組みました。一応動作している模様。
これからしばらく、GUI作りに入ります。
MFCよくわからん。
401:310
16/02/20 13:43:08.30 ZGi2V8ih.net
GUIできた。昔作った序盤定石部分と合体。
中盤探索を反復深化にして、3秒を超えて新しい深さに入らないあたりで調整。
MPCで25手くらいまで読めるように調整。
終盤完全読みは38手から。36手からMPC付で完全読み(つまり完全ではない)。
こんな感じでできたので、早速プレイ。自分だと軽く全滅負けしてしまうので、zebra先生
にお越しいただきました。が、滅茶苦茶弱い。
良く見ると、定石が効いている段階で+16だったのが、中盤読みになった瞬間に一気に
-14くらいまで落ちて、そのまま挽回できない感じ。zebra先生は、その前に定石から外れ
て、既にzebraから見て+14程度の評価値を算出している。つまり、定石部分がおかしい。
それ以外は、評価値もzebraとは大きく違わないし、終盤探索もちゃんと機能している感じ。
402:310
16/02/20 23:06:47.33 ZGi2V8ih.net
zebra先生にならって定石の評価を表示するオプションをつけてみました。
ロジック的には間違いなさそうですが、定石DBがおかしいというか、定石に登録がない
手順に正しい変化があって、それを無視しているため、間違った判断をしているみたい。
一応、完全読みという触れ込みの棋譜を元にしているはずなので、使い方をどこかで
勘違いしているんだと思います。しばらく悩むしかなさそうです。
403:310
16/02/21 01:04:17.33 nPWuqcvw.net
試しに定石部分を外して、中盤探索で開始してみたら、zebraの20手読みに対して
2戦して1勝1分となりました。読みの深さは、こちらが上なので、こんな感じでしょうか。
序盤20手分は評価値が無いので、20手近い探索を反復無しで探索するため、MPCを
使っても最初の数手は1手あたり5分以上掛かってしまいます。
定石については、以前にウェブで見つけてテキストに起こした定石データがあるので、
それを評価0で登録してみようかなぁと思っています。
定石の自己学習とか、評価付けとか、どうやるんだろ。
404:310
16/02/25 21:06:56.39 fXRsnvrs.net
定石データを、上記の手打ちデータで作り直しました。
当初は並び取りとかの極端な進行以外は評価0.0にしたため、mobility関数のビット列
の下から定石に従って着手する形となり、zebra先生のBookに誘導されるように、少しずつ
不利な定石に乗り換えていき、負けるという展開に(汗
悔しかったので別のソフトを拾い、戦ってみると、そちらには圧勝。決して弱くはないと思う。
また、zebraとの対戦時にBookで評価値がついているものは、それを参考に修正したところ、
時々勝てるような感じになりました。
EDAX先生+UnifiedBookなるものを拾って、そちらと戦ってみたところ、軽く惨敗。
fjt定石とかだと終盤近くまでBookがあるみたいで、Bookが続く限り紛れが無い。
こちらが中盤探索などでミスるたびに-2づつ落としていき、お話にならないレベル差を感じました。
しばし熟考の上、定石の拡張、評価付けを考えてみようかと思います。
あと、評価値が近い時には、何らかの確率で手を選択するようにもしてみたいと思います。
405:310
16/02/28 01:10:48.52 hQzoi2Tz.net
縦取り系は白番黒番試して、定石の評価値を修正してみました。
あと、AIの進行ごとのパラメータを試行錯誤して、なるべく負けないようにしてみました。
これにより、AIの読み時間が結構伸びて、1ゲームワーストケースで1手2分、トータル
5分くらい思考してしまいます。これは、反復深化などで、タイムアップをせずに、次の
ステップに入る制限時間だけ決めているためです。
EDAX+Unified Book先生はレベル21で、黒番白番ともに引き分けになります。
こちらは20手前に定石が切れていますが、その後も最善手が打てているという事になり
ます。こちらは何局打っても手を変えないので、EDAX先生のBookの進行に合わせた
だけですが。一方zebra先生は比較的手をいろいろ変えてくるので、勝ち負けが発生します
(もちろん、各アプリの設定次第ですが)。
序盤定石の評価値をそれなりにしたら、後は引き分け進行をひたすら登録していって、
相手が最善しか着手しないと信用すると負けないプログラムができちゃうのではないか
と、ふと思いましたが・・・。トップ同士の対局が引き分けばかりになるのは、こういう事
なんでしょうね。というか、完全解析ってこれが完成した状態なのか。
EDAX先生のUnified Bookは、いくつかの引き分け進行棋譜の集合体のようですが、
元データが幸い既知のWthor形式なので、それをもらってしまうと、トップレベルになる
のかなぁ。トップな人がBook構築に主眼を移したり、開発が止まったりする訳だと。
そろそろ、混とんとしているプログラムを綺麗に直して、パクリBook作って開発終了しちゃ
おうかと思い始めています。速度的には、まだまだ改善の余地はありそうですが。
406:じょげなら ◆kXDiHQuNQ2
16/02/29 19:18:07.19 etqtABZA.net
ライフゲーム囲碁というゲームのネット対局場を作りたいです。
囲碁でいうKGSみたいなのが理想です。
プログラムはある程度わかりますが、ネット関連の知識が乏しいです。
何から始めればいいですか?
407:名前は開発中のものです。
16/02/29 19:21:39.28 etqtABZA.net
URLがNGワードに引っかかる…
408:名前は開発中のものです。
16/02/29 19:34:26.59 etqtABZA.net
好きな言語
C++
C#
Ruby
嫌いな言語
Java
Python
Perl
409:406
16/03/01 20:52:33.32 6wFQeZGp.net
とりあえずHTML5の本買ってきた
410:406
16/03/03 19:44:49.47 Hi4nZgiL.net
URLリンク(fast-uploader.com)
碁石をぽちぽち置けるところまで作った
411:310
16/03/04 10:15:09.55 Q4DtXsqP.net
>>410
一晩考えてみた。
通信回りに興味を持って遊んだのは15年くらい前だし、Javaとかイメージしかないし。
あまり助言できる事はありませんが、一つ言えるのは、UIに凝ったりサービス内容を
考えたりするのは最後で良いと思います。
Rubyが好きなら、まずはCGIベースで、テキスト表示で対戦を実現する仕掛けを作る事
だと思います。次に複数のユーザーが接続するのであれば、身元確認のためのID/パス
ワード管理が必要になりますし、個々の対戦を区別するにはセッション管理が必要になり
ます。この辺は、スタンドアロンのアプリには無い、独特の世界なので、結構新しい技術、
テクニックの習得が必要になるかと思います。いまどきあるのかわかりませんが、チャット
のスクリプトとかあれば、参考になるかも。
その辺から入り込んで、いろいろ調べていくと、だんだんと必要な技術、知識が増えてくる
んじゃないかと思います。
412:406
16/03/04 18:58:38.77 w3YPuhPg.net
>>411
レスありがとうございます。
確かにセッション管理とか知らないです。
チャット調べてみます。
413:406
16/03/07 21:05:27.22 NI+TTWmM.net
RoRの本買ってきた。
チャットはまだ調べてない。
414:名前は開発中のものです。
16/03/09 19:45:29.94 Cf1/SDqU.net
うおおおおセドルがああああぁぁぁ
415:310
16/03/10 02:00:10.79 hvbQwbFh.net
うむむ。
これにて、オセロができたら次は囲碁という目標が雲散霧消してしまいました。
どうしよう。
416:310
16/03/10 18:05:03.79 b1SmaPOg.net
AlphaGO強すぎ・・・orz
今夜は、囲碁関係者だけじゃなく、AI周りの人も、Google以外全員お通夜ですね。
417:名前は開発中のものです。
16/03/10 19:38:43.78 SphVvbk5.net
310氏もalpha碁注目してたか。
セドル一発入れてほしいなぁ
418:名前は開発中のものです。
16/03/11 09:04:36.30 HTdTU0Fi.net
浮上
419:名前は開発中のものです。
16/03/12 12:19:15.41 k2nAbsiz.net
おお、このスレ生きてたんだ
なんで RoR なんか見てるのよスレ間違えたかと思った
420:名前は開発中のものです。
16/03/13 18:01:59.50 X9umXTnK.net
せどるううううッよくやったあああああぁっ
人類の勝利やあああぁぁっ
421:名前は開発中のものです。
16/03/13 19:02:49.19 Gv0++KTh.net
お、第四局はセドル勝ったか
422:310
16/03/13 20:47:23.70 50OeMIN8.net
うむ。なんか期待を裏切られっぱなしw
この負けっぷりを見ると、囲碁もトライしたくなってくる希ガス。
423:406
16/03/15 20:44:49.53 NF77F+OG.net
RoRとjavascriptの連携がよくわからん。
でもちょっとづつだけど進んでる。
424:310
16/03/16 23:06:52.43 YEZK1fac.net
アルファ碁ロスまっただ中ですw
オセロ作ったおかげで、一連の勝負をいままでとは違う視点で見れたかなぁ。
とりあえず、囲碁のモンテカルロ解説した本と、ディープラーニングの入門書を
買ってきた。さらっと読んだけど、ディープラーニングは理解に時間がかかりそうorz
オセロで3層パーセプトロンを試したときは、結局うまく動かなかった。
実装が悪いのもあるけど、学習にもすごく時間がかかった。
あれをディープにしたら、どうなっちゃうんだろうかは不安ではある。
こちとら、SurfacePro3しかないし(汗
425:406
16/03/19 20:06:25.11 Ik15FlWh.net
railsでdeviseとかいうgemをつかってユーザー認証機能実装したけど、
複数ユーザーがログインして対局させる方法がサッパリわからん。
426:406
16/03/24 20:20:54.97 C08ak5N3.net
ブラウザ閉じたときに自動ログアウトのやり方がわからん
427:名前は開発中のものです。
16/03/25 13:51:48.34 9Ea9sx62.net
ブラウザは通信があった時にしかクライアントの消息が確認できない。
n分アクセスが無かったらサーバー側で勝手にログアウトさせちゃう
タイムアウト方式が普通かなと。その時間経過後にアクセスがあっても
ログインからやり直し。
このログインからタイムアウト(ログアウト)までの間をセッションと呼ぶ。
428:名前は開発中のものです。
16/03/25 14:16:19.46 9Ea9sx62.net
1行目おかしかった。
>WEBサーバ、ブラウザという仕組みは、ブラウザから通信があった時にしか、
>サーバーはブラウザの消息を確認できない。
に修正。
1.初画面からログインする
2.サーバが、HTMLにセッションNoを埋め込んで、ブラウザに表示。
サーバでは、セッションIDを配列などで管理して、IDと最終アクセス時間をとっておく。
3.ブラウザ側からのCGIリクエストには、必ずセッションNoを入れて送信。
セッションNoで、相手がだれか(ID)を特定して、処理を行う。
つまり、個々の処理はセッションNoで管理されている。
4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ
あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。
この辺が基本。対局型の場合。
5.2つのセッションが対局している事になるので、対局管理する配列を用意。
6.相手の着手待ちの時に、どうするのか?その辺が肝。
HTMLに細工して、1秒ごとにリロードさせる。リロードにより、着手が行われたか
それとも秒読み時間切れになったか?判断をサーバーに依頼する。
などなど。やり方は色々あるかと思う。
とにかく、肝は、情報がブツ切れで、あちこちにある事。これにより、サーバーで簡単に判断
ができない事があるので、いくつかの機能をブラウザスクリプトに依頼しなきゃならん。
それでも、相手が放置して逃げた時、ブラウザを閉じて逃げた時(回線切断やPCダウン)、
などなどの例外が起きるので、それらをタイムアウト検出などで拾わにゃならん。
どうするのかなどの、例外処理をリストアップして、一つずつ対応を決めていく事。
プログラムテクニックはどうとでもなるけど、例外事象の拾い上げの方が大変。
429:406
16/03/25 17:43:19.31 /V6G/Eic.net
丁寧にありがとうございます。
javascriptのwindow.oncloseからなんとかならないかといろいろ調べていましたが、無理筋なんでしょうか。
タイムアウト検討してみます。
430:名前は開発中のものです。
16/03/26 21:27:54.24 DUGO8n57.net
>>429
そういう事を考えるんなら、Javaアプレットとか、ActiveXとかの、
ブラウザ上で動いて通信できる方法を試した方が良いかもね。
431:406
16/03/30 21:45:07.64 yYbYes7U.net
すいません、教えてください。
4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ
あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。
このゴミ掃除というのはサーバー側がクライアント側から何のアクションも受けずに
能動的にタイムアウトしているセッションをみつけ削除するということですか?
どうやって書けばいいのかわからないのですが…
432:名前は開発中のものです。
16/03/30 23:26:15.10 DNbQONAE.net
>>431
そうです。別にしなくても良いし、月1回手作業で削除しても良いけどね。
433:406
16/03/31 20:31:39.10 dkaj1Oq1.net
>>432
手作業ですかうーん。
まあ、頭の片隅に置いておきます。
ありがとうございます。
434:名前は開発中のものです。
16/04/01 19:52:02.46 JLskKsZt.net
隠しコマンド受け付けるようにしておいて
管理者のクライアントから定期的にコマンドを投げればいい
435:310
16/04/05 10:45:13.03 82XTVDoH.net
久々登場。アルファ碁ロスがでかすぎて、やる気がでないです。
とりあえず、BOOK上で乱数入れて手をばらけさせるようにしました。あとの課題は、
1.持ち時間制度
2.ステータスバーの更新
標準のStatusBarだとOnMouseMoveなどで更新されるとの事。
リアルタイムに更新させるためには、マウスくるくるさせてなければならん。
3.中盤探索の高速化
反復深化+置換表で高速化が効いていない懸念があるけど未確認。その他の高速化検討
4.同じ手順で負けないためのBOOKの自動学習
5.オフラインでの引分手順の自動生成
となります。けど・・・本当にモチベーション上がらない。
時々、気が向いた時に、Zebra先生やEDAX+UB師匠相手にポチポチ手打ちで対戦して、
相手のBOOKに登録されている引き分け手順を見つけて、手入力でBOOK更新してます。
Zebraは研究モードがあるので、ほぼ拾い終わりましたが、逆に引き分けだらけになりました。
EDAX+UB相手だと、こちらが定石から外れるケースでも、EDAX側は学習データで先が
見えていて打ってくるので、ほぼ負けになります。
たまに、EDAX+UBも中盤探索が走ってくれて、極まれに勝勢になる事がありますが・・・
何が腹が立つと言って、そういう時に限って完全読み時にEDAXがバグって、既に石がある
所に着手して逆転した事にされます。もちろん反則なので勝利は勝利ですが、すっきりと
勝たせてもらえないのが腹立たしい。をのれ。
というわけで。やはりオセロは、引き分け手順のリストアップが、強さの肝である事も再確認
してしまいまして。そこまでの根性は無いなぁというのも、モチベーション低下の原因。
436:406
16/04/06 22:31:38.47 SXJnF3U3.net
ログインユーザー一覧表示できるようになりました。
RoRのコーディングは一休みして棋譜管理にとりかかろうと思ってます。
SGFをパクろうかとおもってますが、結構難しい orz.
437:406
16/04/08 22:18:30.78 kkoRA2nm.net
棋譜ツリー表示すんの結構メンドクサイような希ガス
いいライブラリはないんか
438:406
16/04/09 23:59:42.58 SBv5rCvL.net
KGSのレーティングシステム難しい。
まだそんなこと考える段階じゃないけど。
439:406
16/04/11 21:25:49.37 A4FL2sT8.net
javascriptでオブジェクトの比較ってjsonで変換してそれを比較しろとか某ページで見たけど
そんな事せにゃならんの?
440:406
16/04/12 23:02:53.74 xYnFmhAQ.net
URLリンク(textuploader.com)
棋譜ツリーだいぶ形になってきた。
441:406
16/04/16 22:59:10.60 MXucFBba.net
Rails側とjavascript側の連携がやっぱわからん。
色々めんどくさすぎ。
442:406
16/04/23 00:16:56.63 Gce7F8Ms.net
エンコード間違えてて動かなかったわ。
railsがログ吐いてくれてなきゃ一生気づかなかっただろうな。
443:406
16/04/27 21:48:14.23 JGExYAi7.net
開発に使ってたノートのキーボードが一部効かなくなったわorz.
windowsにログインできなくて焦った。
アカウントでも乗っ取られたのかと思ったらソフトキーボード使ったらログインできた。
USBキーボードとかで代用できればいいんだがどうかな~。
444:406
16/05/02 21:58:59.67 i7WwatVD.net
invalid multibyte character
とかってエラーが出るんだけど、どこに全角があるのかさっぱりわからん。
app/controllers/application_controller.rb:1にあるらしいんだけどいくら調べてもみつからん。
445:406
16/05/02 23:06:51.86 i7WwatVD.net
以下のログが出るんだけど、だれか原因わかる人いない?
Started GET "/" for ::1 at 2016-05-02 22:55:10 +0900
ActiveRecord::SchemaMigration Load (1.2ms) SELECT "schema_migrations".* FROM "schema_migrations"
ArgumentError (invalid multibyte character):
app/controllers/application_controller.rb:3:in `<top (required)>'
app/controllers/home_controller.rb:5:in `<top (required)>'
446:406
16/05/03 11:00:58.43 6pwgCgml.net
すいません、解決しました。
447:406
16/05/13 22:42:29.22 Zx20RSfa.net
やはりポーリングだけでは限界があるか?
448:310
16/05/16 21:32:31.63 KQ1qSDyb.net
モチベーションダダ下がりだったけど、なんとなくソースの整理していたら、
直したいところがいろいろ出て来て、見直し中。
後ろ向き枝刈で探索時間は変わらないけど、探索ノード数が2/3になった。
この枝刈手法の速度アップできたら面白いかもと思いつつ、元々自分が
結構高速に書いていた処理(未使用)を流用しているから、これ以上速度アップ
できるかわからん。
でも、EDAXには勝てないんだろうなぁ・・・
EDAXの孫情報からインスピレーション得てるネタだし。
449:310
16/05/26 16:01:37.05 ZBCA70ec.net
遅々として進んでいます。
ソースを一から組みなおして、いろいろと綺麗にしてます。
並列探索を入れない段階で、FFO#40が結構速くなった。
いまさらながらに、FFOテストを40~59まで実行して比較しようとしたところ、
前から薄々気づいていたけど、FFO#41以後が遅い。酷いケースになると
探索ノード数が10倍=時間も10倍になる(#51)。自分のは指数関数的に
比較的にきれいにノード数が増加している。同じようなノード数のものもあるので、
ZebraやEdaxはどこかで上手にばっさり刈り込んでいる感じ。#52以後は時間が
かかりすぎて、未検証ですが。
ZebraやEdaxもノード/秒が一定しているので、置換表みたいな重い方法では
なく、簡単な方法で刈り込んでいるっぽい。とすると、moveorderかなぁ。
一応、MPCの99%で評価値の並び順は置換表に残してあるので、そんなに
間違った順番でソートしていないと思うんだけど。
あと、mtd(f)だと最初から最後までNullサーチしかしない事に思い至り、そこで
処理の効率化できる箇所が無いかと考えてます。Nullしかやらないんなら、
アルファ越えの再探索でウィンドウを広げる必要もないわけで。逐次探索部分
では効果不明だけど並列探索だとYBWCでPVを検索し終わるまで待つ必要が
そもそもない(仮アルファを求める必要がない)ので、多少速度アップできない
かなぁと。
450:310
16/05/27 00:36:10.52 gIFpjm1c.net
早々に状況が判明しました。ここに書くと進むんだよなぁ。
mtd(f)+negaScoutで繰り返し探索しながら、置換表に置換データを置いて、更に
それを並び替えに利用していたのですが、最初にPVを探索してしまうと、その後は
別の着手も評価値がαになってしまい、並び替えの意味が無くなっている感じです。
ちなみにPVだけは別ルートで必ず先頭に探索するようにしてあります。
というわけで、テスト的に初段のみ敢えて並び順を逆転させてmtd(f)を未使用にして
ただのnegaScoutで、mpc99%→全探索をしてみたところ、探索ノード数がかなり減り
ました。置換表使用の深さ全部で並び順を逆転させてみたら、mpcの99%ですら全く
終了する気配がなくなりました。
さて、どうやって実現しようかなと。
今のところ、mpcはかなり高速なので、これをnegaMaxにして。
いわゆる並び替え専用の浅い探査にしようかなと。
451:406
16/06/27 22:12:32.72 rUgIsnK8.net
対局場は結構難しいorzので一旦横に置いておいて
手始めにもうすこし簡単な1人ゲームからPHPで作ろうと思ってます。
具体的にはこれ
URLリンク(www.vector.co.jp)
の一人プレー場とランキングを作りたいです。
元ネタはコンウェイの天使と悪魔という問題みたいですね~。
452:406
16/07/02 23:28:52.20 qo9Pciu3.net
URLリンク(textuploader.com)
とりあえず、HTML & javascriptでシコシコ書いてます。
だいぶ大分形になってきました。
遊んでみてください。
453:406
16/07/02 23:40:37.16 qo9Pciu3.net
なんか文字化けしてんなぁ
なんでだ?
まあいいか
454:名前は開発中のものです。
16/07/14 21:31:20.75 GXGadAU3.net
必殺技が使えるリアルタイムアクションオセロまだですか
455:名前は開発中のものです。
16/07/17 23:40:28.28 M3Q2Msci.net
とりあえず公開しました。
ランキングはまだ未実装です。
URLリンク(nagata442000.xxx.ne.jp)
xxxはさくらに変えてください。
456:455
16/07/18 00:05:57.51 Lx2YZiAH.net
455=406です。
457:406
16/07/21 23:55:32.48 oilR8wYn.net
うーんアクセスがないぜ。
検索エンジンにも引っかからないし。
SEOとかいうのに手を染めるしかないのか?
458:406
16/07/27 00:25:34.27 42/ungMS.net
結果を保存できるようにした。
459:406
16/07/27 22:44:58.98 42/ungMS.net
棋譜を登録&閲覧&再生できるようにした。
そろそろ宣伝かな~。
460:名前は開発中のものです。
16/08/01 12:39:59.89 BFi+UVWj.net
このようなスレがあるとは…
自作でオセロソフトを作成している者です
現在は自己対局による学習中です
初手f5
以降ランダム7手~8手、
中盤8手読み
中盤で次善手を85%の確率で一手のみ打つ
終盤20マス空き読み切り
で300万棋譜集めようかと
この設定であれば一局1~3秒程度なので2ヶ月半くらいで達成できる予定です
まだ86万局程度ですが、今のところFFOはこんな感じです
FFO#40 (a2:+38) 1.36sec FFO#41 (h4: +0) 3.75sec
FFO#42 (G2: +6) 4.86sec FFO#43 (C7:-12) 6.33sec
FFO#44 (B8:-14) 9.46sec FFO#45 (b2: +6) 64.88sec
FFO#46 (b3: -8) 13.20sec FFO#47 (G2: +4) 5.66sec
FFO#48 (F6:+28) 67.74sec FFO#49 (e1:+16) 121.90sec
FFO#50 (d8:+10) 376.73sec FFO#51 (E2: +6) 86.08sec
FFO#52 (a3:+0) 132.61sec
461:406
16/08/02 00:17:59.05 R38aaX9h.net
だれかSEOのやりかた教えてくれ。
462:460
16/08/02 09:44:26.07 /HFRnWj4.net
白の得点が微妙にマイナスに傾いているので9手目までランダムに固定しました。
初手はf5なので8手目までだと白の方がランダム手数多くなってしまうことに気づいて・・・
9手目ランダムだと7手目までの評価値はまともな値にならないのですが、そこはBOOKでどうにかしようかと。
まともな値にならないだけで、互角定石以外に進行したりとかはしないので、とりあえず無視します。
463:406
16/08/02 20:37:12.35 R38aaX9h.net
Google検索で引っかかるようになったみたいです。
でもコンウェイの天使と悪魔なんてワード検索する人そんなにいないだろな。
464:310
16/08/03 14:35:23.97 WXOcEHjz.net
ここしばらく、評価関数に新機軸をと、ディープラーニングにトライ中ですが、
囲碁のように、畳み込みの画像認識の応用では、なかなか上手くいかないと
言うか、自分のパソコンで手におえるくらいの規模のネットワークだと全く歯が
立たない感じです。
というわけで、色々と手はいっぱい動かしているのですが、何にも成果があら
われていない状況です。
465:名前は開発中のものです。
16/08/03 22:36:32.67 u2EcbVrc.net
>>464
ディープラーニングってライブラリ使ってんの?
それとも自家製?
466:310
16/08/04 01:59:01.51 XH3ZGPYC.net
>>465
最初はGitHUBのDeepLearningの参考プログラムを元に自家製でAutoEncoderにDropoutをつけ
たりしてました。
次にCNNで、GitHUBでtiny-cnnというライブラリを落として使用。技術的に凝りすぎライブラリで、
解読するのにC++の勉強が主になってしまいそうなので、改造はあきらめました。
そして、今は、行列ライブラリ(Eigen)落としてきて、自家製に戻りつつあります。Sparse正則化の
ために、ミニバッチ処理をしようかと思って(最初のは逐次処理のみ)、ついでにAVX2命令や
並列化対応を、この行列ライブラリに頼ろうかと思ってます。
Eigen使ったMLPでxor解くテストプログラムは、さきほどできましたが、本当にこれで良いのか、
結構不安です。多少間違っていても、収束しちゃうときがあるので。
明日はAdagradに対応させる予定。何とか2~3層程度で収まらないかな。
パソコン環境が貧弱なので、あまり重い処理ができないのが最大の難点です。
もっとも、できあがった評価関数が重いと、探索深さが浅くなってしまうので、ある程度は妥協
しなきゃならんかなと思っています。
467:名前は開発中のものです。
16/08/04 22:03:08.50 5/KmfpOW.net
壮絶やな。
その情熱がうらやましいぜ。
468:310
16/08/05 20:44:21.05 sOgjr/Uz.net
楽しんでやってますので(笑
で、AdagradとSparse正則化ができました。Sparse正則化は思ったより時間がかかり
ませんでした。さすが行列ライブラリって感じです。AdagradとSparse正則化込みで、
結果も、正則化もちゃんと出来てますので、多分間違いはないでしょう。
今夜はオセロ関連ライブラリ持ってきて、学習データ作って、Sparse Auto Encoder
にしてテストです。全結合層クラスを積み重ねていくだけだし、データ作成は3回目
なので、後は簡単ですが、隠れ層のノード数と、目標とする活性ノード数を色々試す
のが面倒です。
まあ、ここまで全敗なので、あんまり期待していないけどさ(汗
やればやるほどBuroさんの評価関数の凄さがわかってきます。
469:460
16/08/08 01:32:00.53 1caSYJwt.net
PV-LINE(最善の着手リスト)の表示を実装してみました。
PVノードの更新は非常にまれな事象ですが、あまり深い所で表示更新すると
やはり探索速度に影響与えてしまうので、6手目以下の浅いノードで表示更新しています。
あと自己対局棋譜が100万局集まったので、中盤MPCパラメータを作成中です。
現在20手読みのカットペアの計算に入ったところで、これが終われば終盤MPCの実装に入ろうと思います。
470:名前は開発中のものです。
16/08/10 01:12:31.39 BL+f+Yy5.net
310と460はホントに別人なのか?
ディープにオセロAIに取り組む人が2人も現れるとはにわかには信じがたいw
471:310
16/08/10 22:37:11.88 C09Nh62j.net
>>470
他のスレで出会って、誘導させていただきました。
ほんと絶滅危惧種ですよね(汗
Auto EncoderにSparse正則化を加えましたが、やっぱり特徴抽出は
簡単ではないようです。Auto Encoderとしては申し分なく機能している
のですが・・・線形回帰をつけて評価値を算出してみたのですが、ただの
乱数返しているような状態になります。
なんか、微妙に恒等変換を学んでいる臭いんだよなぁ。むむむ。
472:名前は開発中のものです。
16/08/10 22:53:03.62 BL+f+Yy5.net
>>310はかなりハイレベルだと俺は思ってるが
>>310からみて>>460はいい線行ってるの?
473:310
16/08/11 23:18:44.20 M0iE7EXH.net
>>472
僕は全然ハイレベルじゃないですよ。
すぐ脱線して役に立たないことばかりやってるだけです。
別スレでお互いのFFOテストの結果を見せっこしたところ、
前半5つで、速度はほぼ同じくらいでした。
>>460さんと情報交換したところ、末端ノードの高速化の
方向性が全く逆だったのが意外でした。
474:名前は開発中のものです。
16/08/12 00:22:58.37 +2V5AEwc.net
ほほう
460さんも期待出来そうですな
475:460
16/08/12 02:42:42.36 mvQ0iJdF.net
>>472
自分はディープランニングなどの人工知能系はさっぱりなので・・・
310さんはよく勉強されていると思います。
自作オセロですが、今まで32bitで開発していましたが
今ではもう32bitOSを使用する方が稀だと考えて思い切って64bitに移行しました。
探索ノード数がいきなり10~20%程度上がってビックリしています・・・
476:460
16/08/12 04:26:50.73 mvQ0iJdF.net
あ、探索ノード数ではなく探索速度ですw
終盤探索だと10000Knps~15000Knps程度出せるようになりました。
自分の環境だとWZebraが20000Knpsなので、大幅に負けています・・・
そろそろチューニングも視野に入れつつやっていこうと思います。
まずは探索ノード数を終盤MPCで削減しなくては・・・
477:460
16/08/12 07:59:35.21 mvQ0iJdF.net
64ビット移行+120万局の学習でFFOテストの結果をまとめました。
32ビット+86万局の学習だと合計が17219.7sだったので36%ほど高速化しています。
シングルスレッド動作なので、将来的にはマルチに移行したいところ・・・
OS:Win10 CPU:i5-6500 キャッシュサイズ:128MB
FFO#40 (a2:+38) 1.04s FFO#41 (h4: +0) 3.22s
FFO#42 (G2: +6) 4.01s FFO#43 (G3:-12) 13.10s
FFO#44 (D2:-14) 3.22s FFO#45 (b2: +6) 58.63s
FFO#46 (b3: -8) 10.27s FFO#47 (G2: +4) 4.60s
FFO#48 (F6:+28) 36.09s FFO#49 (e1:+16) 50.33s
FFO#50 (d8:+10) 354.14s FFO#51 (E2: +6) 59.20s
FFO#52 (a3:+0) 142.79s FFO#53 (d8:-2) 656.87s
FFO#54 (c7:-2) 1718.85s FFO#55 (G6:+0) 5588.48s
FFO#56 (H2:+0) 314.27s FFO#57 (a6:-10) 1045.01s
FFO#58 (g1:+4) 973.58s FFO#59 (g8:+64) 0.25s
合計11037.95s(トッププログラムは合計で600秒台orz)
478:460
16/08/12 08:01:32.72 mvQ0iJdF.net
>>477
FFO#56はH2:+0ではなくH5:+2に訂正です。。
479:310
16/08/12 15:16:23.38 USoZXJIB.net
がーん。今まで、こちらはノートPCだしと、密かに思っていましたが、32bitでしたか・・・。
完全に脱帽です。
だったら、僕もこのスレで教わったAVX2とかBMIとかの組込関数使って、あとPPLとか
OpenMPとかで並列化して4コアなら3倍強程度なので、トータル4倍以上に速度アップ
すると思いますよ。つまり、その辺やるだけでEdax並まで行くかなと(汗
ちなみに、DeepLearningはあきらめ方向にだいぶシフトしてきました。
480:名前は開発中のものです。
16/08/12 16:41:11.53 8u/4Xx1J.net
仲間が出来ていいのう
481:460
16/08/12 17:56:57.44 wDmYSTDl.net
シングルスレッドだとトッププログラムですら合計2000秒台と限界があるので、マルチスレッド対応は必須ですよね
ただybwc等の並列化アルゴリズムの理解に時間がかかりそう…
482:310
16/08/12 20:50:39.55 USoZXJIB.net
>>481
YBWCはnegascoutのnull window searchを並列化して一括処理する
ようなものだと解釈して実装しました。
この辺はゲーム計算メカニズムなる本で勉強したかな。
並列処理のフレームワーク何使うかが問題ですね。
自分はVC++なのでmsdnで情報が得やすいPPLを使いました。
インテルTBBとかOpenMPなんてのもあります。
PPLは結構使いやすかったですが、速度は不明。
まあ、ルートの方でしか使わないので、あまり影響ないと思っています。
手組でマルチスレッドなプログラム書ける人には不要かも知れません。
483:310
16/08/13 14:18:44.65 D+1dBs0T.net
あ、考え方がnegascoutみたいだという事で。
484:名前は開発中のものです。
16/08/13 20:35:07.80 p7EbJiId.net
avx2って256bitだよな
オセロだと128bitしか使えないような?
485:310
16/08/13 20:47:52.09 D+1dBs0T.net
方向が8つあって、それぞれの処理を8回計算するとき、
右シフト方向が4つ、左シフト方向が4つ。
256bitは64bit×4。右シフトと左シフトで2回。
というわけで、mobilityとかflipとかで便利に使えます。
486:460
16/08/14 16:41:37.52 ALD5heTO.net
現在、終盤用MPCパラメータ作成中です。
23手完全読みのカットペアに入っています。24手読みの計算が終わったらいったん実装に入るつもりです。
>>310
YBWCに関して調べましたが、そうみたいですね。
MPCパラメータを作成している間に、なんとなくで適当に実装してみましたが
なぜかエラーで落ちまくりでしたw
排他がかかっていない致命的な箇所があるのか・・・置換表は排他をかけたのですが・・・
PVライン生成あたりも怪しい、とりあえずもう少し調べてみないとダメそう。
487:460
16/08/14 16:42:16.06 ALD5heTO.net
>>310は>>482の間違いです。。
488:名前は開発中のものです。
16/08/17 21:19:58.40 Z2gXWq7v.net
俺もボードゲーム系AIでディープラーニング書いてみたいと思ってるけど難しいんだろな。
論理もそうだけど膨大なデータが必要そうだし。
>>479
どのへんで諦めました?
489:310
16/08/18 15:43:08.07 7GnJQiSP.net
>>488
まだ細々やってます(汗
Eigenの導入と、少しづつ進んでいくC++技術のおかげで、前よりは試行の
スピードはアップしていますが、なかなか成果は出ません。まだ、色々な
パターンを試しながらディープラーニングって何ぞやを体感しているところ
なんだと思います。
少なくとも「簡単に凄い事ができそう」という幻想は捨てる事ができました(汗
ボードゲームがターン制なら、基本はmin-Maxになると思います。
まずは、盤面の状態に(恣意的で構いません)点をつける評価関数作るところ
から始めたらどうでしょう?
次のステップで評価関数に統計(線形回帰)を持ち込むと、ディープラーニング
じゃなくても、プレイ譜がたくさん必要になります。
オセロの場合は、Buroさんという先人が、実用レベルの評価関数が線形回帰
で作れる事を示してくれています。
僕がディープラーニングを適用しようと思っているのは、ただの思いつきでして。
場合によっては、より軽くて正確評価関数が作れるかと思いましたが、実際に
始めてみると、なかなか評価関数として機能してくれないし、仮にできたとしても
重いものになっちゃいそうという感じです。
490:488
16/08/19 23:15:11.39 i9HkvHw2.net
>>489
手動評価関数はかなり昔五目並べで書いたことあります。
min-maxで思考時間が1手5分くらいかかったけど、
自分でプレーして負かされることもあるくらいの強さにはなりました。
そのBuroさんの線形回帰とやらはWebで論文とか見れたりしますか?
読んでも多分理解できないだろうけどちょっと興味あります。
491:488
16/08/19 23:23:27.55 i9HkvHw2.net
ぐぐったらこんなのがあったけど多すぎ。
URLリンク(skatgame.net)
492:310
16/08/20 16:51:13.03 m44rb9b4.net
>>490
Buroさんが作った伝説のオセロプログラムがLogistelloです。
Thellというオセロプログラムの作者の方が日本語で解説してくれています。
URLリンク(sealsoft.jp)
5.2の計算の高速化のところの説明(P.8の冒頭)のところ。
自分なりに解釈したら、自分が解釈違いしたのか、説明がおかしいのか、
この通りではなかった記憶があります。
とはいえ、これはオセロの考え方であって、将棋なんかだとbonanzaなどを
参考にすべきだし、全く別のゲームであったら、別な事を考えなければなり
ませんね。当たり前ですが。
493:488
16/08/20 20:33:47.55 +7ONDgCM.net
>>492
パターンの重みの線形和が評価関数になる的なことが書いてあるっぽいですけど、
パターンというのは人間が与えてやるわけですよね?
そのパターンすら学習で求めるというのがディープラーニングなのかと思ってますけど。
まあディープラーニングにはロマンがありますね。
494:310
16/08/20 21:29:23.21 m44rb9b4.net
>>493
ですです。
あと、Deepじゃなくても、2層以上のパーセプトロンだと、線形分離不可能問題の
分類ができるようになります。XORの学習が典型ですね。
ところが、パターンの部分まで学習で求めてくれるってのは、やっぱり幻想でして。
ある程度パターンを想定しながら、ネットワークを作らないといかんのではないか
という事に思い至っています。
例えば畳み込みニューラルネットワーク(CNN)で、何故畳み込みをするのかという
と、縦線横線などの隣接ドット同士もつながりを識別してもらうためですし。そもそも
畳み込みのフォワード計算自体が、画像に対して例えば輪郭線強調といったフィル
ターかけるのと、プログラム的に同じものだったりします。学習対象は、フィルターに
なります。
オセロは、囲碁とかと違って、石の色がコロコロ変わるので、隣同士の石のつながで
判断するCNN的なネットワークをそのまま適用できないよなぁというのが、最近の諦め
ポイントであります。
じゃあ、何に頼るかというと、自分はオセロ弱いので・・・No ideaだったりします。
あんな簡単な(DeepLearningと比較して)線形和でBuroさんの評価関数ができています
ので、パターンを活かして、まずはそこに点数を割り振るところをMLPなんかでできない
かなぁと思っています。
495:488
16/08/21 00:04:33.21 EnsCDbgT.net
>>494
>ところが、パターンの部分まで学習で求めてくれるってのは、やっぱり幻想でして。
>ある程度パターンを想定しながら、ネットワークを作らないといかんのではないか
>という事に思い至っています。
ふーむそうなのか。残念。
聞きかじった知識だと夢のような技術なのかと思っちゃったけど、
実戦してみるとなかなか難しいのかぁ。
496:名前は開発中のものです。
16/08/21 21:39:11.08 EnsCDbgT.net
いくらオセロの盤面が小さいからってシングルスレッドで
10000Knps~15000Knpsというのはとてつもなく速く感じるんだが。
どうやったらそんな速度がでるんだ?
オセロ業界じゃ普通なのか?
497:310
16/08/22 02:41:50.59 2ubnBUwd.net
Kが余計で3桁間違えているんじゃないかと(汗
498:310
16/08/22 02:46:41.58 2ubnBUwd.net
あ、違った。自分が3桁間違えていた。
全然おかしくないです。自分の2コアで13000Kくらい出てます。
シングルで同等の速度ですから、かなり速いとは思いますが、
敢えて言うなら2倍程度なら縮められないとは思えない差です。
499:460
16/08/22 08:13:03.66 yZES3OuI.net
終盤MPCを実装完了してFFOを測定してみました。。
残すのはFFO#57のみですが、この時点で9364秒と1万秒を割ってるので
10%程度の高速化は期待できそうです。(評価テーブルは64ビット移行+120万局から変更なし)
500:460
16/08/22 09:20:01.85 qlwiS2PE.net
>>496
簡単な実装だと終盤探索は2000万ノード/秒いけますね。
合法手生成が将棋などより速いので。
とはいえ、中盤探索だと色々やるので5000knps程度に落ちてしまってます。
501:496
16/08/22 21:10:28.52 WzxI/O2e.net
2000万ノード/sとかってsseやavx使って始めて可能になるレベル?
オセロの合法手の実装になにかすごい効率的なビット演算やってるとか?
502:460
16/08/23 11:44:32.28 sSUGbl7L.net
>>501
終盤探索だと合法手生成は葉ノードの近くでは使わないので、ループや条件分岐を使ったコードでなければアセンブラでなくても速度はそれなりに出ますよ。
こことかが参考になります。
URLリンク(d.hatena.ne.jp)
自分はこんな感じのコードをアセンブラに落として少し改変したものを使ってますー
503:460
16/08/23 11:47:50.11 sSUGbl7L.net
置換表に超大バグがあることに気づき修正したらFFO45が32秒になりました…w
180万局の学習を朝に終えたので今晩再度FFOを測定しようと思います。
504:310
16/08/23 13:54:12.88 LVh7XLe+.net
>>502
そのサイトは知りませんでしたが、同じことやっています。
自分の場合は、それをAVX2命令で1,7,8,9ビットシフトを4つ並列で動かす様にして、
右シフト左シフト2回の演算をC++で組んでます。並べて書くと混乱しそうだったので
演算オーバーライドしまくりで、バグ防止しました。
やっぱりアセンブラの方が速いんでしょうね。
ディープラーニングな評価関数の方ですが、突然収束を始めました。
まだ途中ですが、見た感じざっくりで、平均二乗誤差の平方根(σ)が0.6石程度に
収まりそうです。2σで1石、スコアは2づつ変わるので、評価逆転が起きる確率を
数%程度にするには、0.5石以下にしたい。
肝はミニバッチのサイズだった様です(謎)。ハイパーパラメータとしては考慮対象外
でしたが、テスト用に小さくすると収束が悪くなる感触があったので、思い切って大き
くしてみたところ…大きくすればするほど記録を更新していくという状態。ついに212640
件という特大バッチサイズにしてしまいました。メモリー的にはまだいけるかも。
今までの比較検討データは全てパーになったので、検討済のネットワークも、バッチ
サイズ変えて再評価です。今やってるのは、Buroさんパターンがベースのネットワーク
ですが、もしかしたら入力ベタ打ちで「勝手に特徴抽出してくれる。すげー!」に戻るかも(汗
505:名前は開発中のものです。
16/08/23 19:39:22.88 1+aieVpn.net
>>502
ループはおろか条件分岐すらいらんのか(驚愕)
>>504
おお、ディープラーニング期待してます。
506:名前は開発中のものです。
16/08/23 21:26:59.10 KqeLXU8U.net
文系の俺には全然分からん。
もっと簡素な3目並べなら勝てるAIとか作れないかな(´;ω;`)
507:名前は開発中のものです。
16/08/23 21:47:29.66 1+aieVpn.net
ちょっと興味が湧いたんでとあるオセロアプリ落としてやってみた。
弱設定AIが程よく負けてくれて嬉しいw
一方的にボコされたら詰まらんよな一般人は。
オセロAIはもう神の領域だし。
508:460
16/08/24 01:02:17.32 elb1k4A2.net
色々チューニングしてトライしましたが、FFO57を大きく落としてしまい、放心中ですw
FFO57以外は全体的に高速化しているのですが、合計としてはあまり変わらない結果に・・・
終盤MPC探索中にa6とg7でかなりふらつくので、置換表に次善手も入れておかないとダメかもしれません。
とりあえずEdaxとゼブラのオーダリングあたりのソースを見直す予定です。
name move time[s] node[Mn]
FFO#40 a2:+38 1.05 10.61
FFO#41 h4:+0 3.23 37.85
FFO#42 g2:+6 2.43 31.69
FFO#43 G3:-12 7.69 79.04
FFO#44 D2:-14 5.09 48.95
FFO#45 b2:+6 30.21 409.43
FFO#46 b3:-8 7.23 78.8
FFO#47 G2:+4 3.1 38.9
FFO#48 F6:+28 19.58 207.46
FFO#49 e1:+16 45.11 527.45
FFO#50 d8:+10 144.14 1330
FFO#51 E2:+6 39.91 502.74
FFO#52 a3:+0 52.56 687.22
FFO#53 d8:-2 617.63 8360
FFO#54 c7:-2 944.7 13410
FFO#55 G6:+0 測定中
FFO#56 H5:+2 262.85 3410
FFO#57 a6:-10 1523.67 19710
FFO#58 g1:+4 674.09 9760
FFO#59 g8:+64 1.08 5.57
合計4385.35[s](FFO55未測定) 合計ノード数:58645.71[Mn]
509:310
16/08/24 10:40:19.04 GpcelPIW.net
こちらも大バグを見つけて放心中です(汗
ミニバッチサイズごときで収束具合が大きく変わるのがおかしい点。
ミニバッチサイズを大きくすると、収束点がかなり規則的に減少していくように見える点。
この2点から、寝ながらデバッグしてたんですが、テストデータの件数で平均を出すべき
ところで、ミニバッチサイズで割っていた事に思い当りました。
で、修正して、行列の列数で割るようにしたのですが、今度は列数がリセットされていない
事が判明。どうもポインタ渡しで行列を渡した時に行数・列数が正しく引き継がれないよう
な現象のようです。
というわけで、一瞬大喜びしましたが、全くのやり直しとなりました。
510:460
16/08/24 14:56:52.40 Kkx6VEyM.net
>>509
学習プログラムのバグはやっかいですよね。
自分も何回ひどい目に遭ったか…
今でもまだありそうな気がして怖いですw
511:460
16/08/24 22:16:05.70 elb1k4A2.net
FFO57をどうにかしようとチューニングをして、なんとかFFO57が1200秒台に縮まりました。
ある程度縮まったので、期待せずにもう一度全部を測定してみると
全体がかなり高速化されていて、FFO55がまさかの3774秒までに縮まりました!(奇跡)
とりあえずこれをオーダリングの暫定最終結果として、次は並列化に手を出してみようと思います。
まずはYBWCアルゴリズムの実装方法の検討から・・・
FFO#40 (a2:+38) 1.05s FFO#41 (h4: +0) 3.19s
FFO#42 (G2: +6) 2.55s FFO#43 (G3:-12) 7.82s
FFO#44 (D2:-14) 4.18s FFO#45 (b2: +6) 29.77s
FFO#46 (b3: -8) 6.99s FFO#47 (G2: +4) 3.10s
FFO#48 (F6:+28) 19.49s FFO#49 (e1:+16) 36.63s
FFO#50 (d8:+10) 128.15s FFO#51 (E2: +6) 50.46s
FFO#52 (a3:+0) 36.88s FFO#53 (d8:-2) 427.77s
FFO#54 (c7:-2) 730.26s FFO#55 (G6:+0) 3774.07s
FFO#56 (H2:+0) 185.22s FFO#57 (a6:-10) 1281.31s
FFO#58 (g1:+4) 556.86s FFO#59 (g8:+64) 1.08s
合計:7286.83[s]
512:310
16/08/25 00:17:23.06 ZE8G6YuY.net
>>510
Eigen導入前のプログラムみたいにFFOの盤面渡して評価値見るようにしていれ
ば良かったのですが、あまりに収束しないので、収束の兆しが見えてからやろう
なんて放置していたのが失敗でした。あまりに急速に状況が改善していったので、
0.5石切るか知りたくなって、確認が後回しになってました。反省orz
ちなみに、列数がリセットされない問題も、原因がわかりました。
これも自分のミスというか、Eigenの使い方間違ってました。
Eigen便利すぎて、少なくとも行列演算部分に関してはバグフリーで、簡単に先に
進めちゃうので、細かいところがなおざりになっていたような感じです。
513:460
16/08/25 11:20:22.96 PNQVZmVa.net
そういえばFFOに夢中すぎて中盤の強さ評価を忘れていました。
現在は180万局の学習が終わっていますが、ゼブラ(24手読みBookなし中盤誤差なし)と黒と白で戦い、
それぞれ+8と-2という結果になりました。
完全にBook無しだと、白黒両方とも虎定石からのe3酉定石に分岐するため、
金魚や大量取りなどの主要な引き分けオープニングからの勝率を測定しようと思います。
あとHTML5版のMasterReversiレベル3とも対戦してみましたが、白黒両方とも-2という結果に…orz
Book構築方法もそのうち考えようと思います。
514:460
16/08/27 00:02:49.98 ct+QEGYU.net
学習プログラムのバグが怖くなって見直してたら超大バグを見つけました・・・
パターンモデルのうち、triangle(Thellが用いているモデル)だけが
局面出現数のカウントリセットされておらず延々と増え続けていましたw
あと同じ棋譜が結構あり、ダブった棋譜を全て除去すると180万局よりも10%程度減りそうです。
とりあえず除去中の150万局の棋譜でもう一度再学習します・・・orz
515:460
16/08/27 13:15:04.86 ct+QEGYU.net
学習プログラムのバグを直して再学習させたWZebraとの対局結果ですが、芳しくないです。。
棋譜生成で次善手を選ぶ時、打った後の7手読み(対局が8手読みなので)評価値で全ての手をソートしてから
2番目を選んでいるのですが、評価誤差を全く気にせずに選んでいました。
最善手が+10でも次善手が-4とかいう局面も結構あるので、そういった誤差が大きい手を選んでしまうと棋譜の質が低下します。
なので、最善手と次善手との誤差が-2以下の場合のみ次善手を打つようにしました。
その代わり85%で1回打つという処理を単に5%で打つように変えています。
これでなんとか中盤が強くなればいいですが・・・
516:460
16/08/27 13:18:13.50 ct+QEGYU.net
WZebra24手読みBOOK無し評価誤差なしとの対局結果
ゼブラは評価誤差がEdaxやMasterReversiに比べて大きいので、本来負けちゃいけないんですよね。。
実際50万棋譜計画のやつで学習させた場合はほとんど勝っていました。(負けても-8とかはありえない)
牛定石[f5f6d6]
黒持ち:+2
白持ち:+0
酉フック[f5d6c3d3c4f4c5b3c2e3]
黒持ち:+8
白持ち:-8
金魚[f5d6c3d3c4f4c5b3c2e6]
黒持ち:-2
白持ち:+4
FJT[f5d6c3d3c4f4c5b3c2e6]
黒持ち:-4
白持ち:+2
コンポス[f5d6c3d3c4f4f6]
黒持ち:-2
白持ち:-6
517:名前は開発中のものです。
16/09/01 22:33:13.77 PkLGbL4G.net
マイナーゲームで良質の棋譜が大量にない場合、どうやって学習させればいいんだろう?
518:名前は開発中のものです。
16/09/02 09:47:35.76 +DjGOwAN.net
事前学習じゃなくて、強化学習な手法を試したら良いのではないかな。
何をどうすれば良いのか、俺はわからんけど。
519:名前は開発中のものです。
16/09/03 00:54:14.21 lICUKSF2.net
うおお線形回帰とか最小二乗化とかわかんねぇぇ
520:名前は開発中のものです。
16/09/03 20:21:58.46 lICUKSF2.net
とりあえず自己対戦棋譜が1000局集まりそう。
まだ足りないかな?
ここからどう学習させればいいのか…
521:名前は開発中のものです。
16/09/03 21:00:16.00 DJdWXbUx.net
自分も機械学習とか興味あって細々作ってるけど、とても難しい
学習以外の部分も難しくて辛かったけど、学習はなかなか思い通りにするのに苦労する
とりあえずオンライン学習ってので、自分なりに色々やってみたけど
やっとちょっと上手くいき始めたかなってところ
ミスって学習やり直しとか何回もしてしまった
522:名前は開発中のものです。
16/09/03 22:28:55.42 lICUKSF2.net
今ブラッドリーテリーのモデルとやらを調べてる
数式ムズイT△T
523:460
16/09/04 01:59:20.91 f4dqEnZp.net
>>520
オセロは今でこそ強いソフト同士の棋譜が手に入りますが、
初期は人が対局した棋譜(ISOなど)を残り十数手のみ修正して学習させていたようです。
マイナーゲームが何かによりますが、オセロみたく終盤で神のような読み切りが出来る場合は
自己対局の教師あり学習で適当なモデルでもかなり強くすることはできるかと思います。
524:460
16/09/04 02:00:39.37 f4dqEnZp.net
レス番号間違えました。。>>523は>>517宛てです。。
525:460
16/09/04 02:14:06.21 f4dqEnZp.net
自己対局中は暇なので、GUIの拡大縮小対応に手を出してみようと思ってドツボにはまりました。。
C#って描画ほんと遅いですね。。フルスクリーンにするとリスケールも含めて150msecぐらいかかります。
1024x768くらいだと50msecなのでギリギリ許容範囲内かなぁ。
あとGUIの実装に合わせて定石の変化度をツールバーから選べるよう実装していたのですが、
変化度を上げると着手時になぜか頻繁に落ちることが判明。
調べると、定石の木構造を作る処理に壮大なバグがあり、
30万近くある定石のうち1万くらいしか読み込めておらず、
リストも頻繁に上書きされてめちゃめちゃ状態でした。バグというか実装になっていないレベル。。
変化度を弄った時の処理をほとんどテストしなかった数年前の自分を殴りたい。。
かなり昔のコードなので、もう修正をあきらめて再設計して一新しているところです。
526:310
16/09/04 17:00:43.77 WEaBeSKk.net
実際、開発中ってアドレナリン出てるから、ほとんどノーテストで行けるところまで
行っちゃって後で何やってるの俺?って事がしばしば(汗
というかここ数日も、非常につまらない確認漏れというか、毎回間違うswitch文でバグ
出しているのに気づかずに、これはメモリーリークか?それとも計算式が間違ったのか?
みたいな状態になっていました・・・。
さて、今いじってるディープラーニングの仕組みは、かなり汎用性持たせて作ってます。
あまりに収束具合が悪いので、試しに、Buroさんモデルにしてみました。1層の活性化
関数無しにして、入力プログラムを流用するだけなので簡単です。でも、なかなか収束
しない。そこで、過去にどこまで収束したのか、残ってるログを探したところ・・・実際、
同じような感じ(1σ=約3.5石)でした・・・つまり、なんかできてると言えばできているし
これで満足かといえば満足ではなしと。また、なまじデバッグでまじまじ評価値を見ちゃっ
たため、これで本当に使えてるのか?状態です。
で、ミイラ取りがミイラになって、ディープラーニングの学習係数の最適化手法とか、
学習効率向上の方法を色々実装してました。勾配ノイズなる手法も入れてみました。
一体自分はどこに向かっているのだろうって状態です。
527:460
16/09/05 19:53:28.81 5Av5ahUz.net
そういえば散々オセロソフトを開発しておきながらネット対戦のオセロを一回もやった事ないなと思い・・・
やってみると案外勝ててしまいました。
この形は有利不利とかイメージだけで打っていましたが、、人間のパターン認識も結構優秀ってことですかねw
528:460
16/09/05 20:11:21.05 5Av5ahUz.net
>>526
ディープランニングはやはりなかなか曲者のようですな。
こちらも終盤の評価値が悪いところはよく見えて良いところは悪く見えるという平均化が起こっていてやばいです・・・
まずは次善手の割合を調整したのでどうなることやら。。
というかもうランダム数手をやめて、引き分けオープニングからの棋譜生成を重点的にやった方がいいのか考え中です。
529:名前は開発中のものです。
16/09/05 20:52:57.56 A3E5Chzv.net
学習始めたら速いPCが欲しくなってしまった
結果が出るまで時間掛かるなあ
530:310
16/09/05 22:33:11.28 KkVISbKe.net
上に書いた通り、線形回帰はディープラーニングに内包される計算手法ですので
(実際に最急降下法とバックプロパゲーション部分以外の計算式はほぼ同じ)、
学習率の設定にディープラーニングの最新の手法が使えるんじゃないかと思います。
学習率を外から与えるのではなく、初期値だけ与えて、後は誤差の具合を管理して
動的に変える。しかも、各重み毎に個別に学習率を変える。という発想です。
参考)
URLリンク(postd.cc)
URLリンク(qiita.com)
※)数式で、ただの変数のように書いてますが、行列だったりベクトルだったり解読が必要です
自分はこの中で一番新しいSMORMS3を使用してみたところ、モーメンタム法の10倍
以上の速さ(学習回数)で収束するようになったと感覚的に感じています。大体30~
50回も回せば収束してしまう感じです。実装&テストだけして確認していませんが、
AdamやRMSpropでもそん色ない程度には速くなると思います。
でも、早いPCで解決できるんなら、それに越した事はありませんねorz
531:名前は開発中のものです。
16/09/05 22:36:42.16 omFelghI.net
remi coulomの書いたMM法のコード見つけたが難しくて読めないorzorzorz
頑張って読むか
532:310
16/09/05 22:41:44.52 KkVISbKe.net
いかなディープラーニングでも評価関数をいきなり作るのは厳しい気がしてきてます。
ここはアルファ碁の学習の仕方にならって、最初は次の1手を学習させてみようかと。
で、今までは頭でわかったつもりになっていた、多クラス分類問題を調べてみると、
Softmax関数の微分(バックプロパゲーションで必要)がわからない事にあらためて
気が付きました。
幸い、Softmax関数の定義があるひな形プログラムがあったので、これから解読です。
人さまのプログラムを見ると、自分がいかにC++を知らないのか、思い知らされますorz
533:460
16/09/07 01:48:41.72 UfwPrMcb.net
自己対局ですが、8手読みの20マス空き完全読み設定だと、2日で大体20万局終わることが分かりました。
ここまで速いと10手読みの22マス空き読みにランクアップしてみたいところ。。
体感だと1/3くらい遅くなっているのですが、22マス空き読みだと偏りもひどくて、
1~2日やってみないとなんとも言えない感じです。
2日で7万局程度終えられるなら、それでのんびりやろうかと思います。
534:460
16/09/07 03:02:28.63 UfwPrMcb.net
今しがた動かし中ですが、400局完了まで16~17分でした。
1時間で1400局程度できそうなので、1か月で100万局くらい行けそうです。
とりあえずこのまま100万局集めようと思いますw
あと、初手ラムダムをやめて最悪手が数%程度で打つよう、評価値によって着手確率を調整しました。
最悪手の絶対値の1.2倍をそれぞれの評価値に加算した後の総和を使って
それぞれ加算した評価値を除算という古典的な方法ですが・・・
この方法だと絶対値が0に近いと悲惨な事が起こるので、絶対値は>=4にしています。
535:名前は開発中のものです。
16/09/07 23:27:08.71 4MEE20eO.net
誰かヘルプ!
このページのmm.tar.bz2の使い方わかる人いない?
URLリンク(www.remi-coulom.fr)
makeしてexe作るところまではできたんだけど
README通りにmm.exe < input.dat > output.dat
ってやってもoutput.datが空ファイルにしかならない。
536:460
16/09/07 23:57:41.97 UfwPrMcb.net
>>535
とりあえずmm.exe < input.datでコンソールに何が出てきてるか見た方が良いかも。
Cygwinでやるとこんなの出てきました。
$ ./mm < input.dat
..
Games = 2
Feature1 -0.89588 2.44949 0.0285792
Feature2 -0.867301 2.38048 0.15838
Feature2 -0.708921 2.0318 0.0737065
Feature2 -0.635214 1.88743 0.0358307
Feature2 -0.599384 1.821 0.0187057
・・・(略)・・・
0 1.49416
1 1.21426
2 0.586193
3 0.668003
4 2.13451
outputは下5行だけが出力されるみたいです。
537:535
16/09/08 00:10:42.63 /oQCQhP8.net
>>536
おお、返信ありがとうございます。
mm.exe < input.datやってみましたが何も出ないです。
もしかしてinput.datはなにか編集しないといけないのでしょうか?
538:535
16/09/08 00:16:47.92 /oQCQhP8.net
すいません。
makefileからコンパイルオプションを取り除いたところ結果が出力されました。
-O3がダメなのかなぁ。
ともかく、ありがとうございました。
539:460
16/09/08 00:21:28.75 LcwQkLYi.net
>>537
input.datは全く編集せずにやりました。
Cygwin64bitだと動くのですが、環境によっては動かないんですかね・・・
gcc-5.4.0でビルドしましたが、コンパイラのバージョンの差異も原因かもです。
540:460
16/09/08 00:23:56.75 LcwQkLYi.net
>>538
動いてよかったです。
最適化が悪さしていましたか。。-O1程度の方がいいかもですね。
541:460
16/09/10 21:06:28.42 FA2ccDEd.net
>>534の読みを深くさせた自己対局棋譜ですが、15万程度集まったので
無理やり学習してWZebraと対局させてみたところ、黒持ちで+12、白持ちで+2でした!
次善手や序盤ランダムの考慮と読みを深くした効果が現れてて安心しました。。100万達成した時の結果が楽しみです。
542:460
16/09/11 09:03:13.98 UepiTkRD.net
ついにBOOKの読み込みとアルファベータによる手の選択を実装できました。
まだ最善しか着手できないので、誤差率によるランダム着手も実装しようと思います。
ゼブラのExtra-Bookをそのまま使っているので、ゆくゆくは自力で構築できるシステムを
考えたいところ。。
543:名前は開発中のものです。
16/09/11 11:41:57.36 dMHrH3w2.net
>>542
やっぱり最終目標は完全解析なんですか?
544:460
16/09/11 15:25:12.97 UepiTkRD.net
>>543
いえ、さすがにそこまでは・・・w
Edaxの作者が完全解析を先行してやってるみたいですし、そこは任せようかなと。
最終的にEdaxやMasterReversiと同等の評価関数やBOOKを作成できるレベルまで持っていきたいです。
545:535
16/09/12 21:36:16.05 vkOlNla9.net
>>535です。
<number of gammas for this feature>というのがよくわからん。
とりあえず1にしとけばOKみたいな?
input.dat色々いじってみたけど確かにそれっぽい値はに出る。
546:310
16/09/12 22:52:49.52 5hD0Gf9W.net
>>460さん、着実に進んでいてうらやましい。
自分はというと、だんだんとオセロの事は忘れて、ディープラーニングのプログラムの
確認修正、機能追加に頭がスイッチしちゃってる感じです。むむむ。
C++スキルも微妙に上がってきていますので、オセロ側に戻る時も、もう1回1から
全部コーディングしなおした方が良いかもw。ほとんどCの状態から始まって、もう3回
くらい書き直しているので、そんなに時間かからないと思うし。
と、どんどん脱線していくのであった。
>>545さん
そのプログラム見てないですが、γというと、たいてい何かの係数パラメータじゃないかと。
547:535
16/09/12 22:58:52.81 vkOlNla9.net
>>546
返信ありがとうございます。
係数ですか。詳しい説明がどこにあるのかわからなくて。。。
プログラムって最初から書き直すほど洗練されていきますよねw
548:535
16/09/14 22:57:07.95 lQtAf6dT.net
本番のデータ使うと結果が表示されないorz
入力ファイルの形式なんか間違ってるんだろうけど
何間違ってるのかわからんorz
549:535
16/09/15 21:47:58.41 NUOEmvbB.net
もしかして万が一だけど同じフィーチャーに属するガンマは同じチームになれないとかあるのか?
550:535
16/09/15 23:35:36.05 NUOEmvbB.net
うお~わかんねぇぇぇ
コード熟読しかないのか?
厳しいぃぃぃ
551:310
16/09/16 00:03:09.94 44uFy3HE.net
featureってコンピュータの世界では、機能を意味するよね。
あと、もう一度読み返すと、γが複数形になってるので、
γの数であってγの値ではなさそう。
「この機能で使用するγの数」となるけど・・・
これだけだと正直なんのこっちゃだねw
この機能が何を表すかどこかに書いてないの?
552:名前は開発中のものです。
16/09/16 07:31:01.43 mrye4Vvn.net
もう一年くらい将棋をちまちま作ってるけど、なかなか強くならないな
最近ようやくアマ高段くらいには行った感じだ
ランダムでただ指すところから始めて、先人の歴史を全部なぞるようにプログラムして来た
みんなはゲームは違うだろうけど、もうその筋ではかなり強いレベルなの?
553:460
16/09/16 13:50:57.59 gJ0b6G2+.net
自己対局での棋譜生成ですが、10手読みだとまだまだ精度が落ちるようで、思いきって中盤16手読みの24手読みにしてみたところ…10分で35局…w
今日は出勤時間がせまっていたのもありこのままで生成していますが、
中盤14手読みか12手読み、22マス空き完全読みにした方が良さそうです。
ああ、PC10台くらい並べて棋譜生成したい…
554:535
16/09/16 21:02:11.49 l6ih+FVI.net
>>551
返信ありがとうございます。
どこかに解説あるんですかね?
ちょっと本気で探してみるか…
555:名前は開発中のものです。
16/09/16 21:22:13.05 l6ih+FVI.net
URLリンク(www.remi-coulom.fr)
の「囲碁の手のパターンのEloレーティングを計算する」をよみゃいいのかな?
もしかして
556:535
16/09/16 22:26:17.01 l6ih+FVI.net
囲碁の手の特徴にパス、トリ、伸び、自己当たり、当たり、
盤端との距離、直前の手との距離、2手前の手との距離、モンテカルロオーナー
などがあると書かれている。
feature=特徴?
557:名前は開発中のものです。
16/09/17 22:31:21.85 mQ7ypIPZ.net
下がりすぎ
上げるぜ
558:460
16/09/18 02:39:21.57 6855FAgd.net
オセロオンラインというアプリに付属されている真・HAYABUSAと対戦してみました。
どうも定石がかなり充実しているようで、普通にやってると
こちら側が記憶していないドロー進行に分岐されて負けます。。
しょうがないので野兎とか序盤から不利な定石に分岐して評価関数の勝負に入らせると、案外勝てましたw
評価チューニングがEdaxなどに比べると結構甘いようです。
とはいえ国産アプリでここまでチューニングされているとは思わなかったので驚いています。