Deeplearnng.AI第四部分第二周、经典网络
文章目錄
- 2.1 為什么要看實際例子
- 2.2 經典網絡(Classic networks)
- LeNet-5
- AlexNet
- VGG-16
- 2.3 殘差網絡(Residual Networks-ResNets)
- 2.4 殘差網絡為什么有用? (Why ResNets Work?)
- 2.5 網絡中的網絡和 1x1 卷積(Network in Network and 1x1 Convolutions)
- 2.6 Inception網絡簡介(Inception network motivation)
- 2.7 Inception網絡(Inception network)
2.1 為什么要看實際例子
2.2 經典網絡(Classic networks)
- LeNet-5.
- AlexNet
- VGGNet
LeNet-5
首先看看 LeNet-5 的網絡結構,假設你有一張 32×32×1 的圖片,LeNet-5 可以識別圖中的手寫數字,比如像這樣手寫數字 7。LeNet-5 是針對灰度圖片訓練的,所以圖片的大小只有 32×32×1。實際上 LeNet-5 的結構和我們上周講的最后一個范例非常相似,使用 6 個 5×5 的過濾器,步幅為 1。由于使用了 6 個過濾器,步幅為 1, padding 為 0,輸出結果為 28×28×6, 圖像尺寸從 32×32 縮小到 28×28。那個時候用的池化層是平均池化層。這里的過濾器的寬度為 2,步幅為 2,圖像的尺寸,高度和寬度都縮小了 2 倍,輸出結果是一個 14×14×6 的圖像。接下來是卷積層,我們用一組 16 個 5×5 的過濾器,新的輸出結果有 16 個通道。LeNet-5 的論文是在 1998 年撰寫的,當時人們并不使用 padding,或者總是使用 valid 卷積,這就是為什么每進行一次卷積,圖像的高度和寬度都會縮小,所以這個圖像從 14 到 14 縮小到了10×10。然后又是池化層,高度和寬度再縮小一半,輸出一個 5×5×16 的圖像。將所有數字相乘,乘積是 400。下一層是全連接層,在全連接層中,有 400 個節點,每個節點有 120 個神經元,這里已經有了一個全連接層。但有時還會從這 400 個節點中抽取一部分節點構建另一個全連接層,就像這樣,有 2 個全連接層。最后一步就是利用這 84 個特征得到最后的輸出,我們還可以在這里再加一個節點用來預測y^\hat yy^? 的值, y^\hat yy^? 有 10 個可能的值,對應識別 0-9 這 10 個數字。在現在的版本中則使用 softmax函數輸出十種分類結果,而當時的LeNet-5 的輸出層用了另外一種現已很少用的分類器。
讀到這篇經典論文時,你會發現,過去,人們使用 sigmod 函數和 tanh 函數,而不是ReLu 函數,這篇論文中使用的正是 sigmod 函數和 tanh 函數。這種網絡結構的特別之處還在于,各網絡層之間是有關聯的,這在今天看來顯得很有趣。
AlexNet
AlexNet 首先用一張 227×227×3 的圖片作為輸入,實際上原文中使用的圖像是 224×224×3,但是如果你嘗試去推導一下,你會發現 227×227 這個尺寸更好一些。第一層我們使用 96 個11×11 的過濾器,步幅為 4,由于步幅是 4,因此尺寸縮小到 55×55,縮小了 4 倍左右。然后用一個 3×3 的過濾器構建最大池化層,f=3,步幅s為 2,卷積層尺寸縮小為 27×27×96。接著再執行一個 5×5 的卷積,padding 之后,輸出是 27×27×256。然后再次進行最大池化,尺寸縮小到 13×13。再執行一次 same 卷積,相同的 padding,得到的結果是 13×13×384,384 個過濾器。再做一次 same 卷積,就像這樣。再做一次同樣的操作,最后再進行一次最大池化,尺寸縮小到 6×6×256。 6×6×256 等于 9216,將其展開為 9216 個單元,然后是一些全連接層。最后使用 softmax 函數輸出識別的結果,看它究竟是 1000 個可能的對象中的哪一個。
VGG-16
VGG-16 網絡沒有那么多超參數,這是一種只需要專注于構建卷積層的簡單網絡。首先用 3×3,步幅為 1 的過濾器構建卷積層,padding 參數為 same 卷積中的參數。然后用一個2×2,步幅為 2 的過濾器構建最大池化層。因此 VGG 網絡的一大優點是它確實簡化了神經網絡結構,下面我們具體講講這種網絡結構。假設要識別這個圖像,在最開始的兩層用 64 個 3×3 的過濾器對輸入圖像進行卷積,輸出結果是 224×224×64,因為使用了 same 卷積,通道數量也一樣。接下來創建一個池化層,池化層將輸入圖像進行壓縮,減少到 112×112×64。然后又是若干個卷積層,使用 129 個過濾器,以及一些 same 卷積112×112×128.接著再用 256 個相同的過濾器進行三次卷積操作,然后再池化,然后再卷積三次,再池化。如此進行幾輪操作后,將最后得到的 7×7×512 的特征圖進行全連接操作,得到 4096 個單元,然后進行 softmax 激活,輸出從 1000 個對象中識別的結果。順便說一下,VGG-16 的這個數字 16,就是指在這個網絡中包含 16 個卷積層和全連接層。
有些文章還介紹了 VGG-19 網絡,它甚至比 VGG-16 還要大,如果你想了解更多細節,閱讀由 Karen Simonyan 和 Andrew Zisserman 撰寫的論文。由于VGG-16 的表現幾乎和 VGG-19 不分高下,所以很多人還是會使用 VGG-16。該論文的亮點是,文中揭示了,隨著網絡的加深,圖像的高度和寬度都在以一定的規律不斷縮小,每次池化后剛好縮小一半,而通道數量在不斷增加,而且剛好也是在每組卷積操作后增加一倍。也就是說,圖像縮小的比例和通道數增加的比例是有規律的。從這個角度來看,這篇論文很吸引人。
2.3 殘差網絡(Residual Networks-ResNets)
非常非常深的神經網絡是很難訓練的,因為存在梯度消失和梯度爆炸問題。這節課我們學習跳躍連接(Skip connection),它可以從某一層網絡層獲取激活,然后迅速反饋給另外一層,甚至是神經網絡的更深層。我們可以利用跳躍連接構建能夠訓練深度網絡的 ResNets,有時深度能夠超過 100 層,讓我們開始吧。
ResNets 是由殘差塊(Residual block)構建的,首先我解釋一下什么是殘差塊。
在殘差網絡中有一點變化,我們將a[l]a^{[l]}a[l]直接向后,拷貝到神經網絡的深層,在 ReLU 非線性激活函數前加上a[l]a^{[l]}a[l] ,這是一條捷徑。a[l]a^{[l]}a[l] 的信息直接到達神經網絡的深層,不再沿著主路徑傳遞,這就意味著最后這個等式(a[l+2]=g(z[l+2])a^{[l+2]}=g(z^{[l+2]})a[l+2]=g(z[l+2]))去掉了,取而代之的是另一個 ReLU 非線性函數,仍然對 z[l+2]z^{[l+2]}z[l+2] 進行 g 函數處理,但這次要加上 a[l]a^{[l]}a[l] ,即: a[l+2]=g(z[l+2]+a[l])a^{[l+2]}=g(z^{[l+2]} +a^{[l]} )a[l+2]=g(z[l+2]+a[l]) , 也就是加上的這個a[l]a^{[l]}a[l] 產生了一個殘差塊。
在上面這個圖中,我們也可以畫一條捷徑,直達第二層。實際上這條捷徑是在進行 ReLU非線性激活函數之前加上的,而這里的每一個節點都執行了線性函數和 ReLU 激活函數。所以 a[l]a^{[l]}a[l] 插入的時機是在線性激活之后, ReLU 激活之前。除了捷徑,你還會聽到另一個術語“跳躍連接”,就是指 a[l]a^{[l]}a[l] 跳過一層或者好幾層,從而將信息傳遞到神·經網絡的更深層。
這并不是一個殘差網絡,而是一個普通網絡(Plain network),這個術語來自 ResNet 論文。
下面把它變成 ResNet 的方法是加上所有跳躍連接,正如前一張幻燈片中看到的,每兩層增加一個捷徑,構成一個殘差塊。如下圖所示,5 個殘差塊連接在一起構成一個殘差網絡。
如果沒有殘差,沒有這些捷徑或者跳躍連接,憑經驗你會發現隨著網絡深度的加深,訓練錯誤會先減少,然后增多。而理論上,隨著網絡深度的加深,應該訓練得越來越好才對。也就是說,理論上網絡深度越深越好。但實際上,如果沒有殘差網絡,對于一個普通網絡來說,深度越深意味著用優化算法越難訓練。實際上,隨著網絡深度的加深,訓練錯誤會越來越多。但有了 ResNets 就不一樣了,即使網絡再深,訓練的表現卻不錯,比如說訓練誤差減少,就算是訓練深達 100 層的網絡也不例外。有人甚至在 1000 多層的神經網絡中做過實驗,盡管目前我還沒有看到太多實際應用。但是對x的激活,或者這些中間的激活能夠到達網絡的更深層。這種方式確實有助于解決梯度消失和梯度爆炸問題,讓我們在訓練更深網絡的同時,又能保證良好的性能。也許從另外一個角度來看,隨著網絡越來深,網絡連接會變得臃腫,但是 ResNet 確實在訓練深度網絡方面非常有效。
2.4 殘差網絡為什么有用? (Why ResNets Work?)
上圖來自ResNet的論文。
2.5 網絡中的網絡和 1x1 卷積(Network in Network and 1x1 Convolutions)
過濾器為 1×1,這里是數字 2,輸入一張 6×6×1 的圖片,然后對它做卷積,起過濾器大小為 1×1×1,結果相當于把這個圖片乘以數字 2,所以前三個單元格分別是 2、4、6 等等。用 1×1 的過濾器進行卷積,似乎用處不大,只是對輸入矩陣乘以某個數字。但這僅僅是對于6×6×1 的一個通道圖片來說,1×1 卷積效果不佳。
如果是一張 6×6×32 的圖片,那么使用 1×1 過濾器進行卷積效果更好。具體來說, 1×1 卷積所實現的功能是遍歷這 36 個單元格,計算左圖中 32 個數字和過濾器中 32 個數字的元素積之和,然后應用 ReLU 非線性函數。
1×1 卷積可以從根本上理解為對這 32 個不同的位置都應用一個全連接層,全連接層的作用是輸入 32 個數字(過濾器數量標記為nc[l+1]n_c^{[l+1]}nc[l+1]?,在這 36 個單元上重復此過程),輸出結果是 6×6×#filters(過濾器數量),以便在輸入層上實施一個 non-trivial 計算。這種方法通常稱為 1×1 卷積,有時也被稱為 Network in Network,在林敏、陳強和楊學成的論文中有詳細描述。雖然論文中關于架構的詳細內容并沒有得到廣泛應用,但是 1×1 卷積或 Network in Network 這種理念卻很有影響力,很多神經網絡架構都受到它的影響,包括下一節要講的Inception網絡。
舉個 1×1 卷積的例子,相信對大家有所幫助,這是它的一個應用。假設這是一個 28×28×192 的輸入層,你可以使用池化層壓縮它的高度和寬度,這個過程我們很清楚。但如果通道數量很大,該如何把它壓縮為 28×28×32 維度的層呢? 你可以用 32個大小為 1×1 的過濾器,嚴格來講每個過濾器大小都是 1×1×192 維,因為過濾器中通道數量必須與輸入層中通道的數量保持一致。但是你使用了 32 個過濾器,輸出層為 28×28×32,這就是壓縮通道數(n c )的方法,對于池化層我只是壓縮了這些層的高度和寬度。
1×1 卷積層就是這樣實現了一些重要功能的(doing something pretty non-trivial),它給神經網絡添加了一個非線性函數,從而減少或保持輸入層中的通道數量不變,當然如果你愿意,也可以增加通道數量。后面你會發現這對構建 Inception 網絡很有幫助,我們放在下節課講。
2.6 Inception網絡簡介(Inception network motivation)
構建卷積層時,你要決定過濾器的大小究竟是 1×1,3×3 還是 5×5,或者要不要添加池化層。而 Inception 網絡的作用就是代替你來決定,雖然網絡架構因此變得更加復雜,但網絡表現卻非常好,我們來了解一下其中的原理。例如,這是你 28×28×192 維度的輸入層,Inception 網絡或 Inception 層的作用就是代替人工來確定卷積層中的過濾器類型,或者確定是否需要創建卷積層或池化層,我們演示一下。
如果使用 1×1 卷積,輸出結果會是 28×28×#(某個值),假設輸出為 28×28×64,并且這里只有一個層。
如果使用 3×3 的過濾器,那么輸出是 28×28×128。然后我們把第二個值堆積到第一個值上,為了匹配維度,我們應用 same 卷積,輸出維度依然是 28×28,和輸入維度相同,即高度和寬度相同。
接著用 5x5 的卷積核,same卷積保持維數不變,輸出28x28x32。
最后再加一個maxpooling,same padding,步長為1,之后加了一個 1x1x192 的32個卷積輸出為 28x28x32。
有了這樣的 Inception 模塊,你就可以輸入某個量,因為它累加了所有數字,這里的最終輸出為 32+32+128+64=256。Inception 模塊的輸入為 28×28×129,輸出為 28×28×256。這就是 Inception 網絡的核心內容,提出者包括 Christian Szegedy、劉偉、賈陽青、 Pierre Sermanet、Scott Reed、Dragomir Anguelov、Dumitru Erhan、Vincent Vanhoucke 和 Andrew Rabinovich。基本思想是 Inception 網絡不需要人為決定使用哪個過濾器或者是否需要池化,而是由網絡自行確定這些參數,你可以給網絡添加這些參數的所有可能值,然后把這些輸出連接起來,讓網絡自己學習它需要什么樣的參數,采用哪些過濾器組合。
但是所描述的Inception層有一個問題,即計算量大。下面我們來看看這個 5x5 的卷積核在該模塊中的計算量。
我們把重點集中在前一張幻燈片中的 5×5 的過濾器,這是一個 28×28×192 的輸入塊,執行一個 5×5 卷積,它有 32 個過濾器,輸出為 28×28×32。前一張幻燈片中,我用一個紫色的細長塊表示,這里我用一個看起來更普通的藍色塊表示。我們來計算這個 28×28×32 輸出的計算成本,它有 32 個過濾器,因為輸出有 32 個通道,每個過濾器大小為 5×5×192,輸出大小為 28×28×32,所以你要計算 28×28×32 個數字。對于輸出中的每個數字來說,你都需要執行 5×5×192 次乘法運算,所以乘法運算的總次數為每個輸出值所需要執行的乘法運算次數(5×5×192)乘以輸出值個數(28×28×32),把這些數相乘結果等于 1.2 億。即使在現在,用計算機執行 1.2 億次乘法運算,成本也是相當高的。下一張幻燈片會介紹 1×1 卷積的應用,也就是我們上節課所學的。為了降低計算成本,我們用計算成本除以因子 10,結果它從 1.2 億減小到原來的十分之一。請記住 120 這個數字,一會還要和下一頁看到的數字做對比。
這里還有另外一種架構,其輸入為 28×28×192,輸出為 28×28×32。其結果是這樣的,對于輸入層,使用 1×1 卷積把輸入值從 192 個通道減少到 16 個通道。然后對這個較小層運行5×5 卷積,得到最終輸出。請注意,輸入和輸出的維度依然相同,輸入是 28×28×192,輸出是 28×28×32,和上一頁的相同。但我們要做的就是把左邊這個大的輸入層壓縮成這個較小的的中間層,它只有 16 個通道,而不是 192 個。接下來我們看看這個計算成本,應用 1×1 卷積,過濾器個數為 16,每個過濾器大小為1×1×192,這兩個維度相匹配(輸入通道數與過濾器通道數),28×28×16 這個層的計算成本是,輸出 28×28×192 中每個元素都做 192 次乘法,用 1×1×192 來表示,相乘結果約等于 240萬。240 萬只是第一個卷積層的計算成本,第二個卷積層的計算成本又是多少呢?這是它的輸出,28×28×32,對每個輸出值應用一個 5×5×16 維度的過濾器,計算結果是 28x28x5x5x16x32=1000 萬。
所以所需要乘法運算的總次數是這兩層的計算成本之和,也就是 1240 萬,與上上張圖中的值做比較,計算成本從 1.2 億下降到了原來的十分之一,即 1240 萬。所需要的加法運算與乘法運算的次數近似相等,所以我只統計了乘法運算的次數。
2.7 Inception網絡(Inception network)
在上節中,你已經見到了所有的 Inception 網絡基礎模塊。在本視頻中,我們將學習如何將這些模塊組合起來,構筑你自己的 Inception 網絡。
有一個 28x28x192的輸入。
一、用64個 1x1 卷積作用得到 28x28x64的輸出,
二、用96個 1x1 卷積作用得到 28x28x96的中間值,接著用 128個 3x3 的same卷積作用得到 28x28x128的輸出,
三、用16個 1x1 卷積作用得到 28x28x16的中間輸出,接著用32個 5x5 的same卷積作用得到 28x28x32的輸出,
四、用 3x3 padding=same,步長為1的maxpool作用得到 28x28x192的中間輸出,接著用32個 1x1 的卷及作用得到 28x28x32 的輸出。
把這些通道疊起來得到一個 28x28x256 的輸出。這就是一個 Inception 模塊,而 Inception 網絡所做的就是將這些模塊都組合到一起。
這是一張取自 Szegety et al 的論文中關于 Inception 網絡的圖片,你會發現圖中有許多重復的模塊,可能整張圖看上去很復雜,但如果你只截取其中一個環節,就會發現這是在前面所見的 Inception 模塊。
最后,有個有趣的事實,Inception 網絡這個名字又是緣何而來呢?Inception 的論文特地提到了這個模因(meme,網絡用語即“梗”),就是“我們需要走的更深”(We need to godeeper),論文還引用了這個網址(http://knowyourmeme.com/memes/we-need-to-go-deeper),連接到這幅圖片上,如果你看過 Inception(盜夢空間)這個電影,你應該能看懂這個由來。
總結
以上是生活随笔為你收集整理的Deeplearnng.AI第四部分第二周、经典网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Deeplearnng.AI第四部分第一
- 下一篇: 深度学习笔记之DenseNets