勝敗予測モデル2エポック目の成績報告とDNNの種々考察（ポエム回） : TensorFlow将棋ソフト開発日誌 #9

前回 [勝敗予想モデルの学習->試験の成績が悪い : TensorFlow将棋ソフト開発日誌 #8](http://qiita.com/YusukeSuzuki@github/items/4588e6608f6671dab35f)
目次 [TensorFlow将棋ソフト開発日誌 目次](http://qiita.com/YusukeSuzuki@github/items/30bcaf7b14f015493121)

ソース [githubにありますが今のところ自分にしか読めないコードです](https://github.com/YusukeSuzuki/ginkgo)

今回のお話
---------------------------------------------------------------------

- 勝敗予測モデルの2エポック目の学習を終えたのでその成績報告
  - 複数回のエポックは有効かもしれないという感触
- ここまで将棋をDNNで扱っていろいろ考えたことのポエム
- わからないので聞きたいこと調べたいことのあれこれ
- 今後の予定

勝敗予測モデルの学習の2エポック目が完了
---------------------------------------------------------------------

条件は前回と同じ

- 2chkifu 約62000戦のうち約50000戦の各盤面を学習サンプルとする
- 30番手以降、左右反転を含めて870,000盤面が学習対象
- 試験サンプルは残りの約12000戦
- モデルは [TensorFlowによる将棋ソフトの開発日誌（ゆっけさんの場合） #5](http://qiita.com/YusukeSuzuki@github/items/3d2416aaf26da386bf37) で示したものと変わらず

### ロス
前回のログの続きとしてロスの推移を出しています。真ん中より右、870万サンプル以降が2エポック目。グラフの各点にラベルが貼れるような気がするのだけれどやりかたがわからない。

![Selection_009.png](https://qiita-image-store.s3.amazonaws.com/0/25288/323be9a3-ffda-a981-9ee2-1bc573e7dd78.png)

時系列表示ならわかりやすいかもしれない

![Selection_010.png](https://qiita-image-store.s3.amazonaws.com/0/25288/ebc54438-1bd4-fd08-2ff9-9c052e668107.png)


### 学習正答率
誤字を直せ。ロス同様右半分が2エポック目です。

![Selection_008.png](https://qiita-image-store.s3.amazonaws.com/0/25288/cd8d49cb-cc5c-e4dc-ee1f-114bf1914d24.png)

### 試験正答率

```
# 前回1エポック目
correct rate(21400): avg 0.5575672660085642, min 0.3699999451637268, max 0.75
# 今回2エポック目
correct rate(21400): avg 0.5633985763481845, min 0.35999998450279236, max 0.7799999713897705
```

ちょっと上がった？有意な上昇なのかよくわからない。そもそも同形で結果勝敗が異なる対戦がどれだけあるかの知識が必要。

とりまToDo

- データ群から同形の盤面がどのように分布しているのかを調べる。
- 試験データについて手番数で区切って成績の分布を見てみる。安直に考えると前半の勝敗が決めにくい番手は正解率が低く、後半になるほど正解率が上がるはず。
- もう2回か3回エポックを回して正答率の変動を見る。上昇していくのであれば低い正答率はエポックの不足であると考えられる。

ここまで将棋をDNNで扱っていろいろ考えたことのポエム
---------------------------------------------------------------------

箇条書きで

- 既存の手法との関係
  - コンピュータ将棋の作り方みたいな情報を一切調べていなかったのだけれど自分が作っている勝敗予測モデルは既存の手法でいうところの評価関数に相当するようだ。
  - 既存の手法の評価関数が秒間キロからメガのオーダーで探索するためのもののようだ。つまり割と弱い判別器。
  - 対して自分が目論んでいるのは少ない探索で良い手を返すための強い判別器である。
  - これから盤面に対して指す手を返す指し手モデルを作っていくがこれは既存の手法における探索の刈り込みに相当するような気がする
  - やっていることは盤面をキーとした勝敗や指し手の非可逆圧縮データの作成だと思っている
- 画像などとの違い
  - 画像というか音声も含めた信号処理との違いは自分のデータだと入力のベクトルの要素の入れ替わりに非常にセンシティブであるということ
  - つまり各次元の意味が明確に異なるということになるのか
  - 画像などの信号の場合、例えば２つのピクセルの画素値が入れ替わっていても入力の意味は大きく変わらずなんかうまいこと学習できてしまう
  - 次元の意味が明確に異なるようなデータの場合は何か画像とは違う工夫やモデルの設計が必要になるかもしれない
- 将棋の空間の話
  - 画像空間における例えば顔画像空間の次元は結構狭いのに対して、盤面空間に対する勝てる盤面空間というのはとても大きいんじゃないかと感じている
  - 学習に必要なサンプルは現在使用している 2chkifu だけではおそらく全然足りなくて可能ならば10Mオーダーの対戦を学習させたモデルを作りたい
    - 例えばある有効な形（矢倉？穴熊？）をモデルが学習するのに必要なのはその形の対戦データが１つあれば良いの訳ではない
    - その形の周辺にある影響しない駒の配置のバリエーションをたくさん与えて特徴を抽出しないといけない
    - また位置のずれ上下左右のバリエーションなどを考えるとかなりたくさん入力しないとなー、入力を全部学習できる広さのモデルを作らないとなーという感じ
    - そしてマシンパワーが足りなくなる
- 入力ベクトルの次元が高すぎる 9x9x360 次元
  - このせいで学習にかなり時間がかかってる感じ
  - 駒位置チャンネルは１つの要素しか非ゼロにならないとか、動きチャンネルもルール上値が入らない要素があるとか、入力空間に対して実際の将棋盤面の空間は狭い
  - なのでカーネル法で次元圧縮してーみたいなことを考えるが入力から位置関係の情報が失われるのでコンボリューションがあまり効かなくなるのではないかという気がする
  - コンボリューショナルニューラルネットワークって入力ベクトルの各次元に位置的な関係がないと有効ではない気がするのだけれどどうなんだろう
- 順伝播ニューラルネットワークのこと
  - 総数の多さが非線形性の高さで、各層のユニット数が記憶できる容量のようなものとイメージしている
- ネットワークの解析のこと
  - 学習前と学習後のウェイトの差分のヒストグラムを見てエポックごとのネットワークの変化を見てみたい
  - 出力層の手前の層の出力でクラスタリングをしてどういう入力がどういう特徴で分類されるのかを見てみたい

こんなことを考えながらやってます。

今後の予定
---------------------------------------------------------------------

- 3エポック目をAWS EC2 p2.16xlargeを使ってやってみようと思っている。1時間14.4ドル！！！
- そのためにマルチGPUに対応したコードに書き換える作業をします