⑴ 深度學習為什麼不過擬合
深度學習:過擬合
為了得到一致假設而使假設變得過度復雜稱為過擬合。想像某種學習演算法產生了一個過擬合的分類器,這個分類器能夠百分之百的正確分類樣本數據(即再拿樣本中的文檔來給它,它絕對不會分錯),但也就為了能夠對樣本完全正確的分類,使得它的構造如此精細復雜,規則如此嚴格,以至於任何與樣本數據稍有不同的文檔它全都認為不屬於這個類別。
標準定義:給定一個假設空間H,一個假設h屬於H,如果存在其他的假設h』屬於H,使得在訓練樣例上h的錯誤率比h』小,但在整個實例分布上h』比h的錯誤率小,那麼就說假設h過度擬合訓練數據。 —-《Machine Learning》Tom M.Mitchell
假設我們用深度學習來判斷西瓜,過擬合會使得你判斷西瓜更加嚴厲,導致在某些西瓜數據上與你准備的數據有些出入(差別並不會太大),從而結果判定不是西瓜。。。
-----------------
深度學習防止過擬合的方法
過擬合即在訓練誤差很小,而泛化誤差很大,因為模型可能過於的復雜,使其」記住」了訓練樣本,然而其泛化誤差卻很高,在傳統的機器學習方法中有很大防止過擬合的方法,同樣這些方法很多也適合用於深度學習中,同時深度學習中又有一些獨特的防止過擬合的方法,下面對其進行簡單的梳理.
1. 參數范數懲罰
范數正則化是一種非常普遍的方法,也是最常用的方法,假如優化:
minObj(θ)=L(y,f(x))+αG(θ)
其中L為經驗風險,其為在訓練樣本上的誤差,而G為對參數的懲罰,也叫結構風險.α是平衡兩者,如果太大則對應的懲罰越大,如過太小,甚至接近與0,則沒有懲罰.
最常用的范數懲罰為L1,L2正則化,L1又被成為Lasso:
||w||1=|w1|+|w2|+...
即絕對值相加,其趨向於是一些參數為0.可以起到特徵選擇的作用.
L2正則化為:
||w||2=w12+w22+...−−−−−−−−−−−−√
其趨向與,使權重很小.其又成為ridge.
關於更多可以參考:機器學習中的范數規則化之(一)L0、L1與L2范數
2. 數據增強
讓模型泛化的能力更好的最好辦法就是使用更多的訓練數據進行訓練,但是在實踐中,我們擁有的數據是有限的,解決這一問題可以人為的創造一些假數據添加到訓練集中.
一個具體的例子:
在AlexNet中,將256*256圖像隨機的截取224*224大小,增加了許多的訓練樣本,同時可以對圖像進行左右翻轉,增加樣本的個數,實驗的結果可以可降低1%的誤差.
在神經網路中輸入雜訊也可以看做是數據增強的一種方式.
3. 提前終止
如下圖所示(圖片來源deep learning),當隨著模型的能力提升,訓練集的誤差會先減小再增大,這樣可以提前終止演算法減緩過擬合現象.關於演算法的具體流程參考deep learning.
提前終止是一種很常用的緩解過擬合的方法,如在決策樹的先剪枝的演算法,提前終止演算法,使得樹的深度降低,防止其過擬合.
4. 參數綁定與參數共享
在卷積神經網路CNN中(計算機視覺與卷積神經網路 ),卷積層就是其中權值共享的方式,一個卷積核通過在圖像上滑動從而實現共享參數,大幅度減少參數的個數,用卷積的形式是合理的,因為對於一副貓的圖片來說,右移一個像素同樣還是貓,其具有局部的特徵.這是一種很好的緩解過擬合現象的方法.
同樣在RNN中用到的參數共享,在其整條時間鏈上可以進行參數的共享,這樣才使得其能夠被訓練.
5. bagging 和其他集成方法
其實bagging的方法是可以起到正則化的作用,因為正則化就是要減少泛化誤差,而bagging的方法可以組合多個模型起到減少泛化誤差的作用.
在深度學習中同樣可以使用此方法,但是其會增加計算和存儲的成本.
6. Dropout
Dropout提供了一種廉價的Bagging集成近似,能夠訓練和評估指數級數量的神經網路。dropout可以隨機的讓一部分神經元失活,這樣彷彿是bagging的采樣過程,因此可以看做是bagging的廉價的實現.
但是它們訓練不太一樣,因為bagging,所有的模型都是獨立的,而dropout下所有模型的參數是共享的.
通常可以這樣理解dropout:假設我們要判別一隻貓,有一個神經元說看到有毛就是貓,但是如果我讓這個神經元失活,它還能判斷出來是貓的話,這樣就比較具有泛化的能力,減輕了過擬合的風險.
7. 輔助分類節點(auxiliary classifiers)
在Google Inception V1中,採用了輔助分類節點的策略,即將中間某一層的輸出用作分類,並按一個較小的權重加到最終的分類結果中,這樣相當於做了模型的融合,同時給網路增加了反向傳播的梯度信號,提供了額外的正則化的思想.
8. Batch Normalization
在Google Inception V2中所採用,是一種非常有用的正則化方法,可以讓大型的卷積網路訓練速度加快很多倍,同事收斂後分類的准確率也可以大幅度的提高.
BN在訓練某層時,會對每一個mini-batch數據進行標准化(normalization)處理,使輸出規范到N(0,1)的正太分布,減少了Internal convariate shift(內部神經元分布的改變),傳統的深度神經網路在訓練是,每一層的輸入的分布都在改變,因此訓練困難,只能選擇用一個很小的學習速率,但是每一層用了BN後,可以有效的解決這個問題,學習速率可以增大很多倍.
未完待續…
參考資料:
deep learning
tensorflow實戰
機器學習中的范數規則化之(一)L0、L1與L2范數
⑵ 卷積神經網路——卷積層、池化層和激活函數
2018年11月20日,在看tensorflow的時候發現還是有很多概念沒有理解透徹,發現一個很贊的資源(估計大家都知道的,只有我現在才發現),吳恩達老師在網易雲課堂上開的深度學習的 課程 ,感覺很贊.本文實際上是吳恩達卷積神經網路視頻學習筆記。
2019年2月14日,再次溫故這部分的內容,添加了1.1章節的自問自答,添加了對池化層實現反向傳播的方式,添加了激活函數relu和sigmoid的對比。
通過一個3 * 3的每列值相同、第一列為1,第二列為0,第三列為-1的過濾器可以檢測垂直的邊沿。注意到1表示亮,-1表示暗。這樣可以發現正負值的邊沿。
對於垂直邊緣過濾器而言,重要的是中間一列為0,左右兩列的值可以相差盡可能的大。
這個過濾器的數值也是可以通過反向傳播皮運行演算法學習的,不一定需要在演算法開始之前就決定。
深度學習甚至可以去學習其他的邊沿,無論是45度、73度乃至是其他的角度,雖然比手工要復雜一些,但是確實具有這樣的能力。
為什麼需要填充?大家都知道,卷積就是用過濾器(f x f)從左到右、從上到下的掃描一個矩陣(n x n)。有兩種卷積操作,一種稱為valid-conv,一種稱為same-conv。每次卷積的時候,過濾器右側碰到矩陣右邊界就結束當前行的掃描,下側碰到矩陣下邊界就結束掃描,因此通過過濾器的圖像都會縮小,變為(n-f+1) * (n-f+1)。valid-conv就是這樣的卷積操作,而same-conv會在卷積之前填充原始圖,使得卷積之後的大小不變。
一般來說燃嘩,若原圖像大小為n * n,過濾器大小為f * f,那麼需要padding的大小為p=(f-1)/2。一般來說我們會設置f為奇數,很少看見偶數的過濾器。其中的原因之一就是為了對稱填充。另一個原因可能是一般需要將過濾器的中間點用於定位卷積的位置,而偶數過濾器沒有中間點。
上面的提到的卷積過程每次只移動一步。實際上過濾器可以移動不止一步,用s表示步長。那麼n x n的矩陣輸入, f x f的過濾器, p填充padding,以及s步長的情況下,輸出的矩陣大小為 (n+2p-f)/2+1 x (n+2p-f)/2+1 ,這里是向下取整的,這意味過濾器只能在輸入圖像內部移動,不可以移動出邊緣。
注意 在tensorflow中,有兩種填充方式,一種是same,一種是valid。same是填充,而valid是不填充。如果遇到valid,那麼實際計算矩陣大小的時候,是向上取悄襪整,而不是這里提到的向下取整。如果是same模式,那麼最後的矩陣形狀是n/s,也是向上取整
上面提到的卷積的輸入是n x n的,這一般是灰度圖像。對應彩色圖像則存在RGB三個顏色channel,這樣的圖片是n x n x 3。此時的過濾器也必須存在第三個維度,即channel維度,且一個過濾器的channel維度必須和輸入的channel維度一致。這樣的卷積結果就是三個維度上,過濾器和輸入的重疊位置乘積之和。最後的輸出是(n - f + 1) x ( n - f +1)的。 注意,輸出是二維的
我們可以使用N個不同的過濾器得到不同的N個二維輸出,按照輸入的格式將其疊起來,這樣輸出就是 (n - f + 1) x ( n - f +1) x N了。
在上面一節中已經講了如何得到輸入和一個過濾器卷積之後的結果。通常會給卷積的結果添加一個偏執,然後使用非線性的函數進行處理,得到的就是這層網路的輸出。將過濾器的參數標記為W,偏置為 b(一個channel的輸出矩陣Wa的偏置是一個實數,而非一個矩陣。一個layer的偏置b的維度和通道數channel一致) , 輸入數據為上層的激活值。這樣每個過濾器處理之後的結果就可以看成是經過了該layer一個節點之後的輸出。
下面是每層的符號標記,以及根據上一層計算下一層輸入大小的公式,右下角是使用BP學習更新的時候參數更新的次數。可以看到每層的參數的個數只和這層的filter的大小、數目有關,而和輸入的規模無關。這樣就可以通過控制參數的數量避免過擬合了。
可以從下面的課件中看到,卷積神經網路的趨勢是長度和高度逐漸減少,而channel逐漸加深。最後一層會將卷積層平鋪開來,形成一個全連接。全連接層會連接到最後一個判別函數上,判別函數可以是logistic或者softmax層,用於輸出類別或者概率。
一般情況下,卷積網路除了卷積層之外,還會有池化層和全連接層,這些層可以提供更好的學習。
池化層一般在卷積層之後,可以也可以看成一個過濾器,實際上實現的一個采樣的功能,其主要的思想是,著重提取具有某種傾向的特徵,比如最大池化對應的是更顯著的特徵;平均池化對應的是更加平滑的特徵。過濾器有幾點不同
一般常用的池化層有max_pooling和average_pooling.max_pooling更加常用。 ,最大池化層意味著檢測某個特徵,並始終將這個特徵留在池化層的輸出中 。
池化層的輸入n x n x nc,過濾器 f x f,步長s,輸出 ((n-f)/s+1) x ((n-f)/s+1) * nc。
一般取s=2,這意味著輸入的長寬減小一半。
比較好奇的一個問題是,池化層的存在對反向傳播有什麼影響?我們都知道在傳統的神經網路中,反向傳播演算法實際上就是利用函數的梯度進行反向傳播的,那麼池化層這種既改變了矩陣大小又不好求導的情況,怎麼處理呢?
(下面的內容來自 迷川浩浩_ZJU 的博客 )
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變,還是比較理解的。mean pooling比較容易讓人理解錯的地方就是會簡單的認為直接把梯度復制N遍之後直接反向傳播回去,但是這樣會造成loss之和變為原來的N倍,網路是會產生梯度爆炸的。
2、max pooling
max pooling也要滿足梯度之和不變的原則,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id
一般概念上的一層包括卷積層和池化層,之所以不把池化層當做新的一層是因為池化層沒有需要學習的參數,一般意義上的layer是有權重和參數需要學習的。
盡量不要自己設置超參數,而是盡量參考別人論文裡面使用的超參數,選擇一個在別人任務中效果很好的超參數。
下面的表中列舉了上面的網路每一層的數據規模a^(l)以及參數數量。可以發現數據的規模逐漸減小。主卷積層的參數比較少,而進入全連接層之後參數數量很大。(表格中最後三列的參數數量可能存在錯誤,應該是48000 + 120, 120 * 84 + 84, 84 * 10 + 10)
以上的兩個特徵可以明顯的減少參數。減少過擬合
(內容來自 迷川浩浩_ZJU 的博客 )
常用的激活函數有sigmoid函數和relu函數.
Relu(x)={if x>0 then x;else 0}為了在反向傳播演算法中可以正常使用,將其在x=0x=0處的導數置為1,所以它的導數也就變為了 δRelu(x)={if x>0 then 1 else 0}
Relu是一個非常優秀的激活哈數,相比較於傳統的Sigmoid函數,有三個作用
⑶ 如何更好的理解分析深度卷積神經網路
作者:楊延生
鏈接:
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
"深度學習"是為了讓層數較多的多層神經網路可以訓練,能夠work而演化出來的一系列的 新的結構和新的方法。
新的網路結構中最著名的就是CNN,它解決了傳統較深的網路參數太多,很難訓練的問題,使用了逗局部感受野地和逗權植共享地的概念,大大減少了網路參數的數量。關鍵是這種結構確實很符合視覺類任務在人腦上的工作原理。
新的結構還包括了:LSTM,ResNet等。
新的方法就多了:新的激活函數:ReLU,新的權重初始化方法(逐層初始化,XAVIER等),新的損失函數,新的防止過擬合方法(Dropout, BN等)。這些方面主要都是為了解決傳統的多層神經網路的一些不足:梯度消失,過擬合等。
---------------------- 下面是原答案 ------------------------
從廣義上說深度學習的網路結構也是多層神經網路的一種。
傳統意義上的多層神經網路是只有輸入層、隱藏層、輸出層。其中隱藏層的層數根據需要而定,沒有明確的理論推導來說明到底多少層合適。
而深度學習中最著名的卷積神經網路CNN,在原來多層神經網路的基礎上,加入了特徵學習部分,這部分是模仿人腦對信號處理上的分級的。具體操作就是在原來的全連接的層前面加入了部分連接的卷積層與降維層,而且加入的是一個層級。
輸入層 - 卷積層 -降維層 -卷積層 - 降維層 -- .... -- 隱藏層 -輸出層
簡單來說,原來多層神經網路做的步驟是:特徵映射到值。特徵是人工挑選。
深度學習做的步驟是 信號->特徵->值。 特徵是由網路自己選擇。
⑷ 神經網路:欠擬合和過擬合
以我們前面講述的線性回歸為例,比如我們在訓練集上訓練出最優的模型,但是當我們將其使用到測試集時,測試的誤差很大,我們該怎麼辦?
我們一般採取的措施主要包括以下6種:
增加訓練樣本的數目(該方法適用於過擬合現象時,解決高方差。一般都是有效的,但是代價較大,如果下面的方法有效,可以優先採用下面的方式);
嘗試減少特徵的數量(該方法適用於過擬合現象時,解決高方差);
嘗試獲得更多的特徵(該方法適用於欠擬合現象時,解決高偏差);
嘗試增加多項式特徵(該方法適用於欠擬合現象時,解決高偏差);
嘗試減小正則化程度λ(該方法適用於欠擬合現象時,解決高偏差);
嘗試增加正則化程度λ(該方法適用於過擬合現象時,解決高方差);
上面的方法不是隨機選擇,是在合適的情況下(過擬合和欠擬合)選擇合適的方法,對於怎麼判斷一個模型是過擬合還是欠擬合,我們會在下面給出一些機器學習診斷法。
如何對一個假設進行評估?
我們前面在講述線性回歸和邏輯回歸時,只是注重針對訓練數據集訓練出一個最優的參數,但是我們訓練處的模型對於測試集的性能好壞我們沒有進行判斷,我們只是訓練的模型使得損失函數最小,我們前面也討論過,在訓練數據集上損失函數最小並不能代表對於給定的測試數據,測試數據的評估非常准確,比如過擬合現象發生時,那我們如何評價一個假設的好壞呢?
主要的方法包括兩種:
1.對於簡答的模型,我們可以採用將hθ(x)的圖像畫出,來判斷模型的好壞,但是這種方法對於特徵變數不是一個時,這種方法很難實現或者不可能實現。例如我們曾經看到過這樣的圖像,可以通過hθ(x)的圖像明顯可以看出,該假設存在著過擬合現象。
2.另一種評估假設的方法為:將原來的數據集分為訓練集和測試集,一般我們是從原來的數據集中隨機選取(保證訓練集和測試集中都含有各種類型的數據)70%的數據作為訓練集,剩下的30%的樣本作為測試集。同時這種將原來數據集劃分為訓練集和測試集的方法可以用於幫助特徵選擇、多項式次數的選擇以及正則化參數的選擇等。數據集劃分的過程如下:
以上面數據集為例,選取前7個為訓練集,後3個為測試集。用前7個數據集做訓練訓練出一個最優的模型,評價這個訓練出的模型的好壞可以使用測試集來進行判斷,判斷的標准可以使用測試集的損失函數來進行定量的衡量。
對於回歸問題,測試集的損失函數計算公式如下:
Jtest(θ)=12mtest∑i=1mtest(hθ(x(i)test)−y(i)test)2
而對於分類問題,測試集的損失函數計算公式如下:
這種測量方式,如果測試樣本損失函數很大,則代表訓練出的模型泛化能力不好。
對於分類問題,還有另外一種測量的方式,稱為誤分類率,它對於每一個測試樣本進行計算,計算的公式如下:
error=1mtest∑i=1mtesterr(hθ(x(i)test),y(i)))
其中,
模型的選擇和交叉驗證集:
上述我們是在模型選擇好了之後進行訓練的,也就是上述我們都是確定了假設進行訓練的,但是我們怎麼對模型進行選擇呢,這一節我們來討論一下模型的選擇,以及和交叉驗證集的關系。
模型選擇主要包括以下內容:1.怎樣選擇正確的特徵來構造學習演算法?2.怎樣選擇學習演算法中正則化參數λ?等問題。
首先我們結合一個例子來引出模型的選擇和驗證集:
例如我們有上面十個模型,我們對於給定的數據集選擇哪種模型呢?按照我們上面討論的將數據集劃分為訓練集和測試集,使用訓練集對上述模型進行訓練,然後使用測試集來進行選擇最佳的模型,比如最優的為第五個模型,但是這並不能衡量這個模型的泛化能力,因為測試集已經用於選擇最優的模型,這個模型對於其他未知數據的泛化能力還是未知的。
所以針對上述問題我們可以將數據集劃分為訓練集、交叉驗證集和測試集。一般情況下,訓練集占總樣本的60%,交叉驗證集佔20%,測試集佔20%。其中訓練集用於訓練,交叉驗證集用於選擇最優的模型,測試集用於測試模型的泛化能力。
模型選擇方法為:
1. 使用訓練集訓練10個模型;
2. 用10個模型分別對交叉驗證集計算出交叉驗證誤差(代價函數的值),其中計算公式為:
3. 選取交叉驗證誤差最小的模型作為選擇的模型;
4. 用測試集對選擇出的模型計算泛化能力(測試樣本的損失函數),計算公式如上文中討論的一樣。
假設對診斷偏差和方差(即過擬合還是欠擬合)的影響
利用上述方法學習到的演算法性能不好一般會有兩種情況:
1.會出現過擬合,也就是所謂的方差很大;
2.會出現欠擬合,也就是所謂的偏差很大;
首先應該確定演算法性能的不好,是由哪種原因造成的,然後針對不同的情況採取不同的改進策略,可以有效的改進當前的演算法。下面我們來講述一下怎麼判斷是過擬合還是欠擬合。
以下面例子為例,來進行討論:
我們可以通過繪制出訓練集的代價函數和交叉驗證驗證集的代價函數與方次d的關系來進行判斷是上述哪種情況的一種:
對於訓練集,當d較小時,模型的擬合程度不是很好,所以訓練樣本集的代價函數比較大;隨著d的增加,模型的擬合程度不斷提高,代價函數不斷的減小;
對於交叉驗證集,由於d比較小時,模型的擬合程度不是很好,對於新來的樣本預測結果會偏差很大,所以交叉驗證集的代價函數在初始階段會很大,而隨著d的增加會出現一個比較好的方次d,使得模型的擬合程度最佳,同時對於新來的樣本泛化能力很強,所以會有一個代價函數最小的點出現(該轉折點即是模型開始由欠擬合轉向過擬合的點),隨後隨著d的增加,由於過擬合,會存在對新的樣本預測結果不良的現象,所以代價函數會逐漸增大。
當我們繪制出上述曲線時,我們就可以判斷出什麼時候是過擬合什麼時候欠擬合,判斷的標准如下:
1. 當訓練誤差與交叉驗證集誤差接近時,並且都很大時,該模型高偏差(欠擬合);
2. 當訓練誤差遠小於驗證集誤差時,並且訓練誤差很小時,該模型高方差(過擬合)。
判斷出該模型是過擬合或者欠擬合之後,然後使用上述提到的過擬合和欠擬合的解決方法,對演算法進行改進。
正則化對偏差和方差的影響
我們前面講述過正則化可以有效的處理過擬合現象,但是我們上述所說的處理過擬合是在合適的λ情況下,那麼λ值的大小對模型的性能是怎樣影響的呢?我們採用上述與方次d對性能的影響相同的方式來分析λ的值對性能的影響。
我們首先選擇一系列的λ值,通常λ的選擇是0~10之間呈現二倍關系的值(如:0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,5.26,5.12,10)
構建方式如下:
選擇λ的方法如下:
1.使用訓練集訓練處12個不同程度正則化模型;
2.用12個模型分別對交叉驗證集計算出交叉驗證誤差;
3.選擇得出交叉驗證誤差最小的模型;
4.運用步驟3選出的模型對測試集計算得出推廣誤差
我們同樣可以將訓練集和交叉驗證集模型的代價函數與λ的值繪制在一張圖上。對於訓練集、驗證集和測試集的代價函數計算公式為:
需要注意的是,當計算訓練集、交叉驗證集和測試集誤差時,不計算正則項,然後繪制出訓練集和交叉驗證集代價函數與λ值的關系,如下圖所示:
1. 當λ較小時,訓練誤差較小(過擬合)而交叉驗證集誤差較大;
2. 隨著λ的增加(從過擬合到欠擬合的過程),訓練集誤差逐漸增大(欠擬合),而交叉驗證集誤差則是先減小後增大。
學習曲線
學習曲線也是一種可以判斷演算法是否處於過擬合還是欠擬合的情況,學習曲線是將訓練集誤差和交叉驗證集誤差作為訓練集實例數量(m)的函數繪制的圖像。學習曲先不僅可以幫助我們是不是處於過擬合或者欠擬合,它還可以幫助我們判斷是否為了提高演算法的性能需要我們收集多的數據。
假設我們有100行數據,我們從第一行數據開始,逐漸增加數據進行訓練,得到每次訓練數據的代價函數值。當數據很少時,訓練模型能夠非常完美的擬合很少的數據,但是訓練出的模型卻不能泛化其他的數據,所以當數據很少時,訓練集的代價函數很小,但是交叉驗證集的代價函數很大,隨著樣本的增加,訓練集的代價函數逐漸增大,交叉驗證集的代價函數逐漸減小。繪制的曲線如下圖所示:
1. 如何用學習曲線識別欠擬合:
假設我們的模型處於欠擬合的情況下,擬合曲線如下圖所示:
我們可以看出,無論我們怎樣增加樣本數據,誤差都不會有很大改觀。同時在欠擬合的情況下,會出現隨著樣本的增加,訓練集代價函數和交叉驗證集代價函數都很大的情況,在這種情況下,就沒有必要花費時間在收集數據上了,同時這也是一種判斷模型是過擬合還是欠擬合的方法。
2. 如何使用學習曲線識別過擬合:
假設我們有一個非常高次的多項式模型(比如最高次項達到100次),並且正則化非常小時,從下圖可以看出,當交叉驗證集誤差遠大於訓練集誤差時,往訓練集增加更多數據可以提高模型的效果。
對於過擬合現象時,會出現訓練集代價函數一直都很小(雖然是增加的趨勢),但是驗證集的損失函數會很大(雖然是減小的趨勢),同時訓練集代價函數和驗證集代價函數相差會很大,可以使用這種方法來判斷該模型處於過擬合階段。
對於神經網路我們在討論一下過擬合和欠擬合現象:
使用較小的神經網路,類似於參數較少的情況,容易導致高偏差和欠擬合,但是計算代價小;使用較大的神經網路,類似於參數較多的情況,容易導致高方差和過擬合,雖然計算代價比較大,但是可以通過正則化手段來調整而更加適應數據。
對於 神經網路的模型選擇 :我們一般選擇較大的神經網路並採用正則化處理,而不會選擇較小的神經網路。
對於 神經網路隱藏層的層數選擇 ,一般我們從一層開始逐漸增加層數,為了更好的選擇出最佳的層數,可以針對不同隱藏層層數的神經網路進行訓練,然後選擇交叉驗證集代價函數最小的神經網路。
⑸ 卷積神經網路(CNN)基礎
在七月初七情人節,牛郎織女相見的一天,我終於學習了CNN(來自CS231n),感覺感觸良多,所以趕快記下來,別忘了,最後祝大家情人節快樂5555555.正題開始!
CNN一共有卷積層(CONV)、ReLU層(ReLU)、池化層(Pooling)、全連接層(FC(Full Connection))下面是各個層的詳細解釋。
卷積,尤其是圖像的卷積,需要一個濾波器,用濾波器對整個圖像進行遍歷,我們假設有一個32*32*3的原始圖像A,濾波器的尺寸為5*5*3,用w表示,濾波器中的數據就是CNN的參數的一部分,那麼在使用濾波器w對A進行濾波的話,可以用下面的式子表示:
其中x為原始圖像的5*5*3的一部分,b是偏置項置為1。在對A進行濾波之後,產生的是一個28*28*1的數據。那麼假設我們存在6個濾波器,這六個濾波器之間彼此是獨立的,也就是他們內部的數據是不同的且沒有相關性的。可以理解為一個濾波器查找整幅圖像的垂直邊緣,一個查找水平邊緣,一個查找紅色,一個查找黑色這樣。那麼我就可以產生6個28*28*1的數據,將它們組合到一起就可以產生28*28*6的數據,這就是卷積層主要做的工作。
CNN可以看作一系列的卷積層和ReLU層對原始數據結構進行處理的神經網路,處理的過程可以用下面這幅圖表示
特別要注意的是濾波器的深度一定要與上一層傳來的數據的深度相同,就像上圖的第二個卷積層在處理傳來的28*28*6的數據時要使用5*5*6的濾波器.
濾波器在圖像上不斷移動對圖像濾波,自然存在步長的問題,在上面我們舉的例子都是步長為1的情況,如果步長為3的話,32*32*3的圖像經過5*5*3的濾波器卷積得到的大小是(32-5)/3+1=10, 註:步長不能為2因為(32-5)/2+1=14.5是小數。
所以當圖像大小是N,濾波器尺寸為F時,步長S,那麼卷積後大小為(N-F)/S+1
我們從上面的圖中可以看到圖像的長和寬在逐漸的減小,在經過超過5層之後極可能只剩下1*1的空間尺度,這樣是十分不好的,而且也不利於我們接下來的計算,所以我們想讓卷積層處理完之後圖像在空間尺度上大小不變,所以我們引入了pad the border的操作。pad其實就是在圖像周圍補0,擴大圖像的尺寸,使得卷積後圖像大小不變。在CNN中,主要存在4個超參數,濾波器個數K,濾波器大小F,pad大小P和步長S,其中P是整數,當P=1時,對原始數據的操作如圖所示:
那麼在pad操作後卷積後的圖像大小為:(N-F+2*P)/S+1
而要想讓卷積層處理後圖像空間尺度不變,P的值可以設為P=(F-1)/2
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有4個超參數:
K:濾波器個數
P:pad屬性值
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的濾波器也是有意義的,它在深度方向做卷積,例如1*1*64的濾波器對56*56*64的數據卷積得到56*56的數據
F通常是奇數,這樣可以綜合考慮上下左右四個方向的數據。
卷積層從神經元的角度看待可以有兩個性質: 參數共享和局域連接 。對待一個濾波器,例如5*5*3的一個濾波器,對32*32*3的數據卷積得到28*28的數據,可以看作存在28*28個神經元,每個對原圖像5*5*3的區域進行計算,這28*28個神經元由於使用同一個濾波器,所以參數相同,我們稱這一特性為 參數共享 。
針對不同的濾波器,我們可以看到他們會看到同一區域的圖像,相當於在深度方向存在多個神經元,他們看著相同區域叫做 局域連接
參數共享減少了參數的數量,防止了過擬合
局域連接為查找不同特徵更豐富的表現圖像提供了可能。
卷積就像是對原圖像的另一種表達。
激活函數,對於每一個維度經過ReLU函數輸出即可。不改變數據的空間尺度。
通過pad操作,輸出圖像在控制項上並沒有變化,但是深度發生了變化,越來越龐大的數據給計算帶來了困難,也出現了冗餘的特徵,所以需要進行池化操作,池化不改變深度,只改變長寬,主要有最大值和均值兩種方法,一般的池化濾波器大小F為2步長為2,對於最大值池化可以用下面的圖像清晰的表示:
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有2個超參數:
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
將最後一層(CONV、ReLU或Pool)處理後的數據輸入全連接層,對於W 2 *H 2 *D 2 數據,我們將其展成1*1*W 2 *H 2 *D 2 大小的數據,輸入層共有W 2 *H 2 *D 2 個神經元,最後根據問題確定輸出層的規模,輸出層可以用softmax表示。也就是說,全連接層就是一個常見的BP神經網路。而這個網路也是參數最多的部分,是接下來想要去掉的部分。完整的神經網路可以用下面的圖表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的濾波器與更深的網路
2.只有CONV層而去掉池化與全鏈接
最早的CNN,用於識別郵編,結構為:
CONV-POOL-CONV-POOL-CONV-FC
濾波器大小5*5,步長為1,池化層2*2,步長為2
2012年由於GPU技術所限,原始AlexNet為兩個GPU分開計算,這里介紹合起來的結構。
輸入圖像為227*227*3
1.首次使用ReLU
2.使用Norm layers,現在已經拋棄,因為效果不大
3.數據經過預處理(例如大小變化,顏色變化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 參數0.9(SGD和Momentum見我的其他文章)
7.學習速率 0.01,准確率不在提升時減少10倍,1-2次後達到收斂
8.L2權重減少0.0005
9.錯誤率15.4%
改進自AlexNet,主要改變:
1.CONV1的濾波器從11*11步長S=4改為7*7步長為2.
2.CONV3,4,5濾波器數量有384,384,256改為512,1024,512(濾波器數量為2的n次冪有利於計算機計算可以提高效率)
錯誤率:14.8%後繼續改進至11.2%
當前最好的最易用的CNN網路,所有卷積層濾波器的大小均為3*3,步長為1,pad=1,池化層為2*2的最大值池化,S=2。
主要參數來自全連接層,這也是想要去掉FC的原因。
具有高度的統一性和線性的組合,易於理解,十分方便有VGG-16,VGG-19等多種結構。
錯誤率7.3%
完全移除FC層,參數只有500萬,使用Inception模塊(不太理解,有時間繼續看)
准確率6.67%
准確率3.6%
擁有極深的網路結構,且越深准確率越高。是傳統CNN不具備的特點,傳統CNN並非越深越准確。需要訓練時間較長但是快於VGG
1.每個卷積層使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准確率不變減小10倍(因為Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不適用失活(因為Batch Normalization)
具體的梯度過程學完ResNet再說吧。