【オセロ,将棋】ボードゲーム Part2【囲碁,War】
■ このスレッドは過去ログ倉庫に格納されています
比較的地味なボードゲーム専用のスレが欲しくて立ててみました。
前スレ
【オセロ,将棋】ボードゲーム【囲碁,War】
http://mevius.2ch.net/test/read.cgi/gamedev/1057763418/ 他人のコードは読みづらいですよね。
1年前に書いた自分のコードもですがorz
Theano動作おめでとうございます。良かったです。
こちらは…GUI作るのに嫌気がさして、学習部をいじっていましたが、
そろそろ〜30手の評価関数もそれほど酷いものではなさそうな気がしてきて、
中盤探索9手読み(なんの工夫も無し)で記譜作れる事に思い至りまして。
つまり、MCTSより短時間で記譜作成できると…。
この学習で、もし中盤探索の読みがそこそこな精度になってしまったら、
そもそもMCTSにする意味ないじゃんという現実からいかに目を背け続けるか
という戦いが始まりました(涙 やはりこの業界で生きていくには
パイソンの習得は必須… ということでパイソンの入門本買ってきました。
とりあえず囲連星のルールを実装してみます。 相変わらず、GUIから逃げています。
アルファ碁でいうところのポリシーネットの学習を放棄して、代わりに評価値から
P(UCT探索に対する絞り込み項)を生成していましたが、これをQ(UCT探索の
予想スコア:これまでの探索の加重平均)から、1プレイアウト毎に再計算するよう
にしてみました。
多少探索速度は落ちますが、良い感じかなぁ。 パイソン入門本、一回通して読もうとしてますが、ページ数あって結構大変。
コード書きながら読んだほうがいいかなぁ。 新言語習得はストレスですよね。
C#ですら混乱して、C++に帰りたくなってます(汗
というか、メモリー管理できないC#にいらついて、記譜作成回りをいじって
慰みにしています。中盤探索に置換表を足して、反復深化っぽくしてみま
したが、あんまり早くならなくてがっかり。
Python本はまだ買ってません。ウェブ上の入門を眺めたくらいです。
Pythonは構造やら変数の型の考えやら、落とし穴になりそうなところが
色々とありますね。計算式だけ見ていればわかったような気になりますが、
どういう順番で処理が進むのか、慣れないとわからん感じ。 パイソン、変数の型の宣言がないから他人のコード超読みずらいorz
引数に何与えていいのかとかパッとわからないorz 9路囲連星の最低限のルールをパイソンに移植しました。
これからテストします。 おおむねバグ取れたっぽい
あとはこれを>>214に移植できれば… 他人のコード読むの辛いおT△T
これはかなり時間かかる… うーん、なんかこのコード五目並べのルールにべったり依存してる感じなのかなぁもしかして。
複数のゲームに対応しているAlpha Zeroプロジェクトのコードを見たほうがゲームのルールが分離されてるのかもしれないなぁ
一応、別のプロジェクトに手を出すことも視野に入れるか… アルファゼロって数手前の履歴情報が必要らしいけどなんでこんなものがいるんだろう?
謎だ… アルファ碁の論文に書いてあったかな。次の1手的には意味なさそうだけど、
有った方が強くなるので外せなかったみたいな事が書いてあったような。
今現在の思いつきですが、ツリーサーチの末端近くでは、手の流れに応じて
点数が変わる事で、そのツリーのルート側の評価(加重平均)に影響が出てくる
可能性はある。
囲碁の場合、同一盤面が出る可能性が非常に高いのだけど、そこに至る経路で
隙があると、相手にその隙を突かれて、分岐が生じる事で、その点数は無意味に
なる。けど、それは途中の分岐をしっかり読まないと判明しない。経路情報によって
評価値(評価関数直)を下げてしまえば、プレイアウトの振り分けが減って、別の
もっと良い手に集中させることができる。こういう事かなぁ。
ま、本当に今思いついたばかりですが。
GUIに気が進まないまま、ぼーっと学習を見ていると、何故か(効果は微妙だけど)
速度アップの方法を思いついてしまうもので…。地味に色々改良しています。 310さんほどのプログラマがGUIで躓くというのも謎ですね。
単に凝り性なだけですかね。 単にGUIが嫌いなんですorz
凝りたい気持ちと、画面遷移の罠から、心がデッドロックを起こして、
しまいに面倒くさくなってしまうという。 オセロで画面遷移なんてほぼいらんでしょうに。
まいいけど。 五目並べのプロジェクトだとコウの扱いがよくわからないな
囲碁のプロジェクトも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
これで学習が進んでくれれば!! ■ このスレッドは過去ログ倉庫に格納されています