How to Train Triplet Networks with 100K Identities?


1. 為什么介紹此文?

  Triplet net 改進工作之一,主要思想是在大數據集(人臉識別)上的困難樣本挖掘。人臉識別工作對於圖像對匹配而言很有借鑒意義,共性是特征的提取和樣本數據的挖掘。

  Tripnet net源於文章Deep metric learning using triplet network,在論文中也提出了用於訓練三張圖像的triplet loss。許多類似的人臉識別、匹配工作都是在大數據集上實現的,這就要求對數據的高效利用。原因是大多數樣本在訓練中后期不再有梯度貢獻,例如含有margin的損失函數(triplet loss、softpn(pnnet中的損失函數,改進於triplet loss)),多數樣本很容易滿足於這個margin,此時損失函數中的loss不再發生變化,導致訓練停滯阻塞。所以如何有效的進行困難樣本挖掘(OHEM)成為了關鍵,困難樣本應該包括同類(匹配樣本)中距離較大的和非同類(非匹配樣本)中距離較小的樣本。

 

2. 本文的貢獻

  本文的主要改進在於困難樣本挖掘。當下已有兩種OHNM,但是作者認為在極多identities(類別極多)的數據集中不能足夠有效的挖掘困難樣本,這就容易陷入局部極小,無法繼續更新。所以作者提出首先將數據按照相似度聚類,然后實施batch ohem,這樣縮小了搜索空間,更容易挖掘出困難樣本。那么為什么使用triplet loss而非softmax loss呢?因為隨着類別數增多,與softmax loss相連接的全連接也會增多,導致GPU顯存負擔,訓練周期變長。其次是如果每類只有很少的數據那么訓練softmax就會很困難,如下圖所示:

 然而使用triplet loss也並非容易,如何有效的在large-scale情況下高效優化?使用triplet會發現數據量激增,可組合的三元組變多,如果要遍歷所有組合是不現實的,或者極其低效。主要有兩種方法,一是將triplet loss轉為softmax loss(triplet net一文中,將triplet loss結合了softmax的輸出與mse),另一種是OHNM或batch OHNM。但是第二種挖掘樣本的方法都是直接考慮在所有的樣本空間來sample一個batch,如果這個batch中有不滿足margin的就認為是困難樣本。然而這樣做並不能保證采樣時正好選取了很多很相似的樣本,而且(a,p,n)圖像組一經選取就已經固定,不會再有其他的組合,所以效率較低。所以作者認為尋找相似的個體(類別)是提高triplet net的核心關鍵

  我的理解是對於含有10個個體(人)的人臉數據,難以區分的肯定是那些長的很像的個體(比如甲與乙)。之前的困難挖掘是首先在這些打散的整體空間隨機設置(a,p,n)三元組然后成批去訓練,分錯的作為困難樣本。這就使得你這些三元組都已經固定了,困難樣本不一定是真的困難,除非運氣好使得三元組中有很多甲、乙中的樣本。而作者提出的想法是首先對於所有樣本進行聚類,觀察哪些樣本比較接近,(甲和乙長得像肯定聚類結果很接近),那么我就在聚好類的子空間中選取(a,p)二元組組成batch,n在這個batch中來選取,那么這個負樣本n就會是真正的困難樣本。

 

3. 三種OHEM方法

1)Triplet with OHNM

這個公式其實沒有體現困難挖掘,因為它認為違背margin限制,即正樣本距離沒有比負樣本距離小alpha(margin)時就認定為困難樣本。T代表全體樣本空間,所以這里的三元組都是直接從總體樣本中選擇的,這也是我們大多數人的做法。

看上面這個圖示,紅色為anchor,淺綠色為positive,天藍色為negative,深藍色為hard negative。

這個方法中所有的匹配對和negative都是在整體樣本中選取。可見,大多數negative是遠離positive匹配對的,盡管訓練的時候negative也會被分到一個batch中,但是真正困難的negative很難被選擇到。

總結:在打散的整體樣本空間隨機選擇三元組。

 

2) Triplet with Batch OHNM

這個方法是為了在一個batch中盡可能挖掘困難樣本,這時negative並非在整體樣本中選取而是在一個batch中選擇。就是說我只在全體樣本中選匹配對,然后訓練時在batch中再選擇negative來訓練。這就相當於縮小了搜索范圍。從全局搜索變成了局部搜索,所以搜到的困難樣本可能性更大。

可以看到首先是匹配對組成batch經過網絡得到距離后,根據距離判斷相似度,再組成三元組batch,輸入到損失函數來優化。

有一點值得注意是選擇不要直接選擇與匹配對最近距離的negative作為困難樣本,可能會導致poor training,應該選擇比較近鄰的樣本。 我的理解是特別相似的三張圖反而無法訓練,因為它們本來就模糊屬於一個類,這樣反而造成一種“錯誤標記”的訓練樣本,使得網絡陷入模式坍塌。

總結:在打散的整體樣本空間隨機選擇二元組,在計算損失時再組成三元組。

 

3)Triplet with Subspace Learning

本文的方法,作者認為僅僅選擇匹配對組成batch也不妥,即又追根溯源了一步。因為這個batch也是在隨即打散后的整體樣本中選取的,所以作者認為identity(極多個體的人臉)特別多時,那么長得相似的甲、乙二人的人臉匹配樣本對同時進入一個batch的概率就會極低。那么既然長得相似的人都不在一個batch里,那就沒有特別困難的樣本可挖掘了。一個簡單的思路就是對每個identity生成一個representation,然后根據這個representation進行kmeans聚類。最后聚類結果就是一個個subspace。其中距離相近的subspace可以看作難以區分或者說極其相似的樣本。為了加速訓練,利用預訓練網絡來初始化,盡管特征提取和聚類耗費時間,但是子空間學習大大減少了搜索空間和訓練時間

需要注意的是identity representation的選擇和聚類的數目(子空間數目M)。如果M太小,那么子空間划分的就會很模糊,不是那么相似的也被聚為一類,那就難以挖掘特困難的。如果M太大,許多子空間含有的獨立的identity數目就會變少,極端情況下每類單獨成為一個子空間,那么挖掘效率就會很低。作者實驗為每個子空間含有10k identity。

 總結:在整體樣本空間中先聚類成子空間,再迭代使用batch OHNM。

 

4. 總結與思考

  總結三種方法。比方說現在有100000個不同的人的人臉數據,其中甲、乙長得特像,那么我們一定希望這兩個人臉可以盡可能組合為三元組。OHNM方法是在所有樣本中隨機選,那么同時把甲乙選到一個三元組中的概率極小。batch OHNM方法是我先只在所有樣本中隨機選二元組,然后再在這一個batch里面根據距離選擇negative,這時如果batch里面都有甲乙的話就有可能被找出來,這也是相對法一而言的靈活性。方法三是首先對全體樣本聚類,長得相似的人肯定都被聚為了一類,那么我在這個相似子空間里挖掘豈不更容易?甲乙肯定被划分在了一個子空間,這個子空間里都是長得相似的人臉,挖掘效率更高。

  可以看到法二縮小了法一的搜索空間,作者的方法又縮小了法二的搜索空間。即進一步解決了源頭的問題,這個追根溯源的思考方法值得學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM