Softmax

softmax是最常見的人臉識別函式,其原理是去掉最後的分類層,作為解特徵網路匯出特徵向量用於人臉識別。softmax訓練的時候收斂得很快,但是精確度一般達到0。9左右就不會再上升了,一方面是作為分類網路,softmax不能像metric learning一樣顯式的最佳化類間和類內距離,所以效能不會特別好,另外,人臉識別的關鍵在於得到泛化能力強的feature,與分類能力並不是完全等價的。

L_1 = -\frac{1}{N} \sum_{i=1}^{N} log \frac{e^{W^T_{y_i}x_i + b_{y_i}}}{\sum_{j=1}^{n}e^{W^T_{j}x_i + b_{j}}}  \\

公式中N是batch size的大小,n是類別數目。如果訓練進行了停滯,可以採用挑選hard sample(即那些預測錯誤但是預測值較高的樣本,也就是比較難分類的樣本)的辦法進行幫助訓練。具體的可以瞭解OHEM(Online hard example mining)技術, 比如說Focal loss一類的。

Triplet Loss

Triplet loss屬於Metric Learning, 相比起softmax, 它可以方便地訓練大規模資料集,不受視訊記憶體的限制。缺點是過於關注區域性,導致難以訓練且收斂時間長

||x_i^a - x_i^p||_2^2 + m < ||x_i^a - x_i^n||_2^2 \\

這裡提一下Metric Learning的概念,它是根據不同的任務來自主學習出針對某個特定任務的度量距離函式。透過計算兩張圖片之間的相似度,使得輸入圖片被歸入到相似度大的圖片類別中去。通常的目標是使同類樣本之間的距離儘可能縮小,不同類樣本之間的距離儘可能放大。

Center Loss

首先我們看一張圖:

人臉識別損失函式綜述(附開源實現)

可以看到,在separable features中,類內距離有的時候甚至是比內間距離要大的,這也是上問題到softmax效果不好的原因之一,它具備分類能力但是不具備metric learning的特性,沒法壓縮同一類別。在這個基礎上,center loss被提出來,用於壓縮同一類別。center loss的核心是,為每一個類別提供一個類別中心,最小化每個樣本與該中心的距離:

L_2 = -\frac{1}{N} \sum_{i=1}^{N} log \frac{e^{W^T_{y_i}x_i + b_{y_i}}}{\sum_{j=1}^{n}e^{W^T_{j}x_i + b_{j}}}  + \frac{\lambda}{2}\sum_{i=1}^N||x_i - c_{yi}||_2^2\\

左邊是softmax, 右邊則是約束各個樣本到樣本中心的距離。

L-Softmax

原始的Softmax的目的是使得

W_1^Tx

>

W_2^Tx

,即

||W_1||||x||cos(\theta _1) > ||W_2||||x||cos(\theta_2)

,在這個基礎上,L-softmax( Large-margin softmax) 希望可以透過增加一個正整數變數m,使得產生的決策邊界可以更加嚴格地約束上述不等式,讓類內的間距更加的緊湊,類間的間距更加具有區分性

||W_1||||x||cos(\theta _1) > ||W_1||||x||cos(m \theta _1)  > ||W_2||||x||cos(\theta_2)  \\

L-Softmax的公式:

L_i = -log(\frac{e^{||W_{yi}|| ||x_i||\psi(\theta_{y_i})}}{{e^{||W_{yi}|| ||x_i||\psi(\theta_{y_i})}} + \sum_{j\ne y_i}{e^{||W_{j}|| ||x_i||cos(\theta_{j})}}}) \\

