Deep Learning 讀書筆記(一)

 

Deep Learning 讀書筆記(一):ImageNet Classification with Deep Convolutional Neural Networks

本文來自:http://blog.csdn.net/tuqinag/article/details/40077333        


       這篇文章的內容是描述作者在ImageNet LSVRC-2010這個競賽中,所達到the-state-of-art的工作。記得原來有在微博中看到過,現在世界上做圖像最頂尖的那一批人都投身在ImageNet中。而且所給的數據又是非常的龐大,就拿本篇文章所使用的數據集來說,任務是需要將1,200,000高維的圖片分爲1000個不同的類,可見要取得好的成績難度還是非常大的。

        言歸正傳,先大體的介紹下文章模型的結構,讓大家認識到這個模型是有多麼龐大。整個模型共有60,000,000個參數,650,000個神經元,共有5個卷積層,其中有一些卷積層之後是最大池化層(這個告訴我們並不一定卷積層之後就一定是池化層),還有三個全連接層,最後是一個有1000個輸出的softmax層。之後會給出模型結構的圖示。模型的參數這麼多,訓練數據的量又這麼大,我們必然需要找到一些方法來加快模型的訓練速度以及避免過擬合問題的出現。之後會一一介紹所使用的措施。

        首先是在加快模型訓練速度方面所使用的一些方法(接下來介紹的順序是根據作者認爲重要性的由大到小來排序的):

        (1)ReLU Nonlinearity

        這裏,每一個神經元所使用的激活函數不再是或是,而是f(x)=max(0,x).將之前的兩個函數稱之爲saturating nonlinearities函數,而將之後的函數稱爲non-saturating nonlinearities函數。在梯度下降的過程中,使用saturating nonlinearities函數的訓練速度要慢於使用non-saturating nonlinearities函數。作者還做了一個實驗來證明這一點:

        圖中實線表示的是使用non-saturating nonlinearities函數。可以發現在使用相同數目epochs的訓練數據進行訓練時,使用non-saturating nonlinearities函數的訓練速度明顯更快。

        (2) 使用多個GPU進行訓練

        使用GPU來訓練CNN網絡是當前的主流方法,因爲對於2D卷積,現在的GPU能對其有很好的優化。但因爲GPU內存的限制,所以網絡的規模也會有所限制,而且同樣要考慮到我們所能忍受的模型的訓練時間。考慮到文章所使用的模型太大,一塊GPU並不能將其完全容納下,而現在的GPU的並行技術已經能夠做到比較好了,可以直接從另一塊GPU的內存中讀取數據,而不需要再經過主機的內存。具體的實現中,在一塊GPU中放入網絡的一半,我們並不會在網絡的每一層之後進行GPU數據的交換,而是在固定的層之後纔會進行。在之後給出模型的結構圖之後,這一點我們可以看得很清楚。對於網絡的連接模式,我們可以利用交叉驗證的方法來得到,而且也可以調整交換的數據量的大小,使其在一個可接受的範圍。

        (3)局部響應正則化(LRN)

        使用這個方法的原因是,它能夠帶來更好的泛化能力。Hinton等人認爲LRN層模仿生物神經系統的側抑制機制,對局部神經元的活動創建競爭機制,使得響應比較大的值相對更大,提高模型的泛化能力。

