今年二月份,UC Berkeley和Stanford一幫人在arXiv貼了一篇文章:
SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and<0.5MB model size(https://arxiv.org/abs/1602.07360)
這篇文章做成了許多人夢寐以求的事——壓縮神經網絡參數。但和以往不同,原作不是在前人網絡基礎上修修補補(例如Deep Compression),而是自己設計了一個全新的網絡,它用了比AlexNet少50倍的參數,達到了AlexNet相同的精度!
關于SqueezeNet的創新點、網絡結構,國內已經有若干愛好者發布了相關的簡介,如這篇(http://blog.csdn.net/xbinworld/article/details/50897870)、這篇(http://blog.csdn.net/shenxiaolu1984/article/details/51444525),國外的文獻沒有查,相信肯定也有很多。
本文關注的重點在SqueezeNet為什么能實現網絡瘦身?難道網絡參數的冗余性就那么強嗎?或者說很多參數都是浪費的、無意義的?
為了更好的解釋以上問題,先給出AlexNet和SqueezeNet結構圖示:
AlexNet
圖1 AlexNet示意圖
圖2 AlexNet網絡結構
SqueezeNet
圖3 SqueezeNet示意圖
圖4 SqueezeNet網絡結構
為什么SqueezeNet能夠以更少的參數實現AlexNet相同的精度?
下面的表格直觀的展示了SqueezeNet的參數量,僅為AlexNet的1/48。
網絡 | 參數量 |
---|---|
AlexNet | 60M |
SqueezeNet | 1.25M |
乍一看,感覺非常不科學,怎么可能相差如此懸殊的參數量實現了相同的識別精度?
我們先考慮一個非常簡單的例子,這個例子可以說是SqueezeNet和AlexNet的縮影:
1、一層卷積,卷積核大小為5×5
2、兩層卷積,卷積核大小為3×3
以上兩種卷積方式除了卷積核大小不同,其它變量均相同,為了方便后文計算,定義輸入通道數1,輸出通道數為C(兩層卷積為C'),輸出尺寸N×N。
按照目前的理論,神經網絡應該盡可能的采用多層小卷積,以減少參數量,增加網絡的非線性。但隨著參數的減少,計算量卻增加了!根據上面的例子,大致算一下,為了簡便,只考慮乘法的計算量:
5×5一層卷積計算量是25×C×N×N
3×3兩層卷積的計算量是9×C×(1+C')×N×N
很明顯25C<9C(1+C')。
這說明了什么?說明了“多層小卷積核”的確增大了計算量!
我們再回過頭考慮SqueezeNet和AlexNet,兩個網絡的架構如上面4幅圖所示,可以看出SqueezeNet比AlexNet深不少,SqueezeNet的卷積核也更小一些,這就導致了SqueezeNet計算量遠遠高于AlexNet(有待商榷,需要進一步確認,由于Fire module中的squeeze layer從某種程度上減少了計算量,SqueezeNet的計算量可能并不大)。
可是論文原文過度關注參數個數,忽略計算量,這樣的對比方式貌似不太妥當。事實上,目前最新的深層神經網絡都是通過增加計算量換來更少的參數,可是為什么這樣做效果會很好?
因為內存讀取耗時要遠大于計算耗時!
如此一來,問題就簡單了,不考慮網絡本身架構的優劣性,深層網絡之所以如此成功,就是因為把參數讀取的代價轉移到計算量上了,考慮的目前人類計算機的發展水平,計算耗時還是要遠遠小于數據存取耗時的,這也是“多層小卷積核”策略成功的根源。
關于Dense-Sparse-Dense(DSD)訓練法
不得不說一下原作的這個小發現,使用裁剪之后的模型為初始值,再次進行訓練調優所有參數,正確率能夠提升4.3%。 稀疏相當于一種正則化,有機會把解從局部極小中解放出來。這種方法稱為DSD (Dense→Sparse→Dense)。
這個和我們人類學習知識的過程是多么相似!人類每隔一段時間重新溫習一下學過的知識,會增加對所學知識的印象。我們可以把“隔一段時間”理解為“裁剪”,即忘卻那些不怎么重要的參數,“再學習”理解為從新訓練,即強化之前的參數,使其識別精度更高!
-
神經網絡
+關注
關注
42文章
4765瀏覽量
100561
原文標題:神經網絡瘦身:SqueezeNet
文章出處:【微信號:CAAI-1981,微信公眾號:中國人工智能學會】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論