卷積網路的平移不變性可能會經常在論文中看到,那這個到底是什麼呢?看了一些論文的原文和網路上十幾篇講這個的博文,大概捋清了思路然後寫下這個。不得不說,有的博文講的有那麼點問題。
1 什麼是不變性
【不變性】就是目標發生了變換,但是你依然可以識別出來。在影像任務中,我們希望影像中的目標即使被平移、被旋轉或者被縮放,模型都可以識別出來影像的目標。
所以不變性有下面幾種:
- 平移不變性:Translation Invariance
- 旋轉不變性:Rotation Invariance
- 尺度不變性:scale Invariance
- 光照不變性:Illumination Invariance
在影像分類任務中,平移不變性就是影像中的目標不管被移動到哪個位置,模型給出的標籤應該都是相同的。
【平移不變性對應的有一個概念是平移同變性(translation equivariance),這個是用在影像的目標檢測中的,如果輸入影像中的目標進行了平移,那麼最終檢測出來的候選框應該也相應的移動,這就是同時改變。】
2 卷積網路有沒有平移不變性
有的文章說有,有的說沒有,那麼到底有沒有呢?
我先說出我個人的觀點,現在的卷積網路是不具有平移不變性的。不過兩個論點我都會講明白。
3 為什麼有平移不變性
主要是由兩個原因,一個是卷積,一個是最大池化。
【為什麼卷積可以提供平移不變性】
比方說目標是在影像的左上角,經過卷積之後,目標的特徵也會在特徵圖的左上角;目標在影像的左下角,經過相同的卷積核卷積之後,目標的特徵也會在特徵圖的左下角。然後卷積層後面接上一個全連線層進行分類,就算目標位置改變了,但是經過相同的卷積核卷積,然後展開變成全連線層。所以對於全連線層來說,改變的之後特徵的位置。可能之前目標的特徵是作為全連線的第一個神經元的輸入,平移目標位置之後,該特徵就作為全連線的最後一個神經元的輸入。
不過這種說法想體現的就是,就算目標位置變了,經過相同卷積核提取的特徵該有的都有,只是位置變了。
【我個人覺得這個論證有點問題,特徵的順序對於網路來說非常重要,打亂了那很大可能會給出錯誤的答案。上述的論點來源於引用[1]的部落格】
【為什麼池化可以提供平移不變性】
我覺得這個相比上面的解釋,是有一定的道理的。最大池化層返回感受野中的最大值,如果最大值被移動了,但是仍然在這個感受野中,那麼池化層也仍然會輸出相同的最大值。這就有點平移不變的意思了。
在參考連結[2]中,給出了幾個“池化層具有不變性”的例子:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-RgYXVsMc-1595352073693)(http://helloworld2020.net/wp-content/uploads/2020/07/wp_editor_md_c94b9fb055f201230a5f6ba383f04768.jpg)]
可以看到,同樣的數字1,原圖中平移了1個畫素,但是經過2*2的最大池化層之後,得到了相同的特徵圖。
此外,最大池化層還可以根據類似的原理,得到尺度不變性和旋轉不變性:
【池化層引入了平移不變性我覺得是比較靠譜的,這也是池化層的重要作用之一:為CNN引入不變性。但是怎麼說呢?雖然目前聽起來很有道理,在面試的時候被問起來池化層作用的時候我覺得回答上不變性也是不錯的,但是下文就會講解,池化層實際上並沒有引入不變性。好像是2019年的一個論文強調了池化層並沒有不變性】
4 為什麼沒有平移不變性
現在卷積網路的影像輸入,改變一個畫素就可能會得出不同的結構,所以很容易遭到對抗攻擊。下面有一個形象的例子:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-mZuTor9L-1595352073705)(http://helloworld2020.net/wp-content/uploads/2020/07/ezgif-6-e30035fc1a35.gif)]
可以看出來,當平移小鳥的位置的時候,預測結果是有很大的波動的。
池化層並沒有平移不變性。下面是參考連結[3]給出的一個簡單的例子,這是一個一維卷積的例子,二維影像類似:
上圖是一個沒有平移的原始一位資料做了一個1*2的最大池化;
如果對一位資料做了一個平移,那麼得到的池化結果就完全不同!這也就是為什麼下采樣(平均池化層,最大池化層等)沒有平移不變性。
5 平移不變性的定義
說了這麼多平移不變性,那麼平移不變性的具體的嚴格的定義到底是什麼呢?
定義幾個數學符號。原始的輸入資料為\(X\),經過下采樣層變成\(D(X)\),然後再經過上取樣得到\(U(D(X))\).(D是Down下采樣,U是Up上取樣)
【平移不變性】
如果平移之後的輸入影像的下采樣的上取樣與原始輸入影像的下采樣的上取樣相同,那麼就是平移不變性。(中文說的太繞嘴了,數學公式清晰)
\(U(D(X))=U(D(X_{shift}))\)
- \(X_{shift}\)就是平移之後的輸入;
舉個例子:
這個就是\(U(D(X))\),
這個就是\(U(D(X_{shift}))\),可以發現兩者並不相等,所以並沒有平移不變性。
6 如何實現平移不變性
現在使用的全域性平均池化層,就是可以實現平移不變性。依然是用上面的例子:
可以發現,其實不管平移多少,反正得到的數值都是一樣的,全域性平均池化消除了位置的影響,所以實現了平移不變性。
參考連結:
[1]https://zhangting2020.github.io/2018/05/30/Transform-Invariance/
[2]https://www.zhihu.com/question/36686900
[3]https://www.jianshu.com/p/6041f3e8a583