大家好,這篇文章是接上篇文章的一個補充文章,主要是回答一下上篇文章的問題,講一下triplet loss。上一篇文章我們介紹了4種目前人臉識別領域的主流loss,如果沒有閱讀的同學可以先看一下那篇文章哦。
好的,針對上一篇文章的問題我們首先作出一個回答:
為什麼這些同樣是做分類的loss,在人臉領域如此大火,但在其他領域,比如Imagenet上面被大家用的基本沒有呢?一些最普通最基本的問題上面,這些loss的表現如何?
這兩個問題我透過實驗驗證,事實上在其他領域,是完全可以應用改進的新loss function的,而且在模型結構不改變,超引數不改變的情況下,模型的效能會有些許改善。大概在1%~3%點左右。
但是這裡會延伸出來一個問題,我們費勁去將一個新的loss function用到模型裡面只換來1%的提升,這究竟是否有價值?
事實上,比如最簡單的MNIST資料集,用改進loss function提升甚至到不了0。1%(由於目前在這個問題上深度學習普遍模型準確率可達99。5%以上的準確率)。所以我們可以看出來,改進型loss想要取得較好的模型效果是有一定的前提的。
這個前提就是,對於分類問題而言,類別越多,改進loss function的效果越好,這和人臉識別問題相契合,以UMD face為例,其就包含了8277個類別,而改進loss會在這種多類別的分類任務中取得相對而言較好的效果。
好的,那麼現在,我們把上次咱們遺留下來的彩蛋(triplet loss)給介紹一下。
Triplet Loss:
在開始介紹這個loss之前,我們首先需要理解一個這個loss所用到的一個概念:Anchor。這個概念能夠幫助我們直擊triplet的含義,方便我們對於其數學意義的理解。
anchor是什麼?
我們可以簡單理解為我們訓練樣本中任意取出的一個樣本。比如取到的樣本是黃磊老師:
照片來源:《嚮往的生活》
這個在triplet中就是anchor,記為
。然後我們還需要從我們的訓練樣本中去分別找到一個正樣本(possitive sample)和一個負樣本(negitive sample)來組成一個triplet。
正樣本如何選取呢?其實很簡單,就是同類樣本,在本例中就還是黃磊老師,比如:
圖片來源:《中華網》
正樣本我們記為:
負樣本,就是任意一個和黃磊老師不一樣的類別的人臉,比如何炅:
照片來源:《新華網》
負樣本我們記為:
那麼此時,這三個樣本就組成了一個triplet進行訓練了。
三張樣本,進入神經網路,在倒數第二層 embedding 層,一定會得到三個不同的embedding feature輸出(對於embedding feature的理解參見上一篇文章哦)。我們將三個feature標記為:
直觀上設計,我們一定是希望
的距離越近越好,因為他們同屬於黃磊這一類,而
之間的距離越大越好,因為他們屬於不同類。
數學表示就是:
這裡,我們引入了
的概念,和我們之前Arcface,CosineFace思路是一致的,加入一個間隔,使類間距增大,類內距變小。
觀察目標函式,那麼其對應的訓練損失函式也就很顯然了:
這裡的+代表如果()裡的值為負數的時候,則值為0,否則為其本身。
這樣就約束保證了,不同類別之間的embedding
距離一定大於等於
。
以上就是我們的triplet loss了,是不是感覺很簡單呢?
我在這裡有個想法,我們一起回顧了所有的五種新的loss function的設計思路,那麼是不是可以借鑑一下之前的四種,在採用triplet的思路之上,將triplet裡面用的loss裡面的
換個位置,比如採用ArcFace的思想,來設計出一種全新的更好的loss呢?是不是一篇新的期會論文又誕生啦~
不過triplet loss也有其工業上的劣勢,比如建立triplet 對會比較耗時,網路訓練更新不容易等問題,這裡就需要大家用更好的方式去創新更新啦。
好了今天就和大家分享到這裡,
做個預告,我打算近兩篇文章和大家聊聊google 現在大火的transformer(還是一樣的從本質的數學理解), 和聊聊人體姿態學估計與重建的相關演算法,演算法之路,咱們快樂同行。
謝謝閱讀~比心