1. 程式人生 > >GoogLeNet-2014

GoogLeNet-2014

GoogleNet

Related Work

從LeNet-5開始,CNN有了一種典型的結構,也就是卷積層的堆疊(帶有歸一層和最大值池化層)在加上FC layers。各種各樣的基於這種結構的變體出現,並且在很多資料集如MNIST, CIFAR和ImageNet上都取得了很好的成果。對於大資料集如ImageNet,最近的趨勢在於增加網路的深度和寬度,然後利用dropout處理過擬合問題。
儘管最大值池化會在結果上丟棄掉很多空間資訊,但是這樣的結構依然在諸如定位,目標檢測,人體姿態估計等任務上取得了非常的效果。
受靈長類動物的視覺皮質的神經科學模型的啟發,Serre等人運用了一系列不同大小的固定Gabor濾波器來解決影象多尺度變換的問題。在這裡我們也使用同樣的策略。
NIN是由Lin等人提出的策略,為了增加神經網路的特徵表徵能力。在他們的模型中,額外的1x1卷積層被加入到網路中增加了網路深度。這個結構被運用到了我們的模型當中,然而,在我們的結構中,1x1卷積核還有另一層意圖,也是最主要的意圖,它被用來作為降維模組來解決計算瓶頸,如果不使用1x1卷積層會限制我們網路的大小。這樣不僅增加了網路的深度,同時網路的寬度也得以保證在沒有嚴重performance下降的情況下。
最後,最近的物體檢測 state-of-the-art是Girshick等人提出的RCNN結構。R-CNN將整個物體檢測任務分成了兩個子問題:利用低層的特徵如顏色和質地紋理去生成目標可能存在的位置資訊,然後利用CNN分類器去鑑別這個位置點上物體所屬分類。這樣的兩部結構結合了運用低層特徵進行邊界框劃定的準確性以及CNN網路的強大的分類能力。我們也運用了相似的pipeline在我們的識別任務中。

Motivation and High Level Considerations

最為直接的方式來提高深度神經網路的performance就是增大網路,這同時包括增加網路深度——網路的層數,以及網路的寬度——每層網路的神經元數。這是獲得高質量訓練模型最簡單也是最安全的方式,尤其是在擁有了大量帶標籤的訓練集的情況下。然後這樣的方式會帶來兩個很主要的弊端。
越大的網路意味著越多的引數,這會導致網路越容易過擬合,尤其當帶標籤的資料集大小有限時。這是最主要的一個瓶頸,因為足量的帶標籤的資料集的獲得是費時費力且非常昂貴的,需要分類專家對各種各樣精細的視覺物體進行區別(例如ImageNet資料集)。
越大的網路同時也相同的增加了對計算資源的需求。例如,在一個深度視覺網路中,如果兩個卷積層相連,任意卷積核數的增加都會導致計算量以平方數增加。如果增加的計算容量沒有被有效的使用(如大多數權重最後趨於0),那麼大量的計算資源就被浪費了。由於計算資源預算總是有限的,即使在著重追求網路performance的時候,一個有效的計算資源的分佈也會非常重要。
一個最基本的方法來同時解決上述問題就是引入稀疏性,用一個稀疏的網路層來代替FC layers,甚至在卷積裡引入稀疏。如果一個數據集的概率分佈可以被一個大型稀疏的深度神經網路來表示,那麼最優網路拓撲結構可以由對前一層啟用值進行相關性分析,將高度相關的輸出進行聚合來逐層構建網路。儘管嚴格的數學證明需要非常強的條件,但是這個想法與著名的Hebbian principle——neurons that fire together, wire together相呼應,也就暗示著在實際中,這個潛在的想法在不那麼嚴格的條件下也適用。
不幸的是,當下的計算基礎設施,在對非均勻稀疏的資料結構進行數值計算時,非常的低效。即使算數運算運算元量下降100倍,查詢和快取未命中的開銷也依然會佔據主要,運用稀疏矩陣也不會有太大收益。然而這個差距會更加大,由於得到提升的更加調和的數值計算庫的出現允許極速的稠密矩陣運算,還有CPU和GPU的不斷開發。同樣地,非均勻稀疏模型需要更加精細的工程和計算基礎設施。當前絕大部分的視覺導向的機器學習系統都充分利用了卷積本身帶來的空間維度的稀疏性。然而,卷積僅僅應用於網路的低層當中。為了打破網路的平衡以及提高網路的學習能力,ConvNets嘗試在特徵空間進行隨機稀疏的連線,但是最終還是回到了全連線上為了進一步優化並行運算。當下機器視覺state-of-the-art的模型都有著一致的結構。大量的卷積核和更大的batch size來保證計算資源的充分利用。
這就帶來一個問題,是否有希望進行一個折中的操作:建立一種結構能夠利用理論上的卷積核層的稀疏,同時也能夠充分利用當前硬體所帶來的對於稠密矩陣的有效運算。大量對於稀疏矩陣運算的文獻表明聚合稀疏矩陣到一個相對稠密的子矩陣會對提高稀疏矩陣乘法運算的效能。有了這個基礎,那麼對於利用相似方法進行非均勻深度學習結構的自動構建的想法也就變得現實了。

