詳解卷積步長
卷積中的步幅是另一個構建卷積神經網路的基本操作,讓向展示一個例子。
如果想用3×3的過濾器卷積這個7×7的影像,和之前不同的是,把步幅設定成了2。還和之前一樣取左上方的3×3區域的元素的乘積,再加起來,最後結果為91。
只是之前移動藍框的步長是1,現在移動的步長是2,讓過濾器跳過2個步長,注意一下左上角,這個點移動到其後兩格的點,跳過了一個位置。然後還是將每個元素相乘並求和,將會得到的結果是100。
現在繼續,將藍色框移動兩個步長,將會得到83的結果。當移動到下一行的時候,也是使用步長2而不是步長1,所以將藍色框移動到這裡:
注意到跳過了一個位置,得到69的結果,現在繼續移動兩個步長,會得到91,127,最後一行分別是44,72,74。
所以在這個例子中,用3×3的矩陣卷積一個7×7的矩陣,得到一個3×3的輸出。輸入和輸出的維度是由下面的公式決定的。如果用一個\(f×f\)的過濾器卷積一個\(n×n\)的影像,padding為\(p\),步幅為\(s\),在這個例子中\(s=2\),會得到一個輸出,因為現在不是一次移動一個步子,而是一次移動\(s\)個步子,輸出於是變為\(\frac{n+2p - f}{s} + 1 \times \frac{n+2p - f}{s} + 1\)
在這個例子裡,\(n=7\),\(p=0\),\(f=3\),\(s=2\),\(\ \frac{7 + 0 - 3}{2} + 1 =3\),即3×3的輸出。
現在只剩下最後的一個細節了,如果商不是一個整數怎麼辦?在這種情況下,向下取整。\(⌊ ⌋\)這是向下取整的符號,這也叫做對\(z\)進行地板除(floor),這意味著\(z\)向下取整到最近的整數。這個原則實現的方式是,只在藍框完全包括在影像或填充完的影像內部時,才對它進行運算。如果有任意一個藍框移動到了外面,那就不要進行相乘操作,這是一個慣例。3×3的過濾器必須完全處於影像中或者填充之後的影像區域內才輸出相應結果,這就是慣例。因此正確計算輸出維度的方法是向下取整,以免\(\frac{n + 2p - f}{s}\)不是整數。
總結一下維度情況,如果有一個\(n×n\)的矩陣或者\(n×n\)的影像,與一個\(f×f\)的矩陣卷積,或者說\(f×f\)的過濾器。Padding是\(p\),步幅為\(s\)沒輸出尺寸就是這樣:
可以選擇所有的數使結果是整數是挺不錯的,儘管一些時候,不必這樣做,只要向下取整也就可以了。也可以自己選擇一些\(n\),\(f\),\(p\)和\(s\)的值來驗證這個輸出尺寸的公式是對的。
這裡有一個關於互相關和卷積的技術性建議,這不會影響到構建卷積神經網路的方式,但取決於讀的是數學教材還是訊號處理教材,在不同的教材裡符號可能不一致。如果看的是一本典型的數學教科書,那麼卷積的定義是做元素乘積求和,實際上還有一個步驟是首先要做的,也就是在把這個6×6的矩陣和3×3的過濾器卷積之前,首先將3×3的過濾器沿水平和垂直軸翻轉,所以\(\begin{bmatrix}3 & 4 & 5 \\ 1 & 0 & 2 \\ - 1 & 9 & 7 \\ \end{bmatrix}\)變為\(\begin{bmatrix} 7& 2 & 5 \\ 9 & 0 & 4 \\ - 1 & 1 & 3 \\\end{bmatrix}\),這相當於將3×3的過濾器做了個映象,在水平和垂直軸上(整理者注:此處應該是先順時針旋轉90得到\(\begin{bmatrix}-1 & 1 & 3 \\ 9 & 0 & 4 \\ 7 & 2 & 5 \\\end{bmatrix}\),再水平翻轉得到\(\begin{bmatrix} 7& 2 & 5 \\ 9 & 0 & 4 \\ - 1& 1 & 3 \\\end{bmatrix}\))。然後再把這個翻轉後的矩陣複製到這裡(左邊的影像矩陣),要把這個翻轉矩陣的元素相乘來計算輸出的4×4矩陣左上角的元素,如圖所示。然後取這9個數字,把它們平移一個位置,再平移一格,以此類推。
所以在這中定義卷積運算時,跳過了這個映象操作。從技術上講,實際上做的,在前面使用的操作,有時被稱為互相關(cross-correlation)而不是卷積(convolution)。但在深度學習文獻中,按照慣例,將這(不進行翻轉操作)叫做卷積操作。
總結來說,按照機器學習的慣例,通常不進行翻轉操作。從技術上說,這個操作可能叫做互相關更好。但在大部分的深度學習文獻中都把它叫做卷積運算,因此將在這使用這個約定。如果讀了很多機器學習文獻的話,會發現許多人都把它叫做卷積運算,不需要用到這些翻轉。
事實證明在訊號處理中或某些數學分支中,在卷積的定義包含翻轉,使得卷積運算子擁有這個性質,即\((A*B)*C=A*(B*C)\),這在數學中被稱為結合律。這對於一些訊號處理應用來說很好,但對於深度神經網路來說它真的不重要,因此省略了這個雙重映象操作,就簡化了程式碼,並使神經網路也能正常工作。
根據慣例,大多數人都叫它卷積,儘管數學家們更喜歡稱之為互相關,但這不會影響到在程式設計練習中要實現的任何東西,也不會影響閱讀和理解深度學習文獻。