http://blog.csdn.net/sunyangwei1993/article/details/77478484?locationNum=1&fps=1
導語
本文是本人學習深度學習過程中遇到的部分問題,並自己尋找答案,將答案匯總,一是方便自己今后查閱和復習,二是將其分享出來,希望能幫助到需要的同學,共同學習共同進步。
1、卷積神經網絡有那些重要技巧(trick),你認為哪個技巧最影響結果?
卷積神經網絡(CNN)在圖像分類方面展現出了優異的天賦,現已成為圖像處理領域的標准規范。針對特定的問題,需要有多種技巧來調整模型,以使模型在測試數據上有好的效果和更強大的泛化能力。CNN在圖像方面主要有擴增訓練數據、圖像預處理、權值初始化、訓練技巧、激活函數選擇、正則化、訓練過程可視化、類數據不平衡等技巧。
1)訓練數據擴增
深度學習需要大量的數據,而有時數據量卻不夠模型的訓練,對於卷積神經網絡來說,如果訓練圖像不夠,就需要對原始圖像進行擴增。常用的擴增方法有對數據進行水平翻轉(horizontally flipping),隨機裁剪(random crops),顏色抖動(color jittering)等變換方法,生成新的訓練圖像。
2)圖像預處理
常用的圖像預處理方法有:
-
均值0中心化(zero-center),規范化(normalize)
-
PCA白化 (PCA Whitening)
3)權值初始化
權值初始化有:全0初始化、隨機初始化、校正方差
全0初始化:即初始化時所有權值為0,這會帶來一個問題,在進行參數更新時,由於每個神經元輸出都一樣,在反向傳播時會得到同樣的梯度值,使得參數更新一樣,整個網絡呈現對稱性。
隨機初始化:可以設置權值為非常接近於0的隨機值,會讓網絡非對稱,以便於訓練。
校正方差:隨機初始化的方法會讓輸出方差隨着輸入神經元的個數而變化。把權值除以輸入神經元個數的開方就可以讓輸出神經元方差為1,這樣可以讓每層輸出具有相同方差,能夠大大提高收斂速度。在實際的編程實現中,常用如下代碼:
w = np.random.randn(n) / sqrt(n)
考慮到ReLU激活函數,推薦的做法是:
w = np.random.randn(n) / sqrt(n/2.0)
4)訓練技巧
設定合適的卷積核和pooling size
訓練過程,輸入圖像的大小希望為2的冪次,比如32(cifar-10),64,224(ImageNet),384,或者512。而且采用小的卷積核大小(如3*3)和小的滑動步長(如1)和填充0是比較重要的,不但能減少權值參數、調整輸出空間維度而且還能提高整個網絡的准確率。
學習率衰減
指數衰減的學習率既可以讓模型在訓練的前期快速接近較優解,又可以保證模型在訓練后期不會有太大的波動,從而更加接近局部最優。
5)激活函數選擇
激活函數讓深度網絡具有非線性表達能力。幾種常見的激活函數:sigmoid,tanh,ReLU,leaky ReLU,Parametric ReLU,Randomized ReLU。
sigmoid函數
sigmoid函數表達式如下,把實數壓縮在0~1之間。sigmoid函數會在很多地方看到,它很好的模擬了神經元的激活狀態,從0到1表示了該神經元的活躍狀態。


但是sigmoid函數有兩個主要缺點,現在很少用它。①激活值容易飽和,容易接近0或1,會使梯度為非常接近0的數,無法進行權值更新,同時在初始化權值時很難設置初始值,因為容易使激活值飽和。②激活值是非0中心化的。如果激活值都是正值,則反向傳播算w梯度都是正值或負值,這會讓在權值更新時出現鋸齒變化,但是相比①消極影響是不嚴重的。
tanh函數
tanh函數把實數壓縮在-1~1之間。和sigmoid函數一樣激活值容易飽和,容易接近-1或1,會使梯度為非常接近0的數,無法進行權值更新.但是它是0中心化的。在實際應用中,我們更願意使用tanh(x),而非sigmoid函數。

ReLU函數
ReLU在最近幾年非常流行,函數表達式為 f(x) = max(0,x)。