Architectural Details

Inception結構的主要想法在於如何通過一個很好獲取的(或現成的)稠密的結構去近似一個卷積視覺網路的最優區域性稀疏結構。我們注意到對於影象平移不變性的假設意味著我們的網路可以由卷積塊來進行構建。那麼我們需要做的就是找到一個最優區域性結構然後在空間上對其進行反覆運用。Arora等人提出對於一個層級結構,我們需要對上一層進行相關性分析,然後將相關性高的神經元進行聚合。這些聚合的簇就形成了下一層的神經元並且與上一層的神經元進行連線。我們假設較低層的每一個神經元都與輸入影象的某個區域相對應,而且這些神經元會被group起來放到一組濾波器中。在較低的層(靠近輸入的層)相關的神經元會聚集在一個區域性區域,因此對於一個區域性區域,我們會得到很多的簇,這個可以通過一層1x1卷積層來完成,來自NIN結構。然後,我們同時也期望能夠有數量較少的涵蓋更大空間的簇,這個可以用過對較大patch進行卷積得到,隨著涵蓋的面積越大,patch的數量也會越少。為了避免patch對齊(這裡的patch對齊的意思是,輸入在經過卷積後,維度相同可以直接拼接)的問題,這裡的inception結構只採用1x1,3x3,5x5的卷積核;這個決定更多的基於操作的方便,並不是一定要這樣設定。這就意味著這個結構是將所有這些層的卷積輸出進行拼接然後合併為一個輸出tensor來作為下一大層(stage)的輸入。另外,由於池化操作對於當前卷積網路的成功至關重要,所以最好在每個大層中增加一個並行的池化通道來來提高效能。如下圖:
這裡寫圖片描述


