Distilling the Knowledge in a Neural Network (2015)
August 24, 2019概要
蒸留(Distilling)は、既存のモデルの予測性能をできるだけ落とさずに、より小さいモデルを作るための手法である。 複数のモデルからなるモデルや正則化された大きなモデルのように予測性能は高いが、同時に計算コストも高くつく。 蒸留の目的は本番運用に耐えられるデプロイ可能なモデル作ることにである。 Distilling the Knowledge in a Neural Networkは、出力層の活性化関数に温度つきソフトマックスを使った多クラス分類のモデルを蒸留する手法を提案、評価した。
温度\(T\)の温度つきソフトマックスは次の式で表せる。\(T=1\)であれば通常のソフトマックスである。 $$ q_i = \frac{\exp(z_i/T)}{\sum_{j}\exp(z_j/T)} $$
蒸留に使う訓練データセットは、ラベルなしのデータか、蒸留するモデルと同じ訓練データのどちらかである。 ラベルなしのデータセットであれば、高温度のソフトマックス関数と、もとのモデルを使い、データセットに確信度を割りあてる。 次に、同じ高温度で小さいモデルを学習する。 損失関数を交差エントロピー、ラベルである確信度を\(q_i\)とすると交差エントロピーの勾配は
$$ \frac{\sigma C}{\sigma z_i} = \frac{1}{T}(q_i - p_i)=\frac{1}{T}\left(\frac{e^{z_i/T}}{\sum_j e^{z_j/T}}-\frac{e^{v_i/T}}{\sum_j e^{v_j/T}}\right) $$
となる。\(T\)が大きいとき、マクローリン展開より\(e^x \approx 1+x\)であるから、
$$ \frac{\sigma C}{\sigma z_i}\approx \frac{1}{T}\left(\frac{1+z_i/T}{N+\sum_jz_j/T} - \frac{1+v_i/T}{N+\sum_jv_j/T}\right) $$
であり、さらに、\(\sum_j z_j = \sum_j v_j =0\)であれば、勾配は
$$ \frac{\sigma C}{\sigma z_i} \approx \frac{1}{NT^2}(z_i - v_i) $$
のように単純化できる。
蒸留された小さいモデルで学習するときは\(T=1\)で確信度を求める。
なお、蒸留するモデルと同じ訓練データで小さいモデルを学習するときは、蒸留するモデルの出力に対する交差エントロピーと訓練データのラベルの分布に対する交差エントロピーの重みつき平均を損失関数に設定する。ただし、上の式より、モデルの出力に対応する交差エントロピーの勾配は\(\frac{1}{T^2}\)だけ訓練データのラベルの方とスケールが異なるので、勾配に対して\(T^2\)をかけて訓練データのラベルに対応する勾配とスケールを等しくする必要がある。
感想
論文ではもう一つの貢献として、上でまとめた蒸留に加え、特定のクラスの分類に特化した複数のモデルからなるモデルの学習方法の導入がある。 クラス数が多い分類のタスクを解くときの参考にしたい。