日記

日記です

0517

大学

 10:17に研究室着。ダメですねー。気合が足りない。昨日寝るのが遅かった && 二度寝してしまったというコンボでしたね。

 また扇子を持ってくるのを忘れた。まぁ使うかどうかは微妙なところだけど。

 午前中は発表スライドをいくらか作って終わり。

 3限は離散凸解析。マジでなんもわからんという感じだった。マトロイド、劣モジュラあたりで????? ってなった。

 4限は可視化。英語ちょっとわからなくて微妙に理解しきれないところがあった。うーん厳しい。

 5限の後はICPCに向けた競プロの練習会とやらに呼ばれたので顔を出してみた。結構人が多くて驚いた。良いことなんじゃない? 知らんけど。

 20時頃に帰宅して後は野球を観たり(鈴木誠也が決勝ホームランを打ってカープは勝ちました)、本を読んだりしていた。文化的に過ごしたい。

将棋ソフト開発

 なかなか強くなりませんね。そしてコードにはまだ手を付けられていない。打ち歩詰めを正確に実装するの難易度高すぎるので探索部で弾いた方が良いのかなぁ。まだ悩み中。

その他

 だるまブログの文体がキレキレという感じだった。しかし本当に記事が消えていくので一時の楽しみですね。さすがに技術的なことについての記事は残しておいた方が後で学ぶ人には親切だろうとは思うけど、まぁ他人に親切にしなければならない理由もない。

0516

大学

 09:12に研究室着。まぁ悪くない。レポート提出というミッションがあったのでちょっと気持ちに張りがあったおかげということはあるだろうけど。

 すぐイヤホンに手が伸びてしまう。集中力がない。薬中毒みたいな感じでは?

 REINFORCEをちょっと誤解していたかもしれないなぁという気分になってきた。即時報酬による近似、そんなひどい話でもないのか? というかelmo絞りとの関連性が……。モンテカルロ法とかそういうことに近いんだろうか。

 相変わらず読んだ論文をまとめる方法に悩んでいる。数式をスッと書けないと苦しいのはそうなのではてなブログはちょっと厳しいかもしれない。まぁでも[tex:]と入れるだけならまだマシな方なのかもしれないなぁ。Qiitaは数式を書きやすい? らしく、それは人気の理由になりうるだろうなという気持ちになった。

 はてな、微妙にLatexと構文が違って厳しい感じになってきた。もうLatexで書いてしまうのが良いんじゃないか? とか思うけどそれはそれでデータの共有が面倒。うーむ、悩みどころですなぁ。なんだかんだで手書きが一番楽ではとか思い始めてきた。ノートを持ち運べ。

 昼からはさっぱりやる気が出ず、記号接地問題についてつらつらと考えていた。自由意志とか責任とかの観念を人工知能にも与えなくてはならないというような直感はあるわけだけど、それが身体を必然的に要請するものなのかはまだわからない。自分と、外界が明確に区別できれば良いのでは? と思ったりもする。そのために身体が必要ということなのかもしれないけど。

 人工知能のための哲学塾

人工知能のための哲学塾

人工知能のための哲学塾

 買って途中まで読みかけて挫折した覚えがあるんだけど今パッと探した感じでは見つからなかった。買ったストアが違うか、図書館で借りたんだったか。記憶ではなんか問題意識が合いそうで合わないみたいな印象だったが、今読んだらどうかな。

 まぁ哲学の話はどこまで行っても趣味なのであまり時間をかけすぎてもいけない。実践的にはボトムアップに、やれるところからやっていくという方針でなくてはなぁ。だから数学をやらなければならないのだ。

 ここ数日暑くなってきており、扇子を持って来ようと思って毎回忘れている。今は竹不足だかなんだかで扇子が品薄みたいだけど、まぁ物は使ってなんぼでしょという精神の持ち主なので、使ってしまおう。壊れたら困るけど。

 午後にちょっと考えていたんだけど、AlphaZeroはExperience Replayをやっていて、それは方策オフ型の学習しかできないはずだから(ここちょっと怪しい)、Actor-Criticという方策オン型の学習をやっているわけがないのか。やはりExperience Replayが方策オフ型の学習にしか適用できないという言説怪しい気がする。この論文にはそう書いてあるように見えたんだけど、僕の誤読か?

 こういうあれをパッと相談できる先輩とか教授が存在せず厳しい。いや、意外と知っている人がいるんだろうか……? 人との交流が少ないので認知していない。

 まぁきっと方策オンのものについても普通にExperience Replayは使えるということなんでしょう。ある程度間隔を短くとればね。感覚的にはそうだしね。

 早めに来たことに満足して早めに(19時前に)帰ってしまった。意味ないじゃん!

 帰ったあとは小説を読んだ。久しぶりのミステリ。そこそこ面白かった。

