博客 / 詳情

返回

一隻菜鳥學深度學習的日記:入門卷積

本文以作者閲讀《Dive into Deep Learning》為線索,融合串聯了自身理解感悟、原始論文、優秀文章等。如有無意侵權,請聯繫本人刪除。

卷積神經網絡,由圖像處理而生,但在NLP等方面仍有較大作用。
圖像分辨率大時,對模型參數數量要求很多
原理:

  • 物體是什麼 與 物品所在的位置 無關 --- 平移不變性
  • 最初只探索圖像中的局部區域,忽略不同空間的關係 --- 局部性

如果我們用MLP處理圖像,用輸入層圖像\(\mathbf{X}(高H,寬W)\)、其隱藏層表示\(\mathbf{H}\)是矩陣或者説是二維張量,且二者形狀相同。
我們想要所有隱藏神經元都能接收到每一個像素的信息,就要使用四階張量\(\mathbf W\)
\(bias=\mathbf U\),可以把全連接層寫為:

\[\begin{split}\begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathbf{ W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ \\ &令 k = i + a,l = j + b,則 [\mathbf W]_{i,j,i+a,j+b} = [\mathbf V]_{i,j,a,b}\\ \\&= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathbf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}\end{aligned}\end{split} \]

我們為什麼做\(W\rightarrow V\)這個公式的形式上的變換呢?
為了便於理解、過渡

  • \(W\) 是輸出位置和輸入位置的局部連接
  • \(V\) 是輸出位置和相對偏移位置的連接,更符合直覺
    這就是局部連接:
    以輸入輸出\(3 \times 3\),局部窗口大小\(2\times 2\)為例,
    *注:這裏例子中窗口是從當前位置開始的2×2區域,並非以當前位置為中心的對稱窗口,僅用於説明局部連接的概念。

\[\begin{split} H[1,1]& = W[1,1,1,1]\cdot X[1,1] + W[1,1,1,2]\cdot X[1,2] \\ &+ W[1,1,2,1]\cdot X[2,1] + W[1,1,2,2]\cdot X[2,2]\\ &=V[1,1,0,0]\cdot X[1,1]+V[1,1,0,1]\cdot X[1,2]\\&+ V[1,1,1,0]\cdot X[2,1]+V[1,1,1,1]\cdot X[2,2]\\ \end{split}\]

如果\(a、b\)遍歷所有值,就能覆蓋圖像所有位置,即每個神經元都能看到整個輸入圖像。

然鵝,在這樣的局部連接層中,權重\(V\)是依賴於輸出位置\((i,j)\)的,即每個位置的神經元都有獨立的濾波器。這意味着如果輸入圖像很大,參數量會非常龐大。
所以我們可以假設,圖像中不同位置的局部模式應該以相同的方式處理。即一個邊緣檢測器無論在圖像的左上角還是右下角都應該有相同的權重,這就是平移不變性。
現在,我們運用平移不變性,即\(V、U\)實際與\((i,j)\)的值無關,可以知道:

\[[\mathbf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b} \]

同理,偏置\(U\)也應當與位置無關。若我們假設每個輸出通道共享一個偏置(單通道情況下就是一個常數\(b\)),則

\[[\mathbf U]_{i,j}=b \]

再帶入原公式,我們就順利得到了一個二維卷積的定義。
我們稱其中的\(\mathbf V\)卷積核濾波器

補充:
傳統圖像處理中的濾波器,一般要求:

  • 濾波器的大小應該是奇數,這樣它才有一箇中心,才有了半徑的稱呼,例如5x5大小的核的半徑就是2。
  • 濾波器矩陣所有的元素之和等於1,以保證濾波前後圖像的亮度保持不變。

在卷積神經網絡中,卷積核是通過數據自動學習得到的,沒有這些約束:

  • 後續的批量歸一化層會調整特徵分佈的均值和方差
  • 偏置參數可以補償均值偏移
  • 激活函數(如ReLU)會引入非線性並改變數值範圍

