TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋でディープラーニングする その22(評価値と勝率の関係)

前回の日記で書いたようにバリューネットワークの学習データとして、elmoの教師データを使用する予定である。

elmoの教師データは自己対戦の勝敗だけでなく、深さ6で探索した評価値も同時に出力される。
そこで、学習がうまくいっているかの検証用として、elmoの評価値から推測される勝率を使用したい。

シグモイド関数で近似

elmoは評価値から勝率への変換に、ロジスティック(シグモイド)関数を使用している。
その際、評価値を600で割ってスケーリングしている。
\displaystyle
\frac{1}{1 + \exp(\frac{-a}{600})}
グラフにすると以下のようになる。
f:id:TadaoYamaoka:20170524214751p:plain

教師データの生成に使用しているelmoの評価関数は、この式で最適化されているので、実際に生成されたデータも近い分布になるはずである。

そこで、10万局面を生成し、勝率をプロットしてみた。
その結果、以下のようになった。
f:id:TadaoYamaoka:20170524215115p:plain

評価値100ずつの範囲で勝敗の平均値をプロットしている。
緑の線は、回帰で近似したシグモイド曲線である。
回帰の結果、シグモイド関数のスケーリングのパラメータは、0.00132566 = 1/754.3となった。

elmoは損失関数に、浅い探索と深い探索の評価値の交差エントロピー正則化項として加えているので、元の600から差がでていると思われる。

双曲線関数で近似

AlphaGoの論文では、バリューネットワークの出力層は双曲線関数(tanh)が使われている。
tanhは、グラフの形はシグモイド関数と似ているが、値の範囲が-1~1となる関数である。
負けを-1、勝ちを1で表す場合に適している。
(elmoでは、負けを0、勝ちを1で表しているのでシグモイド関数が適している。)

elmoで生成したデータの勝敗を-1と1にして、tanhで近似した場合についても調べた。
その結果、以下のようになった。
f:id:TadaoYamaoka:20170524220123p:plain

緑の線は回帰で近似したtanh曲線である。
回帰の結果、スケーリングのパラメータは、0.00067492 = 1/1481.7となった。

このスケーリングのパラメータを使用して、バリューネットワークの出力の妥当性を検証したい。

調査に使用したソースコードGitHubに公開した。
github.com
winrate.pyが勝率調査用のコードである。
回帰にはChainerを使用した。

2017/6/19 追記

上記の勝率をプロットしたグラフで、評価値3000の個所で、一つだけ下に外れた点がある。
これはelmo_for_learnでは400手が勝負が付かない場合に、結果をDrawとして出力しており、集計の際Drawを負けとしていたためである。
Drawを含むデータだと、勝ちの局面を正しく判断できなくなる可能性があるので、Drawは出力しない方が良いかもしれない。

Drawを除いて、深さ8で生成した10局面のデータで、集計し直すとシグモイド関数のグラフは以下のようになった。
f:id:TadaoYamaoka:20170619161931p:plain
近似曲線のスケーリングパラメータは、0.0013989=714.847380084352となった。

2017/11/24 追記

tanhの係数も引き分けなしで再測定を行った。
100万局で再計測したので、sigmoidの値も掲載しておく。

tanh

f:id:TadaoYamaoka:20171124174201p:plain
1485.7957922263165 = 1/0.00067304

sigmoid

f:id:TadaoYamaoka:20171124174317p:plain
756.0864962951762 = 1/0.0013226