用語集 · 機械学習
関数を保つネットワークの拡張
別名:Function-preserving growth、Net2Net、growing a network、widening、zero-initialised inputs、ネットワークの拡張、ゼロ初期化、関数保存拡張
学習済みのネットワークに、出力を変えないやり方で入力やユニットを足すことです。学習を、ちょうど止めたところから再開できます。
学習済みのネットワークは、ときどき大きくする必要があります。新しい入力を足したり、隠れユニットを増やしたりする場合です。新しい部分をランダムな重みで始めると、ネットワークの出力が変わり、学習を再開する前から覚えたことの一部が失われます。関数を保つ拡張は、新しい部分を足しても、ネットワークが以前とまったく同じ関数を計算するようにします。
新しい入力の場合、こつは、その入力から第1層への重みをゼロにすることです。第1層が を計算していて、新しい入力 を差し込むなら、新しい重み行列は古いものにゼロの列を1本加えたものになります。
これは新しい入力がどんな値でも成り立ちます。それでも勾配は新しい列に届くので、ネットワークは最初の更新からその入力を使うことを学べます。
隠れ層を広げる場合(Net2Netの考え方)は、新しいユニットそれぞれに、入ってくる重みはふつうのランダムな値、出ていく重みはゼロを与えます。学習がそのユニットに役目を与えるまで、何も変わりません。
このプロジェクトでは
技にはそれぞれ専用の入力(「この技を実行中」)があり、最後の入力であるバランスのゲートのすぐ前に置かれています。1つの技の教師は、最新のモデルをこの方法で入力1つぶん拡張したものです。生徒は教師全員の入力ぶん、合計448まで拡張されるので、最初のステップではベースモデルとまったく同じです(シャドウクローン(分身)を参照)。拡張のコードにバグが1つあり、一部の環境で行動の出力のスケールまで変えてしまっていました。そのせいで、学習前の拡張済みコピーは、ベースなら40回中38回できる歩きが40回中6回になりました。修正後は、拡張済みコピーはどの行でもベースと同じスコアになりました。
ネットワークの大きさの実験では、生徒全体をこの方法で広く、そして深く拡張しました。広げる側では、すべての隠れ層に512個の新しいユニットを足しました(入る重みはランダム、出る重みはゼロ)。4096個のランダムな入力に対する出力は、元のものと完全に同じでした。深くする側では、重みを単位行列、バイアスを+1にした隠れ層を1つ足しました。これがうまくいくのは、ネットワークの活性化関数であるELUが−1未満の値を出すことがなく、正の入力では恒等関数になるからです。足した1は出力層のバイアスが差し引きます。深くしたネットワークとの違いは4 × 10⁻⁵で、浮動小数点の丸め誤差でした。