Center Loss在人臉識別中有何應用?
雷鋒網按:本文作者祝浩(皮搋子狐狸),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的條件概率分數比較低的情況,他就會告訴所有的參數, heta_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
,歡迎試用。
雷鋒網注:本文由深度學習大講堂授權雷鋒網發佈,如需轉載請注明作者和出處,不得刪減內容。