由於“Inception 模組”是互相堆疊的,這些模組的輸出的相關性分析也會發生改變:當越來越高度抽象的特徵被網路的高層捕捉到,那麼這些特徵的空間聚合資訊也會衰減。當我們越往高層走,大卷積核(3x3,5x5)的比例就應該相應增加。
上面這個模組結構有一個很大問題,至少在一個我們設計的初始結構中,那就是即使適當數量的5x5的卷積核也會由於上一層卷積通道的過多(因為多個卷積層和池化輸出的卷積通道的直接拼接)帶來相當大的計算量。這個問題一旦加入池化單元加入會變得更加明顯:卷積核輸出通道數等於上一個大層的卷積核數。池化層和卷積層輸出的合併會導致輸出通道數量不可避免的隨著大層增加。當這個結構可能已經是一個最優區域性結構了,但是卻非常的低效,近近經過幾個大層,計算量就已經爆炸。
這就引入了我們對於Inception結構的第二個想法:在會引入巨大計算量的地方進行降維。這個基於嵌入的成功:即使低維的嵌入也會包含一個相對大的圖片patch的很多資訊。然而嵌入代表著資訊會以稠密,被壓縮的形式存在,但是壓縮的資訊很難進行處理。這就要求處理後的資訊同時需要在很多地方保持稀疏,而且只有在全部資訊結合的時候進行訊號壓縮。這也就是,1x1卷積核需要用在3x3,5x5卷積核之前。除了降維,同時1x1卷積之後也要經過ReLU函式,這使得1x1卷積核得到完成雙重目的,而且同時也保證了稀疏性。最終結構如下圖:
這裡寫圖片描述
一般而言,一個Inception網路是由上圖的模組反覆堆疊而成,再加上偶爾的2步長的最大值池化層來減半解析度(因為這裡所有的卷積都是SAME padding模式,卷積完影象解析度不變)。
從技術層面(訓練時的儲存效率),最好在高層開始使用Inception網路,在低層還是採用傳統卷積模型。當然這個只是建議,並不是一定,只是簡單反應了應對當前基礎設施的低效的策略。
該結構的一個好處是能夠大量增加每一大層的神經元數(增大網路寬度),而且同時不會使得後面層的計算量爆炸,這都得益於對於運算量大的卷積核進行提前降維。還有一點,這個設計遵從了實踐中的直覺,也就是視覺資訊需要進行多尺度處理然後整合,這樣下一層在抽象特徵時,就可以同時進行多尺度抽象。
對於計算資源的優化使用使得我們可以增加每一大層的寬度的同時還可以增加大層的數量(也就是同時增加網路深度和寬度),而不會陷入計算困境。我們發現這個網路結構在進行各種除錯平衡計算資源後,往往會比擁有相近performance的不帶有Inception結構的網路要快3-10倍,當然也是需要精心設計的。

GoogLeNet

對於“GoogLeNet”這個名字,我們指的是參加ILSVRC 2014比賽提交的結構。下圖展示了網路結構。(經過自己運算和多方查證,個人覺得網路第一層對於params和ops的運算可能有誤,應該是params:(3x7x7+1)x64=9472, ops=9472x112x112=119M,關於這個ops的計算不一定準確哈,但應該差不多,跟連線數是一個數量級)具體的引數變化過程就不再這裡詳述了。
這裡寫圖片描述
所有的卷積,包括Inception模組裡的,都是用ReLU。
輸出為0均值的224x224的三通道RGB影象。
“#3x3 reduce”和“#5x5 reduce”代表在進行大卷積核卷積之前的1x1的卷積核數量。相應的“pool proj”對應池化後的,1x1卷積核的數量,同樣這些降維/對映層也使用ReLU。
網路擁有22層當指考慮帶引數的層(如果加入池化一共27層)。這個網路一共用到的網路層數(包括獨立的構建單元)大約100層。對於進入分類器前使用平均池化,是基於NIN結構。我們額外增加了一層FC,這個線性層能夠讓網路適應任何的分類數目,這一層的新增只是為了方便,我們並不期待它會帶來太大的影響。
對於相對深的網路來說,梯度是否能夠有效地反向傳播是一個需要考慮的問題。淺層網路的strong performance說明中間層的提取的特徵應該非常具有區分性。通過在中間層連線一個額外的分類器,來保留低層stages的特徵帶來的區分度。這將用來對抗梯度消失問題,同時也引入一定的正則化效果。這些分類器將通過小卷積網路連線在Inception(4a)和Inception(4d)的輸出上面。在訓練時,它們的loss將會有權(0.3的權重)地疊加在網路的整個loss上。在樣本預測時,這些額外的網路將會被廢棄。後面的實驗展示了這個額外網路帶來的效果很小(大約0.5%),而且只要有一個就能夠達到同樣的效果(這裡用了兩個)。
這個額外網路的準確結構是(包括分類器):

  • 一個5x5,3步長的平均池化層,(4a)得到4x4x512的輸出,(4d)得到4x4x528的輸出
  • 一個128通道的1x1卷積層完成降維,然後經過ReLU
  • 一個有1024神經元的FC層,然後經過ReLU
  • 對FC層進行70%的dropout泛化
  • 一個帶有softmax作為分類器的線性層。
    下圖為詳細的網路結構。
    這裡寫圖片描述

