完整的視頻課堂鏈接如下:
完整的視頻課堂投影片連接:
前一課堂筆記連結:
Menu this round (Case Study)
- AlexNet
- VGG net
- GoogleNet
- ResNet
AlexNet
此神經網絡大致結構(8層):
CONV1 >>> MAX POOL1 >>> NORM1 >>> CONV2 >>> MAX POOL2 >>> NORM2
>>> CONV3 >>> CONV4 >>> CONV5 >>> MAX POOL3 >>> Fully Connected6 >>> FC7 >>> FC8
** 注意這邊標註的是一個大致的 AlexNet 框架組成內容,並沒有寫出細節。
開始估算整個神經網絡需要佔用的資源前,先回憶一下神經個數計算方法(點擊),如果現在有個 input image: 227*227*3,使用 96 個 filter matrix: 11*11,步距爲 4 單位,根據沒有 zero padding 的算法:[(N - F) / stride] + 1;得出的 output volumn 即爲:55*55*96;而實際需要參與計算的參數個數則爲:(11*11*3)*96 = 34848(個)。
依照同樣的方式持續算下去更深層神經網絡每一層的情況,注意 POOLING 層是沒有參數的,NORM 層是一種藉由數學算法調整全體數據集分佈的環節,也是沒有參數參與的,詳情見講義第九頁:
計算這些神經網絡細節的目的是爲了能夠更好的讓神經網絡框架與硬件匹配,對於不同水平性能的硬件(如老式的 GPU)可能沒有那麼多的暫存空間讓神經網絡部署,這種情況我們需要有技巧的避開,避開方法可以是換一個更高級的硬件,或是用兩個沒那麼高級的硬件聯合容納該神經網絡。
AlexNet 也是在2012年崛起的一種神經網絡,直接在辨識的準確度上拉高了水平幾乎 10% 大幅領先,風靡了一陣子。後來才又被 ZFNet (11.7%) 打敗,接着就是 VGG (7.3%) -> GoogleNet (6.7%) -> ResNet (3.57%)。發展的走勢基本上沿着更深層的神經網絡算法發展,最深可以到 19~22 層的深度,訓練這些無數個 parameters 需要耗時約兩週,用高級的計算機持續運行。
VGGNet
此神經網絡大致結構(16層):
CONV1-1 >>> CONV1-2 >>> POOL1 >>> CONV2-1 >>> CONV2-2 >>> POOL2 >>> CONV3-1 >>> CONV3-2 >>> POOL3 >>> CONV4-1 >>> CONV4-2 >>> CONV4-3 >>> POOL4 >>> CONV5-1 >>> CONV5-2 >>> CONV5-3 >>> POOL5 >>> FC6 >>> FC7 >>> FC8 >>> SOFTMAX
改進後的此神經網絡深度較 AlexNet 深了 2 倍,並且 filter matrix 縮小成 3*3,隨着層數越深,使用的 filter matrix 也更多。卷積核縮小並把神經層加深,就這個 3*3 的 case 來說其實是等效於 7*7 的單層卷積核效果,但是小一點的核可以讓整體參數不那麼多,對於硬件資源應用來說比較節約,也可以插入更多非線性影響因子,可以更好的擬合自然中不規則的問題,故這是個比較推崇的方法。
更多關於計算神經網絡架構佔用內存空間的算式,可以自行參考講義鏈接裏的內容。
這個方法有 16 與 19 層的深度差別,19 層的準確率不會好多少,同時佔用的內存也不會多太多,兩種層數都是可以用的模型。做遷移學習的時候,前面 CONV 與 POOLING 的層訓練出來的參數尤其好用,只要把 FC 用來分辨 1000 種結果輸出的層與前幾個同爲 FC 的層加以改造,就可以在沒有大量數據的情況下完成準確的訓練模型,可以算是一種電腦的“大腦移植手術”!
GoogleNet
設計初衷就是讓計算更有效率,即便神經網絡深到了 22 層。
對上述所有的神經網絡做了比較,GoogleNet 引入了 inception module 的概念,並去除了 FC 全連接層,讓整個神經網絡的參數少至只有約 5 百萬個,甚至是隻有 8 層神經網絡的 AlexNet 參數量的 1/12,不止有效提升準確性,還提升效率。
Inception module
可以看成它爲神經網絡中的神經網絡,爲了讓個別神經元裏面的數據佈局更爲巧妙而設計。module 裏面的內容主要就是平行處理多種不同尺寸的卷積核,和一個 Pooling operation,並且把個別輸出結果堆疊起來成爲下一層神經網絡的輸入數據。
但是要能夠疊起來條件是尺寸要一樣,因此越大的 filter matrix 就用 zero padding 的方式想辦法把尺寸硬是維持成最小的 filter matrix 卷積出來的大小。不過隨着層數增加,input 的“厚度”也會跟着越來越可怕,這將佔用大量的計算資源。
解決辦法使用 bottleneck filter,它和 1*1 卷積核是同個概念,用小於 input data 厚度的卷積核數做一次 CONV 讓厚度變薄將大幅減輕計算負擔,並不會對準確性造成什麼影響。
完整 GoogleNet 結構如下:
- Stem Network: CONV >>> POOL >>> CONV >>> POOL
- Inception module
- 2.1 Auxiliary classification outputs 用於在較淺層的神經網絡中插入額外的梯度 - Classifier output without FC layers
ResNet
這個 model 一共有 152 層神經網絡,並且再一次擊敗所有對手,達到 3.57 的錯誤率,直接又低了 GoogleNet 一個層級,其全名叫做 Residual Net,使用的是 residual connections 的方法達到百餘層的深度,同時還能夠保證如此深的神經網絡不會讓效果打折扣。
The link of the published paper: https://arxiv.org/pdf/1512.03385v1.pdf
從理論上講,越深的神經網絡就像是一個站在越高的巨人肩膀上分類問題,是可以有越好的分類結果的,然而如果層數太深了,很多時候會再次擡高損失值,進而逐漸遠離最優的解,並且整個網絡也會因爲梯度彌散的問題越難實現 optimization ,對於之前的神經網絡技術來說,雖然有一些輔助算法能夠讓梯度不要爆炸或是消失,但是都沒有根本上解決這個問題,只是可以讓事情延遲發生,到了非常深的網絡時,歸一化的算法也將逐漸失靈。
不過如果我們在訓練的時候只要把某些神經層的影響權重調整成 1 的話,即便是非常深的神經網絡,也是可以讓第 n 層的準確率在其下一層的時候維持,因此 Residual Network 方法基於不變的道理,使用了一個神經網絡 short cut
的概念呢提供了快速通道,如下圖:
原本一般我們看到的神經網絡計算公式上也因此有所調整,如上圖公式所見,原本神經網絡下一層的輸入是經過激勵函數後大的改變結果,現在只更新上一層和下一層之間的差異
,即 optimize 殘差項,第 n+1 層處理出來的 H(x) 與原本第 n 層的輸入 x 相減得到的項 F(x) = H(x) - x,Residual Network 也因此得名,中文又名爲:殘差神經網絡。
改進過的神經網絡整個結構中,都是由一個一個 building block 組成的,每一個 block 都有一個代表 shortcut 的 X identity,而原本通過神經網絡 cell 用來算 H(x) 的調參機制則改成目標瞄準計算 F(x),只關注對 F(x) 參數上的優化,計算過程中如果出現 matrix 不匹配的情況,則使用 zero padding & 1x1 CONV 去補齊,此方法同時解決了兩個問題:
- Gradient Vanish: 由於更新的項是 F(X),在微分求最小值的時候會把原本的輸入作爲常數項微分成 1,很大程度上保證了深層中梯度微分到不見得窘境。
- Loss Degradation: 只更新基於上一層網絡的結果而衍生出來的變化,一定程度上也記錄下了諸多歷史信息,上層的神經網絡是多少損失值,很大程度上也就能夠繼承到下一層去,不至於重新飆升到不良狀態。
並且相對於在每一層之間重新更新一次整體的變化,使之趨近於目標值,只更新 差異 本身可以更快的達到最後更新的狀態。而一旦到了深層的神經網絡中,由於前面累計的 input data 厚度可能會變得非常大,所以 ResNet 中也會套用到在 GoogleNet 介紹到的 bottleneck 方法,用 1x1 的 CONV 卷積核把整個厚度縮減,有利於節約計算資源。
神經網絡細節補充:
- 殘差網絡原理講解: https://blog.csdn.net/mao_feng/article/details/52734438
- 三種前沿神經網絡: https://www.jiqizhixin.com/articles/2017-08-19-4
- ResNet及其變體(簡書): https://www.jianshu.com/p/e96b473926ed
並且使用 ResNet 可以讓整個資源的負載在有深層神經網絡的情況下還很“輕”,同時保持物體鑑別的準確性,詳細圖表統計可以參考頂部鏈接之一的講義 pdf。
等 ResNet 方法被提出來之後,它就被廣泛應用到各個算法裏面,排列組合互相搭配,深度或是廣度的提升狀況看最後輸出結果是否得到更進一步的準確,其他神經網絡架構如下:
- Network in Network (NiN) - 2014
在每個 cell 裏面再放入 network 做運算,有點像是 GoogleNet 的感覺。 - Identity Mappings in Deep Residual Networks - 2016
基於 ResNet 做每個 block 的改進,多了一些 activation function 等處理手段。 - Wide Residual Networks - 2016
把原本深入運算的神經網絡往廣的方向擴展,提升準確性同時還節約計算資源。 - Aggregated Residual Transformations for Deep Neural Networks (ResNeXt) - 2016
基於廣的方向擴展外,加上了 GoogleNet 的背後原理改進。 - Deep networks with Stochastic Depth
把層數提到很深,但是隨機的去讓一些單元參數歸零不起作用,提升計算效率同時還可以有 dropout 的效果。
Else
- FractalNet: Ultra-Deep Neural Networks without Residuals - 2017
- Densely Connected Convolutional Networks - 2017
- SqueezeNet: AlexNet-level Accuracy with 50x Fewer Parameters and < 0.5mb model size - 2017
如果需要深入瞭解個別的神經網絡設計細節,需要自行參考文獻,共勉!