記作在位置(x,y)處利用核i計算出神經元的激活值,然後再利用ReLU nonlinearity,響應正則化項的表達式爲:

        其中,N表示這一層所有核的個數。整個和式是在相同位置,n個相鄰的核上計算得到的。參數的具體值都是通過一個具體的測試集所得到的。

        (4)有重疊的池化

        從前一篇博客描述CNN的池化過程,我們可以知道典型的池化過程是不重疊的。但是本篇文章中所使用的池化過程是重疊的,池化區域的大小爲3x3,而相隔區域的大小隻有2,等於說是重疊了一個像素。而且,作者也說明了,如果使用了重疊的池化,有助於防止過擬合的發生。

        在介紹完模型中所使用的一些trick後,我們來討論下模型的整體結構。先給出模型的結構圖:

        模型的前5層爲卷積層,有些層之後跟有最大池化層,但是並沒有在圖中畫出來,只是標註了下。之後三層是全連接層,最後是一個有1000個輸出的softmax層,輸出輸入圖像的分類結果。模型的目標函數是一個多項的logistic迴歸函數。第二層、第四層、第五層的卷積函數只與其在同一GPU中的那一半網絡的前一層進行連接。而第三層的卷積層則需要與前一層的所有神經元進行連接,兩塊GPU也就是在這裏進行了數據的交換。局部響應正則化技術是在第一層和第二層卷積層之後使用。最大池化層是在局部響應正則化層之後以及第五層卷積層之後使用。ReLU non-linearity技術則是利用在每一層卷積層和全連接層之中。至於網絡每一層具體的大小,這裏就不再敘述了。

        前面我們也提到了,整個網絡有60,000,000個參數,怎樣防止模型出現過擬合問題也是我們急需解決的問題。接下來我們就來敘述下本篇文章中所使用的一些方法。

        (1)增加數據

        對於圖像數據來說,減少過擬合問題,最早使用的同時也是最常用的方法就是,在保持數據標籤不變的情況下增大數據集。這裏我們使用了兩種不同的方法,它們都只需要很少的計算量,因此變換後的圖像並不需要存儲在硬盤中,而只需要存放在內存中即可。在實際的使用中,都是在GPU計算上一個batch的圖像時,在CPU上進行圖像的一些變換操作。之後就來講講所使用到的兩個方法。

        1)image translations and horizontal reflection

        是從256x256的圖片中隨機提取224x224的片段,這樣的話會造成數據之間的關聯性,從而可能會造成過擬合現象的發生。但是,這樣我們可以使用一個更小的網絡。在實際應用中,是取5個224x224的片段,從原圖的4個角和中心處提取,還有horizontal reflections共10個片段。

        2)altering the intensities of the RGB channels

        perform PCA on the set of RGB pixel values(由於我不是專業做圖像處理的,這句話我也不能準確的理解它的意思,只能抄原文了).之後在PCA所得到的主成分上乘以一個隨機的變量,這個變量服從均值爲0,標準差爲0.1的正態分佈。每一個RGB像素值爲,再加上這一項,其中分別是RGB像素值協方差矩陣的特徵向量和特徵值,就是之前提到的那個變量。對不同的圖像進行處理時,就需要取不同的的值。這種方法能夠有效地捕捉到圖像中一些重要的特徵,比如說目標在光照或者背景發生變化的情況下是不會發生改變的。

        (2)dropout 方法

        dropout方法是近年來應用在深度模型中用於減少過擬合問題所採用的一種很普遍的做法,也能夠取得很不錯的效果。我打算在下一篇博客中詳細說一下這個方法,這裏就不再重複了。

        但是,dropout方法所帶來的一個問題,這裏還是有必要說下。文章中提到了,在使用了該方法後,需要增加一倍的循環次數來使得模型的參數達到收斂,這無疑也增加了模型的訓練時間。

        最後,我們來講一講模型在訓練過程中所使用到的一些方法。文章使用隨機梯度下降法進行模型的訓練。權值的更新公式爲:

        其中,i表示循環的次數,v表示動量,表示學習率,表示在batch中,目標函數反傳的誤差。

        爲網絡中的所有連接權值賦上一個服從均值爲0,標準差爲0.01的正態分佈的一個隨機數。爲第二、四、五層的卷積層和所有的全連接層神經元的偏置都賦予1的初始值,而其他層神經元的偏置均爲0。這種初始化方法在模型的訓練初期,能夠有效的提速。因爲爲ReLU輸入的都是正值。

        網絡所有層的學習率都是一樣的,但在訓練過程中會對這個值進行調整。如果在某個學習率下,模型在驗證集上的錯誤率已無法下降,那麼就將學習率除以10。學習率的初始值爲0.01,在學習率被減小3次以後就不會再發生改變了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章