将棋ソフト開発

 レート50くらい上がっているはずだけど検証してもかなり微妙。指し手は良くなっている気もするんだけど、なんか中盤でちょっと悪くしてしまっているようにも見える。そういう分析も統計的にちゃんとやっていかないとダメだろうなぁ。

 自己対局中にShogiGUIがなんか配列外参照が発生したとか言ってくるんだけど原因がよくわからない。強化学習中にバグるのと同じ原因だったら良いなぁ。python力が低くて棋譜の結果を読み込むスクリプトをスッと書けない。

 ちょっとだけ強くなったはずのやつをWCSC版と戦わせたら17%しか勝てなくてむしろ弱くなってる……。なにもわかりません。

 自己対局の対局結果をさらってみたら打ち歩詰めやらかしてるのを発見した。これが諸悪の根源だったら話は早いなぁ。

その他

 研究室行って帰って本を一冊読んだら一日が終わっている。ナンデ!?

 人生が厳しい。

0515

大学

 11:13に研究室着。遅すぎ。自害してほしい。

 14時くらいまではなかなかいいペースで作業ができていた。しかしそのあたりで完全に集中力が途切れる。

 5限には講義。グラフの話面白いなぁ。内容は結構高度で大変だけど。

将棋ソフト開発

 50時間くらい学習させたものはWCSC28版に対して61勝 198敗 16分けだった。勝率約25%で、レート差は190ほど。思ったより強くなっているというのが正直なところですかね。まだまだ伸びてくれるとは信じているが、雑な学習部でどこまで行ってくれるかなぁ。

 原因不明バグはいまだ不明でかなり厳しい。std::vectorのメモリ解放でなんか例外出てるっぽいようにも見えるけどそんなん知らんよ。

 まぁ僕のコードがどこかおかしいんでしょうけどね。ひょっとしてメモリ不足とかそういう可能性もあるのかなぁと。想定よりも2倍以上使ってるっぽいしなぁ。メモリ管理は難しい。人間のやることではないのでは?

 学習結果を晒している通り、ここ数日コードは書けてない。気合が足りない。

強化学習

 なんか用語がよくわからなくて混乱してきた。この記事のAdvantageの説明合っているのかなぁ。AdvantageってQ(s,a) - V(s)として行動aの相対的な良さを測っているからそういう呼ばれ方をしていると思っていたんだけど。先を何ステップ使うかって関係なくない?

 あとはREINFORCEとActor-Criticの関係とか。山岡さんのブログでdlshogiはREINFORCEを使っていると書いてあったんだけど、そのほうがいいのかなぁ。せっかくマルチタスク学習しているなら僕がActor-Criticと認識しているものでやればいい気がするんだけど。

その他

 今日中に出そうと思っていたレポートを出していなかったことに気が付いて焦った。明日の午前中には出さないと。

 音楽に頼るの良くない。どうしてもダメな時だけ使いましょう。

 生活が壊れている。汁椀にひびが入って中身が漏れる。新しいのを買わなくちゃいけないんだけど、物を買うというのがなかなかできない。店頭に行ったらAmazonでいいやと思うし、かといって家に帰ったらAmazonを開く気が起きない。そのほかにも買うべきものはたくさんあるはずで……。

 生活や家事と仲良くやっていくことができない。

 早く寝ないと……。

0514

大学

 10:08に研究室着。もう朝遅くて本当にダメ。着いてからもやる気がさっぱり起きずダメ。何もかも無理。上手く眠れていない感覚がある。単に寝るのが遅くなってしまっただけということもある。

 Twitterで流れてきた論文を読んでいたら急速にやる気が回復してきた。外部知識を利用する強化学習みたいなの、教師あり学習である程度事前学習してから強化学習するのとどういう違いがあるのか見えてこないけど、それとは別の部分としてこの論文は面白そう。

 まぁそれはそれとして課題をやらなければならないので、仕方なく音楽を聴きながら手を付けたら意外とすんなりできた。普段はあまり音楽聴きながら何か作業するの好きではないんだけど、モチベーションが上がらないときはこういうのも有効かもしれないなぁ。競技プログラミングとか、コンピュータ将棋とか、将棋とか、自分から進んでやるもののについては音楽聞きながらやることとかはほとんどないんだけどね。

 動画観ながらとかは流石に気が散るという意味でも、研究室だからという意味でも無理ですね。音楽が限界。できればインストの方がいいとは思うんだけど、あんまりないので普通にamazarashiとかを聴いていた。

 ゲームBGMとかは良さそうなのでは。まぁちょっと不純な利用法ではという気もするけど。まぁしかし僕は音楽についてもCDは全く買わず、ダウンロード購入できるもの、というかほとんどApple Musicにあるものしか聴かないのでかなり幅は狭い。

 最近、モチベーションがすべてだなと感じることが多くて、特に手を付け始める段階まで上手く気分を盛り上げていく方法をもっと工夫していくべきなんだろうなと思う。気分を切り替えるとかそういう部分を、テクニックとしてもっと模索していくことが重要なんじゃないかとか。

