daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

open ai gym[atari]をwindowsでも使えるようにしようじぇ??

f:id:daruma3940:20160520223745p:plain
なんかopen ai gym[atari]をwindows環境で

 pip install gym[atari] 

しようとしたらインストールできなかったので
ビルドする方法をいろいろ調べてやってみたのでここに書き記しておきのじぇ
ちなみにbash on windowsとか vcXsrv とか使うのはめんどくさいのでそれを使わない方法なのじぇ(MSYS2は使ってる)
f:id:daruma3940:20160520223745p:plain
まあこのQuitaの方法のそのまんまなのでこれ読めばわかるって人はこれ読んでくれだじぇ
qiita.com

f:id:daruma3940:20160520223745p:plain
github.com
このissueの
f:id:daruma3940:20170813025408p:plain
この投稿に注目なのじぇ

github.com
どうやらこれをつかえばいいらしいのじぇ?

pip install -U git+https://github.com/Kojoley/atari-py.git

f:id:daruma3940:20160520223745p:plain
まりちゃのPCにはすでにMSYS2環境はすでにあってそこにpathも通っていたので
Visualstudio 2015のC++ビルドツールさえ用意すれば うまくいったのじぇ

f:id:daruma3940:20170813025746p:plain
(このソースは
github.comより

)
f:id:daruma3940:20160520223745p:plain
うむ!ちゃんと動いてるみたいなのじぇ!



f:id:daruma3940:20170813025834p:plain

f:id:daruma3940:20160520223745p:plain

早く公式で対応して..(懇願)

カオスについて

f:id:daruma3940:20160520223745p:plain
暇なのでカオスについてかたろうじぇ?
f:id:daruma3940:20160521003616p:plain
いきなりね

f:id:daruma3940:20160520223745p:plain
カオスの定義はいろいろあるけれどたぶん「初期値俊敏性を持っていて決定論的であるもののこと」なのじぇ
f:id:daruma3940:20170803230209p:plain

この図でいう
{ \displaystyle
\lambda > 0 
}
を持つものなのじぇ



f:id:daruma3940:20160520223745p:plain
昔流れてきたこのツイートも大まかに言ってカオスなのじぇ。

f:id:daruma3940:20160521003616p:plain
はぇ~~~

f:id:daruma3940:20160520223745p:plain
2次元調和振動子の場合を考えてみようじぇ。
これがハミルトニアンなのじぇ
{ \displaystyle
H_0 = \sum_{i=1,2} (p_i^2+\omega_i^2q_i^2)/2 
}

f:id:daruma3940:20160520223745p:plain

f:id:daruma3940:20160520223745p:plain
見ての通りこの場合ハミルトニアンはx方向のものとy方向のものに分離できるのじぇ。
{ \displaystyle
H_0 = \sum_{i=1,2} (p_i^2+\omega_i^2q_i^2)/2 ≡  H_{0x}+H_{0y}
}
そしてこれら
{ \displaystyle
H_{0x}  と H_{0y} は保存されるのじぇ。 
}
{ \displaystyle
\{H_x,H\}_{classical} =dH_x/dt=0     ---(1)
}

f:id:daruma3940:20160520223745p:plain
xについて見てみるとこれは位相空間的に周期的なのじぇ。

f:id:daruma3940:20170804214947p:plain

そしてもちろんyについても周期的なのじぇ。
xについても周期的そしてyについても周期的ということはこれは位相空間上でトーラスになるのじぇ。

f:id:daruma3940:20170804215634p:plain

f:id:daruma3940:20160520223745p:plain

ここでさっきの方法をちょっとだけ変えてトーラスであることを示すのじぇ。
(1)のハミルトニアンの力学変数を作用変数
{ \displaystyle
 J_i=(2\pi)^{-1} \oint p_i dq_i  
}
と角変数
{ \displaystyle
 \phi_i = \omega_i t  
}
に正準変換してみようじぇ。
まあ難しいことしなくてもここでは調和振動子なので作用変数は
縦軸
{ \displaystyle
\sqrt{2E}
}
横軸
{ \displaystyle
\sqrt{2E}/\omega
}
の楕円になるので
f:id:daruma3940:20170805124806p:plain