ReLu有以下兩點好處:①該函數相比sigmoid、tanh計算簡單,不會發生飽和;②訓練過程中能夠加快隨機梯度下降收斂.但是,ReLu有一個主要問題:由於神經元梯度容易為0,這就導致該神經元在訓練過程中失效。實際情況如果學習率設置過高,神經網絡中有大約40%的神經元失效。
leaky ReLU函數
該激活函數是為了解決ReLu問題,在輸入小於0時不設置0,而用乘上一個很小的常數值來代替。函數表達式為f(x) = max(ax,x),a是很小的常數,比如0.01。
6)正則化
采用正則化方法,可以有效防止過擬合。方法有以下幾種:
L2正則化:這是一種最常見的正則化方法,直接在損失函數里加上懲罰項。也就是對神經網絡里每個權值W計算L2范數,然后加到損失函數里,用0.5*lamda*W^2。lamda是正則化強度,lamda越大正則化越強,越能防止過擬合,但是太大了就會變成欠擬合,實際工程中,一般取利用驗證集做超參數確定。最后得到的權值W是分散的,數值也比較小。
L1正則化:這是另一種常見的正則化方法。也就是對神經網絡里每個權值W計算L1范數,然后加到損失函數里,用lamda*|W|。這種L1正則化方法會讓權值變得稀疏,會讓權值W絕大數接近於0,這就相當於只讓部分輸入數據參與到神經網絡,對具有噪聲或者冗余的這部分輸入具有魯棒性。這種性質可以用來做特征選擇。如果不需要做特征選擇,一般才去L2正則化。
最大規范約束:這種正則化方法限制了權值的L2范數小於某個數值,比如3或者4.這樣做好處就是當學習率設置太高了也能訓練深度網絡。
Dropout:該方法相比以上方法是非常高效、簡單的,在訓練過程中,將神經網絡進行采樣,也就是隨機的讓神經元激活值為0,而在測試時不再采用dropout。通常設置隨機采樣概率為0.5,也可以通過驗證集來確定采樣概率。
7)訓練過程可視化
訓練過程中,我們可以把訓練中間結果(如loss值,正確率)以圖表的形式打印出來,能夠實時監控訓練狀態,看是否有效。
學習率:學習率是比較敏感的。非常大的學習率會導致異常的loss曲線。小的學習率又會讓你的loss曲線下降得很慢,收斂困難。相反大的學習率會讓loss曲線剛開始下降得特別快,然后很快收斂,這往往是停留在局部最優。而一個好的學習率loss曲線比較平滑,最后在測試集上有比較好的表現。