Training Methodology

採用非同步隨機梯度下降演算法,帶有0.9的momentum,固定learning rate衰減策略(每8個epoch下降4%)。在inference的時候採用Ployak averaging來構建最後的模型。
在圖片取樣方法上,對影象的多種大小的patch進行取樣,這些patch的大小均勻分佈在影象原大小的8%至100%並且保證 [ 3 4 , 4 3 ] [\frac{3}{4}, \frac{4}{3}] 的patch長寬比。同時我們還發現對影象進行光度扭曲會有效對抗過擬合。

ILSVRC 2014 Classification Challenge Setup and Results

ILSVRC 2014 classificaiton challenge 要求對影象進行分類,一共有1000個類別。1.2M的訓練集,5W的驗證集以及10W的測試集。
我們沒有使用額外的資料進行training。除了上面提到的訓練時用到的技術,我們在測試時也使用了一些技術來提高performance。

  1. 我們分開訓練了7個相同的GoogLeNet模型,初始化權重以及lr策略完全相同,只是影象取樣方法以及輸入影象順序不同,最後結合這7個模型進行預測。
  2. 測試的時候,相比於AlexNet,我們採取了更加複雜的裁剪策略,先將影象resize為4種大小,短邊分別為256,288,320,352,然後分別對resize後的影象的左,中,右部分進行方形裁取。然後對於每個裁取出的方形影象,我們取4個角以及中間的224x224的大小的區域以及再將這個裁取出的方形影象resize為224x224,一共6個,最後再取它們的鏡面對稱影象。所以每一張原始影象就會有4(4種大小)x3(左,中,右)x6(6種裁取)x2(鏡面對稱)=144個裁取圖片。當然實際中,可能不需要這麼多。
  3. 最後對所有的裁取圖片在所有分類器上的輸出求取平均完成最後預測。

總結

為了追求神經網路更好的表現,增加網路的深度和寬度是不可避免的,這也就會帶來更多的引數導致過擬合以及計算量的增大,那麼解決這兩個問題的共同辦法就是引入稀疏,用稀疏連線代替全連線甚至卷積裡也引入稀疏,然而前人對於稀疏連線的實驗表明其不能很好地利用並行運算優化,所以最終還是回到全連線。於是轉換思路,考慮聚合稀疏矩陣到一個相對稠密的矩陣中來同時利用卷積帶來的稀疏性以及當前軟硬體對於稠密矩陣運算的高效性來完成突破。在這個想法的基礎上,構思出了Inception模組,不僅完成了稀疏矩陣的聚合,還通過引入多尺度的卷積核來處理影象多尺度問題提高效能,同時還利用1x1卷積核加大網路深度,引入非線性的同時,完成了Inception模組內的降維,使得Inception計算量大大減小。還引入多分類器來處理梯度消失問題,雖然效果不是很好。


小廣告

淘寶choker、耳飾小店 物理禁止
女程式設計師編碼時和編碼之餘 都需要一些美美的choker、耳飾來裝扮自己
男程式設計師更是需要常備一些來送給自己心儀的人
淘寶小店開店不易 希望有緣人多多支援 (O ^ ~ ^ O)
本號是本人 只是發則小廣告 沒有被盜 會持續更新深度學習相關博文和一些翻譯
感謝大家 不要拉黑我 ⊙﹏⊙|||°
這裡寫圖片描述