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