楕円の面積の公式
{ \displaystyle
 S=\pi ab
}
を用いれば
{ \displaystyle
 S=2 \pi E / \omega \\
より \\
J=E/ \omega
}
このように計算でき、ハミルトニアン
{ \displaystyle
H_0 = \sum_{i=1,2} \omega_i J_i ≡  H_0(J_1,J_2)
}
このように書き直せるのじぇ。
ここで
{ \displaystyle
 dJ_i/dt=-\partial H_0  /\partial \phi_i =0 
}

であるので{Ji}は保存されるのじぇ。
これによってさっきの話と同じようにトーラスになることが分かったのじぇ。



f:id:daruma3940:20160520223745p:plain
今度はこれに非加積分摂動を与えた場合を考えようじぇ。
{ \displaystyle
H_0 =   H_0(J_1,J_2)  + \epsilon \sum_{m,n} f_{m,n}(J_1,J_2)cos(m \phi_1 + n \phi_2)  ---(2)
}
非加積分摂動はフーリエ展開の形で与えるのじぇ。

ここで母関数を
{ \displaystyle
W= J'_1 \phi_1 + J'_2 \phi_2 +\epsilon \sum_{m,n} g_{m,n}(J'_1,J'_2)cos(m \phi_1 + n \phi_2)
}

として 新しい作用、各変数
{ \displaystyle
  \{  J'_i , \phi '_i   \}
}
を導入した正準変換を考えると
{ \displaystyle
 J_i= \partial W/\partial \phi_i= J'_1 +\epsilon \sum_{m,n}  (m\delta_{i 1}+n\delta_{i 2}) g_{m,n}(J'_1,J'_2)cos(m \phi_1 + n \phi_2)
}

