重點在對CNN的理解后, 理解對卷積層的的 梯度(導數) 推演.
回顧 CNN
首先是對神經網絡, 前向, 后向的基本認識.
神經網絡初步認識來看, 跟傳統的 ML 理論的區別在於, 它更像一個經驗的過程, 即debug. 它將一個樣本輸入(向量) 的每個分量, 進行一些 奇怪 的線性處理 (加權, 求和), 然后進行壓縮投影 (0-1), 這樣一層層地處理數據, 最后再來個 歸一化 為一個向量(近似概率) 的輸出. 這個過程呢, 稱為 前向, 得到結果跟真實值之間的誤差, 通過 反向 傳遞的方式來 動態調整權值參數 直到每個節點的 梯度接近0 就停止了調整了, 也就意味着, 網絡基本構建完成了.
而 反向調整權值的 BP算法的核心, 就是多元函數求偏導, 利用鏈式法則而已.
學界已經證明, 一個3層的網絡結構, 是可以模擬出任何的函數的, 只要中間層的節點夠多. 但這樣一來需要的計算量和內存非常大. 於是想着可以適當將網絡變為復雜一點, 從層次上增加 (卷積層), 再加上一個濾波器, 實現對 輸入的數據的特征提取 大幅度降低了計算復雜度.
CNN 的卷積過程, 一般會這樣處理:
- 卷積核: 也是一個矩陣, 或者從數學上稱為算子(option), 對輸入矩陣進行變換, 通常, 輸入,輸出的維數沒變, 但數值變了.
- 池化: 類似對卷積后的矩陣, 進行一個過濾, 分塊 這樣的(濾波器) 操作, 實現對對輸入的 主特征提取.
池化的過程:
而網絡的基本結構為: (以黑白圖像, 單通道舉例). 如果是彩色圖像, 多通道, 則輸入根據 R, G, B 三個矩陣而已.
回顧就到這了, 現重點來關注卷積層的梯度推演.
卷積層梯度 BP推導
變量聲明
輸入:
- 圖像, 尺寸 H, W
- 卷積核, 尺寸 R, S
H, W 分別表示圖片的高和寬, 如 100 x 200 px; R, S 表示卷積核的 垂直方向, 水平方向的 px, 跟 圖片類似概念
參數:
- u, v 為縱向和橫向的步長 (strides)
- a, b 為縱向和橫向的填充 (padding) 這是為了, 卷積和對 圖片區沒有能對應上的地方(邊界) 填充
輸出:
- 特征圖 (大小) : P, Q (P是縱向, Q是橫向)
P, Q 呢, 作為 輸入圖像 H, W 與卷積核 R, S 卷積后的輸出尺寸, 其關系為:
\(P = \frac {H-R +1+2a} {u}\)
\(Q = \frac {W-S +1+2b} {v}\)
2a, 2b 因為有兩端嘛, 畫圖就能形象理解.
默認上對 P, Q 進行了 ceiling 操作, 使其為整數.
卷積的定義
對於給定的圖像矩 I 和卷積核矩陣 K (卷積和尺寸為 k1 x k2)
Cross-correlation:
\((I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i+m, j+n)K(m,n)\)
這就跟咱直觀理解的"卷積" 的那個圖移動操作是相符合的呀, 對應元素相乘, 然后再求和.
而在數學上的卷積概念, 跟我們上邊這個直接對應元素相乘再求和有些不太一樣:
\((I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i-m, j-n)K(m,n)\)
\(=(I \otimes K)_{ij} = \sum\limits_{m=0}^{k_1-1} \sum\limits_{n=0}^{k_2-1} I(i+m, j+n)K(-m,-n)\)
即 卷積 Convolution 相當於將一個卷積核 旋轉180度, 以后再來做 Cross-correlation
旋轉這個操作, 即對應於某個的矩陣. 或者可理解為, 矩陣就是一個函數.
卷積前向
也是要線聲明一波變量.
-
l 為層的下標, 第一層為 l=1,最后一層為 l = L
-
輸入x 的尺寸為 H, W 並用 i, j 表示其下標
-
卷積核 w 的尺寸 k1, k2 並用 m, n 表示其下標
-
\(w^l_{mn}\) 為連接 l-1 層 和 l 層的卷積核
-
\(b^l\) 為 l 層的 bias
-
\(x^l_{i,j}\) 為 l 層激活函數的輸入
-
\(o^l_{i,j}\) 為 l 層的輸出
-
f(*) 為激活函數
暫時不細寫了, 感覺好難去描述這種多層多維度的東西哦, 還是調api吧, 暫時, 太難弄了.
繼續,
小結
還是留了一個推導的 Todo 在這里, 就關於BP推導的部分, 細節還有待考量, 太難弄覺得, 深度學習果然不一般, 目前覺得已到了我的知識上限了, 前面的BP還好, 偏導數而已, 而CNN的BP, 是有一下難度. 不過總體上, 這幾篇算是理解了卷積的大致過程, 卷積無非是做了一個特征提取, 降低計算復雜度的這樣一個往深度發展的網絡結構而已. 原理並不算復雜, 但要從數學符號來描述, 我感覺我目前還是有點難, 放一放先, 至少概念基本清楚, 能調api即可.