本文來自《A Discriminative Feature Learning Approach for Deep Face Recognition》,時間線為2016年。采用的loss是Center loss。
0 引言
通常使用CNN進行特征學習和標簽預測的架構,都是將輸入數據映射到深度特征(最后一層隱藏層的輸出),然后到預測的標簽,如圖1.
在通用目標,場景和動作識別中,預測的樣本歸屬的類別也處在訓練集中,這被稱為“閉集識別”。因此,預測的標簽能表示模型的性能,且softmax loss可以直接處理分類問題。這時候,標簽預測問題就類似一個線性分類模型,且深度學到的特征也具有可分性。
而對於人臉識別任務來說,學到的深度特征不止具有可分性,也具有辨識性。因為不可能在訓練集中收集到所有預測的ID類別,CNN輸出的特征並不總是可用的。需要讓訓練出來的特征具有辨識性,且能夠足夠泛化到那些未見過的人ID的類別。辨識性即需要特征能夠保證類內變化的緊湊性和類間不同的可分性。如圖1所示,辨識性特征可以很容易的通過KNN去划分。然而,softmax loss只保證了特征的可分性,生成的特征還不足夠用於人臉識別。
在CNN中,構建讓特征具有高度辯識性的loss函數是很有意義的。在CNN中的SGD通常是基於mini-batch,其不能很好的反映深度特征的全局分布。因為訓練集本身很大,也沒法每次迭代的時候把整個訓練集都放進去迭代。作為一種解決方法,contrastive loss和triplet loss各自構建了基於圖片二元組和圖片三元組構建loss函數。然而相比於圖片樣本,需要投入的訓練圖片二元組和三元組的數量會急劇增長,同時也不可避免的會減慢收斂和增大不穩定性。通過仔細的選擇圖片二元組和三元組,雖然這些問題可以部分解決。不過也明顯增加了計算復雜度,且也讓訓練過程變得不夠方便。
這里作者提出了一個新的loss函數,叫center loss,可以有效的增強深度特征的辨識性。特別的,對每個類別的深度特征,會學到一個中心(和特征有着一樣維度的一個向量)。在訓練中,會同時更新該中心,且最小化深度特征與對應中心向量的距離。所以該CNN是基於softmax loss和center loss聯合訓練的,通過一個超參數去權衡這兩個loss。直觀的,softmax loss強制不同類別的深度特征保持分離。center loss有效的將同一個類別的其他特征往其對應的中心緊推。通過聯合訓練,不止讓類間特征的區別變大,同時讓類內特征的變化減小。因此讓學到的深度特征辨識性可以增強。
1 Center Face
這里先通過一個例子介紹下深度特征的分布,然后基於該分布提出了center loss來提升深度特征的辨識性。
1.1 簡單的例子介紹深度特征的分布
本部分是基於MNIST數據集進行呈現的。通過將LeNet網絡修改的更深更寬,不過減少最后一層隱藏層的神經元個數為2(即學到的深度特征維度為2)。所以可以直接在2D坐標系上呈現學到的特征。網絡結構的詳細部分如表1。
softmax loss函數式子為:
其中,\(\mathbf{x}_i\in R^d\)表示第\(i\)個深度特征,屬於\(y_i\)類,\(d\)是特征的維度。\(W_j\in R^d\)表示最后一層全連接層中權重\(W\in R^{d\times n}\)矩陣的第\(j\)列,\(\mathbf{b}\inR^n\)是對應偏置項。mini-batch的size和類別的個數分別為\(m\)和\(n\)。這里忽略偏置項以簡單說明(實際上,忽略了之后,性能也沒什么差別)。
生成的2D深度特征如上圖所示。因為最后的全連接層表現的和一個線性分類器一樣,所以不同類別的深度特征可以通過決策面簡單的划分。圖2中可以得出:
- 基於softmax loss的監督之下,學到的深度特征具有可分性;
- 深度特征不具有足夠的判別性,因為仍然有明顯的類內變化
所以還不能直接將softmax學到的特征直接用在人臉識別上。
1.2 Center Loss
所以,如何提出一個有效的loss函數去提升深度特征的辨識性呢?直觀的,是減小類內變化的同時保持不同類特征的可分性。所以,這里提出一個center loss函數:
其中\(\mathbf{c}_{y_i}\in R^d\)表示深度特征的第\(y_i\)個類中心。該式子可以有效的表達類內變化。理想情況下,\(\mathbf{c}_{y_i}\)可以隨着深度特征的改變而更新。換句話說,需要將整個訓練集都考慮在內,並在每次迭代中對每個類別的特征進行平均,這在實際實踐中不具有可操作性。因此,center loss不能直接使用,這也可能就是在CNN中center loss一直沒有應用的一個原因吧。
為了解決該問題,提出兩個必須的修改:
- 不直接基於整個訓練集合更新center,而是基於mini-batch進行操作。在每次迭代中,通過平均對應的類別特征來計算center(這時候,一些center可能並不會被更新);
- 為了避免誤標記樣本帶來的較大擾動,使用一個標量\(\alpha\)來控制center的學習率。
\(L_C\)關於\(\mathbf{x}_i\)的梯度和更新\(c_{y_i}\)的式子如下:
當\(condition\)滿足的時候\(\delta (condition)=1\),反之\(\delta (condition)=0\),\(\alpha\)取值在[0,1]之間。通過將softmax loss和center loss 聯合訓練CNN以保證辨識性特征學習,對應的式子為:
可以看到,由center loss監督的CNN是可訓練的,可以通過標准SGD進行迭代,標量\(\lambda\)可以用來權衡這兩個loss函數。傳統的softmax loss可以看成該聯合loss的一個特殊情況,即\(\lambda =0\)。
上述流程簡單介紹了網絡訓練的過程。
從圖3可以發現,不同的\(\lambda\)會導致不同的深度特征分布,在值合適的情況下,深度特征的辨識性可以增強不少。
1.3 討論
- 如果只是用softmax loss,則會導致較大的類內變化;如果只用center loss,則深度特征和center就會下降為0(此時center loss是很小的);
- 相比於contrastive loss和triplet loss,它們都需要對數據進行擴展成二元組或者三元組,而center loss不需要對訓練樣本進行組合操作,因而CNN網絡能夠更直接的訓練。
2 實驗及分析
這里介紹下實現的一些細節和個別超參數的影響對比。
2.1 實現細節
- 基於MTCNN先對人臉數據集進行人臉檢測和對齊,人臉檢測框統一裁剪成112x96大小,然后通過每個像素值減去127.5並處以128進行大致的歸一化。
- 使用網絡上收集了的數據集如CASIA-WebFace,CACD2000,Celebrity+,在移除了出現在測試集中的ID圖片,大概有0.7百萬張,17,189個ID。並且做了簡單的水平翻轉以數據增強。
- 采用caffe庫進行實現,網絡結構如圖
為了公平對比,只在loss函數層做了不同的設定,如softmax loss(model A);softmax+contrastive(model B);softmax+center(model C)。這些模型的batchsize都為256,在兩塊TitianX上完成。對於模型A和模型C,學習率始於0.1,然后在16K和24K迭代次數時分別除以10。大致需要28K次迭代14小時完成整個訓練。對於模型B,發現收斂的更慢,其以0.1初始化學習率,然后在24K和36K進行變化。一共42K次迭代,大致22小時。- 將第一層全連接層的輸出作為深度特征,通過提取每個圖片的該特征並對圖片進行左右翻轉並再次提取特征,將這2個特征進行合並以此來表示該圖片。先通過PCA進行降維,然后采用cos距離來計算兩個特征的距離。最近鄰和閾值對比分別用來作為人臉識別和驗證。
2.2 基於超參數的實驗
超參數\(\lambda\)控制着類內變化,\(\alpha\)控制着模型C中center c的學習率。他們對網絡的訓練都很重要。
上圖中的一個實驗是固定\(\alpha=0.5\)並變化\(\lambda\),可以發現只用softmax(\(\lambda=0\))效果並不好;同樣的對於第二個實驗,固定\(\lambda=0.003\),改變\(\alpha\)發現還是挺穩定的。
從上圖可以發現,在小數據量上,center Face效果還是挺不錯的,當然還是干不過谷歌那種包含超大數據量的FaceNet