\varphi(\theta ) = \begin{equation} \left\{ \begin{aligned} \overset{.}cos(m\theta), 0\leq \theta \leq \frac{π}{m} \\ D(\theta), \frac{π}{m} \leq \theta \leq π  \\ \end{aligned} \right. \end{equation} \\

cos函式在(0,π)內是單調遞減的,乘上正整數m後內積會減小,這樣可以加大類間的差別,如圖所示:

人臉識別損失函式綜述(附開源實現)

由於L-softmax有一個更加難的實現目標,所以說它更能避免過擬合。同時L-softmax不僅在分類問題上有優勢,同樣在識別問題上也有優勢,因為它使得類內的距離更加的緊湊。 透過控制m的大小,調整類間距離。m越大,類間距離就越大,類內更加緊湊。

人臉識別損失函式綜述(附開源實現)

不同m帶來的分類效果

SphereFace( A-softmax)

L_4 = \frac{1}{N} \sum_i-log(\frac{e^{||x_i||cos(m\theta_{y_i, i})}}{{e^{||x_i||cos(m\theta_{y_i},i)}} + \sum_{j\ne y_i}e^{||x_i||cos(\theta_j, i)}}) \\

SphereFace是在softmax的基礎上將權重歸一化,即使得

||W_i||=1, bias = 0

。它與前面提到的L-sofrmax最大的區別在於SphereFace將W權重歸一化了。L-Softmax會同時從角度和權重長度上區分不同類別,而SphereFace只從角度上去區分不同類別,在資料集大小固定的條件下,L-softmax的精確度可能不如sphereFace。

人臉識別損失函式綜述(附開源實現)

在最近讀的一篇論文The Devil of Face Recognition is in the Noise中,商湯認為A-Softmax使用在clean dataset的效果比之前描述的各種loss要好,但是在噪聲極大的資料分佈中,表現甚至不如Center Loss和Softmax。有關人臉資料集噪聲的問題,可以參考之前寫的博文:人臉識別常用資料集介紹(附下載連結)

CosFace( LMSL: Large Margin Cosine Loss)

L_5 = \frac{1}{N}\sum_i-log(\frac{e^{s(cos(\theta_{y_i,i})-m)}}{{e^{s(cos(\theta_{y_i,i})-m)}} + \sum_{j\ne y_i}e^{s cos(\theta_{j,i})}}) \\

CosFace的思想和SphereFace( A-softmax)的思想接近,其中主要做了以下三點的改進:

loss的形式做了稍微的改變,將超引數m由乘法運算變成了減法運算

不僅對權重進行了正則化,還對特徵進行了正則化

再乘上一個scale引數,超球面過小時,分類對映到超球面上不好分類,這個scale引數可以擴大超球面體積,幫助分類

如下圖所示,A-softmax存在一個問題,它的決策邊界會隨著

\theta

的變化而變化,當

\theta

為0的時候,margin=0, 而CosFace(即LMCL)克服了這個缺點,兩個類別之間有一個明確的決策邊界(margin>0), 相對來說有更好的魯棒性

人臉識別損失函式綜述(附開源實現)

各大損失函式的決策邊界

決策邊界

這裡插播一下決策邊界( Decision Boundaries)的概念,它表示的是在需要分類的資料中,如何區分不同類別的邊界。

人臉識別損失函式綜述(附開源實現)

那麼這麼決策邊界怎麼計算呢,以二分類為例做一個簡單說明。對於二分類而言,分類邊界就是樣本屬於兩個類別的機率相等。以softmax來距離,假設某個樣屬於類別1的機率是

L_1

中log函式的輸入,那麼屬於類別2的機率只是將log函式輸入的分子換成類別2而已,分母是不變的,又因為以e為底的指數函式又是遞增函式,所以直接讓兩個類別的指數相等就能得到softmax的分類邊界函式:

(W_1 - W_2)x +b_1-b_2=0 \\

ArcFace

Arcface的思想和CosFace類似,主要區別是將m放入了cos中,角度距離比餘弦距離對角度的影響更加直接:

L_6 = -\frac{1}{N}\sum_{i=1}^Nlog(\frac{e^{s(cos(\theta_{y_i}+m))}}{{e^{s(cos(\theta_{y_i}+m))}} + \sum^n_{j=1,j\ne y_i}e^{s cos \theta_j}}) \\

論文中提供了大量對照實驗:

人臉識別損失函式綜述(附開源實現)

人臉識別損失函式綜述(附開源實現)

開源實現

想要研究softmax和triplet loss,可以參照google facenet的開源實現:davidsandberg/facenet

想要研究各種ArcFace、CosineFace等,可以參照deepinsight洞見實驗室的開原始碼:deepinsight/insightface

從在資料集表現上來說,ArcFace優於其他幾種loss, 著名的megaface賽事,在很長一段時間都停留在91%左右,在洞見實驗室使用ArcFace提交後,準確率嘩嘩就提到了98%,之後再刷的團隊也大同小異,多使用ArcFace, CosineFace等損失函式。

這兩個開源演算法我也都跑過,粗略地比較了一下,可以見insightface和facenet效果+效能比較

最後吐槽一句,寫這篇文章的時候發現不少技術部落格文章的公式都錯了,然後以訛傳訛很多都是錯的,我自己寫的時候就算對著論文有些地方沒注意也打錯了,所以大家要對著公式實現的時候儘量回去看論文,第二手來源資訊肯定沒有一手資訊可靠~

參考文獻

人臉識別Loss對比:L-Softmax, SphereFace, CosFace, ArcFace

ArcFace演算法筆記 - AI之路 - CSDN部落格

人臉識別論文再回顧之一:Center Loss

ArcFace: Additive Angular Margin Loss for Deep Face Recognition