日記

日記です

0511

大学

 9:51に研究室着。

 最近、表現が得られている後の回帰をすることと(たとえばkkp_kpptを用いて学習)と、表現自体を学習しなければならないDeepLearningの断絶を強く感じる。

 あとは「こんなことやってみました~」って研究はやっぱりちょっと変だなって気もして、ちゃんと仮説と分析を重ねたものであってほしいなぁという気持ちがある。自分がそういうことをできるかというと全く自信はないわけだけど。

 やることが迫ってきて精神が無になってきた。

将棋ソフト開発

 データの容量に問題が多い。そもそもとして今は各要素を2byteで取っていて、要素の数はkkp {81 * 81 * 1534 = 10064574}, kpptが  { 81 * 1534 * 1534 * 2 = 381211272}なので全部で782.551692 メガバイトだそうです(Googleに計算式をぶちこんだ)

 けれど出力されるパラメータのバイナリファイルは764,211 KBと表示されていて、あれーという感じ。ひょっとしてkkpの分が上手く保存されてない……? しかしkpptの分だけだと762.422544 メガバイトのはずで、これもちょっと違う。なにもわからない。

 しかし適当に確保したパラメータを書き出し,読み込みしてみても多分変わってない。データが吹っ飛んでいるとかならわかるんだけどなぁ。ちゃんと保存できてるなら良いかなとは思いつつ、しかしこれは気持ち悪いなぁ。

 パラメータを0初期化する関数はバグっていた。memsetの使い方よくわからなくて怖いので全要素をなめて0を代入するしょうもない実装でいきます。ちょっと速度で損しているんだろうけど、0初期化するタイミングなんてそうそうないし。

 学習させるとメモリをバカ食いする問題もある。学習用パラメータとしてfloat,勾配としてfloat,対戦相手用としてint16_t,の3種類を新たに用意するので上の6倍メモリを使うことになるはずで、4.69531015 ギガバイトのはず。しかしタスクマネージャーで確認するとそれより多くのメモリを確保している。探索部でhistoryとか確保するからこれよりは多くなるとは思うんだけど、それほどか?

 scoreは先手のとき

kkp_score_ + kpp_score_[BLACK] - kpp_score_[WHITE] + turn_bonus

となり,後手の時は

-kkp_score_ - kpp_score_[BLACK] + kpp_score_[WHITE] + turn_bonus

となるので勾配としてもこの符号でいいはず? それでやってみよう。

 やねうら王とか読み太とか読んでいるとなんかルート局面の手番を持っている気がする。下は読み太のeval_pptp.cpp

    // 現在の局面で出現している特徴すべてに対して、勾配値を勾配配列に加算する。
    void addGrad(Board& b, Turn root_turn, double delta_grad)
    {
        // 手番を考慮しない値と手番を考慮する値
        auto f = (root_turn ==    BLACK) ? LearnFloatType(delta_grad) : -LearnFloatType(delta_grad);
        auto g = (root_turn == b.turn()) ? LearnFloatType(delta_grad) : -LearnFloatType(delta_grad);
        auto list = b.evalList()->pieceListFb();

#ifdef USE_AVX
        WeightValue w;

        for (int i = 0; i < M_CNT; i++)
            w.m[i] = _mm256_setzero_p();
#else
        WeightValue w = { 0 };
#endif
        double progress = Progress::evaluate(b);
        int pro = int(progress * 6.0);
        pro = (pro < 0 ? 0 : pro > 5 ? 5 : pro);
        
        w.p[0] = f;
        w.p[1] = g;
        w.p[2 + pro] = f;

        for (int i = 0; i < PIECE_NO_NB; ++i)
            for (int j = 0; j < i; ++j)
                ((Weight*)pptp_w_)[getPpIndex(list[i], list[j])].addGrad(w);
    }

 わからない。現局面でのスコアは現局面でのスコアなんだからルート局面の手番とか関係なくない? なんでそれによって値を反転させたりしているんだ……。winnerの見方とかが違うだけという気がする。そうじゃないかなぁ。

 メモリバカ食い問題はなんか直っていた。4.5GBくらいで想定よりちょっと少ない。これはWindowsのファイルとして表示されている量の6倍に近いけどぴったり一致するわけでもなく、むしろ小さいってちょっと負担になりませすね。メモリを管理するの大変だなぁ。

 あとはX手で引き分けというのと、千日手のスコアをUSIオプションとして指定できるようにしたい。学習の時も有用か?千日手、理念的には評価値0かなとも思うけど、先後入れ替えて指しなおしというルールなら先手番の初期値を反転した値がふさわしいはずですかね。

 コンピュータ将棋、モチベーションが全てだという感じがあるし、ただ時間があるだけではなく何も他にやるべきことが存在していない状況が必要。つまりそろそろダメになってきます。大学……。大学……!

その他

 今日は何度もお茶をこぼした。悲しい。