【オセロ,将棋】ボードゲーム Part3【囲碁,War】
比較的地味なボードゲーム専用のスレが欲しくて立ててみました。 前スレ 【オセロ,将棋】ボードゲーム Part2【囲碁,War】 https://mevius.5ch.net/test/read.cgi/gamedev/1508056498/ なんかちょっとしばらくさぼってたらコーディングの腕が鈍ってるかも。 勘が働かないというか。 マジでモチベが湧いて来ない ここのところ忙しかったのもあるけど 9路囲連星のモチベが上がらないのは本当は心の底ではライフゲーム囲碁をやりたいからなのかもしれない。 いや、ちがうな。手っ取り早く結果が欲しいだけなんだ。 心が弱いんだ。 やっぱ教科書の通り実装しようとするよりも自分でアイディアひねり出そうともがくほうが楽しいなぁ。 教科書が大事じゃないとは言わないけど、なによりモチベが全ての活動の源泉だからな。 対称局面で候補手を絞り込む処理書いてるんだけど、もしかして8対称じゃなくて4対称しか使えないのだろうか?? ちょっと言葉が足りないかな? 着手後の局面が対称局面として同型となる候補手が複数ある場合、 そのうちの一つだけを代表として選択できるようにする、みたいなイメージなんだけど。 線対称と回転対称があって、線対称は縦横斜め×2の4通りと、 180度回転対称の5通りではないかと思われます。 うーむ、線対称はそれぞれ候補手が約半分になるのはわかるが180度回転対称はどうなるんだろう? 0 O O O O @ @ @ @ @ | 0 O O O O O O O O O | 0 @ @ @ @ @ @ @ @ @ | 0 O O O O O O O O @ 1 O O O O @ @ @ @ @ | 1 O O O O O O O O O | 1 O @ @ @ @ @ @ @ @ | 1 O O O O O O O @ @ 2 O O O O @ @ @ @ @ | 2 O O O O O O O O O | 2 O O @ @ @ @ @ @ @ | 2 O O O O O O @ @ @ 3 O O O O @ @ @ @ @ | 3 O O O O O O O O O | 3 O O O @ @ @ @ @ @ | 3 O O O O O @ @ @ @ 4 O O O O @ @ @ @ @ | 4 @ @ @ @ @ @ @ @ @ | 4 O O O O @ @ @ @ @ | 4 O O O O @ @ @ @ @ 5 O O O O @ @ @ @ @ | 5 @ @ @ @ @ @ @ @ @ | 5 O O O O O @ @ @ @ | 5 O O O @ @ @ @ @ @ 6 O O O O @ @ @ @ @ | 6 @ @ @ @ @ @ @ @ @ | 6 O O O O O O @ @ @ | 6 O O @ @ @ @ @ @ @ 7 O O O O @ @ @ @ @ | 7 @ @ @ @ @ @ @ @ @ | 7 O O O O O O O @ @ | 7 O @ @ @ @ @ @ @ @ 8 O O O O @ @ @ @ @ | 8 @ @ @ @ @ @ @ @ @ | 8 O O O O O O O O @ | 8 @ @ @ @ @ @ @ @ @ やっぱりわからないかもしれない。 例えば線対称なら上図のようになりますよね(@が着手候補) 回転対称ってどう半分になりますか? もしかして現局面の対称性を考えるんじゃなくて着手後の対称性を考えるとわかるのだろうか? 回転対称の時は、180度回した場所と対称になるので、左上と右下みたいな感じです。 (0,0)⇔(8,8) (0,1)⇔(8,7) (1,0)⇔(7,8) (1,1)⇔(7,7) : (m,n)⇔(8−m,8−n) みたいになりますので、図形ではイメージしずらいかも。 うーん、回転対称確かに使えるかも。結局8対称全部使えるってことなのかなぁ? とりあえずpostgre sqlをインストールしました。 スレッドリッパー3990x今週発売らしいですね。 藤井聡太7段が狙ってるとかなんとかw なんか今日のabema中継で藤井君が新PC買ったみたいな話出てたよ。 解説陣の伝聞情報だからアテにならないかも知れないけど。 相変わらず棋譜作り続けているけど、まだまだ局面的にはスカスカな感じ(汗 あと1年くらい続けてもダメかも知れないorz あと結構たくさんのパブリックドローが、ドローじゃなさそうな感じになってきてます。 ドローから外れる良い手(+2の分岐)が見つかった時に、それが正しいのかどうかを チェックしています。深いところの分岐なら時間かければ完全読み切りで確定できる のですが、浅いところで外れる場合は確認しきれません。Zebraを見ながら間違い探し をしようにも、こういうのはZebraの評価値も揺れ動いていてあんまりあてにならず。 現在パブリックドローとして拾ってきた棋譜が99本ありますが、12本が確定間違い。 13本が、おそらく間違いという状態です。後者はDAGや対称形を考慮すると4パターン に集約されます。 ちなみに、F5f6E6f4G5の筋は全滅しそうです。F5d6C3d3C4f4C5b3C2の筋は、たくさん 生き残っています。逆に新発見のおそらくパブリックドロー候補もたくさんあるけど、 まだ怖くて確認してません。 対称局面の話ですが、MCTSで探索範囲を絞るのであれば、All Moves As First法が 有効ではないかと思います。 オセロでは全く使えない方法なので僕は詳しくありませんが。 うーん、All Moves As First法ですか。 ライフゲーム囲碁は囲碁に似ているゲームだから有効かもしれませんが、手順はやっぱり大事な気がするんですよね〜 実装して試したわけじゃないけど、第一感として心のどこかで納得いってない部分はあります。 すまんライフゲーム囲碁よくわからんで適当だった。 手順が大事なら無理だね。 こちらはF5f6の筋が全滅している…。 これから間違い探しですが、大変だぁ。 いや、実はむしろ囲碁よりライフゲーム囲碁のほうが有効な可能性までありますが… やはり心のどこかで引っかかるものがあるのです。 F5f6の筋復活。 パブリックドローリスト99件に対して、6パターン12本の棋譜が確定間違い。 そのほか3パターン9本のおそらくパブリックドローじゃない疑い。 あああ、まったく頑張れない 今日も虚しく時間だけが過ぎて行く Orz SQLのテーブルって一回定義しちゃって運用始まっちゃうと中々変えれないイメージがあって踏ん切りがつかない それなら初めからテーブル分割気味に定義したほうがいいのだろうか? テーブルに予備項目もたせて後から項目増やしたくなったらそれ使うみたいな手法もないことはないな。 最善策ではないにしても。 軽く計算してみたけど8TBのHDDをもってしても12〜13手くらいしか全記憶できないっぽいな うーむ 盤面情報と勝率情報をテーブル分けてidでjoinする方向で検討。 親子関係もテーブルに持つようにするかも。 F5f6の筋また死亡。 死亡復活を繰り返して3回目くらいに復活安定した筋もあるので、まだまだかかるかも(汗 というか、こういう作業が面倒臭い。 C++からpostgre sqlにテストデータを1件登録することに成功した。 夢が広がるなぁ テーブル定義は段々固まってきたけどどういう順序で探索ツリーを展開するか一番肝心なところが決まってない。 探索が進むほど有望な局面を選択できるようにしたいがやはりMCTS系の探索だろうか? F5f6の筋復活(汗 その代わり、F5d6E6f4とF5f6E6d6(対称形)に差が出てきて、評価値がずれた。 F5f6E6d6の棋譜をすべてF5f6E6f4に変換して、Bookにはf4系とd6系の2種類登録 しているので、ここの間では差が生じないが、例えばF5f4E3〜の筋からたまたま F5d6E6d6とかに合流してくると、その棋譜については対称変換しないので、差が 生じてしまうという事になるかなと気が付いて、対称変換で差が生じている棋譜を Bookから逆生成してみたところ結構な件数が…というか、ざっくり見積もって既に 3万件超え。どうやって復旧するか悩むところ。というか、おそらくこれやったらまた F5f6の筋が死亡しそうな予感。これから対策を考えます。むむむ。 そのほか、部分的に遡って完全読み切りした時に、そこまでたどり着いていない 筋の方が良い評価値になってしまうという、Bookに生じる矛盾を解消する処理を追加。 こちらは結構綺麗にできた。 対称形の合流問題、一応のプログラムできた…と思う。 ロジック的には色々なやり方があるのだけど、処理時間とどこまでやるのかという ところが悩みどころ。今のままで動かすか、どうするか。 ちょっと悩みたいので一旦ペンディング。 一晩寝かしてプログラム破棄(汗 もともとある対称盤面の処理ロジックを生かして、F5筋しかない棋譜をC4/D3/E6に 対称変換する事で、根本的に解決しようという方向になりました。副作用はBookが 4倍に膨れるのと、F5スタート限定だった評価関数のエラーがいったん大きくなって しまうために、学習しなおさなければならない事です。 やってみたら、Bookサイズでかすぎてメモリーギリギリ。仕方がないので60手目まで 作っていたBookを40手目までに限定。あと敢えて残して(意図的に作って)あった、 24手目以降のベストではない分岐も別途保存して一回削除しました。 メモリ64G以上欲しい…。スレッドは16くらいで十分なので。 Ryzen Threadripper 3990Xに最適化したDDR4-3600 256GBメモリキットがG.SKILLから ttp://www.gdm.or.jp/pressrelease/2020/0212/338305 今更だけど、メモリよりHDDのほうがでかいわけだが、全部メモリに乗らないとするとどうやってプログラム組めばいいか悩ましいな。 ホント今更だけど。 スピードが必要な部分はメモリーに無いといかんわけで。 今は探索でBookを参照しているので、Bookアクセスには速度が必要なわけで。 Bookは重要だけど棋譜は既に重要ではないわけで。 棋譜はSDDに移そうかなと思っていたりします。 どうせ要所要所で保存しているわけだし、都度読み込めばみたいな。 (HDDは遅すぎるので論外かと) ただ…今のロジックがメモリー前提なのと、棋譜ですら読み込みに数秒かかる 状態なので、できればメモリーに置いときたい。そもそも、大した容量じゃないし。 自分の場合、本体でBook読み込むのと、同時にZebraと突き合わせながら間違い 箇所探しで掘り進める用に、Bookを確認するプログラムも同時に動かしていて、 そちらでも同じサイズのBookを読み込まざるを得ないので、16Gのメモリーが あっても、半分くらいに抑えておかないといけないという問題があります。 頭の片隅にバイナリファイルのランダムアクセスってのがちょこっとだけありますが、 それって自分用DBを作るようなものなので、悩み中。とはいえ、最終的にもしオセロ の対戦プログラムにするのなら、今ほど探索時間気にするわけでもなし、動作環境 として要求するメモリー量が大きすぎるのもなんだかなぁと思っていたりもします。 そんな事より、対称形サポートして棋譜作っていたら、またF5f6系が全滅して 途方に暮れていたところで、知らぬ間に復活していたり。間違い可能性高い パブリックドロー筋が復活したと思ったら、またダメだったり。 まだ棋譜作成が足りていないという事実に直面しています。 対称形サポートでBookはだいぶ良くなって来た感じですが、完全読み切りの探索時間 が遅くなった。まだ新しい教師データに対して学習不足なんだと思いますが、どこまで 復活するか。 残り30手読み切り時間がかかりすぎる。棋譜作成のプログラムの方は、ほぼ出来上 がってしまったので、動作具合を見ているだけになっている。何か探索高速化のネタは 無いものか。 PC一つ買って、そちらでオセロの棋譜作成させながら、別の何かの開発を始める時な のかも知れない。 とりあえずモンテカルロ1000poで10〜50手打ち進めてその局面で100000po回して結果の黒番の勝利回数、スコアの合計を収集するプログラムを作成。 あんまりいい方法じゃないとはおもうけどこれだというアイディアもないしこれで一回やってみます。 マシンパワー欲しいすな。 3990xでも足りないかも。 アルゴリズム見直せと言われそうだが。 まーでも310さんも言ってるけど計算にマシン取られるとヒマですね。 AWSとか使うのも面白いかもしれないけどいかんせん金が… 夜中動かすとファンがうるさくてねれないorz やっぱaws… でも金が… でもまあ、コロナでいつポックリいくともわからないならいっそ3990x買っちゃうってのも考えようによってはなくなないな。 たぶん感染経路不明な感染者が1000人超えたらテレビも飽きてきて めっきり話題にならなくると思うなw 70499種類の盤面のモンテカルロ勝率スコアデータが取れました。 これをもとにDNNをトレーニングしてみます。 やっぱ素のモンテカルロに勝てない!!! どうしてなんだ… キター!素のモンテカルロに勝ち越しました! 黒番 31勝20敗 白番 32勝19敗 モンテカルロが間違える局面で間違いを訂正してそれをDNNに学習させる方法ないかなぁ 間違える局面が特定できているて、間違えた手を訂正できるんなら、 訂正後から対戦再開させて、その棋譜で局面DB更新して、学習するとか。 特定できていなくても、基本強化学習は、対戦→DB更新&学習の 繰り返しで、徐々に間違いを訂正していく方法。もうちょっと工夫する ならε-Greedyなどの手法で既存の棋譜の途中で無理やり別の手に 分岐させていく。その手が悪くても、「悪い手である」という認識を学習 させる事ができる。 線形計画だとモデルが上手くできていないと学習が飽和しちゃうけど、 DNNだったらある程度うまく学習してくれるかも。 >>127 特定も訂正も現状できてないですね。 それよりひどいバグを発見して>>115 で取ったデータが全て台無しになる可能性が… あかん、なんか全然おかしいorz ちゃんと見直さないと… 間違い探しを続けるうちに、何故Zebraの評価値の方がまともに見えるか問題に 突き当りました。で、評価関数を手数毎に60種類に分割している事で、学習データ が不足しているとか、スムージングしていないために、2手前の自分の番の盤面との 差分が取れないとかの問題があるのかなぁと思い立ちまして…。 また、4対称採用した事で学習時間も4倍になってしまいまして…。 思い切って、評価関数を1つにまとめてみたらどうだろうと思い立って、専用の学習 プロジェクトを作ってやってみました。通常数百回学習しないとまともな学習ができ ないのですが、20回学習したところで、意外とフィットしてしまいました。学習時間も 少し減ってる気がする。 一旦評価関数の癖を変えたほうが強化学習も進むかなと思い、とりあえず本番採用 してみました。気持ち速度も速くなった気がしています。もっとも、評価関数の学習具合 によってαβのorderingも変わって速度が変わったりするので、今後学習を積み重ね て、過学習気味になったりした時にどうなるのかは不明。 これから数日動かしてみて、良かったらこっちにしようかと思います。強いオセロAIを 作るのなら、対戦してどっちが強いとかやるのが本来なのですが、特にそういう目標も 現状あるわけでなし(汗 >>127 に捕捉しとくと、 自分はGreedyな手法の精度をあげるために、浅い探索(9手)と組み合わせて、 評価値が少しだけ悪い手とか、Book登録ないのに評価値が良いとか、いくつかの 基準の訂正ロジックを作って、明らかに悪い手を排除したGreedy法をとって、 既存の棋譜に対して順次分岐を生成していく事で、Bookを埋めて行っています。 分岐は13手読みで作成していますが、この分岐も間違いがそれなりにあるため、 間違いを積み上げているのではないかという懸念もあります(汗 オセロの場合、黒白両者とも最善の場合、引き分けに収束する可能性が濃厚なため 初手から最善引き分けとなるツリーについては、先頭側からこのGreedy法で分岐を 生成し、また(後ろから)確定読み切りを優先して実行する事で、引き分け手順だけ 優先的に精度を上げています。 評価関数作るのに、こういう制約をつけた方法が良いのかは不明です。現に極端に 形勢が傾いた盤面の読み切りは、学習データが不足しているために、引き分け盤面 よりずっと時間がかかるように感じています。 げげ。>>131 の奴、本番に入れて学習させたらうまく動かん…。 原因箇所は特定できたけど、そもそもBook分だけで学習していて、後半の棋譜から 教師データ作ってなかったので、件数が大幅に違う。後ろ15手分が抜けている。 が、これが入ると学習の途中で無限ループに入ってしまう。 何かのオーバフローなんだと思うけど、今は原因不明orz たぶんなおった。 学習の進行具合インジケータの*印の数を作るところでオーバーフローして 延々と*を表示し続けてるだけだったw こういうところで適当にint使っているのがいかん。 と、怪しそうなところをsize_tに直したら、整合性が取れなくなってワーニングの嵐w 適当にsize_tにすればよいというものでもなかったw オーバーフローが嫌だからついlong longを使ってしまうw メモリ余計に食うけど。 タイルゲーム、完全解析した後でもそれなりに楽しめる不思議。自力では勝てないからな。 そういやconnect4より複雑で完全解析されててネットで遊べるゲームってなにかあるのかな? データ取りなおしたので再度DNN学習させてみます。 ついでにネットワーク少し大きくしてみます。 なんかDNNほぼ最悪の手を打つんだが… 真逆の学習させちまったか? 試しに評価値に*-1してみたがやっぱり悪い手を打つ。 真逆ってわけでもないのか? わけわからん うーん、なんかアルファ碁Leeみたいに、数手前の手順を学習データとして食わせるといいかもなぁ。 石がぶつかってる時の判断がちょっとおかしいんだよなぁ もうヒューリスティックもモリモリ入れちゃおうかなぁ 先制攻撃を仕掛ける体制が整っているかどうかの判定が今後の課題ですね。 先制攻撃を仕掛けた時に反撃で逆に取られる確率とか学習させたら駄目かなぁ? ある局面に対し、それぞれの点が黒の地になる確率のベクタを返すようにDNNを学習したらどうだろう? 前回はスコア差を評価値に学習させましたが、今回は勝率で学習させてみます。 結局セオリー通りがいいのかもしれないので。 ホントはスコア最大化はぜひともやりたいんだけど。 勝率で学習させたら黒番は勝ち越してますが、白番は負け越してますね。 白番でも勝てると思いましたが。 うお、バグ発見w DNNが全く働いてなかったww 黒番で勝ち越したのはたまたまやなこれは。 うーん、石をくっつけて打つなぁ もっとばらけさせたほうがいいと思うんだけど。 うーん、石がくっついているか離れているか標準偏差のようなものを出して学習パラメータに渡すとか ホントはあんま手動で特徴量出そうとするのよくないアイディアなんだろうけど。 結局モンテカルロの勝率データだけだとだめっぽくて、いろんな戦略の中からより良いものを探すようにしたいなぁ あれ、黒番、白番ともダブルスコアで勝ち越してる?? まだ対局数少ないからあれだけど。 自分は、最近、学習効率アップさせようと入れていたヒューリスティックなロジックは 見つけ次第外す方向だったりします。 棋譜作成の元ネタだけは、結構たくさん手動で追加していますが、見つけ次第追加 みたいなやり方で、偏りが出そうな気がするのと、手動追加だと入力ミスも結構あって 面倒なので、どこかで後続棋譜が少ない手順を順次自動で追加していくようにしちゃ おうかなと思ったりしています。ただ、本当に見てるだけになっちゃうのがちょっと嫌。 そんな事より、棋譜作成のペースが速すぎて、逆順での読み切り(スコア確定)が 追い付かない。 黒番 188勝 48敗 白番 176勝 55敗 めっちゃ勝ってる!! 結局ポスグレ全く使ってないというw ま、当面ポスグレは保留かなぁ とりあえず、この新しいAIで勝率データ取りなおして更に学習させるスパイラルへもっていくか。 小人閑居して不善をなす… 評価関数の学習周りをいじっていたら、学習エラーが大きく(4〜5倍)なってしまった。 オプティマイザーをAdamにしてみたのが悪かったのか(バグ?)、それとも他にいじった ところが悪かったのか。オプティマイザーを戻して、追加学習してみたけど、全然もとに 戻らない。 と言いながら、色々と溜まっていた懸案も機能追加してしまった。 結局、どうにも直らないのでウェイトを一旦クリアしてRMSpropで再学習してる最中です。 明日の朝にはまともになっているかなぁ。 行列パッケージEigenにユーザ拡張のサポート無し機能がいくつか追加されていて、 その中にTensorクラスがある事に気づいた。 速度は期待できないけど、もう一度DCNNやってみようかなぁ。 つか、もう一台PCがあれば、棋譜が既にあるので、テストできるんだよなぁ。 RMSpropで一から学習しなおしで、もうすぐ20エポックだけど、順調な感じ。 前回同様20回+αも回せば結構よいところに行きそうな感じ。 おかしかった時は、もともとの場所から離れて、変な局所解にトラップされていた ような感じになっていたんだよなぁ。現状のAdamのコードにバグがあるのか調べ たいけど、もともと参考にしたサイトが見つからない。今見つかるやつはChainerの 類の疑似コードらしく、ちょっとやそっとでは解読できないレベルの記号の羅列orz モンテカルロ+ヒューリスティックAIにも勝利!! いい感じだ。 あーもう、計算時間かかりすぎ! あと3〜4日は計算回さないとデータが集まらない。 こんなときスレッドリッパー3990xがあれば… ぶっちゃけ1週間かかる計算が1日で終わるとしたら3990x買うのもありなんじゃないか…??? 金がないけど。 まあまあ。 自分は棋譜作成開始して、既に数年経ってる気がする(汗 途中データ飛んだりしているから、実際はもっと長い。 だんだんコツがわかって収集速度は加速的に高速化してきているけど、 今度はメモリー溢れが恐怖。 Eigen UnsupportedのTensorクラスを見つけて、またぞろDCNNに興味が沸いて来ま した。で、思い出しがてらウェブを眺めていました。前回断念したのは畳み込み層の 計算を行列で行うためのim2colのロジックを高速に行う方法が見つからなかったから だと思い出しました(汗 しかし、気が付いてしまいました。所詮8×8のマスの定型変換で、汎用性いらないので 64ビットのローテーションとマスク値とのandというビット演算で、前処理ができてしまい ます。そのあとで行列に変換すれば良いだけの事でした。つまりim2col関数はいらん。 もう少しDCNNの最新動向をフォローしてから、同じ棋譜を学習させて試してみたいと 思います。 DNN学習、損失もいい感じで減ってきました。 素のモンテカルロとの対戦に移ります。 実を言えば私は畳み込みはやってないんですな。 全結合でやってます。 お、 黒番 7勝2敗 白番 9勝0敗 これは期待が高まる!!! 黒番 22勝3敗 白番 20勝5敗 いいね〜いいね〜 そろそろソースコードのバージョン管理とかやったほうがいいのかなぁ GitHubとか read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる