前回はフィルタサイズを変更してもうまくいかないことを確認しました。
個人的にはDeepLearningによる学習でValueの学習がなかなかうまくいかないという点が気になっています。マルチタスク学習をさせているので損失は指し手の一致具合とValueの一致具合の和を取っている
loss_op = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=policy, labels=teacher_for_move) + tf.nn.sigmoid_cross_entropy_with_logits(logits=value, labels=teacher_for_win))
のですが、ここの配分を変えてみることで何か知見が得られないかと考えました。
小さいデータ(訓練用1000局、テスト用100局)でいくらか試してみたところ、Value側の損失を大きくしても(定数100をかけても)そこまでValue予測の質は改善されない一方、指し手予測の方はひどい性能になりました。
もともとValueだけを学習するネットワークでもそこまでの精度になっていないことを考えると、これは当たり前なのかもしれません。
一方で逆にValueの損失を小さくするとValue予測の方は多少質が悪化した一方で指し手予測の精度は上がったため、これで全データを使って実験してみました。正確にはvalue側の損失に0.1をかけて学習させました。
loss_op = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=policy, labels=teacher_for_move) + 0.1 * tf.nn.sigmoid_cross_entropy_with_logits(logits=value, labels=teacher_for_win))
Residualブロック数は5、optimizerはSGD、early stoppingのpatienceは7で実験した結果が以下となります。
epoch | Loss | Move Accuracy | Value Accuracy |
---|---|---|---|
1 | 3.5121 | 0.2691 | 0.6114 |
2 | 3.0486 | 0.3111 | 0.6389 |
3 | 2.8629 | 0.3315 | 0.6432 |
4 | 2.7399 | 0.3454 | 0.6505 |
5 | 2.6606 | 0.3545 | 0.6572 |
6 | 2.6133 | 0.3587 | 0.6618 |
7 | 2.5537 | 0.3667 | 0.6635 |
8 | 2.5361 | 0.3689 | 0.6647 |
9 | 2.5160 | 0.3707 | 0.6698 |
10 | 2.4973 | 0.3730 | 0.6707 |
11 | 2.4876 | 0.3743 | 0.6689 |
12 | 2.4843 | 0.3759 | 0.6745 |
13 | 2.4760 | 0.3783 | 0.6731 |
14 | 2.4844 | 0.3774 | 0.6744 |
15 | 2.4794 | 0.3795 | 0.6742 |
16 | 2.4832 | 0.3790 | 0.6717 |
17 | 2.4864 | 0.3799 | 0.6747 |
18 | 2.4926 | 0.3797 | 0.6761 |
学習に必要なエポック数は伸びていますが特に性能は上がっていません。損失の合計が小さくなっているので収束が遅いのは当然なのでしょうか。それならばValue側の損失の寄与も十分に意義あるものだった、ということになると思えます。
学習自体が不安定なのではないかという説も自分の中で起こっています。同じ条件で何度も実験してみないと何も言えないのかもしれません。
実験とは本質的に関係のないことかもしれませんが、ログファイルから表の作成、グラフの作成あたりは自動化しておいたほうが良さそうですね。山岡さんの本でもいくらか記述があったので、それを参考に頑張ってみたいと思います。