なので(2)をJ'iの周辺でテーラー展開したものは,
{ \displaystyle
H =   H_0(J'_1,J'_2)  + \sum_{i=1,2} ( \partial H_0/\partial J_i ) (  J_i -J'_i )+ ... \\
=  H_0(J'_1,J'_2)  + \epsilon \sum_{m,n}  [ f_{m,n}+  (m\omega_1+n\omega_2)g_{m,n} ] cos(m \phi_1 + n \phi_2) +O(\epsilon^2)
}

になるのじぇ。

。もし摂動が小さく任意のm,nに対して
{ \displaystyle
 | f_{m,n} | << | m\omega_1+n\omega_2 |
}
が成立するのであれば、
{ \displaystyle
g_{m,n}=-f_{m,n}/(m\omega_1+n\omega_2)    (<<1)
}
のようにgを選ぶことでテーラー展開のεの一次の項を消すことができるのじぇ。
もし
{ \displaystyle
\gamma=\omega_1/\omega_2
}
有理数の場合は分母を発散させるm,nの選び方ができてしまうのでg関数は決まらないけれど、
有理数の数は無理数の数に比べてとても少ないのでそれは無視できると考えられるらしいのじぇ。

この手続きをεの高次の項に対しても繰り返すことで高次の項を消去でき、
ハミルトニアンは結局
{ \displaystyle
H=H_0(J^{(∞)}_1,J^{(∞)}_2)
}


となり、元のトーラスは変形して新しいトーラスができるのじぇ。
これを Kolmogorov-Arnold-Moser(KAM) トーラスというらしいのじぇ。
f:id:daruma3940:20160520223745p:plain
gをどう選ぶかの話のにいろいろ疑問を持つ人は多いと思うけれどそこはかなり難しい数学の議論でKolmogorov-Arnold-Moserの論文に詳しく書かれているらしいのじぇ。



。もし摂動が大きくなってくると、
{ \displaystyle
 | f_{m,n} | >> | m\omega_1+n\omega_2 |
}
となり、
{ \displaystyle
 | g_{m,n} |<< 1
}
となる母関数を得ることができず、εの一時の項を消せないためトーラスは崩壊するのじぇ。これがカオスの発生なのじぇ。


ところでなぜ母関数が
{ \displaystyle
 | g_{m,n} | << 1
}
を満足しなければならないのかはまりちゃにはわからないのじぇ(詳しい人いたら教えてください。)


f:id:daruma3940:20160520223745p:plain
本の内容をブログに書いてみればよくわかるんじゃないかと思ったけれど
大事で気になるところがはしょられているのでいまいちよくわからんって感じなのじぇ
f:id:daruma3940:20160520223745p:plain
トーラスが崩壊してカオスがどのように作り出されるか
ポアンカレマップ、面積保存写像、孤立固定点についてkicked rotator modelの図を交えた話はまた今度気が向いたらなのじぇ


~~~~追記~~~~
f:id:daruma3940:20160520223745p:plain
KAMトーラスなんて現実世界に現れるのかと思うかもしれないけど
うちの教授によるとなんと土星の環がKAMトーラスらしいのじぇ
土星の太陽を回る周期と,土星の輪をなしている塵が土星の周りを回る周期でトーラスを形成しほかの惑星によって及ぼされる引力が微小な摂動となり
周期比が有理数比から遠いところだけが輪として残っているということらしいのじぇ
f:id:daruma3940:20171116212310j:plain
写真はここから
solarsystem.nasa.gov

f:id:daruma3940:20160521003616p:plain

ちょっとまりちゃ。最近全然将棋プログラム書いてないじゃない!

次の電王トーナメントのために何かしなさいよ!

f:id:daruma3940:20160520223745p:plain

一応電王トーナメントに関係することはしているのじぇ。

f:id:daruma3940:20160521003616p:plain

え?何してるの?

f:id:daruma3940:20160520223745p:plain

ゲーム作ってるのじぇ。

f:id:daruma3940:20160521003043p:plain

は?

f:id:daruma3940:20170716150153p:plain

 

f:id:daruma3940:20160520223745p:plain

Tower of DenOuなのじぇ。

f:id:daruma3940:20160521003616p:plain

えぇ....

f:id:daruma3940:20160520223745p:plain

せかいの まんなかにたつ とうは

でんおうに つうじている という


はるかな でんおうを ゆめみて
おおくの ものたちが
このとうの ひみつに いどんでいった 
だが かれらの うんめいを
しるものはない

そして いま またひとり‥‥

f:id:daruma3940:20160521003616p:plain

魔界塔士かよ!

 

f:id:daruma3940:20170716150538p:plain

f:id:daruma3940:20160520223745p:plain

あの鳥はcoduck,あのうさぎはlesserpyonなのじぇ

ゲームとしてはロックマン的な感じにしたいのじぇ。

f:id:daruma3940:20170716150900p:plain

f:id:daruma3940:20160520223745p:plain

これが最初のボスうさぴょんなのじぇ。

ジャンプしながら攻撃を仕掛けてくるのじぇ

 

f:id:daruma3940:20170716151018p:plain

f:id:daruma3940:20160520223745p:plain

これはBonanza。3駒連携攻撃をしてくるのじぇ。

 

f:id:daruma3940:20170716151143p:plain

f:id:daruma3940:20160520223745p:plain

これは技巧。

いまいち仕様が決まってないのじぇ。

f:id:daruma3940:20170716151340p:plain

f:id:daruma3940:20170716151436p:plain

f:id:daruma3940:20170716151636p:plain

f:id:daruma3940:20160520223745p:plain

ゲーム開発は楽しいのじぇ。

 

f:id:daruma3940:20160520223745p:plain

ちなみにちょっと遊べるぐらいのクオリティになってきたので友達にテストプレイとして公開してみたけどだれも遊んでくれなかったのじぇ
この「遊んでくれてありがとう」画面を作った意味がなくなってしまったのじぇ

f:id:daruma3940:20170716151942p:plain

f:id:daruma3940:20160521003616p:plain

ざんねんね。

f:id:daruma3940:20160520223745p:plain

今の課題としては難易度調整がダメダメで技巧よりもうさぴょんのほうが強くなってしまっていること、ボリュームが足りていないこと、音楽を自作しようとしているが全然作曲ができていないことなのじぇ。

 あとこういうサガフロみたいな感じのゲームつくるのも面白そうだじぇ

 

 

備忘録

http://www2.computer-shogi.org/wcsc27/appeal/Apery/appeal_wcsc27.html
なんで強いソフト深い探索の評価値に今の局面の評価値を近づける学習方法使う時に静止探索の末端局面の特徴に対して更新しているのか?


静的な局面でないとあまり正確な局面評価ができない
つまり今の評価関数は静止探索をする前提である
今の評価関数では静止探索を表現できない?(手番があればある程度はできるような気がするのだけれど。しかしまあ最新の強いソフトがまだ静止探索をしてるってことはまあそういうことか。DNNほどの特徴があれば静止探索も表現できるだろうが静止探索するより遅いので論外)
静止探索を前提としているということはつまり今の評価関数には静止探索も含まれているということ?


Stockfish探索では静止探索はleaf nodeでしか呼び出されない。すべてのゲーム木内のノードで静止探索が呼び出されるわけではない。つまりleaf以外では完全な評価はできていないので前向き枝切りの精度が悪い?

この点ソースコードを見直してみると多くの前向き枝切りで静止探索をした点数を用いていたため大丈夫そう。
唯一使ってなかったのがfutility prunning。
これも静止探索した方がいいと思うがそれだとrazoringとかぶるよなとも思う。
この辺よくわからん

そして静止探索の末端局面の評価値を深い探索の値に近づけている都合上、ノードの評価値が深い探索の値に近づいているかといわれると直接的に近づいているわけではない
(しかし反復進化の考えによると一度はleaf nodeであったことがあるはずで静止探索の値がTTに格納されているはずなのでそこまで気にする必要はないのか?しかしnullwindowsearchとか枝切りとかが起こると読まれないし...)

RootStrapで静止探索をせずにRootの局面に対して値を更新する?
通常探索用の評価関数(手番付き)(rootにそのまま深い探索の値を近づける)と静止探索用の評価関数を用意する?(取り合いを読ませた後なら手番がなくても表現できるはず)(しかし取り合いがいつ終わるのかということはStandPatなどの影響で簡単にはわからない この辺がネック)

TreeStrapについて調べてみたのじぇ

f:id:daruma3940:20160520223745p:plain
https://chessprogramming.wikispaces.com/Meep
きっかけはここのページに
Algorithm Elo
Untrained 250 ± 63
TD-Leaf 1068 ± 36
RootStrap(αβ) 1362 ± 59
TreeStrap(mm) 1807 ± 32
TreeStrap(αβ) 2157 ± 31

と書かれていたので、「Tree StrapはRootStrapより強くなるのか!?そういえばtree strapやってるソフトなんて聞いたことないな!鉱脈を見つけてしまったかも!!!!」と思って詳しく知りたくなったからなのじぇ!
f:id:daruma3940:20160520223745p:plain

http://www0.cs.ucl.ac.uk/staff/d.silver/web/Applications_files/bootstrapping.pdf
論文を見つけたので読んでみたのじぇ
f:id:daruma3940:20160520223745p:plain

RootStrapはRootNodeの評価値を深い探索の結果の値に近づけるのに対してどうやらTreeStrapは探索木のノード全体を深い探索の値に近づける方法で、
αβ探索を用いる場合は探索木の多くのノードで正確な値を計算できないので代わりにそのノードにおけるalpha,beta値を利用して値を更新するということをするようだったのじぇ
ノードの評価値がαよりも小さければ評価値をαに近づけ、βよりも大きい場合は評価値をβに近づけるらしいのじぇ
確かにalpha,beta値は探索の結果出てくるものなので、正確な値がわからなければこれを用いるのはなるほどなと思ったのじぇ
f:id:daruma3940:20160520223745p:plain
しかし,探索した時の深さが8だったとするとrootnodeはdepth8の時の情報を利用できるが、ゲーム木の内部ではそれより浅いdepthにおける情報を利用するしかないのであまりよくないかとも思うのじぇ
まあこれはdepthがあまりに浅いと値を更新するのに使うのを制限するということをすれば大丈夫だと思ったし、探索に出てくる局面に対して値を更新できるので多くの局面を学習できるのでメリットがあるのではないかと思うのじぇ
f:id:daruma3940:20160520223745p:plain
しかし
論文の7ページ目の図を見ると図のnumber of training gamesが全然足りないことに気が付いたのじぇ。一万ゲームしかないのじぇ...
そしてもう少しiterationを増やせばrootstrapがtreestrapのELOを追い越しそうだったのじぇ
f:id:daruma3940:20160520223745p:plain
この辺で第四回電王トーナメントの時のことを思い出した。そういえばこのグラフ見たことがある....
そうだ...出村さんがやねさんと話していた時に出していた論文じゃん....そしてその時も「TreeStrapは胡散臭いよね~」「TreeStrapよくないかも」みたいな会話になっていた。
tree strapは鉱脈ではなかったようなのじぇ....

f:id:daruma3940:20160520223745p:plain
「探索に出てくる多くの局面に対して値を更新できるので多くの局面を学習できるメリット」についてもこのnodchipさんの一連のツイートを見ると



RootStrapでも結構多くの特徴が出てくるのでゲーム木内部で浅い探索結果を利用してまで学習局面を増やす方法にメリットがなさそうということに気づいたのじぇ
f:id:daruma3940:20160520223745p:plain
そして何よりRoot Strapは教師データ生成と学習を別にできるので同じ教師データを用いて学習の条件調整が簡単にできるという大きなメリットがあるのじぇ
f:id:daruma3940:20160520223745p:plain
まあtree strapはお蔵入りになったが、この考え方はどこかで使えるかもしれない。
知識として引き出しの中にしまっておくことにしようじぇ?

第27回世界コンピューター将棋選手権に参加してきた。

第27回世界コンピューター将棋選手権に参加してきた。
今回はライブラリを使わずに参加しようということで前回の第4回電王トーナメントが終わった後動物将棋のエンジンを作り感覚を取り戻してから一から本将棋のプログラムを作り直した。
大会でshogi686さんからrotated bitboardはpext bitboardより高速に処理ができると教わったのでrotated bitboardを採用することにした。rotated bitboardの実装は結構大変でバグを取ったりするうちに丸一日経っていた。
bitboardには81bit必要で、飛び効きを処理するためにはこれに加えて+45,-45,90°回転(rotated)させたbitboardも必要なのだけれど,効きを遮る駒が盤の一番端っこにいる場合は一番端っこに駒がいないのと同じだけ盤上に効きを作ることができるので飛び効きの処理に必要なbitboardは81bitではなく縦横で7*9=63bit斜めで7*7=49bitあればいい。
これらは64bitに収まるので縦横斜めすべてを256bit型に格納してSIMD演算で一気に計算できると教わった。
shogi686は斜めのテーブルをどのbitに格納するとキャッシュにのりやすいかといった高速化もしていたが、私にはそこまでできない。
局面の評価は一般的な3駒関係でなく2駒関係を用いることにした。これは2コマの方が3コマよりも強いと思ったからとかそういうわけではなくて単純に2駒のほうがサイズが小さくて取り扱いやすいこと、学習に時間があまりかからないことというLazyな理由からであった。学習にはbonanza methodを使うことにした。
符号の間違いが多くてちゃんと学習させるのにはかなり手間取った。
しかし学習させた自分のソフトが自力で穴熊に組んだ時はかなりうれしかった。
探索部はチェスの最強ソフトであるStockfishの探索部を将棋用に改良してそれを取り入れた。取り入れるだけであるがなんだかんだバグが出てきて取り除くのは大変だった
今回はどれぐらい強くなるか弱くなってしまってもしょうがないなと思ったがbonanza6に勝てるぐらいのソフトになった。正直感無量だった。あのbonanza6を超えることができるとは...
なんか書くの疲れてきたので大会は楽しかったでおわりにする

大会1日目の飲み会代払うの忘れてたのじぇ!

f:id:daruma3940:20160520223745p:plain

しまったのじぇ!!

大会一日目の飲み会代払うの忘れてたのじぇ!

f:id:daruma3940:20160520223745p:plain

あの日朝2時寝の4時起きで飲み会の途中でうとうとしてしまって、飲み会を途中で抜けたので翌日お金を渡すことになっていたのじぇ

 

f:id:daruma3940:20160520223745p:plain

Claireさんに冗談でここで黙ってれば払わなくて済むんじゃないww??

みたいなことを言ったけどまさかホントに払うの忘れてしまうとは....

f:id:daruma3940:20160520223745p:plain

非常に申し訳ないので次の大会の飲み会は余分に請求していただいて大丈夫です