loss值:對訓練樣本進行批訓練,設置批訓練大小(batch size),在每一輪批訓練結束之后,可以將loss值輸出,最后得到整體的loss曲線圖。如果loss曲線呈線性下降則說明學習率過小;如果loss曲線不下降太多,則說明學習率過大。而求loss曲線的上下寬度和batch值有關,如果太寬說明震盪比較厲害,就要提高batch值。、
正確率:在訓練的時候可以實時的將正確率輸出,比較訓練集的正確率和驗證集的正確率得出某些結論幫助我們調整模型。比如在訓練集上的正確率很大,驗證集的正確率比較小且趨向於收斂,此時如果差距很大說明模型過擬合,需要適當地加大正則項力度。如果差距很小且正確率都比較低,則說明模型的比較差,需要增強模型的表達能力。
8)類數據不平衡問題
在實際應用中,各類的數據經常是不平衡的:有的類有大量的訓練樣本,而有的類有很少的數據樣本,這會非常影響深度網絡的表現。解決類不平衡的方法有:
上采樣:對每一份數據集中比較少的類,直接復制其中的圖片增大樣本數量直至所有類別平衡。這種采樣方法有一個明顯的缺點,就是同一個點會在高維空間重復出現,這會導致一旦分類正確就是全部正確,一旦分類錯誤就是全部錯誤,對模型的結果有很不好的影響。解決這個問題的方法是在生成新樣本時加一個隨機的輕微的擾動。
下采樣:從多數量類的樣本中剔除一部分使其和少數量樣本類一樣。 缺點顯而易見,那就是最終的訓練集丟失了數據,模型只學到了總體模式的一部分。解決的方法是多次下采樣,產生多個不同的訓練集,進而訓練多個不同的分類器,通過組合多個分類器的結果得到最終的結果。
分類器加權:設置不同類別分錯的代價。
k C(k,1) C(k,2) … 1 0 2 … 2 1 0 … 3 3 1 … … … … …
表中C(i,j)表示將類別為j的類判別為i類別的代價,我們可以根據實際情況設置它們的值。
小結
上面簡單講述了幾種CNN中常用的技巧,這些技巧不僅在CNN中適用,同時也在其他深度學習模型中適用。總的來說,這幾種技巧在深度學習中很常用,常常結合多種技巧使模型的效果達到最好,因此並沒有最好或最重要的說法。
2、卷積神經網絡有那些前沿應用,他是怎么起作用的?
卷積神經網絡在計算機視覺中的應用
CNN在計算機視覺中的應用包括圖像分類、物體檢測、圖像分割、人臉識別等。
圖像分類
圖像分類是指通過對圖像的分析,將圖像划歸為若干類別中的某一類,主要強調對圖像的整體語義進行判別。當下有很多關於圖像分類的數據集,其中最有名當屬ImageNet Large Scale Visual Recognition Challenge(ILSVRC)競賽,該競賽的數據集是ImageNet的子數據集,包含上百萬張帶標簽的高分辨率圖像,這些圖像分別屬於1000個類別。在2012年以前,獲勝的團隊都是手工提取特征然后用SVM等傳統機器學習算法進行分類,取得的最好結果是28.2%的錯誤率。ILSVRC2012是一折重要的轉折點,深度神經網絡首次被用於圖像分類,並取得了突破性的進展,從此所有的冠軍模型都是基於深度神經網絡。2012年的AlexNet模型如下圖所示,是一個8層的卷積神經網絡,其中前5層是卷積層,后3層是全連接層。

AlexNet網絡結構
物體檢測
相比圖像分類,物體檢測是一個更復雜的任務,因為不僅一個圖像可能含有多個物體,而且還要對他們進行定位。AlexNet在ILSVRC2012中所取得的成功不僅影響了圖像分類方向的研究,也得到了計算機視覺其他方向研究者的關注。Ross Girshick等便將CNN運用於物體檢測中,提出了R-CNN模型。如下圖所示,該模型首先使用非深度學習算法來提出待分類的候選區域,然后將每個候選區域輸入到CNN中提取特征,接着將這些特征輸入到線性SVM中進行分類。為了使定位更加准確,R-CNN還訓練了一個線性回歸模型來對候選區域坐標進行修正,該過程稱為Bounding box regression。該模型在PASCAL VOC的物體檢測數據集上取得了比傳統算法高大約20%的平均正確率,奠定了以后使用CNN進行物體檢測的模型結構基礎。

圖像分割
圖像分割是指:對於一張圖來說,圖上可能有多個物體、多個任務甚至多層背景,希望能做到對於圖上每個像素點,能預測它是屬於哪個部分的(人、動物、背景…)。最近幾年深度學習也在圖像分割任務重逐漸被運用。一種方法是將一些深度神經網絡改為全卷積網絡。利用一些流行的分類網絡(AlexNet、VGG、Google Net)在保留一些他們在圖像分類方面所訓練得到的參數基礎上,進行“修剪”,轉變為針對圖像分割的模型。然后將一些網絡較深的層的所得的特征和一些較淺的層所得的特征結合起來,最后用一個反卷積層方法放大到原始圖像大小來提供提供一個更為准確的分割結果,稱之為跳躍結構。
以AlexNet為例,如下圖所示,將AlexNet最后三層改為全卷積層,這一步不僅加快了訓練速度、減小了參數,進而減少了過擬合,還為最后一步的反卷積提供了便利。對於信息丟失過多的最后一層卷積層,可以先將它反卷積擴大1倍,達到上一層pooling完了之后的大小,之后將兩者的信息整合,進而再次反卷積,再擴大16倍,取得的效果也有所提升。

