架構之美-最強卷積神經網路架構設計初想

架構之美-最強卷積神經網路架構設計初想

來自專欄架構之美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.AlexNetZFNetVGGNet

性能比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:一個炙手可熱的快速深度神經網路庫

TAG:機器學習 | 神經網路 | 人工智慧 |