One-shot Learning 的損失函數以及背後的幾何直觀

$$ 做者:祕塔科技圖像研究員 Yanbing Dong $$算法

在獲取知識和識別新事物方面,人類有很強的能力,當人們被給予新的概念時,他們能夠很快地理解,而且在之後遇到這個概念或者它的變種的時候能夠很快的識別出來。儘管深度學習算法在不少方面都取得了很好的效果,可是當咱們可以獲取的數據量不多時,不少深度學習算法的預測能力就會直線降低。但深度學習其實並不必定須要依賴於海量的樣本,極端狀況下,咱們甚至能夠對每類只提供一個樣本。這類問題被稱之爲 One-shot Learning。在這樣的極端狀況下,如何準確進行分類?數據庫

Siamese Neural Networks for One-shot Image Recognition 中,做者經過一個 Siamese Network 去學習圖像對之間的類似性,從而將 One-shot 的分類問題轉化爲圖像識別中標準的驗證問題。而在人臉驗證的系統中,咱們也只是給了系統某我的的一張人臉照片,而後去判斷相機拍攝的人臉和系統中保存的是否是同一我的,是一個典型的 One-shot Learning 問題。網絡

那麼要怎麼作人臉驗證呢?對於給定的兩張人臉圖片,,咱們能夠經過神經網絡計算獲得特徵$f_1$和$f_2$,那麼app

  • 若是 $d(f_1, f_2)$ 很小,那麼 $x_1$,$x_2$ 屬於同一我的
  • 若是 $d(f_1, f_2)$ 很大,那麼 $x_1$,$x_2$ 屬於不一樣的兩我的

其中 $d$ 表示距離度量,經常使用的有歐式距離和餘弦距離。那麼在理想的狀況下,咱們但願:同一我的的人臉特徵之間距離的最大值比不一樣人的人臉特徵之間距離的最小值還要小,咱們能夠從 n維錐體(n-dimensional Cone)的角度去理解這個問題。函數

clipboard.png

接下來咱們介紹幾種用於 One-shot Learning 的損失函數,以人臉爲例。固然這樣的方法能夠用於其餘非人臉識別的任務中。學習

Softmax Loss: 在 Deepface: Closing the gap to human-level performance in face verification 中做者把特徵學習當成一個類別超多的分類問題去解決,經過 Softmax 去在人臉數據庫上訓練一個分類器,雖然 Softmax 學習到的特徵是可分離的,可是同一我的的不一樣人臉之間的變化很大,基於歐式距離或者餘弦距離的判斷會致使最後的驗證出錯。spa

clipboard.png
clipboard.png

因此,線性可分僅僅是 One-shot Learning 的必要非充分條件。爲了解決這個問題,研究者提出了新的損失函數。code

Angular Softmax Loss: 爲了使同一我的的人臉之間的特徵更加緊湊,同時使不一樣人臉之間的特徵儘量分離,在 SphereFace: Deep Hypersphere Embedding for Face Recognition 中做者基於球面流形的分析,在 Softmax 的基礎上,在不一樣人的特徵的角度之間增長了一個 Margin,使得不一樣人的特徵有着不一樣的分類面。在這個的基礎上,Additive Margin Softmax for Face Verification Arcface: Additive angular margin loss for deep face recognition 又提出了添加 Angular Margin 的不一樣形式,減少了訓練的難度。orm

Triplet Loss: 谷歌的研究者 2015 在 Facenet: A unified embedding for face recognition and clustering 中提出 Triplet Loss,但願在學習到的特徵空間裏: i) 同一我的的兩張人臉比較接近 ii) 不一樣人的兩張人臉相距較遠。爲了這個目的,經過圖像的三元組 (Triplet) 去定義損失函數,這個三元組由:圖片

  • A:某我的的一張人臉圖片;
  • P:與 A 屬於同一我的的一張人臉圖片;
  • N:與 A 不一樣的人的一張人臉圖片。

在距離度量 $d$ 爲歐式距離的狀況下,定義損失函數爲:

$$ \mathcal{L} = max(d^2(f_a, f_p) - d^2(f_a, f_n) + \alpha, 0) $$

其中 $f_a$,$f_p$ 和 $f_n$爲三張圖片對應的特徵,$\alpha$ 爲調節距離 Margin 的一個參數。由損失函數能夠看出,理想狀況下,咱們但願正樣本與負樣本之間的距離至少爲 $\alpha$.

雖然這個損失函數看上去很直觀,但在實際的工程應用中其實有額外的注意事項。譬如,在 a 足夠小的時候,咱們會發現,若是咱們經過神經網絡所生成的全部圖片特徵都收斂到一個點時,損失接近於零,即:

$$ f_a=f_p=f_n\to\mathcal{L}\approx0 $$

爲了不上述狀況,須要對網絡的輸出進行額外的正則化處理。

從上面的描述中能夠看出,因爲引入了 Margin,使得不一樣人的人臉特徵之間更加具備區分性。那麼在訓練 Triplet Loss 的過程當中,怎樣選擇 Triplet 呢?給定某我的的一張人臉圖片,正樣本能夠從這我的的其餘人臉圖片中隨機挑選一張,因爲其餘人的任何圖片均可以做爲負樣本。而不一樣的選擇策略所帶來的訓練難度與最終收斂的模型泛化能力有所差別。

Facenet 的論文中討論了幾種選擇負樣本的方法:

  1. 選擇損失最大的 N;
  2. 選擇 $d(f_a, f_p) < d(f_a, f_n)$ 並且 $\mathcal{L} > 0$ 的 triplet,這時候選擇的 triplet 因爲知足 $d(f_a, f_p) < d(f_a, f_n)$ 的條件,難度並無那麼大,而又由於 $\mathcal{L} > 0$,計算梯度仍然能對參數進行改進。

這種對負樣本的選擇方法的思想能夠類比課程學習 (Curriculum Learning) 。咱們的訓練先從比較容易的樣本開始,逐漸增長樣本的難度,使模型收斂到泛化能力更好的解。咱們使用這種方式在 MNIST 上作了一個小的演示實驗。從圖中能夠看出,各個數字的特徵在球面上不只是分開的,並且任意兩個類之間都有很大的間隔,證實 Triplet Loss 的訓練起到了分離特徵的做用。

除了選擇適合的損失函數之外,生成模型特徵的網絡結構選擇,以及預訓練的數據,都會對模型最終泛化能力產生很大影響,下次與你們分享!

相關文章
相關標籤/搜索