今天介绍一下NormFace: L2 Hypersphere Embedding for Face Verification
Motivation
希望利用正则化解决两个问题:1. 人脸识别任务里面的loss有softmax、contrastive、triplet、pairwise等等,其中softmax是单个样本输入就可以训练的,其他的都是需要sample的,尤其是metric-learning每次要sample 3个样本才能算出一个loss,这会导致采样空间为N^3,速度慢而且采样策略对训练结果影响很大;2. softmax本身优化的是没有归一化的内积结果,但是最后在预测的时候使用的一般是cosine距离或者欧式距离,这会导致优化目标和最终的距离度量其实并不一致。我们之前做的时候用softmax训练做pretrain,然后后面用欧式距离的metric-learning做进一步学习或者finetune其实也是不大合理的,用一个欧式距离优化目标去finetune一个内积空间最优的模型应该不容易得到好的效果。
基本原理
既然最后在特征对比的时候使用归一化的cosine距离,那么就在训练的时候也把feature做归一化处理,即
,其中e是为了防止除0的较小正数。
对应的BP求导公式:
为了解释一下为什么需要normalize,作者还做了比较漂亮的数学推导并给出了可视化的结果。softmax loss倾向于学习到一个radial分布的特征,其原因在于特征的scale越大就会使得softmax的loss越小,figure.3里面是softmax之前的fc有bias的情况下会使得有些类别在角度上没有区分性但是通过bias可以区分,在这种情况下如果对feature做normalize,会使得中间的那个小类别的feature变成一个单位球形并与其他的feature重叠在一起,所以在feature normalize的时候是不能加bias的。
做了归一化之后,softmax的优化就变成了直接优化cosine距离了:
但是这里有遇到一个问题是这样训练并不收敛,其原因在于normalize之后softmax loss的输入处于一个[-1,1]的分布,其最小值被抑制、是有下限的,并且对于一个类别的概率来说,其公式为:
,
即使样本被完美分类,即对应类别的输出为1,其他的为-1,那么这个概率Py还是一个比较小的值,而softmax loss的梯度为1-Py,这使得容易的样本梯度也很大。相比于原来的softmax loss,其输入的scale可以很大使得概率Py是个接近于1的数使得难易样本的梯度差别比较明显。所以解决办法也就显而易见了,就是在normalize之后加个scale,让这个差距再拉大,所以最终normalize之后的softmax loss如下,其中w和f都是归一化的。
到这里为止作者已经解决了归一化的softmax问题,那么归一化还有什么好处呢,由于归一化之后w和f的平方项为1或者常数,
那么欧式距离、内积、cosine距离就变成了等价的
所以contrastive和metric-learning也可以写成单样本形式:
其原理在于用Wj、Wk去代替原本loss里面的fj和fk,作者把这个Wj叫做第j类feature的agent,
直观的理解就是fi和他自己所在类别的Wj的距离应该足够接近而与其他类别的Wk的距离应该足够远,
其实这个与原本的constractive和triplet loss还是有本质差别的,这里的loss输入仍然是f和W内积之后的输出,
只不过形式变成了不同类别所对应的输出之间的比较,而原来在没有normalize的情况下这个值并不能等价
于cosine距离并且范围不固定使得margin的选择变得很困难。相比于作者之前的工作
SphereFace: Deep Hypersphere Embedding for Face Recognition. In Proceedings of the IEEE conference on computer vision
and pattern recognition,除了做weight normalize之外还做了feature normalize,
并由此设计了一些分类任务也可以实现的intra&inter class
loss。
实验结果
相比于前面的推演,实验结果有点让人失望,结论是normalize本身比loss的区别更重要,
而且提升也不是特别明显。其中有一些trick作者在文章里提到的:
1. 归一化feature的时候scale是十分必要的但是归一化weight的时候并不需要scale,
从原理上来看最终是W和f的内积,所以任何一方有scale应该都是可以的,
所以作者也没能解释这个原因是什么,有分析明白的朋友可以帮忙解释一下?
2. finetune要比from scratch要好,其中from scratch做weight normalize训练无法收敛。
总结:
数学上的工作比较漂亮,normalize本身对于深度学习的训练有好处这个事情其实已经是共识,
在normalize之后用内积的方式构造了contrastive、triplet、centerloss
的idea是很新颖的,
但是当类别数较多的时候,比如1000万类,还是会遇到softmax一样的超大W显存问题,
还是得用传统的triplet loss。另外就是在实际计算triplet的时候
作者没有提到采样之类的问题,
虽然变成了单样本模式,但是f与哪些Wj和Wk计算distance貌似没有提,
如果都算的话计算量比较大而且并没有hard negtive samping在里
面,这可能也是导致结果在新提出的loss上并没有变好的原因。