4.4 Triplet 损失-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
| 4.3 Siamese 網(wǎng)絡(luò) | 回到目錄 | 4.5 面部驗證與二分類 |
Triplet 損失 (Triplet Loss)
要想通過學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的參數(shù)來得到優(yōu)質(zhì)的人臉圖片編碼,方法之一就是定義三元組損失函數(shù)然后應(yīng)用梯度下降。
我們看下這是什么意思,為了應(yīng)用三元組損失函數(shù),你需要比較成對的圖像,比如這個圖片,為了學(xué)習(xí)網(wǎng)絡(luò)的參數(shù),你需要同時看幾幅圖片,比如這對圖片(編號1和編號2),你想要它們的編碼相似,因為這是同一個人。然而假如是這對圖片(編號3和編號4),你會想要它們的編碼差異大一些,因為這是不同的人。
用三元組損失的術(shù)語來說,你要做的通常是看一個 Anchor 圖片,你想讓Anchor圖片和Positive圖片(Positive意味著是同一個人)的距離很接近。然而,當(dāng)Anchor圖片與Negative圖片(Negative意味著是非同一個人)對比時,你會想讓他們的距離離得更遠(yuǎn)一點。
這就是為什么叫做三元組損失,它代表你通常會同時看三張圖片,你需要看Anchor圖片、Postive圖片,還有Negative圖片,我要把Anchor圖片、Positive圖片和Negative圖片簡寫成 A、P、NA、P、NA、P、N 。
把這些寫成公式的話,你想要的是網(wǎng)絡(luò)的參數(shù)或者編碼能夠滿足以下特性,也就是說你想要 ∣∣f(A)?f(P)∣∣2||f(A)-f(P)||^2∣∣f(A)?f(P)∣∣2 ,你希望這個數(shù)值很小,準(zhǔn)確地說,你想讓它小于等 f(A)f(A)f(A) 和 f(N)f(N)f(N) 之間的距離,或者說是它們的范數(shù)的平方(即: ∣∣f(A)?f(P)∣∣2≤∣∣f(A)?f(N)∣∣2||f(A)-f(P)||^2\leq||f(A)-f(N)||^2∣∣f(A)?f(P)∣∣2≤∣∣f(A)?f(N)∣∣2 )。( ∣∣f(A)?f(P)∣∣2||f(A)-f(P)||^2∣∣f(A)?f(P)∣∣2 )當(dāng)然這就是 d(A,P)d(A,P)d(A,P) ,( ∣∣f(A)?f(N)∣∣2||f(A)-f(N)||^2∣∣f(A)?f(N)∣∣2 )這是 d(A,N)d(A,N)d(A,N) ,你可以把 ddd 看作是距離(distance)函數(shù),這也是為什么我們把它命名為 ddd 。
現(xiàn)在如果我把方程右邊項移到左邊,最終就得到:
∣∣f(A)?f(P)∣∣2≤∣∣f(A)?f(N)∣∣2||f(A)-f(P)||^2\leq||f(A)-f(N)||^2∣∣f(A)?f(P)∣∣2≤∣∣f(A)?f(N)∣∣2
現(xiàn)在我要對這個表達(dá)式做一些小的改變,有一種情況滿足這個表達(dá)式,但是沒有用處,就是把所有的東西都學(xué)成0,如果 fff 總是輸出0,即0-0≤0,這就是0減去0還等于0,如果所有圖像的 fff 都是一個零向量,那么總能滿足這個方程。所以為了確保網(wǎng)絡(luò)對于所有的編碼不會總是輸出0,也為了確保它不會把所有的編碼都設(shè)成互相相等的。另一種方法能讓網(wǎng)絡(luò)得到這種沒用的輸出,就是如果每個圖片的編碼和其他圖片一樣,這種情況,你還是得到0-0。
為了阻止網(wǎng)絡(luò)出現(xiàn)這種情況,我們需要修改這個目標(biāo),也就是,這個不能是剛好小于等于0,應(yīng)該是比0還要小,所以這個應(yīng)該小于一個 ?α-\alpha?α 值(即 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2≤?α||f(A)-f(P)||^2-||f(A)-f(N)||^2\leq-\alpha∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2≤?α ),這里的 α\alphaα 是另一個超參數(shù),這個就可以阻止網(wǎng)絡(luò)輸出無用的結(jié)果。按照慣例,我們習(xí)慣寫 +α+\alpha+α (即 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha\leq0∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0 ),而不是把 ?α-\alpha?α 寫在后面,它也叫做間隔(margin),這個術(shù)語你會很熟悉,如果你看過關(guān)于支持向量機 (SVM)的文獻(xiàn),沒看過也不用擔(dān)心。我們可以把上面這個方程( ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2||f(A)-f(P)||^2-||f(A)-f(N)||^2∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2 )也修改一下,加上這個間隔參數(shù)。
舉個例子,假如間隔設(shè)置成0.2,如果在這個例子中, d(A,P)=0.5d(A,P)=0.5d(A,P)=0.5 ,如果 Anchor和 Negative圖片的 ddd ,即 d(A,N)d(A,N)d(A,N) 只大一點,比如說0.51,條件就不能滿足。雖然0.51也是大于0.5的,但還是不夠好,我們想要 d(A,N)d(A,N)d(A,N) 比 d(A,P)d(A,P)d(A,P) 大很多,你會想讓這個值( d(A,N)d(A,N)d(A,N) )至少是0.7或者更高,或者為了使這個間隔,或者間距至少達(dá)到0.2,你可以把這項調(diào)大或者這個調(diào)小,這樣這個間隔 α\alphaα ,超參數(shù) α\alphaα 至少是0.2,在 d(A,P)d(A,P)d(A,P) 和 d(A,N)d(A,N)d(A,N) 之間至少相差0.2,這就是間隔參數(shù) α\alphaα 的作用。它拉大了Anchor和Positive 圖片對和Anchor與Negative 圖片對之間的差距。取下面的這個方框圈起來的方程式,在下個幻燈片里,我們會更公式化表示,然后定義三元組損失函數(shù)。
三元組損失函數(shù)的定義基于三張圖片,假如三張圖片 A、P、NA、P、NA、P、N ,即Anchor樣本、Positive樣本和Negative樣本,其中Positive圖片和Anchor圖片是同一個人,但是Negative圖片和Anchor不是同一個人。
接下來我們定義損失函數(shù),這個例子的損失函數(shù),它的定義基于三元圖片組,我先從前一張幻燈片復(fù)制過來一些式子,就是 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha\leq0∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0 。所以為了定義這個損失函數(shù),我們?nèi)∵@個和0的最大值:
L(A,P,N)=max(∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α,0)L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha,\ 0)L(A,P,N)=max(∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α,?0)
這個 maxmaxmax 函數(shù)的作用就是,只要這個 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha\leq0∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0 ,那么損失函數(shù)就是0。只要你能使畫綠色下劃線部分小于等于0,只要你能達(dá)到這個目標(biāo),那么這個例子的損失就是0。
另一方面如果這個 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha\leq0∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α≤0 ,然后你取它們的最大值,最終你會得到綠色下劃線部分(即 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α )是最大值,這樣你會得到一個正的損失值。通過最小化這個損失函數(shù)達(dá)到的效果就是使這部分 ∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha∣∣f(A)?f(P)∣∣2?∣∣f(A)?f(N)∣∣2+α 成為0,或者小于等于0。只要這個損失函數(shù)小于等于0,網(wǎng)絡(luò)不會關(guān)心它負(fù)值有多大。
這是一個三元組定義的損失,整個網(wǎng)絡(luò)的代價函數(shù)應(yīng)該是訓(xùn)練集中這些單個三元組損失的總和。假如你有一個10000個圖片的訓(xùn)練集,里面是1000個不同的人的照片,你要做的就是取這10000個圖片,然后生成這樣的三元組,然后訓(xùn)練你的學(xué)習(xí)算法,對這種代價函數(shù)用梯度下降,這個代價函數(shù)就是定義在你數(shù)據(jù)集里的這樣的三元組圖片上。
注意,為了定義三元組的數(shù)據(jù)集你需要成對的 AAA 和 PPP ,即同一個人的成對的圖片,為了訓(xùn)練你的系統(tǒng)你確實需要一個數(shù)據(jù)集,里面有同一個人的多個照片。這是為什么在這個例子中,我說假設(shè)你有1000個不同的人的10000張照片,也許是這1000個人平均每個人10張照片,組成了你整個數(shù)據(jù)集。如果你只有每個人一張照片,那么根本沒法訓(xùn)練這個系統(tǒng)。當(dāng)然,訓(xùn)練完這個系統(tǒng)之后,你可以應(yīng)用到你的一次學(xué)習(xí)問題上,對于你的人臉識別系統(tǒng),可能你只有想要識別的某個人的一張照片。但對于訓(xùn)練集,你需要確保有同一個人的多個圖片,至少是你訓(xùn)練集里的一部分人,這樣就有成對的Anchor和Positive圖片了。
現(xiàn)在我們來看,你如何選擇這些三元組來形成訓(xùn)練集。一個問題是如果你從訓(xùn)練集中,隨機地選擇 A、PA、PA、P 和 NNN ,遵守 AAA 和 PPP 是同一個人,而 AAA 和 NNN 是不同的人這一原則。有個問題就是,如果隨機的選擇它們,那么這個約束條件( d(A,P)+α≤d(A,N)d(A,P)+\alpha\leq d(A,N)d(A,P)+α≤d(A,N) )很容易達(dá)到,因為隨機選擇的圖片, AAA 和 NNN 比 AAA 和 PPP 差別很大的概率很大。我希望你還記得這個符號 d(A,P)d(A,P)d(A,P) 就是前幾個幻燈片里寫的 ∣∣f(A)?f(P)∣∣2||f(A)-f(P)||^2∣∣f(A)?f(P)∣∣2 , d(A,N)d(A,N)d(A,N) 就是 ∣∣f(A)?f(N)∣∣2||f(A)-f(N)||^2∣∣f(A)?f(N)∣∣2 , d(A,P)+α≤d(A,N)d(A,P)+\alpha\leq d(A,N)d(A,P)+α≤d(A,N) 即 ∣∣f(A)?f(P)∣∣2+α≤∣∣f(A)?f(N)∣∣2||f(A)-f(P)||^2+\alpha\leq||f(A)-f(N)||^2∣∣f(A)?f(P)∣∣2+α≤∣∣f(A)?f(N)∣∣2 。但是如果 AAA 和 NNN 是隨機選擇的不同的人,有很大的可能性 ∣∣f(A)?f(N)∣∣2||f(A)-f(N)||^2∣∣f(A)?f(N)∣∣2 會比左邊這項 ∣∣f(A)?f(P)∣∣2||f(A)-f(P)||^2∣∣f(A)?f(P)∣∣2 大,而且差距遠(yuǎn)大于 α\alphaα ,這樣網(wǎng)絡(luò)并不能從中學(xué)到什么。
所以為了構(gòu)建一個數(shù)據(jù)集,你要做的就是盡可能選擇難訓(xùn)練的三元組 A、PA、PA、P 和 NNN 。具體而言,你想要所有的三元組都滿足這個條件( d(A,P)+α≤d(A,N)d(A,P)+\alpha\leq d(A,N)d(A,P)+α≤d(A,N) ),難訓(xùn)練的三元組就是,你的 A、PA、PA、P 和 NNN 的選擇使得 d(A,P)d(A,P)d(A,P) 很接近 d(A,N)d(A,N)d(A,N) ,即 d(A,P)≈d(A,N)d(A,P)\approx d(A,N)d(A,P)≈d(A,N) ,這樣你的學(xué)習(xí)算法會竭盡全力使右邊這個式子變大( d(A,N)d(A,N)d(A,N) ),或者使左邊這個式子( d(A,P)d(A,P)d(A,P) )變小,這樣左右兩邊至少有一個 α\alphaα 的間隔。并且選擇這樣的三元組還可以增加你的學(xué)習(xí)算法的計算效率,如果隨機的選擇這些三元組,其中有太多會很簡單,梯度算法不會有什么效果,因為網(wǎng)絡(luò)總是很輕松就能得到正確的結(jié)果,只有選擇難的三元組梯度下降法才能發(fā)揮作用,使得這兩邊離得盡可能遠(yuǎn)。
如果你對此感興趣的話,這篇論文中有更多細(xì)節(jié),作者是Florian Schroff, Dmitry Kalenichenko, James Philbin,他們建立了這個叫做FaceNet的系統(tǒng),我視頻里許多的觀點都是來自于他們的工作。
? Florian Schroff, Dmitry Kalenichenko, James Philbin (2015). FaceNet: A Unified Embedding forFace Recognition and Clustering
順便說一下,這有一個有趣的事實,關(guān)于在深度學(xué)習(xí)領(lǐng)域,算法是如何命名的。如果你研究一個特定的領(lǐng)域,假如說“某某”領(lǐng)域,通常會將系統(tǒng)命名為“某某”網(wǎng)絡(luò)或者深度“某某”,我們一直討論人臉識別,所以這篇論文叫做FaceNet(人臉網(wǎng)絡(luò)),上個視頻里你看到過DeepFace(深度人臉)。“某某”網(wǎng)絡(luò)或者深度“某某”,是深度學(xué)習(xí)領(lǐng)域流行的命名算法的方式,你可以看一下這篇論文,如果你想要了解更多的關(guān)于通過選擇最有用的三元組訓(xùn)練來加速算法的細(xì)節(jié),這是一個很棒的論文。
總結(jié)一下,訓(xùn)練這個三元組損失你需要取你的訓(xùn)練集,然后把它做成很多三元組,這就是一個三元組(編號1),有一個Anchor圖片和Positive圖片,這兩個(Anchor和Positive)是同一個人,還有一張另一個人的Negative圖片。這是另一組(編號2),其中Anchor和Positive圖片是同一個人,但是Anchor和Negative不是同一個人,等等。
定義了這些包括 A、PA、PA、P 和 NNN 圖片的數(shù)據(jù)集之后,你還需要做的就是用梯度下降最小化我們之前定義的代價函數(shù) JJJ ,這樣做的效果就是反向傳播到網(wǎng)絡(luò)中的所有參數(shù)來學(xué)習(xí)到一種編碼,使得如果兩個圖片是同一個人,那么它們的 ddd 就會很小,如果兩個圖片不是同一個人,它們的 ddd 就會很大。
這就是三元組損失,并且如何用它來訓(xùn)練網(wǎng)絡(luò)輸出一個好的編碼用于人臉識別。現(xiàn)在的人臉識別系統(tǒng),尤其是大規(guī)模的商業(yè)人臉識別系統(tǒng)都是在很大的數(shù)據(jù)集上訓(xùn)練,超過百萬圖片的數(shù)據(jù)集并不罕見,一些公司用千萬級的圖片,還有一些用上億的圖片來訓(xùn)練這些系統(tǒng)。這些是很大的數(shù)據(jù)集,即使按照現(xiàn)在的標(biāo)準(zhǔn),這些數(shù)據(jù)集并不容易獲得。幸運的是,一些公司已經(jīng)訓(xùn)練了這些大型的網(wǎng)絡(luò)并且上傳了模型參數(shù)。所以相比于從頭訓(xùn)練這些網(wǎng)絡(luò),在這一領(lǐng)域,由于這些數(shù)據(jù)集太大,這一領(lǐng)域的一個實用操作就是下載別人的預(yù)訓(xùn)練模型,而不是一切都要從頭開始。但是即使你下載了別人的預(yù)訓(xùn)練模型,我認(rèn)為了解怎么訓(xùn)練這些算法也是有用的,以防針對一些應(yīng)用你需要從頭實現(xiàn)這些想法。
這就是三元組損失,下個視頻中,我會給你展示Siamese網(wǎng)絡(luò)的一些其他變體,以及如何訓(xùn)練這些網(wǎng)絡(luò),讓我們進(jìn)入下個視頻吧。
課程板書
| 4.3 Siamese 網(wǎng)絡(luò) | 回到目錄 | 4.5 面部驗證與二分類 |
總結(jié)
以上是生活随笔為你收集整理的4.4 Triplet 损失-深度学习第四课《卷积神经网络》-Stanford吴恩达教授的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.3 Siamese 网络-深度学习第
- 下一篇: 4.5 人脸验证与二分类-深度学习第四课