基於AlexNet的全卷積神經網絡
人臉識別
人臉識別技術包括人臉檢測、人臉特征提取、人臉識別3個過程。
人臉檢測是從輸入圖像或視頻流中檢測並提取人臉圖像,並進一步給出人臉的位置、大小以及各個主要面部器官的位置信息,通常是采用Haar特征和Adaboost算法訓練級聯分類器對圖像中每一個矩形子區域進行分類。特征提取是通過一組數據來表征人臉信息,這組數據就是所需要提取的人臉特征。常見的人臉特征分為幾何特征和表征特征。幾何特征是指各個主要面部器官之間的幾何關系,如距離、面積和角度等,這種特征只適合於人臉圖像的粗略識別無法在實際中應用。表征特征利用人臉圖像的灰度或色彩信息通過以下算法提取全局或局部特征,將待識別的人臉所提取的特征與數據庫中已有的特征信息進行對比,然后進行判別分類。
使用深度學習方法提取到的人臉特征表示具有傳統手工特征表示所不具備的重要特性,例如局部遮擋、光照變化、表情變化等具有良好的魯棒性。這些特性都是在海量的圖像數據上訓練自然得到的,網絡模型中並沒有添加其他顯式的約束條件,得到的人臉特征也沒有進行其他的后期處理。這說明深度學習並非是單純地使用具有大量參數的、非常復雜的非線性神經網絡模型去擬合數據集,而是通過逐層訓練學習,最終得到蘊含數據本質信息的特征表示,從而大大提高了識別率。
卷積神經網絡在自然語言處理中的應用
CNN在自然語言處理中的應用主要是分類任務,包括語義分析、垃圾郵件檢測、情感分類和話題分類。
在文本分類任務中,CNN的構造相當簡單,輸入層是一個表示句子的矩陣,每一行是word2vec詞向量。接着是由若干個濾波器組成的卷積層,然后是最大池化層,最后是softmax分類器。也有人直接用原始數據訓練CNN模型,不需要預訓練得到word2vec或GloVe等詞向量表征,它直接對one-hot向量進行卷積運算。

用CNN對文本進行分類
上述的模型表征都是在單詞的層面上,另外有一些團隊則研究如何將CNNs模型直接用於字符。Santos和Zadrozny等人利用CNN學到了字符層面的向量表征,將它們與預訓練的詞向量結合,用來給語音打標簽。Xiang Zhang和Yann LeCun研究了直接用CNNs模型直接從字符學習,而不必預訓練詞向量了。值得注意的是,作者使用了一個相對較深的網絡結構,共有9層,用來完成語義分析和文本分類任務。結果顯示,用字符級輸入直接在大規模數據集(百萬級)上學習的效果非常好,但用簡單模型在小數據集(十萬級)上的學習效果一般。
3、生成式深度模型包含哪些具體內容?
對抗樣本
對抗樣本是指通過在數據集中添加細微的噪聲干擾,受干擾之后導致模型以高置信度輸出錯誤的結果。Christian Szegedy等人在ICLR2014發表的論文中提出了對抗樣本的概念,並提出在深度學習其他模型包括卷積神經網絡也對對抗樣本有這樣的高脆弱性。他們的研究提到,很多情況下,在訓練集的不同子集上訓練得到的具有不同結構的模型都會對相同的對抗樣本實現誤分,這意味着對抗樣本成為了訓練算法的一個盲點。Ian Goodfellow等人由此提出了生成對抗網絡(Generative Adversarial Nets),利用對抗樣本進行對抗訓練,提高模型的抗干擾能力。
生成式對抗網絡
GAN模型主要包括兩個網絡,G(Generator)和D(Discriminator):
- G是一個生成圖片的網絡,它接收一個隨機的噪聲z,通過這個噪聲生成圖片,記做G(z)。
- D是一個判別網絡,判別一張圖片是不是“真實的”。它的輸入參數是x,x代表一張圖片,輸出D(x)代表x為真實圖片的概率,如果為1,就代表100%是真實的圖片,而輸出為0,就代表不可能是真實的圖片。

