推薦 CVPR2018:Decoupled Networks
來自專欄深度與強化學習基礎341 人贊了文章
一篇優秀的論文,就是你看到就忍不住要分享下,這篇CVPR2018的論文就是這樣的一篇。為什麼這是一篇好的論文呢?因為它有一個好的問題,並且給出了一個靠譜的解決方案,甚至更加具有一般性。大量的實驗驗證了自己在實踐上也是非常有效的。甚至故事講得也非常的棒,並且演算法思路清晰驚艷。
如果我問你神經網路(這裡重點放在CNN上,對於其餘的網路模型也具有一般性)機制上存在哪些缺陷,並且相應的產出了哪些解決方案?你能夠想到多少呢?
過擬合,梯度消失或者是膨脹,訓練依靠大量的樣本,對網路初始化極其敏感以及協遷移等等。相信針對這些問題所提出的網路的改進方案大家也不陌生,很多的模塊已經成為現在DL的標配了。
那麼對於操作子(Operator)本身的改進的工作多不多呢? 顯然對於這種重新造輪子的事情大家還是不太有勇氣去嘗試的。而這篇文章的工作就是在重新定義操作子,自己造輪子。
要打操作子的主意,那麼首先得說說現在的卷積操作子有什麼問題吧。卷積操作其實就是一個內積的操作:
其本質上是一個:矩陣相乘計算 兩個矩陣相似度的操作(類似卷積濾波)。而本文的核心就是為了解耦(Decouple)這個操作。那麼這種操作到底是什麼內容的耦合呢? 簡單來講,類內差異(intra-class variation)和類間差異(inter-class difference)的耦合。也就是說當你通過卷積操作得到的結果很相似的時候,你並不能夠得到一個結論說這兩個很相似,反之亦不能。 因為你不能夠區別這種差異或者是相似度是類內差異造成的還是類間的差異造成的(而對於分類的問題來講,我們其實關心的就是 類間差異而已)。說起來有點抽象,我們具體來看一下這張圖:
這張圖是 CNN在手寫體識別任務上學到的特徵的2D可視化示意圖。 0~9每一個手寫體數字對應的特徵是圖中的一束;任意一束當中的不同位置表示的是同一類別的不同表徵,也就是類間差距(intra-class Variations);束與束之間形成的夾角表達的是兩個類別之間的差距(inter-class difference),也就是這裡所謂的語義差異。
如果不解耦會存在一個什麼樣的問題呢?就是說你只能得到一個最終的結果,但是對於兩個同樣的輸出,你不能分辨造成這個結果的原因是因為他們實際就是同一種類別,還是因為剛好 ab =cd。那麼具體怎麼解耦呢? 作者給出的解決方案真是精簡:
,直接將卷積操作解耦表示為 幅值 (Norm)和 角度(Angle)兩個部分,並且將這兩部分分別用兩個函數h(.) 和g(.)來表示,毫無疑問其中的
。因此關於角度的函數g(.)則度量著不同的類別之間的差異(inter-class difference),關於幅值的函數h(.)則度量著同一類別當中的差異(intra-class variations),同時其值的大小也就表示了這個類別的可信度。這種思路是不是非常的精妙啊!同時,傳統的卷積操作就變成了解耦網路的一個特例,即:為什麼角度可以來衡量類別之間的差異呢?作者是從傅里葉變換當中的得到的motivation: 對於傅里葉變換來說,兩個概念非常的重要,一個就是幅值,另一個就是相位。對於一張圖像的傅里葉變換,如果你使用幅值和隨機的相位重建這張圖像,得到的結果往往不能辨認;但是如果你使用相位和隨機的幅值卻能夠重建出能夠辨認的圖像。
到此為止,文章最核心的部分已經講完。接下來作者討論了各種關於這兩個函數的設計,包括有界的,無界的;加權的不加權的以及解耦網路的幾何解釋等等。那麼具體文章設計出來的h(.) 和g(.)函數表示為以下:
需要注意的是這裡討論的都是不加權的解耦操作子,也就是說所有的權重被認為是同等的重要:h(||ω||, ||x||)= h(||x||). 同時作者在實驗當中說明了,其實這樣的操作簡化了操作同時也保證了準度。
對於h(||ω||, ||x||),舉幾個重要的例子來說:
1 . SphereCov: 即 h(||ω||, ||x||) =α, 也就是說對於任何一個類別,其實我並不關心他們的類內差異,我只想要得到一個最終的類間差異,因此,我將這個最終決定權全部交給g(.)。所以你會發現所有的類別的特徵都會投影在一個球面(Sphere)上面。
2 . BallCov: 從名字來講我們就知道,特徵的投影會是一個實心的球(Ball),也就是說我考慮類內的差異,但是這個差異有一個上界那就是這個球的球面,而在球的內部,其重要性是和輸入相關的。即:
其中的 ρ就是Ball的半徑。
3 . TanhConv:也很簡單,就不過多的解釋了:
通過這三種操作子得到的特徵的可視化可以表示為:
注意 SphereCov更多是投影在球面的,而後面的兩個理論上可以看做是一個實心的。
那麼我們再來看一下g(.), g(.) 是一個關於θ的函數,大多數實際上是一個非線性的函數,也就是說其實就是一個激活函數,這裡作者稱之為角度激活函數(Angular activation)。 那麼理論上來講,這樣的操作子是不需要再有一個激活函數的。作者列出了幾種g(.) 的選擇,最簡單的就是這兩個,也很好理解:
Linear:
Cosine:
具體的細節請參考原文,那麼我們來看一下大家最關心的結果。
實驗的部分,作者做了大量的實驗,不僅比較了設計的DN網路的收斂性,非線性,BN功能,而且還和ResNet等比較下目標識別任務上的準確度,此外作者還對網路對於對抗樣本攻擊的性能進行了比較。在所有的比較當中作者都得到了最好的結果。主要看以下幾個方面的比較
1.在CIFAR100上和沒有BN的CNN:
注意,這個表格當中,每一行都是一個 卷積操作子也就是 h(.)Norm函數,每一列都是一個 角度激活函數g(.)。因此,如之前所說,對於一個一般CNN 就是g(.)=Cosine。
結果顯示,即便是沒有BN,DN都能夠表現出絕對的優勢。
2. 操作子的非線性的比較
第一列的比較非常明顯的看出,在沒有ReLU激活函數的情況下,一般的CNN可以達到高達58%以上的錯誤率,而對於DN來講只有差不多30%;而從第三列再加上ReLU之後,DN的性能也好於傳統的CNN。
3. 目標識別性能比較:
作者是 CIFAR10 和CIFAR100 兩個數據集上面和當前最好的網路模型進行了分類準確度的比較,我們可以看出。DN都可以拿到最好的結果。同時作者也在ImageNet-2012上進行了比較,也同樣拿到了最好的效果:
4. 對抗樣本攻擊的比較
作者在黑盒和白盒的情況下,比較了兩種演算法的攻擊:FGSM和BIM。結果顯示其具有更好的防止攻擊的能力。
非常推薦這篇文章!
文獻鏈接:
[1804.08071] Decoupled Networks
推薦閱讀:
※【特徵工程】特徵選擇與特徵學習
※基於Python互聯網金融LeningClub貸款違約預測模型
※特徵工程-Outliers
※OneHotEncoder獨熱編碼和 LabelEncoder標籤編碼
TAG:深度學習DeepLearning | 機器學習 | 特徵工程 |