1. 程式人生 > >CNN進展與技巧(下)

CNN進展與技巧(下)

上期勘誤    PPT11, 隨機Pooling中藍色矩形中概率值相加不為1,修正結果如下:    PPT16, 歐式損失和對比損失函式係數應為1/2N,原文中誤為-1/N,修正結果如下:    本文作者劉昕特此感謝上海科技大學湯旭同學騰訊優圖汪鋮傑研究員指出上期推送中的錯誤。作者對此表示深刻歉意,並承諾加強內容稽核,同時歡迎深度學習大講堂的廣大讀者指正,共同為優質的內容生產而努力。正文
1. Caffe實戰技巧    Caffe是目前作為活躍的深度學習開源平臺之一。Caffe中的核心概念包括:caffe.proto、Solver、Net、Layer和Blob。其中Solver負責網路引數的更新,每個Solver中包含一個訓練網路和一個測試網路,兩個網路共享一套引數。每個Net由若干個Layer構成,每個Layer用Blob實際儲存引數及梯度資訊。每個Blob邏輯上是一個四維矩陣,但是為了提高儲存效率,Blob實際上是一個一維陣列並通過Caffe框架中的SyncedMemory自動管理CPU和GPU之間的資料同步。
    在PyCaffe出現之前,網路結構檔案(一般字尾為prototxt)依靠手寫,這樣費時費力且容易出錯。PyCaffe的出現使得我們可以用Python程式碼定義網路結構。上圖中所示為用PyCaffe定義LeNet的定義例子,入口引數來自於caffe.proto中對應層的引數。    進一步的,我們給出了定義CaffeNet和殘差網路Residual Net的程式碼片段。    推薦一個網路結構視覺化的線上工具netscope,通過這個工具可以方便的檢查定義好的網路結構拓撲。    除了卷積層、全連線層之外,Caffe中還有一些特殊的功能層,例如隱式包含的Split層,這對分叉網路的命運影響很大,Split層使得我們可以自由的定義分叉網路而不需要自己管理梯度回傳問題。特別提醒注意Eltwise層,這是深度殘差網路中Addition操作的推薦實現方式。
    Caffe當中目前支援單機多卡的分散式訓練,但是基於同步模式,每一輪迭代都要進行梯度的交換。因此在多GPU伺服器上就可能存在GPU之間的通訊瓶頸,如果GPU之間不支援P2P方式連線而採用socket連線,會極大影響GPU並行的加速比。Linux下可以採用nvidia-smi topo –m命令檢視,如果兩塊顯示卡之間的橋接方式為SOC也就是socket連線,那麼不推薦使用這兩塊顯示卡進行分散式訓練。注意顯示卡的橋接方式由主機板硬體決定,無法通過軟體修改設定!2. 小資料深度學習實戰    本節將以ICCV2015社會年齡估計競賽為例介紹小資料條件下的深度學習技術。    競賽全稱是ICCV2015 Apparent Age Estimation Challenge,一共4699張影象,分為train, validation和test三個子集。開發階段:train訓練,在validation上彙報效能。測試階段:train + validation訓練,在test上彙報效能。值得一提的是,這些影象人物的年齡標籤並非其真實年齡,而是所謂“社會年齡”,表示從人主觀上認定的年齡。比如二十歲的人六十歲的臉,其標籤是“60”。【請不要將這個例子在身邊對號入座】收集資料時,主辦方請了10名志願者標註年齡並計算了均值和方差。
    由於訓練資料只有2K,這是一個典型的小資料條件下的深度學習問題。    未能免俗,網路結構稱之為AgeNet。AgeNet採用大規模的深度卷積網路學習多層次的年齡特徵表示,基於多維的高斯分佈編碼學習年齡分類器,基於一維實值特徵和歐式損失學習年齡迴歸器。    下面介紹大規模深度網路的結構。上圖與Google Net非常類似,只不過將兩個輔助損失層去掉,加入Batch Normalization加速收斂。是否保留輔助損失層是一個很有爭議的問題。輔助層會在網路較深時幫助網路收斂(避免梯度消失),實踐中我們發現在加入BN層之後,去掉輔助層反而會帶來效能的微小增益(一點兒微小的發現)。AgeNet Deep Age Regressor:     1維實值編碼 + Euclidean Loss     歸一化年齡到[0,1],採用歐式Loss學習年齡迴歸器。注意在歐氏損失之前進行了Sigmoid歸一(LeCun 1989 CNN開山之作的彩蛋之一)。AgeNet Deep Age Classifier:    分佈標記編碼 + Cross-Entropy Loss     採用標記分佈學習(LDL Geng’ TPAMI2013)編碼年齡,學習年齡分類器。即既有當前年齡的權值,又有相鄰年齡的權值。    Fine-tune是目前deep 領域解決小資料問題一個不可或缺的技術。因為target domain資料很少,而source domain資料很多。    我們希望pre-train的過程中體現general to specific的語義遷移。為了理解這一點,請看上圖。最外圈是隨機的影象特徵,往裡是自然場景影象,再往裡是人臉影象,最後體現限定條件的人臉影象,包括特定的pose,特定表情,特定年齡特徵,等等。    具體說來,我們在AgeNet的訓練過程中,從general的模型慢慢過渡到specific的模型。AgeNet訓練中依次訓練人臉分類網路、真實年齡估計網路和社會年齡估計網路。我們認為真實年齡包含了跟社會年齡的變化規律。    如果把其中的一個或幾個fine-tune拿掉呢?比較有趣的結果是真實年齡網路的fine-tune的效果沒有人臉分類網路好,這提示大家可以考慮比較general的網路去做初始化。    最終我們在決賽中取得了亞軍。我們方法的優勢: 1)與第一名20個VGG網路相比,我們只使用了8個GoogLeNet,而效能只相差0.6%。2)完全end-to-end學習,我們沒有使用單獨的統計學習方法進行年齡估計器學習。    一些good case和bad case的例子。粗略的觀察結論:AgeNet對姿態、光照、種族、遮擋和色彩魯棒性好,但是對模糊、誤配準和老年人效能有所下降。3. CNN前沿討論    方向1: 在Graph上做CNN,突破2D影象資料卷積的限制。    方向2:網路結構學習,根據樣本複雜度自適應調整網路結構。    方向3: 訓練過程中的隨機深度約減。    方向4. 網路結構簡化。