【オセロ,将棋】ボードゲーム Part2【囲碁,War】
■ このスレッドは過去ログ倉庫に格納されています
比較的地味なボードゲーム専用のスレが欲しくて立ててみました。
前スレ
【オセロ,将棋】ボードゲーム【囲碁,War】
http://mevius.2ch.net/test/read.cgi/gamedev/1057763418/ オセロで画面遷移なんてほぼいらんでしょうに。
まいいけど。 五目並べのプロジェクトだとコウの扱いがよくわからないな
囲碁のプロジェクトもgithubで漁るか… 藤井聡太さん朝日杯将棋オープン戦優勝ですか
すごいすな ドタバタしながら音だけ聞いていたけど、なんか普通に互角から徐々に優勢を
築いて、相手の奇手にも動ぜずにさばいて、勝利って感じで、強さが際立って
いましたね。
これで勝っても漫画なら編集長にバカにされるレベルと言われていましたが、
本当に笑うしかないですね。 >>214のプロジェクトに囲連星ルールを移植してみまして、モンテカルロAIが動いたみたいです。
ただし超絶遅い。絶望しかないってくらい遅い。
10プレイアウトで10秒くらいかかります。
デフォルト1000プレイアウトになっていたのでそれぐらいないとまともな強さは出ないんでしょう。
となると1手1000秒か?
絶望しかない。
orzorzorzorzorz 小路盤五目並べとかConnect4とかtic tac toe くらい小さなゲームじゃなきゃまともに動かんぞこれ ,.‐''" ̄`丶、 ひどい…!ひどすぎるっ……!
/ \ こんな話があるかっ…!
/´ \
/ |\_>、_ 、r‐、 \ 命からがら… やっとの思いで…
レ! ||_| |/_ ヽ\} \ 辿り着いたのに… やり遂げたのに……
|八|-/>、∪_ u`i ト、 \
/ / ,くィ夕u' | |/ ``‐- 、_.、__\ 実行速度っ…!
|/ / /_ヽ┐u | ,| / ,-,.=====ゝ
ヾ' / r┘|.l__人 | /\// \ あの計算量がもぎ取ってしまった……!
\ ) | N / //\./´ ̄`丶
|u | /|(l(l「| | | | せっかく手にした
| u| / | ヾ-イ .|| l、 俺の未来…希望…
_| |/| | \_|_|,. く. \
ハ.___ハ >、 \ \ \ Alpha Zero AI を……! つか連想配列とか見るからに遅そうなクラス使いまくりなんだよなぁ
こうなったらC++に移植する方向で考えるか?? 囲連星ルール部分をC++で書きなおしてパイソンと結合させるという手もあるんだろか??
とにかく今のままじゃ遅すぎる
囲連星ルール部分がどれくらいネックになってるかもよくわからないですが多分相当遅い 五目並べルールだとそこそこのスピード出ますね
当たり前か…
やっぱ囲連星ルール実装がネックか〜
は〜
死にたい PythonからC++関数を呼べるみたいですね。
C++からPythonも呼べるみたいです。
前にPythonに手を出そうかと思った時にググったら出てきました。
前者の方が解説が多かったと思います。
自分はBitboardを使いまくりなので、Pythonに手を出しあぐねていました。
また、評価関数の学習部と、評価値計算をうまく分離できれば、前者を
Python、後者をC++で書けないかなぁと思っていますが、im2col関数の
うまい実装を考えるのが面倒で、放置になっています。 ここ数日強化学習の結果がよさげになってきたので、結果の良かった学習方法に
集中させたら、また変な学習になってしまったようで、迷走中です。
学習の具合が良いと、色々な探索も速度アップするんだけど、具合が悪いと全部
悪循環になってしまうという。
仕方無いので、中盤探索の反復深化を作り、その結果を置換表に溜めてオーダ
リングを行うようにしてみましたが、効果があったのかよくわからない罠。
こちらも、学習の具合が良くなったら、急激に効果が表れるのではないかと期待
しているんだけど。 まずは簡単なC++関数一個だけのパイソンモジュール作成に成功しました。
つぎは囲連星ルールパイソンモジュールの作成ですね〜 なんかdeepcopyとかいうのに対応しなきゃいかんようなのだが。 評価関数がどんどん悪化していく罠。
頭に来たので、評価関数をステージ分割。
ステージ分割すると学習部分の全面書き直しとなる。
どうせニューラルネットは使わないと決めたので、線形回帰にスケールダウン。
またしてもゴチャゴチャしてきた部分を全面書き直しパターンへ。
もうGUIはすっかり忘れていますorz キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
動きました!
C++版囲連星ルールパイソンモジュール!!!
10倍くらい速くなりました!
でも1000プレイアウト1手約100秒
まだまだ遅い
でもこれ以上速くするアイディアもないし、とりあえず、これで進めるか。 なんかトレーニングが不正終了しますね。。。
zipから解凍したソースそのままで実行しても不正終了になるのでちょっと謎ですね。 なんかteanoてライブラリが悪いっぽいorz
上手くインストールできたと思ってたけど実はまだ駄目だったのかなぁorz linux入れるならVMWareお勧め?
他に候補ある? ちなみにHDDはパーティション切りなおすのメンドイ 評価関数変更ついでにまるっと作り直してます。
自己対戦など、汚いコードを綺麗に書き直し。
かけた工数的には自己対戦の方が大変だったかも。
評価関数を1手毎のステージ分割で60ステージにして、学習し直しです。
これで序盤を学習させると終盤が狂う問題は解消されると信じていますが、
学習に60倍の時間がかかる事が予想されるという状態で、記譜を幾ら作って
も追い付かない感じなので、強化学習主体にするつもりです。
というか、まだ、UCTの所は作りこんでいない。
まあ、ほとんどコピペですが。
で、ここまで来たところで、もういっちょ改造したくなってきた…。 ubuntuだと>>214のプログラム問題なく動くみたいですね
素晴らしい。 囲連星ルールをubuntuに移植してみましたがエラーが出ますね。
合法手が無い、みたいな感じに見えますが… くそ〜結局コツコツソース読み解くしかないかorz
いい線行ってると思うんだけどなぁ うおお、しんどい、これはしんどいorzorzorz ん、human_play.pyは動きますね…
train.pyと何が違うんだろう? C++のクラスをディクショナリのキーに突っ込んでさらに参照しようとしたときにキーの比較に失敗してるっぽく見える __hash__と__eq__を定義するといいみたいです。
__eq__はC++のoperator==で良いみたいです。 お、処理が進み始めました。
Board.init_boardでC++のオブジェクトを初期化してなかったのがエラーの原因だったみたいです。 やっぱ小路盤五目並べと比べて時間かかりますね。
焦れるw
とりあえず、これでウェイトファイルが出力されれば第一段階クリアですが… あ〜これシングルスレッドなんですね。
まあ確かにコード読んでてもマルチスレッドには見えなかったけど。 ベストポリシーとか言うファイルは出力されましたが…
いかんせん遅すぎますねぇ
並列化してハードも強化してあと30倍は速くしないと… んんん、もしかして仮想環境だとディスクアクセスめっちゃ重くなる?
CPUがほとんど仕事してないんだが… ディスクアクセスが100近くいって処理がほとんど進まなくなっちまったorz
いったん止めるべきかな〜 新評価関数版ようやく一通りできた。
強化学習にすごーく時間がかかりそう(汗
というわけでNew PC見繕ってます。
ノートPCでi7-8700Kの6コア12スレッドにメモリー32メガで
GTX1080搭載のノートPCがある。
むむむ。 帰ってきてパソコン見てみたら学習が強制終了してました。
土曜からずっと動かしっぱなしでしたが、ここにきて強制終了は痛いですね。
解決しようにも再現させるだけで数日かかってしまうし目星を付けることすら難しそう。 途中で出力されたポリシーモデルで対戦してみましたが、
予想してたよりずっとまともな手を返してきますね。
ほぼランダムに着手すると思ってました。
これはちゃんと学習できる環境整えればかなり期待できるかも! 俺も良い目のノート一台買ってLinux入れようかなぁ
デスクトップ2台は手狭だからなぁ とりあえず、Linuxならパイソン動くことはわかったから
他のもっと高速化に力入れたalpha zeroプロジェクトも試してみようかな どもです。
お高いですが、デスクトップのフルスペックの1/3以下で済むようです。
回しっぱなしの奴がレアケースで異常終了すると萎えますね。
自分の奴は、たぶん怪しいところはほぼ蓋をしているので、今は安心しています。
とはいえ、評価値の保存に数秒かかるようになってしまったので、保存中にうっかり
終了してウェイトファイルを破壊しないように、いくつか策を講じました。最近はOSの
アップデートで勝手に再起動されちゃうので。 あ、価格と性能です(^^;
強化学習に凡ミス発見。
強化学習が良いのは、学習し続ければ何とか復旧できると思えるところorz 価格コムで調べたら>>281って50万以上ですよね? >>291
ほほう?
ハイスペックノートの割には確かに安いですね。 うわパイソン部分でルール間違ってたorz
やっぱ軽くでもテストはやっておかないとあかんなorz うぬぬ。強化学習でどこかおかしい。
強化学習単純化しすぎちゃったかなぁ。
暫定的にひたすら記譜作成&記譜学習に戻しました。
遡り30手が鬼門。記譜学習で、ここをクリアする事を当面の目標にします。
とはいえ、残り29手完全読み切りの記譜がそれなりにあるのは、以前では
考えられない状況ではありますが。 強化学習がおかしいというより、記譜のパターンが圧倒的に足りていなかった
のかもと思い始めました。それによって、着手して分岐しても±0となっている
みたいな。
とりあえず、記譜の増殖手段を模索中。
今は、ヌルウィンドウサーチを使用して、遡り探索を行っている関係で、間違った
着手(石損となる手)を捨ててますが、ある程度までその手も読み切って、記譜に
加えても良いのかなぁと思っています。
とりあえず、βカット(もっと良い手があった)時の評価関数は明らかに読み間違い
をしているので、そこ限定で記譜に加えていますが、ある程度以上の手数は全て
付け足しても良いのかなぁと。 なんとなく想像しただけですが、何が悪かったのかわかり始めました。
今の学習は「良い手」しか学習していないという事です。
序盤はある程度ランダムな着手を入れて、結果がばらつくようにしていますが、
途中から読みを入れて、良い手だけで着手し、その結果を遡りで訂正しています。
遡りが有効なのは30手くらいまでで、序盤のランダムは20手程度までに抑えて
あります。とすると、遡れる範囲では、悪手を打ったらどういう事になるのかという
学習が抜けている。間違えた着手もちょっとだけ悪いだけでです。結果、最善手の
評価値はそこそこ正確なのですが、極端な悪手も、評価値としてはちょっとだけ
悪い数字でも問題が起きないという事になります。
これはこれで順序付けさえ合っていればそれで良いのですが、ちょっと学習が
進んで、微妙に係数が変わった時に、計算上0.1程度しか悪くない相当な悪手
をうっかり選択しやすくなってしまうという事で、これがオーダリングで悪さをして、
探索時間を長引かせてしまう可能性があります。
恐らく評価関数のステージ分割で、表現力がかなりアップした事から、こういう
学習漏れみたいな事が起きてくるのかなぁと。ほんと、評価関数はスカスカです。
というわけで、昨夜書いたように、ある程度深さを捨てて分岐をすべて記譜に残す
ようにしてみようかなぁと思っています。しばらく記譜作成しながら、この事を踏まえ
た強化学習をちょっと考えてみたいと思っています。 結果が出るまで時間がかかり過ぎるなぁ。
もうちょっと様子見るけど。。。
やっぱマルチスレッド化された別のalpha zeroプロジェクト探そうかな… 駄目だぁ、強くなる気配がないorz
別のalpha zero プロジェクト本気で探すか…
ここまで来てもったいない気もするけど… なんかバグ直して再学習したら、ランダムに打ったほうがマシ、くらいに変な手(1の1とか)打つんだが?
もう嫌になっちゃう。 そういやLeela Zeroも学習過程では一線うってたな。。。
逆にいい傾向なのか??? 分岐をすべて記譜にリストアップするようにしてから、爆発的に記譜が増えてます。
2000程度だったのが、15000超えました。
が、まだまだスカスカみたいです。
ここまでするんなら、真面目に自己対戦して遡りせずに、ランダム着手に対して
分岐をリストアップさせても一緒というか、早い気がしてきています(汗 ランダム着手も追加して記譜増殖中。ただいま32000超え。
もっとも、残り数手とかの記譜もあるけど(汗
ステージ分割しているので、記譜がなかなか生成されない25〜30手近辺で
非常に少ない教師データで何度も学習する事になり、そのあたりが極端な
過学習になってしまった。
解消方法をいくつか検討中です。
1)時間かかっても良いので、25〜30手の記譜ができるまで頑張る
2)前後の盤面を混ぜて、教師データを増やしてみる
3)ランダム強化学習してみる。
2)3)をやると、おそらく、平均化されて評価値がフラットになるが大小関係は
治ってくると思う。
というわけで、今夜は2)3)を試してみる予定。 あと、時々スコア指定(ヌルウィンドウサーチ)の記譜作成処理で
エラー(スコア間違い)が出る時がある。
運が悪い事にハンドリングミスその他で、記譜を残せていないので、
現象の特定ができていない。
頻度としては数日に1回くらい。
たぶん、全滅と直前のパスがらみだと思うんだけど。 Geforce GTX 1060を増設しました。
>>214をpytorchで学習してみます。 んーうごかん。
GPUありとなしでポリシーファイルに互換性がないんですかね?
もしかして。
初めからやり直すか… おお。どんどん進んでますね。
こちらは、昨夜のバグの現象は特定しました。
スコアが62や−62で、mtd(f)の探索開始が64や−64の時に、
置換表に残った64や−64が悪さして、64や−64と誤答する模様。
とはいえ、どこを直すべきかはわかりません。探索開始が64や−64
の時に、62や−62にしてやる事で、姑息的に回避はできるので後回し。
あと、記譜作成に色々機能を加えていたら、どこかがおかしそうだという
不安な状態になってしまいまして。このまま記譜学習を進めて良いか自信
が無いので、今までのデータで安全な部分をテスト用に回して、新たに
記譜を作成開始。34手目までは全探索しながら普通に遡れる感じです。
33手目から先は探索時間がしんどいので、ひとしきり落ち着いてから、もう
一度、遡りチェックのプログラムをきちっと見直して、追加していこうかな
と思っています。この間に、強化学習混ぜて、過学習部分を解消して
いこうと思います。 お、ちゃんと時間測ってないからあれだけど、気持ち速くなってる気がする。
ちゃんと時間測りたいなぁ。 バグ問題は、結局姑息的手段では回避できず。
全滅がらみでほかのケースでも誤答するケースが発生しました。
元々FFO#59用にmin-Max探索に入れていた、全滅時の処理くらいしか
原因となりそうなものが思い当たらなかったので、とりあえずコメントアウト
して様子見です。全滅時の探索が速度低下しますが、仕方がありません。 結局バグ問題は…迷宮入り臭いです。
記譜作成で負荷テスト並みに探索を繰り返すと、全滅絡まなくても間違うケースが
出てきました。再現性が無いのが辛いところ。
その昔悩んでいた時も、やっぱり置換表がらみの問題で迷宮入りでしたが、
今回も、ケチって置換表を極力クリアせずに使用していた事から、何らかの
矛盾が起きているようです。それを言っちゃうと、置換表付mtd(f)でf値を変え
ながら探索することも、またその時に作成された置換表を流用して記譜作成
兼ねた読み切り処理を速度アップすることも、怪しいという事になるわけで。
間違えてしまった事が判明した時点で、その探索は捨てるくらいしか対策が
無いという事になります。
ネットで調べたら、将棋AI界隈でも置換表の問題点を書いている人がいまして。
少なくとも深さがあっていない置換表データは使うべきではない模様。
今の調子だと一晩動かすと結構な頻度で朝見たら止まっているとい状態なので
せめて発生率を下げるべく、mtd(f)に入る前に置換表をクリアする事にしました。
なぜしなかったかというと、記譜データからスコアが確定している盤面を置換表に
入れて、それを見ながら既に読み切りしている盤面は飛ばす処理をしていたから
です。置換表をクリアして盤面再構築に時間がかかるためです。別途盤面キャッシュ
を持って、そちらは追記、置換表は毎回クリアという形に変更しました。 Leela ZeroがKGSでかなり強くなってる。
俺がパクったプログラムも学習し続けたらあれくらい強くなるんだろうか? え、ちょっとまってよ。
GPUありなしでポリシーファイルが違うってことは
成果物を配布しようとしたらGPU持ってる人しか遊べないってこと? しかもCUDAとかも一緒にインストールしてもらわないといけない?
ええぇ? 誤答問題は、置換表クリアで解消しました。
違う局面の探索で使用した置換表データは使いまわしてはいけないという事で。
なんか、結果的に、2年くらい前にも同じ事で騒いでいたような。
色々整ってきたので、あとはひたすら記譜作成しながら学習を回すだけになって
しまって、暇になってます。別PC買ってそっちで学習させながら、別の事をはじめ
ようかなぁと思い始めています。 うーん、つよくならないorz
学習は継続しつつ別のalpha zero プロジェクトも物色するか… ん、なんかメモリリークあんのかな…
swigでC++から移植したクラスってデフォルトでガベージコレクトされないのかなぁ?
もしかして。 VMWareの設定がメモリ1GBになってた。
とりあえず8GBに増やしてみた。 お、メモリ増やして再起動かけたら結構いい感じで進みだした?
メモリ増やしたのと再起動かけたのどっちが効いたのかわからんが。 くそ〜ベストポリシー更新が全く来ないorz
もう何回目だ?TT お、メモリ増やしたせいか連続運転が安定している。
しかしベストポリシー更新は相変わらずなしorz もしかして、ネットワークの初期値が糞すぎるんだろうか。
でも確かめようがないorz ベストポリシー更新まじコネ〜
でも他のプロジェクトに浮気しようにもなかなか手ごろなのがないんだよなぁ いっそ実績のあるLeelaZeroを本気でパクりに行ってみるべきか…
でも多分、難解なんだろうな〜 あんまりおかしいんでソースをオリジナルとdiffとったら学習係数が1/100になってたんだがwww
え〜何時いじったかな全く記憶にないwww
これで学習が進んでくれれば!! loss も entropyも減ってきてる!
これでベストポリシー更新が来れば!! キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
ベストポリシー更新きました!
次の切りのいいところで止めてプレーしてみよう それはそうとzen+の発売日が迫ってますね。
金がないから買えないけど情報だけは追っかけてみます。
爆速だといいな。 あとちょっとだけ待とう
終局までの手数も順調に減ってきてるから意味のある手を打ってるんだろう多分
ワクワク 打ってみました。
序盤、中盤は棋理の芽生えみたいなものが感じられました。
伸ばせそうなところを伸ばすとか伸ばされそうなところを止めに来るとか
でもわざと負けようとしても5連までは積極的に作りに来るのにそこからパタッと伸ばすのをやめて7連を作ってくれませんw
なぜw?
でもまあ、希望は感じられました。
もうすこし学習してみます。 zen+なかなかよさげですね。
前世代と比べて一割前後性能アップ? うーん。AMDはSIMD命令で遅い命令があって、速度低下するかもって
どこかで読んじゃったからなぁ。
こちらは地道に記譜作成しながら学習させてます。
深さ優先で記譜作成すると、分岐が少ない手筋ばかり増えていくので、
幅優先で、同じ深さである程度記譜溜まってから、次の深さとするように
したのですが、空きマス27からの記譜展開で、時間がかかるようになって
なかなか空き28マスに行けない。オーダリングの精度が出ていないから
だと思いますが、同時に選択肢も増えてきて、余計時間がかかる感じ。
空き30マス突破したら、かかる時間の増加率は下がるはずなんだけど。 もしかして終盤はあえてランダム性を残すことによって学習が進みやすくなるなどの深い理由があるのだろうか?
わからんが。 それとも序盤は同一局面のデータがたくさん現れるから学習できるけれど
終盤に行くとデータが散らばっちゃって学習できなくなるということだろうか あるいは一線や二線は打たないほうがいいと学習してしまっているがため、7連を作れないのだろうか? オセロは記譜生成させてるだけで暇なので、将棋の事を考えてました。
KKPとかよくわからないし、同じ事をやってもつまらないので、利きを点数化
しようかと考えてみまして、実際の計算方法を考えていたら、自玉周辺と
相手玉に対する利きがKKPなのではないかと思い至ってしまいました。
持ち駒の点数は駒種毎に固定で振られていて、駒同士のぶつかりによる優劣
特に駒交換はmin-Maxにて補間しているのかなと。評価関数自体は意外と単純
な事しか学習していない感じで、探索で補っている部分が大きいように感じます。
こうやって見ると、上手く単純化しているなぁと。
自分で勝手に想像した内容に感心してしまいました。
ただ、これならこれで、自玉KPと相手玉KPの合算で、2駒関係に次元を落とせ
そうではないかと思ってしまいました。まあ、無理なんでしょうけど。
自分がやる上での一番のネックは、オセロの評価関数が点数だったために、
なんちゃって強化学習しかやった事がな点ですね。あと、みなさんライブラリ化
されていて、それに則れば色々な人の考えた高速化・高効率化のネタが利用
できる点で、一から車輪の再発明していては追い付けないよなぁと。 ほう、将棋に進出ですか。
将棋AI界はオープンソースが進んでる感じなんですかね。 alpha zero のパクりプログラムgithubから丸パクしてきたわけだけど
そろそろちゃんとソース読み解いてみようかな。難しいだろうけど
丁寧な解説がどこかにあればいいんだけどね お、AIが7作った。
いままではわざと負けようとしても勝ってくれなかったけど今回は勝ってくれた。
まだまだ弱いけどもっと学習させてみよう ■ このスレッドは過去ログ倉庫に格納されています