這節課主要講了一些在實際使用 CNN 時的技巧,可以加速訓練網絡。很多內容需要圖解,所以我就直接截圖了。所有圖都是從 CS231n lecture 11的課件中截取的。
The power of small filters
Three 3 x 3 conv gives similar representational power as a single 7 x 7 convolution
這是在 VGG[1] 這篇論文中最先提出來的,3 層 3x3 大小的卷積 和 一層 7x7 大小的卷積效果差不多,因爲等效的 感受野(receptive field)大小都是 7x7。這在下面這張 slice 中很清楚的表明了。
對比使用一層 7x7 的卷積和使用三層 3x3 的卷積,發現後者有更少的參數,更少的乘法運算,以及更好的非線性(層數變多,非線性就變多了),所以在 VGG 論文中全部使用了 3x3 的卷積核!
bottlenech 結構
在最新版的 GoogLeNet[2] 使用了所有這些想法。
summary:
- Replace large convolutions (5 x 5, 7 x 7) with stacks of
3 x 3 convolutions - 1 x 1 “bottleneck” convolutions are very efficient
- Can factor N x N convolutions into 1 x N and N x 1
- All of the above give fewer parameters, less compute,
more nonlinearity
Implementing Convolutions: im2col 加速卷積計算的方法
在計算機中矩陣乘法是比較快的,而且有很多優化的矩陣乘法庫,所以可以把卷積操作轉化爲矩陣乘法來加速。
把 feature map 中所有對應一個 conv filer 大小的感受野區域 K x K x C 轉化爲有 CK^2 個元素的列向量,可以得到一個大小爲 (CK^2) x N 的矩陣,同時把每個conv filer也相應轉換爲一個有 CK^2 個元素的行向量,得到一個大小爲 D x (CK^2) 的矩陣,兩個矩陣相乘,就得到了一個大小爲 D x N 的矩陣,再 reshape 爲結果矩陣就行了。
從上面的描述也可以看到這種方法也有一個缺點,就是會比原來佔用更多內存。不過在實際使用時並不是一個很大的問題。
還有一些其他加速卷積計算的方法,比如利用快速傅立葉變換 FFT 來計算卷積,不過目前還沒有普遍使用。
Reference
[1]Very Deep Convolutional Networks for Large-Scale Image Recognition
[2]Rethinking the Inception Architecture for Computer Vision