1. 經典深度神經網路架構解析 - VGG,ResNet,Inception
深度神經網路對於問題的抽象建立在我們可以通過合適的神經網路架構構造一個通用的函數逼近,使得我們可以從輸入樣本空間映射到目標樣本空間。這一聽起來簡單的任務在實際構建過程中需要耗費大量的計算和時間以完成模型試驗和迭代。而由於遷移學習的可行性,使得我們可以藉助已有的在特定分類任務中表現出色的架構來完成類似甚至看起來完全不相關的任務。在學習的過程中,閱讀了一些這些經皮飢典的網路架構的相關論文,在此做一個記錄。
VGG Net 與之前的經典網路結構相比最突出的特徵是大量的使用 3x3 (部分架構中還採用了 1x1 )的小卷積核,並且採用 same padding 來維持卷積前後的 w 和 h,Feature map 的縮放完全交給 2x2 的 max pooling 層來完成,此後基本上所有的卷積神經網路的卷積核都採用 3x3 的尺寸。也正因為採用這個簡單的、小的卷積核結構,才使得 VGG 成為同時代網路中最經典的深度神經網路。
在深度神經網路中採用小卷積核的原因:小卷積核通過多層疊加後可以在輸入層取得與大卷積核同等規模的感受野,且由於網路層次的增加會同步增加網路的容量 model capacity 和復雜度 model complexity,進一步地,通過疊加多個層次的卷積核還可以減少模型的參數:例如對於通道數為 C 的輸入和輸出來說,採用 7x7 的卷積核需要的參數是 7x7xCxC = 49C 2 個,而通過疊加 3 層 3x3 的卷積核所需要的參數數量為 3 x [3x3xCxC] = 27C 2 個。
在 VGG 的架構中,作者採用 1x1 卷積的主要目的在於增加網路中的非線性,採用與原有輸入特徵相同通道數量的 1x1 的卷積結構,執行卷積前後不改變特徵的表達的數量,但根據作者的經驗在同等架構下帶有 1x1 結構的網路表現不如 3x3 的網路,因此在後續廣為沿用的 VGG 架構都是單純的 3x3 網路。
一個值得注意的細節是,為了使得網路具有縮放不變性,作者在訓練時先將全部圖片縮放至 384x384 的尺寸,在此基礎上隨機裁剪 224x224 的圖片區域作為網路的輸入,最後再用經過在指定范圍內進行尺寸縮放的圖片進行微調。
另一個細節是作者在測試時採用了很多比較高明的技巧如 Ensemble 和 multi-crop 等方法使得測試的結果得到了一定的提升,不過這些提升一般只在競賽中有意義,在真實的生產環境中應用很少。
ResNet 的提出是基於這樣一個發現:直覺上深度神經網路應該的性能應該優於架構類似但相對層數更少的網路,但在實際情況中,隨著網路層次的加深,梯度消失 Vanishing gradient 的影響愈加明顯,網路的訓練變得異常困難。這個現象在作者看來反應出了通過非線性激活的神經網路來構建近似恆等映射是困難的,那麼我們可以反其道而行之,我們希望神經網路學習這個特定映射和恆等映射之間的差值,此時,由於給定了一個參考基準,使得整個學習的過程更加的容易,這兆擾個想法實在是精妙!
在此基礎上 ResNet 網路的構建都是基於上圖中基本單元構成的。
Inception 這個系列目前共有燃猜返 5 篇文章,包括:
其中第一篇是對 Inception 架構的一個簡單介紹,第二篇則是在改進 Inception 網路的過程中發現了 Batch Normalization 這一被後續廣泛使用的提高網路穩健性的方法,第三篇 Rethinking the Inception Architecture for Computer Vision 這一篇相比前兩篇論文信息量更大,作者給了很多構建深度卷積神經網路的建議,並且在這一篇中進一步改進了下圖中第一版的 Inception Mole,將 5x5 的卷積核改為兩個 3x3 卷積層的疊加,這是一篇十分誠意的論文,值得反復閱讀。
相比於 VGG Net,Inception 網路不再是基本的卷積神經網路的堆疊,取而代之的是對不同變體的 Inception Mole 進行疊加。盡管從結構上 Inception 網路更加復雜,但由於大量的使用了 1x1 的卷積核,使得參數量居然比 VGG 還要小。
在此我們除了盲目復雜化網路以外,一個不可避免的問題是:為什麼 Inception 網路會有更有的表現?
一種說法是我們在構建網路的過程中很難知道如何選擇合適的卷積核,而 Inception Mole 使得我們可以嘗試多個不同的選擇,讓網路自己確定哪個方式更加合適。
另一種說法來自本系列的第 5 篇文章,keras 的作者 Francois Chollet 給出的解釋是,在傳統的卷積神經網路中,卷積核不僅需要在寬度和高度方向上建立特徵識別能力,還要在深度(通道)方向上也構建這一能力。再一次地, 知識的表示形式決定了學習的難易程度 ,我們是否可以將這兩個方向的特徵識別分離開來,而簡化這一任務?這就是 Inception 網路及後續在此基礎上衍生出的 Xception 網路的核心思想。
2. 經典CNN網路結構-AlexNet、VGG、GoogleNet、ResNet)
AlexNet之所以能夠成功,跟這個模型設計的特點有關,主要有:
使用了非線性激活函數:ReLU
防止過擬合的方法:Dropout,數據擴充(Data augmentation)
其他:多GPU實現,LRN歸一化層的使用
GoogLeNet(從Inception v1到v4的演進)
2014年,GoogLeNet和VGG是當年ImageNet挑戰賽(ILSVRC14)的雙雄,GoogLeNet獲得了第一名、VGG獲得了第二名,這兩類模型結構的共同特點是層次更深了。
VGG 繼承了 LeNet 以及 AlexNet 的一些框架結構,而 GoogLeNet 則做了更加大膽的網路結構嘗試,雖然深度只有22層,但大小卻比 AlexNet 和 VGG 小很多。
GoogleNet參數為500萬個,AlexNet參數個數是GoogleNet的12倍,VGGNet參數又是AlexNet的3倍,因此在內存或計算資源有限時,GoogleNet是比較好的選擇;從模型結果來看,GoogLeNet的性能卻更加優越。
解決深度網路(過擬合, 參數過多, 梯度彌散)這些問題的方法當然就是在增加網路深度和寬度的同時減少參數,為了減少參數,自然就想到將全連接變成稀疏連接。但是在實現上,全連接變成稀疏連接後實際計算量並不會有質的提升,因為大部分硬體是針對密集矩陣計算優化的,稀疏矩陣雖然數據量少,但是計算所消耗的時間卻很難減少。那麼,有沒有一種方法既能保持網路結構的稀疏性,又能利用密集矩陣的高計算性能。大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能, 如人類的大腦是可以看做是神經元的重復堆積,因此,GoogLeNet團隊提出了Inception網路結構,就是構造一種「基礎神經元」結構,來搭建一個稀疏性、高計算性能的網路結構。
原始輸入圖像為224x224x3,且都進行了零均值化的預處理操作(圖像每個像素減去均值)。
輸入為224x224的RGB圖像,『#3x3 rece』和『#5x5 rece』表示3x3和5x5卷積之前1x1的卷積核的個數。
之所以卷積核大小採用1、3和5,主要是為了方便對齊。設定卷積步長stride=1之後,只要分別設定pad=0、1、2,那麼卷積之後便可以得到相同維度的特徵,然後這些特徵就可以直接拼接在一起了。
3. RepVGG:VGG,永遠的神! | 2021新文
論文: RepVGG: Making VGG-style ConvNets Great Again
目前,卷積網路的研究主要集中在結構的設計。復雜的結構盡管能帶來更高的准確率,但也會帶來推理速度的減慢。影響推理速度的因素有很多,計算量FLOPs往往不能准確地代表模型的實際速度,計算量較低的模型不一定計算更快。因此,VGG和ResNet依然在很多應用中得到重用。
基於上述背景,論文提出了VGG風格的單分支網路結構RepVGG,能夠比結構復雜的多分支網路更優秀,主要包含以下特點:
當然,想要直接訓練簡單的單分支網路來達到與多分支網路一樣的精度是很難的。由於多分支網路中的各個分支在訓練時的權重變化不定,所以多分支網路可看作是大量簡單網路的合集,而且其能夠避免訓練時的梯度彌散問題。雖然如此,但多分支網路會損害速度,所以論文打算訓練時採用多分支網路,而推理時仍然使用單分支網路,通過新穎的結構性重參數化(structural re-parameterization)將多分支網路的權值轉移到簡單網路中。
由於多分支的存在,使得多分支網路相當於一個包含大量小網路的集合,但其推理速度會有較大影響,所以論文僅在訓練時使用多分支進行訓練,訓練完成後將其權值轉移到簡單網路中。為了夠包含大量更簡單的模型,論文在 卷積的基礎上添加ResNet-like的identity分支和 分支構成building block,然後堆疊成訓練模型。假設多分支網路包含 個building block,則其可以表達 種簡單網路結構。
在開始描述最重要的權值轉換之前,先進行以下定義:
假設 、 以及 ,則有:
若輸入輸出維度不相同,則去掉identity分支,即只包含前面兩項。 代表是推理時的BN函數,一般而言,對於 ,有:
權值轉換的核心是將BN和其前面的卷積層轉換成單個包含偏置向量的卷積層。假設 為從 轉換得到的核權值和偏置,則有:
轉換後的卷積操作與原本的卷積+BN操作是等價的,即:
上述的轉換也可應用於identity分支,將identity mapping視作卷積核為單位矩陣的 卷積。
以上圖為例,在 的情況下,將3個分支分別轉換後得到1個 卷積和兩個 卷積,最終的卷積偏置由3個卷積的偏置直接相加,而最終的卷積核則是將兩個 卷積核加到 卷積核中心。需要注意的是,為了達到轉換的目的,訓練時的 卷積分支和 卷積分支需要有相同的步長,而 卷積的填充要比 卷積的小一個像素。
RepVGG是VGG風格的網路,主要依賴 卷積,但沒有使用最大池化,而是使用步長為2的 卷積作為替換。RepVGG共包含5個階段,每個階段的首個卷積的步長為2。對於分類任務,使用最大池化和全連接層作為head,而其它任務則使用對應的head。
每個階段的層數的設計如上表所示,除首尾兩個階段使用單層外,每個階段的層數逐漸增加。而每個階段的寬度則通過縮放因子 和 進行調整,通常 ,保證最後一個階段能夠提取更豐富的特徵。為了避免第一階段採用過大的卷積,進行了 的設置。
為了進一步壓縮參數,論文直接在特定的層加入分組卷積,從而達到速度和准確率之間的trade-off,比如RepVGG-A的3rd, 5th, 7th, ..., 21st層以及RepVGG-B的23rd, 25th和27th層。需要注意,這里沒有對連續的層使用分組卷積,主要為了保證通道間的信息交流。
SOTA分類在120epoch訓練的性能對比。
200epoch帶數據增強的分類性能對比。
對比多分支效果。
其它操作與結構重參數化的對比實驗。
作為分割任務的主幹網路的表現。
RepVGG將訓練推理網路結構進行獨立設計,在訓練時使用高精度的多分支網路學習權值,在推理時使用低延遲的單分支網路,然後通過結構重參數化將多分支網路的權值轉移到單分支網路。RepVGG性能達到了SOTA,思路簡單新穎,相信可以在上面做更多的工作來獲得更好的性能。
4. 深度學習演算法有哪些卷積神經網路
這個太多了,卷積是一種結構,凡是包含這種結構的深度網路都是卷積神經網路。比較知名的有:VGG、GoogleNet、Resnet等
5. caffe和vgg-16和googlenet的區別
三者都屬於深度學習領域的術語。
caffe是目前在圖像領域應用最為廣泛的深度學習平台,許多國內外的大牛都使用caffe做為實驗平台,主要原因個人認為有兩個,一是caffe發展較早,隨著時間的積累積聚了大量的深度學習研究成果,例如能夠直接運行的代碼和使用預先訓練好的模型,可以很方便的進行實驗;二是後人如果想與之前的方法進行比較,就需要保持除方法外的其它因素一致,如所使用的數據以及實驗使用的平台。
vgg-16是一種深度卷積神經網路模型,16表示其深度,是alexnet後比較有代表性的深度模型之一,在圖像分類等任務中取得了不錯的效果
googlenet是google設計的一種深度卷積神經網路模型,第一版深度可至22層,這一網路採納了稀疏學習的思想,通過稀疏網路的參數來加大網路規模。
類似caffe的平台還有tensorflow, theano, torch, paddle等等
類似vgg-16和googlenet這樣的網路結構更是多種多樣,比較有代表性的就是alexnet, resnet
6. Lecture 9 卷積神經網路架構
首先回顧一下在數字識別領域有巨大成功的LeNet-5,該網路結構為 [CONV-POOL-CONV-POOL-FC-FC]。卷積層使用5x5的卷積核,步長為1;池化層使用2x2的區域,步長為2;後面是全連接層。如下圖所示:
而2012年的 AlexNet 是第一個在ImageNet大賽上奪冠的大型CNN網路,它的結構和LeNet-5很相似,只是層數變多了——[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-Max POOL3-FC6-FC7-FC8],共有5個卷積層、3個池化層、2個歸一化層和三個全連接層。如下圖所示:
之所以分成上下兩個部分,是因為當時的GPU容量太小,只能用兩個來完成。還有一些細節是:
AlexNet奪得ImageNet大賽2012的冠軍時,將正確率幾乎提高了10%,2013年的冠軍是ZFNet,和AlexNet使用相同的網路架構,只是對超參數進一步調優:
這樣將錯誤率從16.4%降低到11.7%
14年的冠亞軍GoogLeNet和VGG分別有22層和19層,下面來分別介紹。
VGG 相對於AlexNet使用更小的卷積核,層數也更深。VGG有16層和19層兩種。卷積核只使用3x3,步長為1,pad為1;池化區域2x2,步長為2。
那麼為什麼使用3x3的小卷積核呢?
下面看一下VGG-16的參數和內存使用情況:
VGG網路的一些細節是:
下面來看一下分類的第一名,GoogLeNet。
先說明 GoogLeNet 的一些細節:
「Inception」模塊 是一種設計的比較好的區域網拓撲結構,然後將這些模塊堆疊在一起。
這種拓撲結構對來自前一層的輸入,並行應用多種不同的濾波操作,比如1x1卷積、3x3卷積、5x5卷積和3x3池化。然後將所有濾波器的輸出在深度上串聯在一起。如下圖所示:
但是這種結構的一個問題是計算復雜度大大增加。比如考慮下面的網路設置:
輸入為28x28x256,而串聯後的輸出為28x28x672。(假設每個濾波操作都通過零填充保持輸入尺寸)並且運算花費也非常高:
由於池化操作會保持原輸入的深度,所以網路的輸出一定會增加深度。解決辦法是在進行卷積操作前添加一個「瓶頸層」,該層使用1x1卷積,目的是保留原輸入空間尺寸的同時,減小深度,只要卷積核的數量小於原輸入的深度即可。
使用這種結構,同樣的網路參數設置下,的確會減少計算量:
最終得到的輸出為28x28x480。此時總運算量為:
Inception mole堆疊成垂直結構,這里方便描述,將模型水平放置:
所以含參數的層總計3+18+1 = 22層。此外,橙色部分的層不計入總層數,這兩塊的結構都是:AveragePool 5x5+3(V) - Conv 1x1+1(S) - FC - FC - SoftmaxActivation - Output。「該相對較淺的網路在此分類任務上的強大表現表明,網路中間層產生的特徵應該是非常有區別性的。 通過添加連接到這些中間層的輔助分類器,我們期望在分類器的較低階段中鼓勵區分,增加回傳的梯度信號,並提供額外的正則化。 這些輔助分類器採用較小的卷積核,置於第三和第六個Inception mole的輸出之上。 在訓練期間,它們的損失會加到折扣權重的網路總損失中(輔助分類的損失加權為0.3)。 在預測時,這些輔助網路被丟棄。」——引自原論文
從2015年開始,網路的層數爆發式的增長,15-17年的冠軍都是有152層,開始了「深度革命」!
ResNet 是一種非常深的網路,使用了殘差連接。細節是:
表現這么好的ResNet僅僅是因為深嗎?答案是否定的,研究表明一個56層的卷積層堆疊網路訓練誤差和測試誤差都比一個20層的網路要大,並且不是過擬合的原因,而是更深的網路優化更難。但是一個更深的模型至少能和一個較淺的模型表現一樣好,如果想把一個較淺的層變成較深的層,可以用下面的方式來構建:將原來比較淺的層拷貝到較深的層中,然後添加一些等於本身的映射層。現在較深的模型可以更好的學習。
ResNet通過使用多個有參層來學習輸入與輸入輸出之間的 殘差映射( resial mapping ) ,而非像一般CNN網路(如AlexNet/VGG等)那樣使用有參層來直接學習輸入輸出之間的 底層映射( underlying mapping) 。
若將輸入設為X,將某一有參網路層映射設為H,那麼以X為輸入的該層的輸出將為H(X)。通常的CNN網路會直接通過訓練學習出參數函數H的表達式,從而直接得到 X 到 H(X) 的映射。而 殘差學習 則是致力於使用多個有參網路層來學習輸入到輸入、輸出間的殘差(H(X) - X)的映射,即學習 X -> (H(X) - X) ,然後加上X的 自身映射(identity mapping) 。也就是說網路的輸出仍然是 H(X) - X + X = H(X),只是學習的只是 (H(X) - X),X部分直接是本身映射。
殘差學習單元通過本身映射的引入在輸入、輸出之間建立了一條直接的關聯通道,從而使得強大的有參層集中精力學習輸入、輸出之間的殘差。一般我們用 來表示殘差映射,那麼殘差學習單元的輸出即為: 。當輸入、輸出通道數相同時,自然可以直接使用 X 進行相加。而當它們之間的通道數目不同時,我們就需要考慮建立一種有效的自身映射函數從而可以使得處理後的輸入 X 與輸出 Y 的通道數目相同即 。
當X與Y通道數目不同時,有兩種自身映射方式。一種是簡單地將X相對Y缺失的通道直接補零從而使其能夠相對齊,另一種則是通過使用1x1的卷積來表示 Ws 映射從而使得最終輸入與輸出的通道一致。
實驗表明使用一般意義上的有參層來直接學習殘差比直接學習輸入、輸出間映射要容易得多(收斂速度更快),也有效得多(可通過使用更多的層來達到更高的分類精度)。比如在極端情況下,如果自身映射是最優的,那麼將殘差設為零比通過使用一堆非線性層進行自身映射更容易。
完整的網路結構如下:
對於ResNet-50+的網路,為提高計算效率,使用類似GoogLeNet的「瓶頸層」。像Inception模塊那樣通過使用1x1卷積來巧妙地縮減或擴張特徵圖維度從而使得3x3 卷積的卷積核數目不受上一層輸入的影響,它的輸出也不會影響到下一層。不過它純是為了節省計算時間進而縮小整個模型訓練所需的時間而設計的,對最終的模型精度並無影響。
ResNet的實際訓練如下:
實際的訓練效果為可以堆疊很多的層而不使准確率下降:152在ImageNet上, 1202層在CIFAR上。現在和預想中的一致,網路越深,訓練准確率越高。橫掃了2015年所有的獎項,第一次超過人類的識別率。
下面左圖通過Top1准確率來比較各種網路的准確性;右圖是不同網路的運算復雜度,橫軸為計算量,圓圈大小表示內存佔用。其中 Inception-v4是 Resnet + Inception。
圖中可以看出:
還可以比較前向傳播時間和功率消耗: