目的
kaggleや物体検出の論文を読んでいると"auxiliary head"に出会うことが多かった。
Unet++やYOLO等色々なモデルに使われており、kaggleでもモデル改善の一つの手段になっている。そこでauxiliary headについて原論を確認しようと思い、備忘録作成。
原論:
Chen-Yu Lee et. al., Deeply-Supervised Nets, Artificial Intelligence and Statistics, 562-570, 2015, https://arxiv.org/abs/1409.5185
論文を1行で言うと
DSN(Deeply-supervised nets)により画像認識の精度が向上し、学習の収束も早くなった。
課題意識
CNN(Convolutional Neural Network)の当時の一般的な課題点3つに取り組んでいる。
- 隠れ層が最終的な分類結果にどう影響するか不透明。
- 序盤の隠れ層がどの程度分類・汎化性能を持っているか(1とほぼ同義)
- 勾配消失・拡散により学習が収束しない。(当時はスキップ接続がまだ提案されていない)
この3つに取り組むことでCNNの精度を高める方法を検討した。
提案された解決策
すべての隠れ層にSVC(Support Vector Classifier)の分類器を導入した(原論中は"companion objective"と書いている)。
それぞれの隠れ層のSVCの結果に対して損失関数を適用し、パラメータを更新させている。
こうすることで、隠れ層の特徴量マップの質を可視化し(課題1,2)、また出力までのパスが短くなるので勾配消失・拡散(課題3)を抑制できる。
このように、隠れ層に分類器をくっつけて学習中に出力させながら学習することがDeep supervisionで、この時の分類器がauxiliary head。
筆者の主張は、より良い特徴量(隠れ層)を基に分類(SVC)した結果はより良くなるはずであるため、この分類結果をパラメータ学習中に監視(supervision)すれば、序盤の隠れ層の質が良くなり、最終的な出力も改善されるということ。
導入されたSVCはモデル訓練の時のみ使用され、推論時には使われない。
筆者の意図としては、この方法は正則化のような役割を持つはずだと主張している。つまり、学習時に序盤の隠れ層の質(=分類器にインプットした時に良い結果が返ってくる)が低下するのを防ぐことを正則化と捉え、これが汎化性能を高めているはずだと推測されている。
実際に原論中の実験では、deep supervisionにより訓練データの正答率は減少し、テストデータの正答率は向上している。
モデル概要と損失関数
原論の概要図を示します。
左図がモデル概要図ですが、一般的な畳み込み層とプーリング層の組み合わせがm層ある(原論の時代はまだBatch Normalizationが無い)という形です。右矢印でそれぞれの特徴量マップでSVCしている様子が表現されています。右図は縦軸が不明ですが、損失関数を表現したもののはずです。
(原論図)
損失関数はSVC由来の損失関数で書かれますが、SVCだけでなく一般化すると以下のような形になっています。※1
\displaylines{
loss = (最終層の損失) + \alpha(max((隠れ層の損失) - \gamma),0) \\
\alpha : 隠れ層の損失をコントロールするハイパラ \\
\gamma : 隠れ層の損失がいくつ以下まで抑えたいかをコントロールするハイパラ \\
}
最終的に精度を高めたいのは最終層の精度なので、ハイパラで隠れ層の出力の影響をコントロールしています。
上記の方法でCIFARのデータセットの学習をした結果と、それと対応するCNNの結果の特徴量マップが下図になります。Deep supervisionした方が、特徴量マップがインプット写真と形状が似ているものが多いです。
(原論図)
指摘された懸念点
隠れ層のパラメータが影響されることで、最終層でのアウトプットの結果に悪影響がでるのでは?
(隠れ層出力の最適パラメータ != 最終層にとっての隠れ層の最適パラメータ)
⇒原論中では確認されなかった。これを応用した例(UNet++等)では、deep supervision導入前(Unet等)と比べてパフォーマンスが向上しないケースがあるので、これが一つの原因?
# 注釈
※1 原論だと$ [数式]_{+} $と書いており、下付きのプラスの意味が分かっていません、、、。なので、意味的に"[]内がプラスの時のみ考慮する"だろうと思い、この表現で書きました。間違えていたらすみません、、