數據不匹配與卷積“平移不變”

1. 數據不匹配問題

吳恩達深度學習課程中有幾個小節談到了訓練數據集和測試數據集分佈不匹配的問題,這種不匹配可能經常發生,因爲對於特定問題領域我們可能無法獲得充足的數據,而在深度學習中我們又總是儘量去收集更多的數據來訓練網絡,即使這些數據與目標分佈不同,由此導致的結果是訓練出的模型在實際應用中也許不能很好的工作。

吳恩達的課裏講到,這種問題沒有什麼系統性的解決辦法。一般就是通過人工分析來找出數據不匹配的地方,然後想辦法收集或者生成能彌補這種差距的數據。

2. 人臉性別分類器面對的數據不匹配挑戰

最近爲了做人臉屬性轉換,訓練了一個人臉性別識別的分類器,就碰到了這種數據不匹配的問題。

因爲人臉轉換使用CelebA作爲數據集,所以分類器當然也在CelebA上進行訓練,使用的是剪裁對齊後的圖片。一開始只使用隨機左右翻轉的數據增強,訓練以及降低方差都沒什麼難度。但當我使用CelebA之外的人臉圖片測試時則表現很差,比如下面圖片中前5張,男女的判別全是反的:
在這裏插入圖片描述
我首先注意到小李和凱特的人臉有一定的傾斜,把圖片旋正後,認出小李是男人了,可凱特還是漢子。實話說凱特的照片除了膚色有點紅以外,我一開始實在看不出有什麼特別之處。下面是幾張CelebA的圖片,看上去和凱特的圖差不多。

在這裏插入圖片描述
當然,蒙娜麗莎確實和CelebA的不同,第一張圖片的飽和度和色調可能和CelebA的也有點區別,並且是一個長相普通的中國女性,和CelebA不太一樣,但我確實想象不出范冰冰和凱特有什麼問題,尤其是凱特!於是我找了另一張凱特的圖片就是上面圖片中的最後一張,還好這張圖分類器認出是女人了。

在看不出明顯問題的情況下,我只能猜測某些方面存在着人類感知不到的區別。於是爲了解決數據分佈不匹配的問題,我一方面在模型中加入了正則化,參見gender_classifier.py,另一方面增加了數據增強,加入了隨機旋轉,剪裁,亮度,對比度,色度,飽和度的隨機變化等等,參見dataset.py的augmentate函數(不過github上的這個程序版本並沒有使用這些數據增強,後面會提到原因),希望分類器對未知的數據分佈能有一定的泛化能力。

通過上述手段,分類器在CelebA開發集上的錯誤率進一步降低了,對CelebA之外的圖片表現也有所提高,但凱特,蒙娜麗莎以及第一張女性照片仍舊識別不出來。

必須要說清楚的是,這裏的情況和吳恩達深度學習課程中談到的並不一樣:

  • 一是,這不是一個商業應用,沒有明確的目標數據集,因而開發集和測試集也都是CelebA的一部分,只是希望訓練後得到的系統在廣泛隨機的圖片上也表現良好。因爲CelebA的數據均從Internet上收集得到,從人類的角度看,樣本非常多樣化,所以一開始我以爲這是一個合理的期望。
  • 二是,收集和處理數據的成本對個人開發者而言非常高,所以這裏只是隨機從互聯網上手工收集一點圖片進行評估測試。由於實際上這個項目沒有明確的目標和範圍,所以就把這些個位數量的圖片作爲目標。

3. 遷移學習

上述數據不匹配的問題始終得不到解決,最後,使用了遷移學習。facenet_gender_classifier.py在Facenet網絡的末段輸出後面接兩個Dense,在CelebA上只使用隨機左右翻轉數據增強,訓練10輪,不但在CelebA上可以取得接近百分之百的準確率,在測試圖片上的表現也非常完美。

使用Facenet做遷移學習是一個非常合理的選擇,但這裏有一個和普通遷移學習完全不同的地方是:普通的遷移學習是使用已訓練的模型和已習得的特徵提取能力在一個新的數據集上進行擬合,目標是擬合這個新數據集的分佈;而在這個例子中,使用已訓練模型的輸出特徵作爲輸入,訓練一個小網絡擬合一個數據集,最終這個小網絡不但擬合了這個數據集,而且在不同分佈的數據上也能夠很好的擬合!這隻能說明一點:那就是不同分佈的數據輸入Facenet,到最後輸出時,那些和人臉特徵無關的分佈特性已經不存在了!對於那個小網絡來說,無論輸入數據分佈是否相同,Facenet輸出給它的都是同一個分佈,所以無論什麼照片它都能很好的識別。

