以前の日記で、バリューネットワークを学習した際、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万局面でバリューネットワークを学習したところ以下のようになった。
※凡例の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で求めている。
モデルのコピーには以下のコードを使用した。
https://github.com/TadaoYamaoka/DeepLearningShogi/blob/master/dlshogi/transfer_policy_to_value.pygithub.com