アドバンストパラメタ調整
学習の方は、前回記事の後更にバグがいくつか見つかって直して、2/7にはほぼ動いてました。速度は遅いけど、これはハードの評価を忠実にソフトでエミュレートしたり、またそのため差分計算がまったくなかったり、とかあるのでここはあまり改善する気力なし。Core2Duo (1.86GHz) なので並列化もしました。学習は並列化簡単ですね。スレッド間やりとりがほとんどないので。pthread_createとpthread_joinしか使ってなくて、多少のデータ構造変更を入れても1日でできました。1万局面(「局」じゃないですよ)、1ステップで3時間くらい。めちゃ遅いっしょ?
J'(局面あたり)は、最初はほんのざっとの手調整をしたパラメタからスタートしたんですが、その時点で20くらい。そこから学習させてJ'/#pos=11くらいまではあっさり下がりました。が、そこからはほとんど下がらず。あれこれいじったりステップの取り方を工夫したりして、今やっと9.5くらい。学習の結果を初期値に反映させていってるんですが、今は最初のステップから9.5くらいで、その後まったく下がりません。一致率は最初が13%くらいで、今は24%くらい。これ以上よくするには特徴(パラメタ)増やさないとだめかなー、と感じてます。初期値の変更自体は手でやってるので、私のやってるのは正確には学習ではなく、「ボナンザメソッドを補助的に使用した評価パラメタの手調整」です。
パラメタ数は、最初65でしたが、その後多少増やして今139。でもまあこれでも全然少ないんですよね、きっと。とはいえハードの物量が黄信号になってるので、物量削減を試みて、空いたぶんにできるだけ有効そうな特徴を入れたいんだけどそれってどれなんや、という感じで苦しんでます。まあパラメタ少ないぶん局面数は少なくていいよね、というのは単なる気休めですが。
学習はソフトのモデル(「Cモデル」…C++だけど)を使ってやってまして、ここではパラメタはすべてfloatにしてます。微分を計算しやすいので。が、ハードではfloatなんてないので値を「量子化」しなくてはなりません。9.67とかいう値になってても、シフトで1/2/4/8/...倍しかできないから8にしようとか、3bitに収めたいから7にしようとか普通にやってます。何やってるのかわからん気もしますが、でもしょーがないしねぇ。この量子化の作業は各パラメタによって微妙に事情が変わるので、いちいち手作業でやってます。ソフトの方はおそらく半自動でできてるのでしょうが、ハードでは苦労するとこの一つです。
学習がサチュってきたところで、いったん戦わせてみようや、ということで上記の量子化の作業をひととおりやってハード作ってみました。KShogi初級とやると1勝1敗だったので、2/15 久々にfloodgate投入。入れたとたんまた西村さんに目ざとく見つけられてます^^; 十分な数対局できてませんが、強さはあまり以前と変わってないorz 一体何やってたんや、という気もしますが、まあ学習のフレームワークができてから実際の学習自体は10日程度しかやってないし。100個以上のパラメタをさしたる苦労もなしにそこそこの値にチューニングできるというのはある意味すごくありがたいですから。(学習なしで100個のパラメタを調整、がどんだけ女工哀史か…)早く大槻さんのように「寝てる間に小人さんが強くしてくれる」境地に辿り着きたいものです。
制約とペナルティの話。制約は、入れたらどうなるのかなーと思ってやってみたら、結果発散しまして。考えてみると、J'はまあ一見明らかに最小値があるわけですが、λの項を入れると当然ながら-∞になりえるんですよね。で最急降下法ではダメなわけです。でも、じゃあどうすればいいかがわからなかった--; 数値計算の本とか見れば解法書いてあるんでしょうか。で当面は、奈良さんのように「歩が100」とかにすればλは不要なので、これでやってます。金が600固定、なんですけど。この方が駒割の総和がブレないかなー、と思って。
ペナルティは、よくわからないながらとりあえずakiさんのとこにあったのをまねてw=0.0001とかで最初やったら、値がJ'に比べて全然小さく、ほとんど効いてません。ただ、それでも位置系>>駒割、とかにならないので、そのままにほってあります。なんでなんでしょうね。たぶん保木さんはそうなってしまうからペナルティ導入したんじゃないかと思うんですが。パラメタの取り方によるのかな。というわけで、制約もペナルティも実質使ってません。学習はとにかく、(基本思想はともかく、実装の細部では)理論的根拠がさっぱりわからん、ということが多いです。わかんないの私だけ?なんか気持ち悪いんですけど。
さてここまでのところ、手調整が学習に変わりはしましたが、ほぼ当初のスケジュール通り(不思議なことに)進んできてます。でもパラメタ調整はあと3週でできそうな気はせんな…大会ぎりぎりまでやってそうな気が。なんかやりだすときりないような気がするんですよね。
…とここまで書いた後の2/22、またちょっと改良したバージョンで対戦させてみました。floodgateやったらなんかどうもネットワークまわりがおかしくて。でそれはとりあえず後まわしにして、KShogiとやらせました。初級に4勝1敗。中級には2敗。以前(評価部大改造の前)は初級と勝ったり負けたりだったので、まあ何とか前よりは強くなったんじゃないかと思います。3か月かけましたからねぇ、これで成果全くなしだとかなりがっかりAちゃんなところでした。
さて今後ですが、評価はいったん中断して、まずキラー手とMVV-LVAを実装する予定。どっちもそう大きな修正ではないので、合わせて1か月はかからんでしょう。で残り1か月半は地道にパラメタや特徴をいじってみる、という感じで行ってみませう。
話変わって、oslソースレビュー案はナイスですね。私もぜひ聞きたいです。動画公開するおつもりあるならお手伝いしますよ。
« J'リーグ参戦 | トップページ | 哀愁の Can't fit design in device »
「将棋プロセサ」カテゴリの記事
- ボンクラーズの開発過程について書いた記事が掲載されました(2019.03.07)
- 「浅い評価値を深い評価値に近づける学習法」誕生の背景(2016.10.06)
- 塚田九段の対ボンクラーズ練習棋譜を公開します(2013.09.07)
- Puella α ソース公開(2013.08.28)
- クラスタ並列の解説記事を公開します(2013.08.22)
学習が前進しててなによりです
学習時の探索もFPGAですか?
学習はソフト探索でやればfloatもそのまま使えるんじゃないでしょうか。
投稿: komiya | 2009年2月24日 (火) 07時51分
学習の勉強(てのも変な言い方ですが)にあたっては小宮日記は大変参考にさせていただきました。ありがとうございます。
学習時は探索から何からすべてソフトです。そこではパラメタはfloatで、たとえば9.67とかになります。しかしハードを作るときにそれを8とか7とかに変える必要があります。
投稿: 伊藤 | 2009年2月24日 (火) 17時47分
学習はソフトで、FPGAに結果を持って行く時に整数に丸めているって話ですね。
しかしFPGAで世界初の将棋に続いて
FPGAで世界初のボナメソ将棋ですね(^^;
投稿: komiya | 2009年2月25日 (水) 20時46分