爲什麼Facenet能處理不同分佈的數據呢?我曾有不少猜想:比如數據,網絡,任務。。。也進行了一些驗證,不過在我找到數據哪裏不匹配後,真相水落石出了。

4a. 數據不匹配的真相

前面說過,我使用的是剪裁對齊的圖片,當我快速的一張一張過這些圖片時,發現CelebA的人臉照片裏,雙眼都在同一個位置,甚至嘴的位置也大致相同,不管人臉的姿態和大小怎麼變化。稍微想一下就明白了,CelebA數據集是自動化處理得到的,所以一定是使用人臉檢測軟件識別出人臉,然後校正到圖像中央(所以即使左右翻轉雙眼和嘴位置也不變)。而我手工下載的照片則沒有注意這一點!

把我自己收集的照片也做相同的位置校正後,之前訓練的網絡認出凱特和蒙娜麗莎是女人了!第一張人臉確實比較難識別,所以分類器仍舊認成是男人,但也更接近正確了。

那麼Facenet爲什麼能處理位置分佈的不同也就明朗了,閱讀它的文檔和代碼後發現:它使用CASIA數據集訓練時,用MTCNN做人臉檢測對齊,然後做隨機剪裁,這就相當於把位置變化了;而使用VGGFace2數據集時除了翻轉不需要做數據增強,因爲VGGFace2數據集中的圖片是這樣的:
在這裏插入圖片描述
所以歸根結底,還在於訓練數據。

等等,卷積的平移不變性(translation invariant)呢?

到這可能就有讀者有疑問了,不是說好的卷積具有平移不變性嗎?!爲啥你這眼睛的位置一變,人臉就識別不出來了呢?!

爲此,我重新查閱了《深度學習》第九章 卷積網絡 9.2 動機,這一節寫道:

對於卷積,參數共享的特殊形式使得神經網絡層具有對平移等變(equivariance)的性質。如果一個函數滿足輸入改變,輸出也以同樣的方式改變這一性質,我們就說它是等變(equivariant)的。

就是說輸入數據的位置變了,輸出數值不變但是輸出相應的也會做相同的位移。

9.3 池化,寫道:

當輸入作出少量平移時,池化能夠幫助輸入的表示近似不變(invariant)。對於平移的不變性是指當我們對輸入進行少量平移時,經過池化函數後的大多數輸出並不會發生改變。

“等變”!“少量”!“近似”!“大多數”!可見教科書說的就是嚴謹!不知道誰那麼缺德腦補成“平移不變性”,把我都帶歪了。。。。

澄清卷積“平移不變性”的誤解,已經有人做研究了:《Why do deep convolutional networks generalize so poorly to small image transformations?》《證僞:CNN中的圖片平移不變性》《既然cnn對圖像具有平移不變性,那麼利用 圖像平移(shift)進行數據增強來訓練cnn會有效果嗎?》的首位回答對這個問題也都說得非常清楚,他倆都提到了前述論文。不過即使這樣,在他們文章的評論裏和別人的回答裏還有不少不同聲音,比如有人猜測全卷積網絡/全局池化就能平移不變了,讀者們不要被誤導。

作爲結論,大致上是這樣:卷積和池化有能力允許網絡具有某些不變性,但需要用變化的數據來訓練網絡,使之學到期望的不變性。

4b. 數據不匹配的真相

正是由於對CNN的“平移不變”理解不透,導致我之前分析數據不匹配時一直存在盲區,沒往人臉位置那方面考慮。但是我一開始也使用了隨機剪裁的數據增強呀,爲什麼不起作用呢?

仔細看一下代碼會發現,每個樣本只有十分之一的概率會隨機剪裁,因爲當初做數據增強時並不知道哪裏不匹配,就只是打散彈槍式的做各種增強,樣本中十分之一的隨機剪裁不足以影響網絡最終的參數。輸入網絡的圖片都是從178x218剪裁到160x160,凱特那張照片這麼處理後眼睛偏離中心確實就很多了。。。Facenet訓練時是每個樣本都做隨機剪裁的,所以它能夠應付這種位置變化。

因此,在性別分類器這個例子裏,每張圖片都做隨機剪裁就可以解決數據不匹配的問題。不過對於這個應用,端到端的解決方案並不是必需的,人臉檢測+人臉識別組成pipeline是這類應用的普遍解決方式,Facenet之所以要訓練變化的位置可能也只是爲了提高模型的性能和魯棒性。

另外,
Understanding Black-box Predictions via Influence Functions提到使用影響函數來幫助解決數據不匹配問題,但兩年過去也沒聽到進一步的成果,所以我猜測可能在實際中並沒有取得太大的成效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章