探したけどなかなかL2 Constrain Softmax Lossのサンプルがなかったのでとりあえず作成した.
https://arxiv.org/pdf/1703.09507.pdf
L2 Constrain Softmax Loss
色々な人が解説を書いているので私のところではあくまで簡単なレベルのみで概要を記載する.
このl2 constrain softmax lossを何に使いたいか
metric learningで使い、それぞれを区別しやすい特徴量を作りたい.
通常のsoftmax lossを使っていながらその直前に
- 特徴量の最終出力をL2正則化 (x/||x|| : xは全結合層の出力ベクトル)
- 通常のsoftmaxでは難しいベクトルが全要素小さくなりがちなため、||x||=1とし敢て他と対等にし重きを置くようにする
- アルファでスケール(αx/||x||)
- アルファをかけることで||x||=1としたことで、値が小さくなりすぎて識別しにくくなった分大きくする.値を大きくすると一番大きい値の要素がsoftmaxで強く強調される.
を行う.追加する層は、「L2正則化する層」+「スケールする層」
αは自動で学習させても、手動で決め打ちでもよい.
また、このl2 constrain softmax lossの手法をmetric learningとして使う時のポイントは、学習時と使用時で使い方が異なること
学習時は、通常のsoftmax同様に最後まで計算し、softmax lossで逆誤差伝播
使用時はL2正規化の手前の特徴量を最終出力特徴量として、プロットしたり、他のベクトルと内積をとるなど行う(コサイン類似度を計算する時にどうせL2正則化をするので手前で取っているだけ)

図で示すと上記のような処理になっている.新しいのはNewと書いた部分のみ.
他はこれまで通りの処理. スケールした後にFCをしてクラス数を揃えてからsoftmax処理.
実装
ということで、Tensorflow+Kerasベースで実装してみた.幾らかハマったが、通常のチュートリアルに数行足せば終わり.