将棋ソフト開発

 ゼロベクトルから24時間自己対局による強化学習を回したところ、ちょうど9割勝てるようになっていた。まぁでもゼロベクトル(駒割りのみ)なんてめちゃくちゃ弱いわけだからまだまだですね。

 そして自己対局中に謎のバグによって落ちるのは長い時間をかければ再現性があるっぽいけど原因はまだよくわからず。非合法手を指していたり合法手のvectorをコピーするところでバグっていたりと、なんだか見えてこない。一度再現するにも数時間から十数時間かかるのでなかなかデバッグが大変。

 バグった局面をsfen形式で読み込もうとしたらなんか読み込み部自体もバグっているっぽくて地獄。ほとんど初期局面以外の検証はしていないからなぁ。

動画

 剣持刀也さん面白いと思う。しかしこれは単に男性実況、あるいは生主を観ているのと何が違うのか? わからん。

 全体的ににじさんじ勢はそういう危うさを抱えているわけで、些細な違いが、しかし本質的な違いなのだと言い切れる強さを自分の中に持っていないとなかなかファンやっていくのは難しそう。

 ところで自然にゲーム実況し始めるの面白いんですが、権利にはかなり気を使っていそうな発言もみられるので、つまり許可を得ているってことなんでしょうね。なんか時代は変わっているのだなぁ? みたいな気分になってくる。

Twitter

 サービスとしてこのままの感じだとあまり長く持たないんじゃないかなぁという気がしてくる。まぁあまり依存しないようにやっていこう。

その他

 激なにもわかりません状態になってきた。終わりが近い。

 Twitterで中途半端に発散しなければ詩情にまで至るのだろうか。

0513

 今日はダメな日だった。やる気がさっぱり湧いてこず、ずっとにじさんじの動画ばかり観ていた。

 学習はまぁ上手く行っているような雰囲気があるので符号は間違ってない、のかなぁ。間違っていてもなんやかんや学習できてしまうということがありそうで怖い。

 とりあえず駒割のみ(つまりkkp_kppt部分はゼロベクトル)のものよりは強くできた。しかし自己対局だけ(elmo絞り)で強くしていくの大変っぽいなぁ。これは先が長そうだ。やっぱりボナンザメソッドからやった方がいいっていうのはそうだろうけど、どうしましょうかねぇ。一応以前のプログラムをそのまま動かせばある程度はできると思うんだけど。

 あとは原因不明の停止するバグがある。全く分からないのでvisual studio上で動かしてみる。これで止まれば多少わかるはず……。

 計算資源が欲しいなぁ。学習の待ち時間不毛という気がする。新しくデスクトップを買うか、AWSとかを使うか。置く場所もないしAWSかなぁ。しかし手元にマシンが残らないというのは学習失敗していた時に完全なる損失ということで厳しい。さすがにこの段階ではまだ利用は論外ですね。

 もっとソフトを練り上げて、どうしても学習だけがボトルネックとなったらAWS等の利用を考えましょうね。今はまだやれることがたくさんあるはず。

0512

大学

 10時過ぎに研究室着。遅くなってしまった。さらに午前中はモチベーションが上がらずボーっとしていることが多かった。研究室のパソコンで学習を回してしまうと作業ができなくて困る。ノートパソコンだとどうもねぇ。これ結構深刻なのでどうしよう。もう一つパソコンが欲しいとか言って買ってもらえるのかなぁ。

 仕方がないからいくらか論文を漁るくらいしかしていなかった。しかし読んだ論文の良いまとめ方がわからないなぁ。いろいろなパソコンを使いうるので上手くクラウド的に管理したいところだけど、どうすればいいのかわからない。PDF保存までいくと大変だから出典とか置くくらいか。しかしダウンロードするたび大学がお金払っているんだっけ。うーん。

 テキスト形式でまとめているとやはり見栄えが悪そうだから、まとめスライド1枚作るとか実践的なのかなぁ。パラパラ見返してくのは便利そうか。あとは検索性の問題があるわけだけど。

 一覧性は欲しいがそこから詳細へも飛びたいとなるとハイパーリンクが欲しくて、結局ブログにまとめてしまうのが良いのではとかちょっと思ったり。さすがに公開はしたくないので非公開ブログを作るとかはありかなぁ。

将棋

 叡王戦第3局は千日手になった。これが本当にもうすごくて、金井六段が最後頭抱えながら千日手を選んだところで僕はもう感極まってしまったんですね。これは普通に負けるより辛いのでは。この局面で、自分は勝てないと自分で判決を下すわけなのだから。僕は何かと自分の意志で何か重大な選択をするというシーンに弱い。

 ふと思い出したのは虐殺器官だった。人を殺すことに抵抗はないのに、母の死を決定したことは引きずり続ける主人公の内省が続く小説である。自分の行動の中でも自由意志を感じる重みは平等でない。重さが、この千日手の決定にはあったのではないか。

 負けは相手という抗えない力によって引き起こされる事態と見ることもできる。しかしこの千日手は……。

 最後の千日手を決めた1分間。金井六段の頭の中には何が駆け巡っていたのだろう。

 僕の中でエモさが爆発してきてしまった。

 指し直し局で金井六段は破れました。辛いとか、そんなレベルではないのだろうな。

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かなとも思うけど、先後入れ替えて指しなおしというルールなら先手番の初期値を反転した値がふさわしいはずですかね。

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

その他

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