CNN 基本運作方式

by allenlu2007

Reference:  Ranzato CVPR 2013 slide 以及 IPAM 2012 presentation 還有 Jarrett (NYU) ICCV 09 paper.

本文主要討論 CNN (convolution neural network) 的運作方式,但沒有原理。因為 CNN 會 work 的真正原理似乎仍缺乏一個堅實的理論 (by Yann LeConn in CVPR 2015).   儘管如此,在 image recognition (ImageNet), computer vision, speech recognition 的確 outperform 之前其他算法。也許這是另一個師法自然(靈長類視覺也是 hierarchy neural network, from Gallant “Reverse Engineering the Human Visual System” at CVPR 2015) 而成功的例子。(飛行是更早的例子)。

基本上大部份 object recognition systems 不論是 deep or shallow nets, 或是非 neural net, feature extraction stages are generally composed of a filter bank (or called weights, kernel), a non-linear transformation (sigmoid, tang, abs, regulated linear), and some sort of feature pooling layer.  



以下用 CNN 為例。

CNN 是 deep learning 的一種實踐方式。幾個重點:

1. Hierarchy and Locally Connected

為什麼要 hierarchical? 很簡單: divide-and-conquer.  要不然要 train/learn 的 parameter space 實在太大。

以 1M pixel (1000×1000) image 為例,一層的 hidden layer 一般也會有 1M hidden units.  如果是 fully connected net, 每一個 hidden unit 都有 1M connection (也就是 1M weight parameter, 尚不算 RGB x 3), 所以 total 就有 1M connection x 1M hidden unit = 10^12 connection (or parameters) to learn.  

很顯然這是不實際,而且也是不必要。因為 image 是 highly local correlated.  One pixel 大多只和附近 pixels highly correlated, 和 remote pixels 基本上沒有 correlation.  Train/learn 出來的 weight for remote pixels 也是 0.  




如果只用 locally connected neural net (可以想成 finite taps FIR filter) 如下圖。每一個 hidden unit 只有 10×10 的 local connection.  Parameter space 就變成 10x10x1M hidden unit = 100M parameter.  比 fully connected 要小很多,但仍然很大。




2. Share Weight (Filter)

Share weight 就是假設 hidden unit 的 weight 都一樣。當然這就大幅簡化 training or learning.  如果所有 hidden unit 的 weight (or FIR filter) 都一樣。Parameter space 就只剩下 10×10=100!!  當然直覺上會認為所有的 10×10 pixels across different locations 都用同樣的 weight/filter/kernel 合理嗎? 以及這個 weight/filter/kernel   代表什麼意義?  這是基於一個假設,就是 pixel-cluster 或是 image signal 本身是 statistics stationary w.r.t location (translation invariant –> momentum conservation?).

可能用 speech 來解釋比較容易理解。Speech signal 是由聲帶、口腔、和其他共振結構組成。講話的聲波基本特徵基本上不會隨著時間改變,或是改變也不大。如聲調 (tone and pitch/frequency), 音色 (harmonics), 語速。這些特徵可說是 stationary (w.r.t time), 或是 time-invariant (energy conservation?).  所以 share weight 的 weight/filter/kernel 就是要找的 feature.   

問題是 feature 不只一個,如果只有 one set of filter (share weight) or feature 是遠遠不夠分辦。因此需要多組 filters 如下。如果以 100 filters 為例 (100 個 features, 特徵, 注意這只是 1 layer!).  Parameter space 就有 10x10x100 = 10K (one layer, 100 組 FIR filters).  

如果有 10-layer neural network, 基本上就可以有 100^10=10^20 種特徵組合!  這是 SVM 或是其他 shallow learning 所無法達到的!  可以看出 hierarchy neural network (or deep learning) 的好處。



3. Weight 是 Learn 出來的,不是 Try 出來的

其實上述的想法和作法,和之前的 image detection 算法並沒有太大的不同。之前的算法主要是先經過 feature extraction block (SIFT, HOG, etc.) 然後再經過 classifier.   Feature extraction block 是 man-made.  只有 classifier 是 learning 出來的。兩個主要差異:

(1) 之前的算法是 shallow learning.  以 feature 數目而言,fingerprint/face recognition 大約 <100, 假設每種 object 的 feature size < 100 (車, 房, 馬 ), 以及 10^5 objects.  General image features ~ 100×10^5 ~ 10^7.  比起 hierarchical CNN 的 10^20 features 小的多!!!  從此也可以看出 deep (composition) 比 shallow (combination) 的好處。

(2) 之前的算法 feature extraction 是 man-made.  並非 learn 出來。畢竟 man-made feature 所能參考的 samples 也許是 100s or 1000s 不同 image (think about cars).  但 CNN (or deep learning) 是 end-to-end learning.  意即 feature 也是 learn 出來而不是 man made! 或 try 出來。

什麼是 feature learning?  基本上包含兩部份: (1) multi-layer hidden units 因為要 input forward propagation 和 error backward propagation,  以及經過 optimizer (SGD) fine tune weights (filter/feature).  (2) training sample 可以非常大 (10^6 using ImageNet, for example), 因為是 computer 在 run 而不是人在 try and error.  

In summary:  CNN feature 更準確因為 weight (feature) is optimized through the algorithm and huge samples. 


(use Yann LeCun slide) 

4. Pooling to reduce dimension (Sub-sampling)

前面提到 one layer 的 feature 約 100, 經過 10 layers, total features ~ 100^10 = 10^20.  實務上大約需要 10^7 的 features 可能就足夠。太多的 features 會造成 (1) under fit, 類似 sparse weights;  (2) 太多的 computation, 一個 feature 約對應 100 weights.  

Pooling 就是把 weight 縮減的方式如下。Pooling 是把 weights cluster 取 max or L2 (mean square average).  一般用 max for computation efficiency.

有兩個好處 (1) 縮減 weight space (from 10K to 1K); One layer reduce 10X, 10 layer reduce 10^10.  所以 total feature size 10^10 stead of 10^20!    同時下一層的 hidden unit 縮小了 10X, parameter space 每層縮小 10X?

 (2) make the detection more robust 而且 location (or translation) invariant (sort of ?)





5. Local Contrast Normalization (LCN)

多數情況 image 會有曝光不足或過度的問題。或是照度在不同環境不同。需要做 normalization.




6. Nonlinearity

前文已提到為什麼需要 nonlinearity.  最常見的 nonlinearity 是 sgn(x).  不過有用的區間是 non-differentiable.  另外的 nonlinear function 是 sigmoid,  是 differentiable, 同時數學運算也簡單。(forward prop 需要算 exponential; backward prop 只需要 multiplication).

但對於 large scale CNN, 即使 exponential 仍然 too computationally expensive.  因此目前常用 regulated linear function ( y = x  when x > 0 and 0 elsewhere).  基本上只有在原點 non-differentiable.  使用效果不錯。computation 也更容易。


CNN Typical One Layer Architecture