前回の日記で書いたようにバリューネットワークの学習データとして、elmoの教師データを使用する予定である。
elmoの教師データは自己対戦の勝敗だけでなく、深さ6で探索した評価値も同時に出力される。
そこで、学習がうまくいっているかの検証用として、elmoの評価値から推測される勝率を使用したい。
シグモイド関数で近似
elmoは評価値から勝率への変換に、ロジスティック(シグモイド)関数を使用している。
その際、評価値を600で割ってスケーリングしている。
グラフにすると以下のようになる。
教師データの生成に使用しているelmoの評価関数は、この式で最適化されているので、実際に生成されたデータも近い分布になるはずである。
そこで、10万局面を生成し、勝率をプロットしてみた。
その結果、以下のようになった。
評価値100ずつの範囲で勝敗の平均値をプロットしている。
緑の線は、回帰で近似したシグモイド曲線である。
回帰の結果、シグモイド関数のスケーリングのパラメータは、0.00132566 = 1/754.3となった。
elmoは損失関数に、浅い探索と深い探索の評価値の交差エントロピーを正則化項として加えているので、元の600から差がでていると思われる。
双曲線関数で近似
AlphaGoの論文では、バリューネットワークの出力層は双曲線関数(tanh)が使われている。
tanhは、グラフの形はシグモイド関数と似ているが、値の範囲が-1~1となる関数である。
負けを-1、勝ちを1で表す場合に適している。
(elmoでは、負けを0、勝ちを1で表しているのでシグモイド関数が適している。)
elmoで生成したデータの勝敗を-1と1にして、tanhで近似した場合についても調べた。
その結果、以下のようになった。
緑の線は回帰で近似した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局面のデータで、集計し直すとシグモイド関数のグラフは以下のようになった。
近似曲線のスケーリングパラメータは、0.0013989=714.847380084352となった。