人臉識別之數據和網路結構

更新了一部分對網路結構的嘗試

針對於移動端的神經網路結構,我覺得要關注的有兩個方面,一個是設計表達能力較強的網路,另一個是模型壓縮,關於模型壓縮的內容可以參考我之前的文章,這裡我想說的是網路結構。目前CNN主要分為卷積層和全連接層,而卷積層的計算量又很大,所以我們考慮的尋找表達能力強並且計算量小的卷積,學術界和工業界已經在這方面做了很多探索比如group convolution, depthwise separable convolution, point-wise convolution等等,具體可以參見網上資料或者是mobilenet和shufflenet,我覺得手機端的網路由於內存等限制可以選擇10-20層的網路,並且不需要考慮ResNet之類的結構,如果能根據你的任務進一步修改是更好的。此外移動端還需要的是一個有效的前向傳播框架諸如騰訊的NCNN和百度的MDL,我們也在其上做了進一步的優化,目前測試結果比NCNN快五倍左右。

----------------------------------------分割線------------------------------------------------------------------------

最近做了點人臉方面的工作,把自己的一些感受記錄在這裡和大家分享下。

我覺得人臉識別關鍵是為了得到泛化能力強的feature,而目前我比較關注的是移動端的人臉識別,所以我認為人臉識別需要關注的點主要包括三個部分:數據集,網路結構,損失函數。下面我分開來說說

對於數據集來說我們一般認為是樣本越多越好,其實這句話對也不對,因為我們收集的數據集可能存在雜訊(有的類別中的樣本明顯不屬於這個類)和分布不平衡(有的類別樣本數很多,有的類別樣本數很少)等情況,所以我們要做一些預處理,首先對於雜訊而言我們需要濾掉錯誤的樣本,我們可以選取用外部數據或者是該數據集中的部分數據來計算樣本之間的樣本相似性來濾掉錯誤的樣本,需要注意的是要求樣本是比較乾淨的。這裡我們還可以保留一些預測錯誤但是其預測值比較高的樣本,原因我會再接下來說明。還有一定程度的髒的數據對於訓練是有益的,我覺得可以看做是為了提高泛化能力吧。

其次對於分布不平衡來說,常見的方法是降採樣和過採樣以及給不同的類別加權重等,但是上述方法有一定的局限性,降採樣和過採樣會導致重複計算和加大過擬合的可能性,而加權重的話需要不斷的人工調整,費時費力。我採用的方法是加入一定比例的的long tail 數據,這樣對整個訓練來說是有益,但是這個比例也需要人工去實驗,[1]中針對分布不平衡問題在損失函數做了改進,認為long tail data中類內距離最遠的樣本為hard sample,通過約束hard sample來處理分布不平衡的問題。

我認為數據平衡重要,但我們更應該去關注數據中的hard sample,所以這裡不同類別加權中也需要仔細考慮了。我們用softmax訓一個人臉模型,發現前期訓練收斂很快,但是到後期的時候大量樣本的準確率都在0.99以上,這時回傳的梯度就很小了,無法再指揮網路訓練了,這時候我們就需要更為hard的樣本來提高模型的泛化能力。加入hard sample之後訓練的精度可能不會上升,但是泛化的能力會增強,所以訓練的時候不能只關注損失函數下降了多少。此外trplet loss, contrastive loss等損失函數也包含了hard sample的含義,我會在之後的文章中解釋。

1.[1611.08976] Range Loss for Deep Face Recognition with Long-tail

未完待續,敬請期待,如有錯誤,歡迎指出。


推薦閱讀:

張溪夢:如何打造高速增長團隊,實現快速增長
「數據湖」中數據管理的4種方式
盤點 | 2017 最「熱」門的十大數據技術
Data Structures公開課聽課筆記--序
用數據找知己:驀然回首 那人卻在三十五萬用戶中

TAG:深度学习DeepLearning | 人脸识别 | 数据 |