雷锋网按:本文作者祝浩(皮搋子狐狸),3M Cogent Beijing R&D 高级算法工程师。本硕分别毕业于哈尔滨工业大学机械专业和北京师范大学计算机专业,并于2012年加入3M。14年拿到NICTA Scholarship及top-up Scholarship。熟悉计算机视觉,神经影像和医学图像处理。在各种相关国际会议期刊上发表论文10余篇。
摘要
在大家吐槽用softmax训练出来的人脸模型性能差,contrastive 和 triplet需要个中谜一样的采样方法之际。ECCV 2016有篇文章提出了权衡的解决方案。通过添加center loss使得简单的softmax就能够训练出拥有内聚性的特征。该特点在人脸识别上尤为重要,从而使得在很少的数据情况下训练出来的模型也能有不俗的性能。本文尝试用一种比较容易理解的方式来解释这篇文章。
我觉得在开始正式介绍center loss之前,我有必要讲一个故事。请大家回答我,做人脸研究,最期待的事情是什么?来100块Titan……!咦,还不如换成银子呢。
笔者认为,对于做人脸的人而言,最幸福的事情就是拿到全世界所有人的若干张人脸数据(画外音:地球人都知道!)。各位看官先勿开喷,请听故事….假设我拿到了世界所有人的人脸数据,也训练好了一个所谓的映射空间(其实我更喜欢叫嵌入空间)…..此时我们觉得这个空间的画风应该是这样的(密集恐惧症慎入)….
图 1
咦?这不是海洋球么→_→,我书读得少你不要骗我?各位看官好眼力,这真的就是海洋球( T___T )。如果我们把一个球就看成一个人的话,球的中心就是类中心,直径就是他若干张照片带来的variance。理想情况我们当然认为每个人所代表的球应该差不多大,人与人之间也是能分开的,就跟海洋球一样。然后海洋球所在的池子呢,就是能容纳所有球的界。
梦做完了,醒醒,我翻了翻硬盘,也就有10W人的数据。现实总是那么骨感。接下来发生的事情胖子可能会不太爱听,因为我们只有10W人的数据,但是池子还是很大,如果我们用普通的方法训练的话,海洋球就会填不满这个池子。最简单的解决方案就是,我们从50亿个海洋球,变成10W个足球(估计还是不够,没准得用月球( ¯ □ ¯ )),对,你没听错,通过变成吃货长胖这种方式我们把损失49亿多海洋球弟兄的空间填满了。
图 2
看官可能会问,填满了不就填满了么?有什么问题么?请大家注意,虽然那49亿多个兄弟不在你的训练集里面,但是有可能在你的测试集哟。所以当以前的两个离得比较近的海洋球兄弟进入到这个胖子的世界的时候(‘‘)(’’), 这个新世界会要求新来的弟兄跟他们的国民一样胖,然后悲剧发生了。他们很有可能撞在了一起,以至于他们老妈都很有可能都分不清谁是谁(因为在小数据情况下的可分行并不能推广到全集)。如图3,如果用所有数据训练是可分的话,只用部分数据训练因为变胖问题,会使得两个不同的identity出现碰撞风险,从而会造成错误接受和错误拒绝。
图 3
那么请问,什么样的方式才合理呢?鄙人认为,我心目中比较合理的海洋球摆放画风应该是这样的(7颗海洋球用来召唤神龙 (╯-_-)╯):
图 4
该画风的满足的条件就一个,那10W海洋球兄弟不允许吃胖。这样剩下来的空间就能够给他们每人一个大院子,这样一旦有新的朋友(49亿多个兄弟)来玩耍的时候,不至于撞得他们老妈都分不清楚是谁(至少从概率上极大的降低了)。
不好意思,主持人,故事讲得太爽,忘记我们是来讲一篇paper的了 (╯-_-)╯╧╧ 。今天我们要讲的文章名字叫做A Discriminative Feature Learning Approach for Deep Face Recognition. 在放公式驱散一票读者之前,我觉得还是放点图来缓和一下作者和读者之间的紧张关系。论文中提出我们之前训练出来的features只是可分而已(下图左),如果要得到一个判别性比较高的features应该是右边这种样子的。用我们的胖子理论,不好意思应该叫海洋球理论,大家就可以知道,并且理解为什么右图的特征更合理。
图 5
我们用论文中的另一个图来表达,海洋球理论的论据。我们在图6的左上图上画了三条线来模拟feature之间的角度(因为人脸verification基本上就是cosine距离),可以看到,如果每一个类别吃的太胖,可能会导致他的类内距离可能比类间距离大,从而……你懂的(假分很高)。如果我们引入论文中的center loss并且给一个比较高的weight的时候,比如右下图,我基本找不到反例了。
图 6
同时新的未知类别进来的时候也有更大的概率会和其他的类别分开(包含未知类和已知类)。在这center loss起到的作用就是减肥剂,怎么让一个比较胖的类内数据分布,变瘦,从而使得他有足够的院子容纳新的客人。
以上文字给初学者品尝,接下来的文字将会上公式,请有耐心的初学者和大牛们接着往下看。整个softmax+center loss的定义如下:
我基本不太想解释一遍…….左边是softmax,右边嘛,就是约束当一个样本看到自己的类中心的时候,走上去打个招呼。这样才能瘦。主持人快来…..我编不下去了…..
可能大家会问了,为什么需要右边的约束才能达到这个效果呢?softmax为什么达不到这个效果?或者说softmax有啥缺点?
昂,简单来说就是伟大的softmax管杀不管埋。不对,应该说是只许自己胖,不准别人胖。
各位看官请看softmax的更新函数,如果出现input的条件概率分数比较低的情况,他就会告诉所有的参数,\theta_j。你们碍着我长胖了,离我远点,然后乘机偷偷的向着input方向长胖一点(不改其吃货本质)。所以每个类都这么流氓的结果,就是大家都变成胖子,每个胖子的鼻子都贴着另一个胖子。
写到这本来想停笔了,但是wanda同学提了个问题。这玩意和contrastive loss和triplet loss之间有什么区别或者是联系没有呀?
上面的公式可以看成softmax + contrastive loss只不过只提供一个类内样本作为pair,而这个类内样本就是整个类的类中心。这在一定程度上解决了contrastive loss坑爹的采样问题,大家都知道contrastive loss需要坑爹的采样很多pair对,一不小心还会搞得positive pair和negative pair严重imbalance。
尽管triplet一定意义上解决了这个imbalance的问题,带来的后果是更复杂的采样策略,导致实际在使用过程中的trick实在太多,什么semi-hard example mining等等。Center loss相当于拆解了contrastive loss的两种情况:positive pair和negative pair。Center loss相当于把每一个进来的样本都自动配了一个positive sample(也就是他们类中心), negative pair的inter-class separation则是通过softmax来完成的,就是那么的简单粗暴有效。
Wanda童鞋已经重复出很positive的结果并提供了mxnet
code,欢迎试用。
雷锋网注:本文由深度学习大讲堂授权雷锋网发布,如需转载请注明作者和出处,不得删减内容。