GAN模型框架圖
在訓練過程中,生成網絡G的目標就是盡量生成真實的圖片去欺騙判別網絡D。而D的目標就是盡量把G生成的圖片和真實的圖片分別開來。這樣,G和D構成了一個動態的“博弈過程”。
在最理想的狀態下,G可以生成足以“以假亂真”的圖片G(z)。對於D來說,它難以判定G生成的圖片究竟是不是真實的,因此D(G(z)) = 0.5。
用公式表示如下:
簡單分析一下這個公式:
- 整個式子由兩項構成。x表示真實圖片,z表示輸入G網絡的噪聲,而G(z)表示G網絡生成的圖片。
- D(x)表示D網絡判斷真實圖片是否真實的概率(因為x就是真實的,所以對於D來說,這個值越接近1越好)。而D(G(z))是D網絡判斷G生成的圖片的是否真實的概率。
- G的目的:上面提到過,D(G(z))是D網絡判斷G生成的圖片是否真實的概率,G應該希望自己生成的圖片“越接近真實越好”。也就是說,G希望D(G(z))盡可能得大,這時V(D, G)會變小。因此我們看到式子的最前面的記號是min_G。
- D的目的:D的能力越強,D(x)應該越大,D(G(x))應該越小。這時V(D,G)會變大。因此式子對於D來說是求最大(max_D)
通過這樣的巧妙設計,GAN 就擁有了一個非常吸引人的性質。GAN 中的 G 作為生成模型,不需要像傳統圖模型一樣,需要一個嚴格的生成數據的表達式。這就避免了當數據非常復雜的時候,復雜度過度增長導致的不可計算。同時,它也不需要 inference 模型中的一些龐大計算量的求和計算。它唯一的需要的就是,一個噪音輸入,一堆無標准的真實數據,兩個可以逼近函數的網絡。
4、Autoencoder,Boltzmann Machine和GAN在網絡結構上的區別和聯系有哪些?
AutoEncoder 是多層神經網絡,其中輸入層和輸出層表示相同的含義,具有相同的節點數。AutoEncode學習的是一個輸入輸出相同的“恆等函數”。不過輸入和輸出相同,使得這個網絡的輸出沒有任何意義。AutoEncoder的意義在於學習的(通常是節點數更少的)中間coder層(最中間的那一層),這一層是輸入向量的良好表示。這個過程起到了“降維”的作用。當AutoEncoder只有一個隱含層的時候,其原理相當於主成分分析(PCA),當AutoEncoder有多個隱含層的時候,每兩層之間可以用RBM來pre-training,最后由BP來調整最終權值。網絡權重更新公式很容易用求偏導數的方法推導出來,算法是梯度下降法。


AutoEncoder和Restricted Boltzmann machine
Autoencoder和RBM是一類的,都屬於學習模型;而稀疏編碼更像是施加在這些基本模型上的一種優化手段,它是把大多數的神經元限制為0,只允許少量的神經元激活,來達到“稀疏”的效果。這主要是為了模擬人眼視覺細胞的特性。在算法里,其實就是在需要優化的目標函數里面加入一個表示稀疏的正則項。
Autoencoder和RBM的不同之處:Autoencoder的神經元是確定型的,用的是sigmold函數,就像傳統的神經網絡一樣。而RBM的神經元是隨機的。(最基本的RBM神經元只有0和1兩種狀態,但是擴展后可以在這個區間上取任何值)由於autoencoder的確定性,它可以用BP方法來訓練。但是RBM就只能用采樣的方法來得到一個服從RBM所表示分布的隨機樣本。(Gibbs采樣,CD采樣等等)在深度學習里面,可以把autoencoder和RBM都看作是一個個特征提取器,我們可以用許多這樣的特征提取器構造出深層次的網絡。基本思路是前面先用這些特征提取器搭出幾層網絡,自動學習出數據的一些特征后,后面再用一個分類器來分類,得到最后的結果。如果用autoencoder作特征提取器,得到的就是stacked autoencoder;如果用RBM作特征提取器,得到的就是deep belief network。
上述兩種網絡結構都屬於生成式模型,認為輸出y是由輸入x決定的,即通過模型可以學習到輸入x的一個良好的特征表示。生成模型的最大優勢是直接從輸入樣本x中進行無監督或半監督學習,並不需要大量的帶標簽樣本。而GAN是由生成模型和判別模型組成,即組合了深度學習兩大模型結構,可以說綜合了他們的優點。GAN的生成模型由輸入x得到輸出y,判別模型義y作為輸入,判別是原來的真實數據還是通過噪聲產生的數據,經過兩者的平衡博弈,便得到了輸入樣本的相似表達。