架構之美-最強卷積神經網路架構設計初想
來自專欄架構之美22 人贊了文章
今天迎來了我家兩公子周歲生日,在這美好的日子裡我用「美」為主題分享一下目前非常火非常火的CNN卷積神經網路。
本文目錄
最美的是什麼?
經典架構回顧
聊一聊這些架構有哪些優缺點
架構設計思考
什麼是最美的卷積神經網路?
深度學習是近幾年迅速發展起來的學科,其在物體識別、檢測、跟蹤等任務中獲得了突破性進展。卷積神經網路(Convolutional Neural Network,CNN)是深度學習中最為重要的分支之一,被大量用於檢測、分割、物體識別以及圖像的各個領域。
本文先回顧最近幾年各種經典的CNN卷積神經網路架構,來領略一下各路大神高超的智慧,聊一聊這些架構有哪些優缺點,從中提煉出一些想法來設計最強最美的卷積神經網路架構。
一、最美的是什麼?
在數學中我認為最美的符號是:
在數學中我認為最美的公式是:
這時候我想問自己一個問題,那在深度學習, 計算機視覺中,最美的卷積神經網路是什麼?
先不著急,請細讀下文,我會給出答案。
二、經典架構回顧
為了不讓本文的遍幅過長,本節只聊重點, 只聊重點,各經典架構的詳細介紹就煩請讀者自行查閱。
上圖是ILSVRC歷年的Top-5錯誤率,我們就按照上圖中經典架構出現的時間順序對他們進行簡單的總結。
- LeNet (1998年)
成績:
LeNet是卷積神經網路的祖師爺LeCun在1998年提出,用於解決手寫數字識別的視覺任務。自從那時起,CNN的最基本的架構就定下來了:卷積層、池化層、全連接層。
貢獻點:
- 定義了CNN的基本組件
基本組件包括:卷積層、池化層、全連接層。
- 層之間連接順序
卷積層後接池化層,最後接全連接層。
- AlexNet (2012年)
成績:
AlexNet在2012年ImageNet競賽中以超過第二名10.9個百分點的絕對優勢一舉奪冠,從此深度學習和卷積神經網路名聲鵲起,深度學習的研究如雨後春筍般出現,AlexNet的出現可謂是卷積神經網路的王者歸來。
貢獻點:
- 更深的網路
比LeNet的5層多了3層。
- 數據增廣
增強模型的泛化能力,避免過擬合,使用了隨機裁剪的思路對原來256×256的圖像進行隨機裁剪。
- ReLU
用ReLU代替Sigmoid來加快收斂。
- 多GPU支持
利用多GPU加速訓練。
- Dropout
有效緩解過擬合。
- ZFNet (2013年)
下圖為AlexNet與ZFNet的比較:
成績:
ZFNet是2013年ImageNet分類任務的冠軍,其網路結構沒什麼改進,只是調了參數,性能較AlexNet提升了不少。
貢獻點:
- 使用更小的卷積核,更小的滑動步長
將AlexNet第一層卷積核由11變成7,滑動步長由4變為2。
- VGGNet(2014年)
成績:
VGGNet是2014年ImageNet競賽定位任務的第一名和分類任務的第二名中的基礎網路。
貢獻點:
- 使用多個小的卷積核代替大的卷積核
上圖為兩個3X3的卷積核代替一個5X5大的卷積核,在降低參數的同時並建立了更多的非線性變換,使得網路對特徵的學習能力更強。
- 有規則的卷積-卷積-池化操作
VGGNet包含多個conv->conv->max pool這樣的結構。
- GoogLeNet(2014年)
成績:
GoogLeNet在2014年的ImageNet分類任務上擊敗了VGGNet奪得冠軍,它在加深網路的同時(22層),也在網路結構上做了創新,引入Inception結構代替了單純的卷積+激活的傳統操作。
GoogLeNet包括多個版本,如下所示:
Inception V1貢獻點:
- 引入Inception結構
該Inception結構中卷積核的滑動步長為1,通過3×3池化、以及1×1、3×3和5×5這三種不同尺度的卷積核,一共4種方式對輸入做特徵提取。
- 中間層的輔助loss單元
GoogLeNet網路結構中有3個loss單元,這樣的網路設計是為了幫助網路的收斂,在中間層加入輔助計算的loss單元,目的是計算損失時讓低層的特徵也有很好的區分能力,從而讓網路更好地被訓練。
- 全連接層替換為簡單的全局平均pooling
減少參數,提高計算效率。
Inception V2貢獻點:
- 引入BN層,減少Internal Covariate Shift問題
Batch Normalization:批標準化,對每一個 mini-batch 數據進行標準化處理,使輸出規範化到 N(0,1) 的正態分布,減少了Internal Covariate Shift(內部神經元分布改變)。
- 引用了VGGNet中使用多個小的卷積核代替大的卷積核的特性
Inception V3貢獻點:
- Factorization into small convolutions
將一個較大的二維卷積拆成兩個較小的一維卷積,如下圖所示:
上圖為3X3卷積拆成1X3卷積和3X1卷積,也可以將7X7卷積拆成1X7卷積和7X1卷積。
Inception V4,Inception-ResNet-V1,Inception-ResNet-V2貢獻點:
什麼?這麼多? 這些都是Inception結合了 ResNet 中的Residual Connection,或結合 ResNet 可以極大地加速訓練,同時極大提升性能,是不是覺得Residual Connection, ResNet很強大,那我們就繼續往下看神奇的ResNet吧。
- ResNet(2015年)
成績:
2015年何愷明推出的ResNet在ISLVRC和COCO上橫掃所有選手,獲得冠軍。
貢獻點:
- 網路非常深,已經超過百層,甚至千層
設計了一種殘差模塊讓我們可以訓練更深的網路。
殘差模塊結構如下圖所示:
上圖可以看出,數據經過了兩條路線,一條是常規路線,另一條則是捷徑(shortcut),直接實現單位映射的路線。
上圖展示了兩種形態的殘差模塊,左圖是常規殘差模塊,有兩個3×3卷積核組成,但是隨著網路進一步加深,這種殘差結構在實踐中並不是十分有效。針對這問題,右圖的「瓶頸殘差模塊」(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1這三個卷積層堆積而成,這裡的1×1的卷積能夠起降維或升維的作用,3×3的卷積可以在相對較低維度的輸入上進行,以降低參數從而達到提高計算效率的目的。
- 引入殘差模塊來解決退化問題
網路深度增加的一個問題在於這些增加的層是參數更新的信號,因為梯度是從後向前傳播的,增加網路深度後,比較靠前的層梯度會很小。這意味著這些層基本上學習停滯了,這就是梯度消失問題。
深度網路的第二個問題在於訓練,當網路更深時意味著參數空間更大,優化問題變得更難,因此簡單地去增加網路深度反而出現更高的訓練誤差,深層網路雖然收斂了,但網路卻開始退化了,即增加網路層數卻導致更大的誤差。
- DenseNet(2017年)
其中Dense Block的結構圖如下:
成績:
2017最佳論文。
貢獻點:
- 密集連接:加強特徵傳播,鼓勵特徵復用
DenseNet是一種具有密集連接的卷積神經網路。在該網路中,任何兩層之間都有直接的連接,也就是說,網路每一層的輸入都是前面所有層輸出的並集,而該層所學習的特徵圖也會被直接傳給其後面所有層作為輸入。
- 密集連接:緩解梯度消失問題
這種Dense Connection相當於每一層都直接連接input和loss,因此就可以減輕梯度消失現象,這樣更深的網路不是問題。
- 極大的減少了參數量,提高計算效率
由於每一層都包含之前所有層的輸出信息,因此它不需要再重新學習多餘的特徵圖,僅學習少量的幾層特徵圖就可以了。
三、聊一聊這些架構有哪些優缺點
在上面回顧部分,對經典架構中的各種優點(貢獻點)簡單的做了說明,那這些架構是不是也有一些沒有解決或沒有考慮到的問題,下面我們簡單的來聊一聊。
1.AlexNet、ZFNet、VGGNet
性能比GoogLeNet、ResNet、DenseNet要差一些,所以重點來聊GoogLeNet、ResNet、DenseNet。
2.GoogLeNet
- GoogLeNet以及 Inception的結構複雜嗎?
我認為當時沒有Residual Connection/Dense Connection這樣神奇的設計,在網路深度很難增加時,就在網路寬度上做了創新(即引入了Inception結構),並設計各種規格來提高性能,導致網路過於複雜。
3.ResNet
- 引入了Residual Connection訓練很深的網路,是否會導致有些層沒有作用?
實驗表明:丟掉某些層對網路沒有影響,即存在沒有作用的層。
問題1:沒有作用的層帶來的存儲及計算是浪費的?
問題2:沒有作用的層如何量化?即有多少?
- Block數量怎樣的配置為最好?
ResNet50中Block數量分別是(3, 4, 6, 3)
ResNet101中Block數量分別是(3, 4, 23, 3)
問題1:手動配置很難是最好的,那是否有更優的方案?
4.DenseNet
- 引入了Dense Connection每一層的輸入為前面所有層輸出特徵圖的堆疊,這些輸入的特徵圖都全部利用上了嗎?
實驗表明:存在某些層沒有全部利用輸入的所有特徵圖。
問題1:沒有利用上的特徵圖帶來的計算是浪費的?
問題2:沒有利用上的特徵圖如何量化?即有多少?
- Dense Connection的設計只能在Dense Block內嗎?
問題1:Block與Block之間的特徵圖沒有得到很好復用?
- Block數量怎樣的配置為最好嗎?
DenseNet121中Block數量分別是(6, 12, 24, 16)
DenseNet169中Block數量分別是(6, 12, 32, 32)
問題1:手動配置很難是最好的,那是否有更優的方案?
5.共存的問題
- 簡單/一般/複雜的任務都要經過這麼複雜的網路嗎?
問題1:很明顯,簡單的任務幾層的網路就可以做到,那是否有更優的方案?
問題2:某個場景只有一些簡單的任務,但由於內存等原因不能載入這麼複雜的網路,是否可以通過卸載該網路某些能力,就可以使用?
問題3:如果有更複雜的任務,該網路是否有通過擴展使它的能力更強?
四、架構設計思考
從AlexNet到ZFNet到VGGNet、GoogLeNet再到ResNet和DenseNet,網路越來越深、越來越寬、越來越複雜、性能也越來越高、解決反向傳播時梯度消失的方法也越來越巧妙,但如果讓我們來設計強大的網路我們會採用什麼樣的方法呢?當然最快最好的方法就是把各路大神的成果直接拿來使用:
- 數據增廣
- BN
- ReLU
- 全連接層替換為簡單的全局平均pooling
- 引入Residual Connection
- 引入Dense Connection
- 引入Inception相似結構
這裡不完全採用GoogLeNet中的Inception結構,而是做了簡化,如今網路在深度方面已不是問題,再加上已通過大量實驗表明,多個小的卷積替換大的卷積是可行的,並且多個小的卷積增加了更多的非線性變換,使得網路對特徵的學習能力更強,因此我認為網路在深度/寬度上堆疊如下簡單結構可以達到各種神奇的效果:
想降低參數或想升維/降維就可以在前面增加一個Conv 1X1如下圖所示:
還缺什麼?
現已經在網路深度、網路寬度都得到很好的解決,想一想還缺什麼?
也許你想到了,還缺網路廣度。
網路廣度? 網路廣度是什麼?請繼續看下面的內容。
五、SmartNet
SmartNet是什麼?是一個新的網路架構,從網路深度、網路寬度、網路廣度等方面來提高網路的性能,並來解決上面所提到的問題。
1.SmartNet架構
- 該架構怎麼看上去很像DenseNet,但又多了許多連接?
對,很像DenseNet,其實圖中的Smart Block就跟Dense Block幾乎差不多,只是把Connection連接也引用到Block與Block之間,使得特徵圖最大化復用。同時把Dense Connection改名為Smart Connection,把Dense Block改名為Smart Block。
- 為什麼把Dense Connection改名為Smart Connection?
這裡利用Smart Connection連接,來解決(「沒有利用上的特徵圖帶來的計算是浪費的?」)的問題,即通過Smart Connection連接表示沒有利用上的特徵圖不參與計算,細心的讀者可能已看到了箭頭線是虛線。
- 該架構中只看到第一層與後面的層有Smart Connection連接?
其實每一個Smart Block的輸入與前面所有的Smart Block的輸出都有Smart Connection連接,圖中只是省略了,畫太多連線就不好看了(給自己找一個借口,其實就是畫不好嘛!)。
- 為什麼把Dense Block改名為Smart Block?
先不著急,下面會有詳細的解釋。
- 架構中還有許多方向路標?DenseNet只有一個前進方向,SmartNet怎麼有兩個方向?
嗯,細心的讀者可能已發現,圖中上面的行所畫的特徵圖比下面的行所畫的特徵圖多,即想表達的意思讓該網格在圖中向右方向,表示的是網路的深度越來越深,性能也越來越高,在圖中向下方向,表示的是只要能達到目標就找最近的出口出來,如下圖所示:
這也是本文所指的網路廣度(網路需要自己學習根據任務的難易程度自動選擇最優的路徑)。
舉例子可能更容易理解,架構圖中第一行Smart Block學習4個特徵圖(這裡4是虛似值,實際可能是8,16,32,64,128等),下面我們假設Smart Block學習的特徵圖數寫在特徵圖右上角,並假設這個值為每個Smart Block運行時間單位數(可以這樣理解,學習1個特徵圖需要1個時間單位,學習8個特徵圖就需要8個時間單位),如下圖所示:
2.特徵圖上三角矩陣
什麼?特徵圖上三角矩陣?之前只知道特徵金字塔。
嗯,FPN就是近些年其中一種特別火也特別有用的特徵金字塔網路,但與這個特徵圖上三角矩陣可不是同一個東西。該特徵圖上三角矩陣是統一存儲(網路學習出來的)特徵圖的地方並共享給後面所有Block來使用。
3.網路中幾個關鍵點
- 最優的路徑?
網路需要自己學習選擇最優的路徑。(這個可以考慮使用Condition GAN來訓練生成一些隱信息來控制或使用強化學習)。
- Smart Connection?
網路需要自己學習選擇對Block有用的特徵圖。
- Smart Block?
為了更加智能,Block中的層數最強的網路應該是自己學習得到的,這也就是為什麼把Dense Block改名為Smart Block的原因。
- 每組Block輸出的特徵圖尺寸不一樣?
可以採用不同大小的pooling或採用Fast/Faster RCNN中的ROI Pooling對不同大小的特徵圖映射到固定的大小。
- 網路的參數?
這個同DenseNet一樣,由於每一層都包含之前所有層的輸出信息,因此它不需要再重新學習多餘的特徵圖,僅學習少量的幾層特徵圖就可以了。
- 多個出口?
後一個出口是對前一個出口的增強。
即input4>input3>input2>input1。
- 增減衣服最簡易操作原則?
該網路符合我們從小都懂的一個增減衣服最簡易操作原則,即天熱時,減去最外層的衣服,天冷時,在最外層基礎上增加一層衣服。
這樣的網路優勢很多,網路可以按出口存儲,按出口載入。
對於一般的任務,只載入前幾個出口相關的參數即可,甚至以後網路還有類似GC功能(垃圾回收器),動態載入與回收出口相關的參數來提高運行效率。
- 如何訓練?
一個出口一個出口訓練。
題外話:眾所都知目前的人工神經網路只學習W與b參數,可能還存在另外的參數需要學習,來使得我們的網路更強。
4.總結
為了我們的人工智慧更加智能,最強的網路應該是在我們給定的目標下(如:內存、計算時間、正確率等),網路會自動初化化如上面所說的特徵圖上三角矩陣大小,甚至通過學習來調整特徵圖上三角矩陣的大小,並學習選擇最優的路徑。這個時候我們好像只需要給定幾個超參數,其餘的一切網路都會自己學習到。
在這裡我們把這最強的網路賦能給原始的CNN。
有了這樣的網路我們是不是不用關心AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet、SmartNet、甚至是已在路上的XXXNet或未來的YYYNet,只需要關心的是我們使用CNN卷積神經網路就可以了。
多管齊下、化繁為簡、豈不美哉!!!
是時候給出開頭問題的答案了。
最美的卷積神經網路是什麼?
我認為最美的卷積神經網路是:
在CNN中我認為最美的卷積是:
以上網路還有很多問題值得去思考,這裡只是拋出想法,本人在這方面資歷尚淺,可能有許多不準確或不正確的地方,歡迎指正及提出您們寶貴的意見與建議。
此文章是原創,若是轉載,請標明出處。
推薦閱讀:
※僅使用NumPy完成卷積神經網路CNN的搭建(附Python代碼)
※機器學習論文筆記(二)Practical Block-wise Neural Network Architecture Generation
※從下往上看--新皮層資料的讀後感 第三部分 MP神經元-70年前的逆向推演
※DLL:一個炙手可熱的快速深度神經網路庫