今週末はデータの分析をしながらマッタリ過ごす予定 RSSフィード

2012/01/29

[]光さす庭で 11:33

 丁度一年ほど前に自然方策勾配法、無理かもという記事を書きましたが、改めてパラメータ数を数えてみると行けそう。

 現状の評価項目で進行度無しだと、パラメータ保存用に確保している領域が33,513個。ただ、この内2/3〜3/4は使ってないデッドスペースなんで、実際の個数は多分1万前後です。

 そうすると、パラメータ数×パラメータ数の行列はfloat型だと400MBで収まりますので、主記憶に載ります。

 という訳で、とりあえずは正確なパラメータ数を調べるコードを書いて、その後自然方策勾配法の勉強をしてみます。

 方策勾配法で学習が停滞しているらしいのが学習エージェント側の問題なら、自然方策勾配法で解決するかもしれませんし、いっちょ気合入れてやってみます。ひょっとしたら選手権までに化けるかも!!!

[]光さす庭で Zwei 12:48

 えーっと、パラメータ数をカウントするコードを調べてみたら、デッドスペースの大半を除いて33,513個でした。実際には後ちょっとデッドスペースがあるんで数%は減るでしょうが、3万前後ってのが最終的な個数になりそうです。

 そうすると、パラメータ数×パラメータ数の行列が約3.6GBになるんで、評価関数1〜2個分は主記憶に確保出来ますね。

 行列自体はパラメータ修正時に一時的に必要なだけなんで、パラメータ修正ルーチンの同時実行数をセマフォとかで制御してやればOKっポイです。

 残る問題は3.6GB分の逆行列を求める必要があるって事なんですが、まぁ実装してプロファイルとってから速度の事を考えましょう。

[]とりあえず行列クラスを作る 23:35

 3万×3万要素の逆行列を計算する速度が気になったんで、まずは行列クラスから作ってます。

 んで、ここを参考に実装してみたんですが…遅いです。

 Core i7 940上で動かして、1000×1000の逆行列を求めるのすら3秒かかってます。1万×1万とか3万×3万は動かしてはみたものの、一向に終わる気配が無いんで中断しました。少なくとも、数十分〜数時間はかかりそうな雰囲気です。

 という訳で、何か別のアルゴリズムを探した方が良いのかな。あるいはIntelのMKLみたいな有り合わせのライブラリ使うとか。

suzume_rsuzume_r 2012/01/30 13:29 こんにちは。1万×1万の逆行列は厳しそうですね。
行列演算ならclapackが便利だと思います。あるいは
近似でよいなら反復演算で逆行列を求めるタイプもあると思います。

かず@なのはかず@なのは 2012/01/30 18:53 題がカッコよすぎw

GasyouGasyou 2012/01/30 20:42 >>suzume_rさん
はじめまして。3万×3万だと17時間弱かかりました(汗
clapackというのはライブラリみたいですね。はじめて知りました。
逆行列を近似するのも、探してみるといくつかアルゴリズムがあるみたいですね。
情報有難う御座います。とても助かりました。
# floodgateにいたkumaの作者の方だったんですね。
# 今年の選手権には参加されるんですか?

>>かず@なのはさん
少女革命ウテナのパクリですw

suzume_rsuzume_r 2012/01/30 23:07 >今年の選手権
初参加です。よろしくお願いします。今はsimkで投入しています。
fv.binをそのまま使っている割には弱いです。

clapackは数値計算では有名で20年の実績があるライブラリで
matlabも内部で使ってます。行列サイズが大きいと数値誤差も
馬鹿にならないのでdoubleが安全かと思います。

GasyouGasyou 2012/01/31 20:45 こちらこそよろしくお願いします。kumaの後継がsimkだったんですね。

うーん、やっぱりdouble使うべきですか。
ただ、それだと行列1つだけでメモリを使いきっちゃうんで…
これは、メモリ増設すべきですかね。