1 研究背景:
最近對深卷積神經網絡 (CNNs) 的研究主要集中在提高計算機視覺資料集的精确度上。對于給定的精度級别, 通常可以用不同的 CNN 體系結構來實作了該精度級别。而具有更少參數的 CNN 體系結構具有以下幾個優點:
(1)更高效的分布式訓練
(2)向用戶端導出新模型時的開銷更小
(3)可行的 FPGA 和嵌入式部署
2 相關工作
2.1 模型壓縮
奇異值分解 (SVD)
網絡修剪
深壓縮
【目前對模型壓縮的理論以及方法還不熟悉,後續加強此方面學習】
2.2 CNN 微結構
CNNs網絡結構越來越深的大趨勢下, 手動選擇每個層的過濾尺寸變得很麻煩。為了解決這一問題, 提出了由多個卷積層組成的各種更進階别的建構塊或子產品.然後将許多這樣的子產品組合起來, 也許還有其他的(ad-hoc)層來組成一個完整的網絡. 我們使用CNN 微體系結構【CNN microarchitecture】一詞來引用各個子產品的特定組織和次元。
2.3 CNN 宏觀結構
雖然微體系結構是指單個層和子產品, 但我們将CNN macroarchitecture定義為多個子產品的系統級組織, 使其成為一個端到端的 CNN 架構。
從Vgg 12層到19層開始,網絡層數是熱門話題。加深網絡層數可獲得較高的準确性。
ResNet 殘差網絡,解決網絡加深,性能退化問題。
2.4 網絡設計空間探索
神經網絡 (包括深度網絡和卷積神經網絡) 具有很大的設計空間, 比如說microarchitectures、macroarchitectures的設計和其他超參數的選擇。神經網絡設計空間探索的大部分工作都側重于開發自動化的方法, 以找到更高精度的神經網絡體系結構。這些自動化方法包括貝葉斯優化 (Snoek et, 2012), 模拟退火 (Ludermir 等, 2006), 随機搜尋 (Bergstra & Bengio, 2012) 和遺傳算法 (Stanley & Miikkulainen, 2002)。值得贊揚的是,每一篇論文都提供了一個案例,在這個案例中,提出的DSE方法産生了一個NN體系結構,與一個具有代表性的基礎神經網絡相比,它的精确度的确更高。然而, 這些論文并沒有試圖提供關于神經網絡設計空間形狀的直覺。在本文的後面, 我們避開了自動化的方法-相反, 我們通過重構 CNNs 的方式, 這樣就就可以做A/B的比較, 進而可以探索出CNN 架構是如何影響模型的大小和準确性的。
在下面的章節中, 我們首先提出和評估了 SqueezeNet 網絡結構, 并沒有模型壓縮。然後, 我們探讨了微體系結構和 宏觀體系結構中的設計選擇對 SqueezeNet 型 CNN 架構的影響。
3 SQUEEZENET: 使用少量參數保持精度
3.1 結構設計政策
本文的首要目标是确定在保持準确性的同時, 有幾個參數的 CNN 架構。為了實作這一點, 我們在設計 CNN 架構時采用了三個主要政策:
政策 1.用1x1 濾鏡替換3x3 濾鏡。
考慮到一定數量的卷積的預算, 我們将選擇大量使用1x1卷積, 因為1x1 卷積的參數比3x3 過濾器少了 9X.
政策 2.減少3x3 卷積輸入通道的數量。
假設有一個卷積層, 它完全由3x3 卷積組成。此層中參數的總數量為:(輸入通道數) * (過濾器數) * (3 * 3)。是以, 為了在 CNN 中得到更少的參數, 不僅要減少3x3 過濾器的數量 (參見上面的政策 1), 還要減少3x3 卷積中輸入通道的數量。我們使用squeeze層将輸入通道的數量減少, 在下一節中我們将對其進行描述。
政策 3.在網絡中延遲下采樣的時間, 以便卷積層具有較大的特征圖。
在卷積網絡中,每個卷積層輸出一個特征圖,特征圖的寬度和高度由一下内容決定:
(1)輸入資料的大小
(2)在CNN 體系結構中縮減像素采樣的層的選擇
我們的直覺是, 在其他不變的情況下,大的特征圖 (由延遲下采樣産生) 可以導緻更高的分類精度 。的确, K.He和 h. Sun 将延遲下采樣率應用到四種不同的 CNN 體系結構中, 在每種情況下, 延遲下采樣都會導緻分類精度變高 (He& Sun, 2015).【這裡所說的下采樣應該就是指池化】
政策1和2是關于在盡可能保持模型準确度地情況下減少 CNN 的參數數量,。政策3是關于在有限的參數數量下最大化精度。接下來, 我們描述的Fire子產品, 将使我們能夠成功地使用戰略 1, 2 和3。
3.2 Fire Model
圖1
一個Fire子產品包括:
一個squeeze層 (隻有1x1 卷積), 将其放入一個具有1x1 和3x3 卷積組合的expand層中(圖1)。
在Fire子產品中随意使用1x1 過濾器是應用3.1節中的政策1。
在一個Fire子產品中有三個超參數: s1x1, e1x1和 e3x3。在Fire子產品中, s1x1 是squeeze層 (所有 1x1) 中的過濾器數, e1x1是1x1 卷積在expand層的數量, e3x3 3x3卷積在expand層的數量。當我們使用Fire子產品時, 我們設定 s1x1 小于 (e1x1 e + 3x3 ), 是以, expand層有助于限制3x3卷積中輸入通道的數量即3.1節中的政策 2。
3.3 SQUEEZENET 體系結構
我們現在描述了 SqueezeNet CNN 的架構。
我們在圖2中說明了 SqueezeNet 從一個獨立的卷積層 (conv1) 開始, 後跟8個Fire子產品 (fire2-9), 最後 conv 層 (conv10) 結束。從開始到網絡的末端,我們逐漸增加每個Fire子產品的卷積的數量。
SqueezeNet 在層 conv1、fire4、fire8 和 conv10 之後執行最大池化, 其步長為 2;這些相對較晚地執行池化操作是在執行3.1節的政策3。我們在表1中展示了完整的 SqueezeNet 體系結構。
圖 2
3.3.1 其他SQUEEZENET 細節
為了簡潔起見, 我們省略了表1和圖2中有關 SqueezeNet 的詳細資訊和設計選項的數量。我們提供以下這些設計選擇。這些選擇背後的直覺可以在下面引用的論文中找到。
(1)為了使1∗1 和 3∗3 filter輸出的結果有相同的尺寸,在expand modules中,給3∗3 filter的原始輸入添加一個像素的邊界(zero-padding)
(2)squeeze 和 expand layers中都是用ReLU作為激活函數
(3)在fire9 module之後,使用Dropout,比例取50%
(4)注意到SqueezeNet中沒有全連接配接層,這借鑒了Network in network的思想,用GAP代替全連接配接
【GAP 代替全連接配接解釋與實作】https://www.cnblogs.com/hutao722/p/10008581.html
(5)訓練過程中,初始學習率設定為0.04,在訓練過程中線性降低學習率。更多的細節參見本項目在github中的配置檔案。
(6)由于Caffe中不支援使用兩個不同尺寸的filter,在expand layer中實際上是使用了兩個單獨的卷積層(1∗1filter 和 3∗3filter),最後将這兩層的輸出連接配接在一起,這在數值上等價于使用單層但是包含兩個不同尺寸的filter。
【在github上還有SqueezeNet在其他架構下的實作】MXNet、Chainer、Keras、Torch。
https://github.com/forresti/SqueezeNet
表1
4 評估SQUEEZENET
在評估 SqueezeNet 時, 我們使用 AlexNet[4] 和相關的模型壓縮結果作為比較的基準
表2
在表2中, 我們将最近的模型壓縮結果 和SqueezeNet網絡做一個對比。可以看到:SVD 方法可以将 AlexNet 模型壓縮為以前的5x, 同時會使top-1 資料集上的精度降低到 56.0% (丹頓 et, 2014)。網絡修剪實作了模型尺寸的9x 降低, 同時保持了 top-1資料集上 57.2%的精度和top-5資料集上 80.3% 的精度 (Han等人, 2015b)。深壓縮達到35x 的模型尺寸壓縮比率, 同時仍然保持以往的精度 (Han等, 2015a)。現在, 使用 SqueezeNet網絡, 我們實作了減少50X 的模型壓縮比率, 同時滿足或超過 AlexNet 的 top-1 和 top-5 的準确性。
我們似乎已經超過了目前模型壓縮所取得的最新成果: 即使使用未壓縮的32位值來表示模型, SqueezeNet 也在保持或超過原本正确率的基礎上有一個1.4× 的模型壓縮比,這相比于目前模型壓縮所取得的最新成果還要好一些。
SqueezeNet, 使用33% 稀疏和8位量化. 這将生成一個 0.66 MB 的模型 (363× 小于32位 AlexNet), 并具有與 AlexNet 等效的精度。
此外, 在 SqueezeNet 上應用6位量化和33% 稀疏度的深壓縮, 我們生成一個0.47MB 模型 (510× 小于32位 AlexNet), 具有等效的精度。我們的小模型确實可以壓縮。
此外, 這些結果表明, 深壓縮 (韓等, 2015a) 不僅在 CNN 的體系結構具有許多參數 (如 AlexNet 和 VGG), 但它也能夠壓縮已經緊湊, 完全卷積 SqueezeNet結構。通過10×壓縮 SqueezeNet 的深層壓縮, 同時保留基線精度。總而言之: 通過将 CNN 的體系結構創新 (SqueezeNet) 與最先進的壓縮技術 (深壓縮) 結合在一起, 我們實作了一個 510× 在模型大小上的縮減, 與基線相比, 精确度沒有降低。
5 CNN 微體系結構設計空間探索
現在, 在5和6節中, 我們探讨了設計空間的幾個方面。我們将此體系結構探索分為兩個主要主題: microarchitectural 探索(每個子產品層的次元和配置) 和macroarchitectural 探測(子產品的端到端組織和其他層)。
在本節中, 我們設計并執行實驗, 目的是提供關于 microarchitectural 設計空間形狀的直覺, 就我們在3.1 節中提出的設計政策而言。請注意, 我們在這裡的目标不是在每個實驗中實作最大的精确度, 而是要了解 CNN 架構選擇對模型大小和準确性的影響。
圖3
5.1 CNN 微體系結構參數
5.2 壓縮比(SR)
在3.1 節中, 我們建議減少參數的數目, 方法是使用squeez層減少3x3 卷積的輸入通道數。我們将壓縮比率 (SR)定義為squeeze層中的卷積個數與expand層中的卷積個數之間的比值。我們現在設計了一個實驗來研究壓縮比對模型尺寸和精确度的影響。
在這些實驗中, 我們使用 SqueezeNet (圖 2) 作為起點。與 SqueezeNet 中一樣, 這些實驗使用以下 metaparameters:basee=128,incre=128,pct3x3=0.5,freq=2basee=128,incre=128,pct3x3=0.5,freq=2。我們教育訓練多個模型, 其中每個模型有一個不同的壓縮比 (SR),他們在範圍 [0.125, 1.0]内變化。 在圖 3 (a) 中, 我們展示了這個實驗的結果, 在圖上的每個點都是一個獨立的模型, 從頭開始訓練。SqueezeNet 是SR = 0.125的點。 從這個數字我們知道, 在SR= 0.125時增加SR 可以進一步增加 ImageNet top-5 精度(從 80.3% (4.8MB)到86.0% (19MB)) 峰值在86.0% ( SR = 0.75 ,模型大小為19MB ), 并且設定 SR = 1.0 進一步增加了模型的大小,卻沒有提高準确性。
5.3 訓練時關閉1X1和3X3卷積核
在3.1 節中, 我們建議通過用1x1 卷積替換一些3x3 卷積來減少 CNN 的參數數目。一個開放的問題是, CNN 過濾器中的空間分辨率有多重要?
VGG (Simonyan & Zisserman 2014) 體系結構在大多卷積層中都充斥着3x3 的卷積;GoogLeNet (Szegedy 等, 2014) 和NiN (林等, 2013)在某些層裡有1x1 的卷積。在 GoogLeNet 和NiN, 作者簡單地提出了具體數量的1x1 和3x3 卷積沒有進一步的分析。在這裡, 我們試圖闡明1x1 和3x3 過濾器的比例對模型大小和精度的影響.
我們在本實驗中使用以下 metaparameters:basee=128,incre=128,SR=0.5,freq=2basee=128,incre=128,SR=0.5,freq=2, 并且我們讓pct3x3pct3x3從1% 到99%變化 。換句話說, 每個Fire子產品的expand層有一個預定義的數量的過濾器劃分在1x1 和3x3 之間,
在這裡,我們把“旋鈕”從 “大多數是1x1卷積” 調節到 “大多數是 3x3卷積”。與以前的實驗一樣, 這些模型有8個FIre子產品, 與圖2中的層組織相同。我們在圖 3 (b) 中顯示了這個實驗的結果。請注意, 圖 3 (a) 和圖 3 (b) 中的13MB 模型是相同的體系結構: SR = 0.500 和 pct3x3=50pct3x3=50%。我們在圖 3 (b) 中看到, 在3x3 卷積占比為50%時,ImageNet資料集上的精度會達到85.6% , 當進一步增加了3x3 卷積的百分比時,隻增加了模型的大小, 但沒有提高 ImageNet資料集上的準确性。
6 CNN 宏觀體系結構設計空間探索
到目前為止, 我們已經探索了微體系結構層面的設計空間, 即CNN網絡各個子產品的内容。現在, 我們在 macroarchitecture 級别上探讨了有關Fire子產品之間高層連接配接的設計決策。靈感來自 ResNet (He等, 2015b), 我們探索了三種不同的體系結構:
· Vanilla SqueezeNet (按前一節).
· SqueezeNet 在某些Fire子產品之間進行簡單的旁路連接配接。
· SqueezeNet 在Fire子產品之間使用複雜的旁路連接配接。
我們在圖2中畫出了這三種 SqueezeNet 的變體。
表3
我們的簡單旁路體系結構在3、5、7和9的Fire子產品附近添加旁路連接配接, 要求這些子產品在輸入和輸出之間學習殘差函數。與 ResNet 一樣, 要實作圍繞 Fire3 的旁路連接配接, 我們将輸入設定為 Fire4 等于 (Fire2 + 輸出 Fire3 的輸出), 其中 + 運算符為數組加法。這改變了應用于這些Fire子產品的參數, 并且, 根據 ResNet, 可以提高最終的準确度。
一個限制是, 在簡單的情況下, 輸入通道的數量和輸出通道的數量必須相同;是以, 隻有一半的Fire子產品可以有簡單的旁路連接配接, 如圖2的中間圖所示。當無法滿足 “相同數量的通道” 要求時, 我們使用複雜旁路連接配接, 如圖2的右側所示。雖然一個簡單的旁路是 “隻是一個導線,” 我們定義一個複雜的旁路作為旁路, 包括一個1x1 卷積層與數量的過濾器設定等于數量的輸出通道。需要注意的是, 複雜的旁路連接配接會向模型中添加額外的參數, 而簡單旁路連接配接則不會。
我們還可以比較直覺地看到: 增加旁路連接配接将有助于減輕squeeze層引入的瓶頸。例如:在 SqueezeNet中, 擠壓比 (SR) 是 0.125, 這意味着每個squeeze層的輸出通道比expand層少8倍。由于這種嚴重的通道數減少, 隻有很少的資訊可以通過expand層。但是, 通過将旁路連接配接添加到 SqueezeNet網絡中, 我們打開了資訊的通道, 使資訊可以在不同的squeeze層之間傳輸。
我們按照圖2中的三種結構訓練了 SqueezeNet網絡, 并比較了表3中的精度和模型大小。我們修正了微體系結構以比對 SqueezeNet, 如表1在整個探索中所述。複雜和簡單的旁路連接配接相比于基礎的SqueezeNet結構,準确性得以改善。有趣的是, 簡單的旁路使得精确度的提高比複雜的旁路更高。
7 論文閱讀總結
關于神經網絡的部分了解:
CNN微結構
CNN宏觀結構
關于模型壓縮的方法:
這方面理論基礎為無,後續加強。
參考連結:
https://blog.csdn.net/u013044310/article/details/80188530?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param