2.1)深度学习笔记:深度学习的实践层面
目錄
1)Train/Dev/Test sets
2)Bias/Variance
3)Regularization(重點(diǎn))
4)Why regularization reduces overfitting(理解)
5)Dropout Regularization(重點(diǎn))
6)Understanding Dropout
7)Other regularization methods(了解)
8)Normalizing inputs
9)?Vanishing and Exploding gradients
10)Weight Initialization for Deep Networks(重點(diǎn))
11)Numerical approximation of gradients
12)Gradient checking
13)Gradient Checking Implementation Notes
14)Summary
以下筆記是吳恩達(dá)老師深度學(xué)習(xí)課程第二門課第一周的的學(xué)習(xí)筆記:Practical aspects of Deep Learning。筆記參考了黃海廣博士的內(nèi)容,在此表示感謝。?
1)Train/Dev/Test sets
今天我們可能已經(jīng)知道:應(yīng)用深度學(xué)習(xí)是一個(gè)典型的迭代過程。 在建立訓(xùn)練模型的過程中,數(shù)據(jù)集會(huì)被劃分為以下幾個(gè)部分:
- 訓(xùn)練集(train set):用訓(xùn)練集對(duì)算法或模型進(jìn)行訓(xùn)練;
- 驗(yàn)證集(development set):利用驗(yàn)證集(又稱為交叉驗(yàn)證集)進(jìn)行交叉驗(yàn)證,選擇出最好的模型;
- 測(cè)試集(test set):最后利用測(cè)試集對(duì)模型進(jìn)行測(cè)試,獲取模型運(yùn)行的無偏估計(jì)。
在數(shù)據(jù)量比較少的時(shí)候,如 100、1000、10000 的數(shù)據(jù)量大小,可以將數(shù)據(jù)集按照以下比例進(jìn)行劃分:
- 無驗(yàn)證集的情況:70% / 30%;
- 有驗(yàn)證集的情況:60% / 20% / 20%;
而在如今的大數(shù)據(jù)時(shí)代,對(duì)于一個(gè)問題,我們擁有的數(shù)據(jù)集的規(guī)模可能是百萬級(jí)別的,所以驗(yàn)證集和測(cè)試集所占的比重會(huì)趨向于變得更小。驗(yàn)證集的目的是為了驗(yàn)證不同的算法哪種更加有效,所以驗(yàn)證集只要足夠大到能夠驗(yàn)證大約 10 種算法哪種更好時(shí),就不需要使用 20% 的數(shù)據(jù)作為驗(yàn)證集。在百萬數(shù)據(jù)中抽取 1 萬的數(shù)據(jù)作為驗(yàn)證集就可以了。
測(cè)試集的主要目的是評(píng)估模型的效果,如在單個(gè)分類器中,往往在百萬級(jí)別的數(shù)據(jù)中,我們選擇其中 1000 條數(shù)據(jù)足以評(píng)估單個(gè)模型的效果。
100 萬數(shù)據(jù)量:98% / 1% / 1%;
超百萬數(shù)據(jù)量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)
吳恩達(dá)老師在視頻中補(bǔ)充到:建議驗(yàn)證集要和訓(xùn)練集來自于同一個(gè)分布(數(shù)據(jù)來源一致),可以使得機(jī)器學(xué)習(xí)算法訓(xùn)練得更快并獲得更好的效果。如果不需要用無偏估計(jì)來評(píng)估模型的性能,則可以不需要測(cè)試集。
2)Bias/Variance
偏差(Bias)和方差(Variance)是機(jī)器學(xué)習(xí)領(lǐng)域非常重要的兩個(gè)概念和需要解決的問題。在傳統(tǒng)的機(jī)器學(xué)習(xí)算法中,Bias和Variance是對(duì)立的,分別對(duì)應(yīng)著欠擬合和過擬合,我們常常需要在Bias和Variance之間進(jìn)行權(quán)衡。而在深度學(xué)習(xí)中,我們可以同時(shí)減小Bias和Variance,構(gòu)建最佳神經(jīng)網(wǎng)絡(luò)模型。
在欠擬合(underfitting)的情況下,即出現(xiàn)高偏差(high bias)的情況,不能很好地對(duì)數(shù)據(jù)進(jìn)行分類。
當(dāng)模型設(shè)置的太復(fù)雜時(shí),使得模型出現(xiàn)過擬合(overfitting)的情況,在驗(yàn)證集上出現(xiàn)高方差(high variance)現(xiàn)象。
當(dāng)訓(xùn)練出一個(gè)模型以后,如果:
- 訓(xùn)練集的錯(cuò)誤率較小,而驗(yàn)證集的錯(cuò)誤率卻較大,說明模型存在較大方差,可能出現(xiàn)了過擬合;
- 訓(xùn)練集和開發(fā)集的錯(cuò)誤率都較大,且兩者相當(dāng),說明模型存在較大偏差,可能出現(xiàn)了欠擬合;
- 訓(xùn)練集錯(cuò)誤率較大,且開發(fā)集的錯(cuò)誤率遠(yuǎn)較訓(xùn)練集大,說明方差和偏差都較大,模型很差;
- 訓(xùn)練集和開發(fā)集的錯(cuò)誤率都較小,且兩者的相差也較小,說明方差和偏差都較小,這個(gè)模型效果比較好。
吳恩達(dá)老師在視頻中針對(duì)偏差和方差問題給出了一些建議:
對(duì)于高偏差問題:
- 擴(kuò)大神經(jīng)網(wǎng)絡(luò)規(guī)模,如添加隱藏層或隱藏單元數(shù)目;
- 尋找合適的網(wǎng)絡(luò)架構(gòu),使用更大的 NN 結(jié)構(gòu);
- 花費(fèi)更長時(shí)間訓(xùn)練。
對(duì)于高方差問題:
- 獲取更多的數(shù)據(jù);
- 正則化(regularization);
- 尋找更合適的網(wǎng)絡(luò)結(jié)構(gòu)。
3)Regularization(重點(diǎn))
正則化是在cost函數(shù)中加入一個(gè)正則化項(xiàng),懲罰模型。正則化可以用于解決高方差的問題。
我們先回顧一下之前介紹的Logistic Regression。我們采用的是L2正則化,加入正則化后的cost函數(shù)為:
這里我們只對(duì)參數(shù)進(jìn)行了正則化處理而不對(duì)處理。因?yàn)闉橐粋€(gè)常數(shù),相對(duì)來說的維度很大,對(duì)模型泛化能力的影響很大。
除了L2正則化之外,還有另一張正則化方法,L1正則化,表達(dá)式為:
由于 L1 正則化最后得到 w 向量中將存在大量的 0,使模型變得稀疏化,因此 L2 正則化更加常用 。注意,lambda在 Python 中屬于保留字,所以在編程的時(shí)候,用lambd代替這里的正則化因子。
在深度學(xué)習(xí)模型中,L2正則化的表達(dá)式為:? ? ? ??
被稱為弗羅貝尼烏斯范數(shù)(Frobenius Norm),所以神經(jīng)網(wǎng)絡(luò)中的正則化項(xiàng)被稱為弗羅貝尼烏斯范數(shù)矩陣。
加入正則化之后,我們的梯度下降計(jì)算變?yōu)?#xff1a;
加入正則化之后新的梯度下降公式變?yōu)?#xff1a;
可以看見,權(quán)重衰減,所以L2正則化項(xiàng)也被稱為權(quán)重衰減。
4)Why regularization reduces overfitting(理解)
我們都知道正則化可以有效避免過擬合,但為什么可以避免過擬合呢?我們舉例來說明:下面是欠擬合、剛好擬合和過擬合的情況。
假如我們選擇了非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,如上圖左上角所示。在未使用正則化的情況下,我們得到的分類超平面可能是類似上圖右側(cè)的過擬合。但是,如果使用L2 正則化,當(dāng)λ很大時(shí),w[l]≈0。w[l]近似為零,意味著該神經(jīng)網(wǎng)絡(luò)模型中的某些神經(jīng)元實(shí)際的作用很小,可以忽略。從效果上來看,其實(shí)是將某些神經(jīng)元給忽略掉了。這樣原本過于復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型就變得不那么復(fù)雜了,而變得非常簡單化了。如下圖所示,整個(gè)簡化的神經(jīng)網(wǎng)絡(luò)模型變成了一個(gè)邏輯回歸模型。問題就從high variance變成了high bias了。
因此,選擇合適大小的λ值,就能夠同時(shí)避免high bias和high variance,得到最佳模型。
數(shù)學(xué)解釋:
假設(shè)神經(jīng)元中使用的激活函數(shù)為tanh函數(shù)。
在加入正則化項(xiàng)后,當(dāng) λ 增大,導(dǎo)致??減小,?便會(huì)減小。由上圖可知,在 z 較小(接近于 0)的區(qū)域里,tanh(z)函數(shù)近似線性,所以每層的函數(shù)就近似線性函數(shù),整個(gè)網(wǎng)絡(luò)就成為一個(gè)簡單的近似線性的網(wǎng)絡(luò),因此不會(huì)發(fā)生過擬合。
5)Dropout Regularization(重點(diǎn))
除了L2正則化,還有一種防止過擬合的有效方法:Dropout。dropout(隨機(jī)失活)是在神經(jīng)網(wǎng)絡(luò)的隱藏層為每個(gè)神經(jīng)元結(jié)點(diǎn)設(shè)置一個(gè)隨機(jī)消失的概率,保留下來的神經(jīng)元形成一個(gè)結(jié)點(diǎn)較少、規(guī)模較小的網(wǎng)絡(luò)用于訓(xùn)練。dropout 正則化較多地被使用在計(jì)算機(jī)視覺(Computer Vision)領(lǐng)域。下圖為概率為0.5的Dropout的正則化例子。
Dropout有不同的實(shí)現(xiàn)方法,接下來介紹一種常用的方法:Inverted dropout。假設(shè)對(duì)于第ll層神經(jīng)元,設(shè)定保留神經(jīng)元比例概率keep_prob=0.8,即該層有20%的神經(jīng)元停止工作。dl為dropout向量,設(shè)置dl為隨機(jī)vector,其中80%的元素為1,20%的元素為0。在python中可以使用如下語句生成dropout vector:
keep_prob = 0.8 # 設(shè)置神經(jīng)元保留概率 dl = np.random.rand(al.shape[0], al.shape[1]) < keep_prob al = np.multiply(al, dl) al /= keep_prob最后一步al /= keep_prob 是因?yàn)?中的一部分元素失活(相當(dāng)于被歸零),為了在下一層計(jì)算時(shí)不影響 的期望值,因此除以一個(gè)keep_prob 。注意,在測(cè)試階段不要使用 dropout,因?yàn)槟菢訒?huì)使得預(yù)測(cè)結(jié)果變得隨機(jī)。
6)Understanding Dropout
Dropout通過每次迭代訓(xùn)練時(shí),隨機(jī)選擇不同的神經(jīng)元,相當(dāng)于每次都在不同的神經(jīng)網(wǎng)絡(luò)上進(jìn)行訓(xùn)練,類似機(jī)器學(xué)習(xí)中Bagging的方法,能夠防止過擬合。
對(duì)于單個(gè)神經(jīng)元,其接收輸入特征并輸出。但是加入了 dropout 后,輸入的特征都存在被隨機(jī)消失的可能,所以該神經(jīng)元不會(huì)再特別依賴于任何一個(gè)輸入特征,即不會(huì)給任何一個(gè)輸入特征設(shè)置太大的權(quán)重。 因此,通過傳播過程,dropout 將產(chǎn)生和 L2 正則化相同的收縮權(quán)重的效果。
對(duì)于不同的層,設(shè)置的keep_prob也不同。一般來說,神經(jīng)元較少的層,會(huì)設(shè)keep_prob為 1.0,而神經(jīng)元多的層則會(huì)設(shè)置比較小的keep_prob。
dropout 的一大缺點(diǎn)是成本函數(shù)無法被明確定義。因?yàn)槊看蔚紩?huì)隨機(jī)消除一些神經(jīng)元結(jié)點(diǎn)的影響,因此無法確保成本函數(shù)單調(diào)遞減。因此,使用 dropout 時(shí),先將keep_prob全部設(shè)置為 1.0 后運(yùn)行代碼,確保 函數(shù)單調(diào)遞減,再打開 dropout。
7)Other regularization methods(了解)
除了L2 正則化和dropout 正則化之外,還有其它減少過擬合的方法。
一種方法是增加訓(xùn)練樣本數(shù)量。但是通常成本較高,難以獲得額外的訓(xùn)練樣本。但是,我們可以對(duì)已有的訓(xùn)練樣本進(jìn)行一些處理來“制造”出更多的樣本,稱為data augmentation。例如圖片識(shí)別問題中,可以對(duì)已有的圖片進(jìn)行水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、任意角度旋轉(zhuǎn)、縮放或擴(kuò)大等等。如下圖所示,這些處理都能“制造”出新的訓(xùn)練樣本。雖然這些是基于原有樣本的,但是對(duì)增大訓(xùn)練樣本數(shù)量還是有很有幫助的,不需要增加額外成本,卻能起到防止過擬合的效果。
還有另外一種防止過擬合的方法:early stopping。將訓(xùn)練集和驗(yàn)證集進(jìn)行梯度下降時(shí)的成本變化曲線畫在同一個(gè)坐標(biāo)軸內(nèi),當(dāng)訓(xùn)練集誤差降低但驗(yàn)證集誤差升高,兩者開始發(fā)生較大偏差時(shí)及時(shí)停止迭代,并返回具有最小驗(yàn)證集誤差的連接權(quán)和閾值,以避免過擬合。這種方法的缺點(diǎn)是無法同時(shí)達(dá)成偏差和方差的最優(yōu)。
8)Normalizing inputs
在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),標(biāo)準(zhǔn)化輸入可以提高訓(xùn)練的速度。標(biāo)準(zhǔn)化輸入就是對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行歸一化的操作,即將原始數(shù)據(jù)減去其均值μ后,再除以其方差:
為什么使用標(biāo)準(zhǔn)化輸入呢?我們來看下面這幅圖:
有圖可知,使用標(biāo)準(zhǔn)化輸入前后,成本函數(shù)的形狀有較大改變。
在不使用標(biāo)準(zhǔn)化的成本函數(shù)中,如果設(shè)置一個(gè)較小的學(xué)習(xí)率,可能需要很多次迭代才能到達(dá)全局最優(yōu)解;而如果使用了標(biāo)準(zhǔn)化,那么無論從哪個(gè)位置開始迭代,都能以相對(duì)較少的迭代次數(shù)找到全局最優(yōu)解。
9)?Vanishing and Exploding gradients
在神經(jīng)網(wǎng)絡(luò)尤其是深度神經(jīng)網(wǎng)絡(luò)中存在這樣一個(gè)問題:梯度消失和梯度爆炸。意思是當(dāng)訓(xùn)練一個(gè)層數(shù)非常多的神經(jīng)網(wǎng)絡(luò)時(shí),計(jì)算得到的梯度可能非常小或非常大,甚至是指數(shù)級(jí)別的減小或增大。這樣會(huì)讓訓(xùn)練過程變得非常困難。假設(shè)存在下面這個(gè)每層包含兩個(gè)神經(jīng)元的深度神經(jīng)網(wǎng)絡(luò):
假定 ,對(duì)于目標(biāo)輸出有:
- 對(duì)于 的值>1 的情況,激活函數(shù)的值將以指數(shù)級(jí)遞增;
- 對(duì)于的值<?1 的情況,激活函數(shù)的值將以指數(shù)級(jí)遞減。
對(duì)于梯度計(jì)算同樣。因此,在計(jì)算梯度時(shí),根據(jù)不同情況梯度函數(shù)會(huì)以指數(shù)級(jí)遞增或遞減,導(dǎo)致訓(xùn)練梯度難度上升,梯度下降算法的步長會(huì)變得非常小,需要訓(xùn)練的時(shí)間將會(huì)非常長。
10)Weight Initialization for Deep Networks(重點(diǎn))
下面介紹如何改善梯度消失和梯度爆炸這類問題,方法是對(duì)權(quán)重進(jìn)行一些初始化處理。、
深度神經(jīng)網(wǎng)絡(luò)模型中,以單個(gè)神經(jīng)元為例,該層的輸入個(gè)數(shù)為,其輸出為:
可知,當(dāng)輸入的數(shù)量 n 較大時(shí),我們希望每個(gè) 的值都小一些,這樣它們的和得到的 也較小。
一種方法是在初始化w時(shí),令其方差為。相應(yīng)的python偽代碼為:
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])如果激活函數(shù)是tanh,一般選擇上面的初始化方法。
如果激活函數(shù)是ReLU,權(quán)重的初始化一般令其方差為:
w[l] = np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1])至于選擇哪種初始化方法因人而異,可以根據(jù)不同的激活函數(shù)選擇不同方法。另外,我們可以對(duì)這些初始化方法中設(shè)置某些參數(shù),作為超參數(shù),通過驗(yàn)證集進(jìn)行驗(yàn)證,得到最優(yōu)參數(shù),來優(yōu)化神經(jīng)網(wǎng)絡(luò)。
11)Numerical approximation of gradients
Back Propagation神經(jīng)網(wǎng)絡(luò)有一項(xiàng)重要的測(cè)試是梯度檢查(gradient checking)。其目的是檢查驗(yàn)證反向傳播過程中梯度下降算法是否正確。
雙邊誤差求導(dǎo)(即導(dǎo)數(shù)的定義):?
?
當(dāng) ε 越小時(shí),結(jié)果越接近真實(shí)的導(dǎo)數(shù),也就是梯度值。可以使用這種方法來判斷反向傳播進(jìn)行梯度下降時(shí),是否出現(xiàn)了錯(cuò)誤。
12)Gradient checking
介紹完如何近似求出梯度值后,我們將介紹如何進(jìn)行梯度檢查,來驗(yàn)證訓(xùn)練過程中是否出現(xiàn)bugs。
梯度檢查首先要做的是分別將全部連接起來,構(gòu)成一個(gè)一維向量。?這樣成本函數(shù)就成為。
同時(shí),對(duì) 執(zhí)行同樣的操作得到一維向量?,它和 ?有同樣的維度。
接著利用對(duì)每個(gè)計(jì)算近似梯度,其值與反向傳播算法得到的相比較,檢查是否一致。例如,對(duì)于第i個(gè)元素,近似梯度為:
計(jì)算完所有的近似梯度后,計(jì)算和的歐氏距離,公式如下:
一般來說,如果歐氏距離越小,例如,甚至更小,則表明反向梯度計(jì)算是正確的,沒有bugs。
如果歐氏距離較大,例如,則表明梯度計(jì)算可能出現(xiàn)問題,需要再次檢查是否有bugs存在。
如果歐氏距離很大,例如,甚至更大,則表明梯度下降計(jì)算過程有bugs,需要仔細(xì)檢查。
13)Gradient Checking Implementation Notes
在進(jìn)行梯度檢查的過程中有幾點(diǎn)需要注意的地方:
- 不要在訓(xùn)練中使用梯度檢驗(yàn),它只用于debug;
- 如果算法的梯度檢驗(yàn)失敗,要檢查所有項(xiàng),并試著找出 bug;
- 當(dāng)成本函數(shù)包含正則項(xiàng)時(shí),也需要帶上正則項(xiàng)進(jìn)行檢驗(yàn);
- 梯度檢驗(yàn)不能與 dropout 同時(shí)使用。因?yàn)槊看蔚^程中,dropout 會(huì)隨機(jī)消除隱藏層單元的不同子集,難以計(jì)算 dropout 在梯度下降上的成本函數(shù) J。建議關(guān)閉 dropout,用梯度檢驗(yàn)進(jìn)行雙重檢查,確定在沒有 dropout 的情況下算法正確,然后打開 dropout;
14)Summary
本節(jié)課主要介紹了深度學(xué)習(xí)的實(shí)踐層面。
首先我們講了如何配置訓(xùn)練集,驗(yàn)證集和測(cè)試集,并如何分析偏差、方差,如何處理欠擬合或過擬合問題;
然后我們介紹了如何在深度神經(jīng)網(wǎng)絡(luò)模型中應(yīng)用不同形式的正則化,如L2正則化和dropout正則化;
最后我們介紹了歸一化輸入,這可以加快神經(jīng)網(wǎng)絡(luò)的訓(xùn)練速度,以及梯度檢驗(yàn)。
總結(jié)
以上是生活随笔為你收集整理的2.1)深度学习笔记:深度学习的实践层面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ismserv.exe是什么进程 ism
- 下一篇: 15.深度学习练习:Deep Learn