TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

将棋でディープラーニングする その32(転移学習)

以前の日記で、バリューネットワークを学習した際、SL policy networkからバリューネットワークに転移学習が可能であることに言及した。

転移学習するには、12層まではネットワーク構造が同じであるため、SL policy networkからバリューネットワークにパラメータをそのままコピーすればよい。

モデルのコピー方法

Chainerでモデルを部分的にコピーするには、以下のようにする。

policy_model = PolicyNetwork()
value_model = ValueNetwork()

serializers.load_npz(args.policy_model, policy_model)

value_dict = {}
for path, param in value_model.namedparams():
    value_dict[path] = param

for path, param in policy_model.namedparams():
    value_dict[path].data = param.data

serializers.save_npz(args.value_model, value_model)

一旦モデルのインスタンスを作って、それぞれのモデルのnamedparams()でパラメータのパスとパラメータを取得して同じパスのパラメータの値をコピーすればよい。

転移学習の効果測定

1億局面から学習済みのSL policyのモデルをバリューネットワークにコピーして、elmo_for_learnで生成した100万局面でバリューネットワークを学習したところ以下のようになった。
f:id:TadaoYamaoka:20170607222435p:plain
※凡例のinitialが初期値から学習した場合
※transferが転移学習した場合

1エポック後のテストデータ1万局面のtest accuracyは以下の通りとなった。

初期値 0.6400353908538818
転移学習 0.7109866142272949

転移学習した方がtrain lossが35%小さくなり、test accuracyは11%大きくなっている。

以上の結果から、SL policy networkからバリューネットワークへの転移学習は効果があることが確かめられた。

なお、バリューネットワークの出力はAlphaGoではtanhだが、sigmoidに変更している。
理由は、後ほどSL policyとvalue networkのマルチタスク学習を試したいため、lossを交差エントロピーに揃えたいためである。
上記のtest accuracyは、binary_accuracyで求めている。

モデルのコピーには以下のコードを使用した。
github.com