CNN中的卷積核是一種特徵檢測器,而不是傳統意義上的圖像濾波器。它們被訓練來檢測對任務有用的模式篩選特徵(如邊緣、紋理、形狀 · · ·),而不是保持圖像屬性不變。

我們再用局部性,即一個像素通常只與其鄰近像素有較強的關聯,而與遙遠像素的關聯很弱。將\(|a|、|b|\)限制在局部的範圍之內。 在推導中就可簡單將外部區域的權重設為 \(0\)

\[[\mathbf{H}]_{i, j} = b + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b} \]

這就是一個二維離散卷積層(忽略填充、步幅)。

現在理解一下“卷積”

下面是連續函數的卷積公式:

\[(f * g)(t) = \int_{-\infty}^{\infty} f(\tau) g(t-\tau) d\tau \]

\(g(t-\tau)\) 表示將 \(g(\tau)\) 翻轉得到 \(g(-\tau)\),再向右平移 \(t\) 個單位

然而,在在上文中我們並沒有對卷積核 \(V\) 進行翻轉,而是直接滑動,這其實是互相關。
所以我們為什麼依舊用“卷積”這個詞呢?

  • 沿用信號處理領域詞語。
  • 嚴格數學卷積依舊存在翻轉步驟,而且 \(V\) 是可學習的參數,不是一成不變的,可以自適應是否翻轉。
  • 是否翻轉,都是線性操作,不影響模型的表達能力。
    深度學習中實際使用的是互相關(無翻轉)
    所以,一般情況下,把“卷積”理解為“用一個可學習的小窗口在輸入上滑動並進行加權求和”即可。
    因為我們輸入的其實是離散圖像數據,是一個張量,所以我們將這個公式離散化,就可以得到

\[(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b) \]

深度學習實際使用的互相關為:

\[(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i+a, j+b) \]

注意這裏的 \(f\) 對應卷積核,\(g\) 對應輸入圖像,與連續卷積公式中的 \(f,g\) 角色可能相反,但這是常用的表示方式

多維張量

顯然,純黑白格子畫例外,所有輸入的圖像都不是簡簡單單的二維張量,每個像素點位置的基礎上都儲存着灰度或者RGB三通道,所以我們可以在這裏暫且認為輸入是一個三維張量(實際訓練中我們更多使用四維\((height, weight, channel, batch\_size)\) )。
因此輸入 \(\mathbf X\) 是一個三維張量,形狀為\((C_{in},H,W)\),其中 \(C_{in}\) 是輸入通道數,那麼卷積也應調為\([\mathbf V]_{a,b,c}\)
這時,對於每個空間位置的隱藏層 \(\mathbf H\) ,我們各用一組堆疊着的二維張量的通道 表示,而每個通道都向後續層提供一組空間化的學習特徵,我們稱之為“特徵映射”。

對於特徵映射,每個映射(通道)都是一個\((高度×寬度)\)的二維矩陣,其中每一個值都表示着某個特定特徵在輸入圖像對應位置的激活強度。
這裏的特徵保留了位置信息,即映射上的每個座標點都對應輸入圖像的某個區域,是空間化、保留空間結構的。
其中,淺層特徵映射、中層特徵映射、深層特徵映射應用、意義不同:淺層特徵映射檢測簡單模式(如邊緣、紋理),中層特徵映射檢測組合模式,深層特徵映射對應高級語義特徵。

在這裏,為了支持輸入\(\mathbf X\) 和隱藏層 \(\mathbf H\) 能用多個通道,更有普適性,可以讓 \(\mathbf V\) 再添加一個座標,使其表示 \((size\_h,size\_w,C_{in},C_{out})\)
這是一個含有多個通道的隱藏層表示:

\[[\mathbf{H}]_{i,j,d} =b_d + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_{c=0}^{C_{in}-1} [\mathbf{V}]_{a, b, c, d} [\mathbf{X}]_{i+a, j+b, c} \]

其中 \(a,b\) 是卷積核的空間維度(高度、寬度),\(c\) 是輸入通道索引,\(d\) 是輸出通道索引,
\(b_d\) 是第 \(d\) 個輸出通道的偏置

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.