日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

2.1)深度学习笔记:深度学习的实践层面

發(fā)布時間:2023/12/10 pytorch 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2.1)深度学习笔记:深度学习的实践层面 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1)Train/Dev/Test sets

2)Bias/Variance

3)Regularization(重點)

4)Why regularization reduces overfitting(理解)

5)Dropout Regularization(重點)

6)Understanding Dropout

7)Other regularization methods(了解)

8)Normalizing inputs

9)?Vanishing and Exploding gradients

10)Weight Initialization for Deep Networks(重點)

11)Numerical approximation of gradients

12)Gradient checking

13)Gradient Checking Implementation Notes

14)Summary


以下筆記是吳恩達老師深度學習課程第二門課第一周的的學習筆記:Practical aspects of Deep Learning。筆記參考了黃海廣博士的內(nèi)容,在此表示感謝。?


1)Train/Dev/Test sets

今天我們可能已經(jīng)知道:應(yīng)用深度學習是一個典型的迭代過程。 在建立訓練模型的過程中,數(shù)據(jù)集會被劃分為以下幾個部分:

  • 訓練集(train set):用訓練集對算法或模型進行訓練;
  • 驗證集(development set):利用驗證集(又稱為交叉驗證集)進行交叉驗證選擇出最好的模型
  • 測試集(test set):最后利用測試集對模型進行測試,獲取模型運行的無偏估計。

在數(shù)據(jù)量比較少的時候,如 100、1000、10000 的數(shù)據(jù)量大小,可以將數(shù)據(jù)集按照以下比例進行劃分:

  • 無驗證集的情況:70% / 30%;
  • 有驗證集的情況:60% / 20% / 20%;

而在如今的大數(shù)據(jù)時代,對于一個問題,我們擁有的數(shù)據(jù)集的規(guī)??赡苁前偃f級別的,所以驗證集和測試集所占的比重會趨向于變得更小。驗證集的目的是為了驗證不同的算法哪種更加有效,所以驗證集只要足夠大到能夠驗證大約 10 種算法哪種更好時,就不需要使用 20% 的數(shù)據(jù)作為驗證集。在百萬數(shù)據(jù)中抽取 1 萬的數(shù)據(jù)作為驗證集就可以了。

測試集的主要目的是評估模型的效果,如在單個分類器中,往往在百萬級別的數(shù)據(jù)中,我們選擇其中 1000 條數(shù)據(jù)足以評估單個模型的效果。

100 萬數(shù)據(jù)量:98% / 1% / 1%;

超百萬數(shù)據(jù)量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)

吳恩達老師在視頻中補充到:建議驗證集要和訓練集來自于同一個分布(數(shù)據(jù)來源一致),可以使得機器學習算法訓練得更快并獲得更好的效果。如果不需要用無偏估計來評估模型的性能,則可以不需要測試集。


2)Bias/Variance

偏差(Bias)和方差(Variance)是機器學習領(lǐng)域非常重要的兩個概念和需要解決的問題。在傳統(tǒng)的機器學習算法中,Bias和Variance是對立的,分別對應(yīng)著欠擬合和過擬合,我們常常需要在Bias和Variance之間進行權(quán)衡。而在深度學習中,我們可以同時減小Bias和Variance,構(gòu)建最佳神經(jīng)網(wǎng)絡(luò)模型。

欠擬合(underfitting)的情況下,即出現(xiàn)高偏差(high bias)的情況,不能很好地對數(shù)據(jù)進行分類。

當模型設(shè)置的太復雜時,使得模型出現(xiàn)過擬合(overfitting)的情況,在驗證集上出現(xiàn)高方差(high variance)現(xiàn)象。

當訓練出一個模型以后,如果:

  • 訓練集的錯誤率較小,而驗證集的錯誤率卻較大,說明模型存在較大方差,可能出現(xiàn)了過擬合;
  • 訓練集和開發(fā)集的錯誤率都較大,且兩者相當,說明模型存在較大偏差,可能出現(xiàn)了欠擬合;
  • 訓練集錯誤率較大,且開發(fā)集的錯誤率遠較訓練集大,說明方差和偏差都較大,模型很差;
  • 訓練集和開發(fā)集的錯誤率都較小,且兩者的相差也較小,說明方差和偏差都較小,這個模型效果比較好。

吳恩達老師在視頻中針對偏差和方差問題給出了一些建議:

對于高偏差問題:

  • 擴大神經(jīng)網(wǎng)絡(luò)規(guī)模,如添加隱藏層或隱藏單元數(shù)目;
  • 尋找合適的網(wǎng)絡(luò)架構(gòu),使用更大的 NN 結(jié)構(gòu);
  • 花費更長時間訓練。

對于高方差問題:

  • 獲取更多的數(shù)據(jù);
  • 正則化(regularization);
  • 尋找更合適的網(wǎng)絡(luò)結(jié)構(gòu)。

3)Regularization(重點)

正則化是在cost函數(shù)中加入一個正則化項,懲罰模型。正則化可以用于解決高方差的問題。

我們先回顧一下之前介紹的Logistic Regression。我們采用的是L2正則化,加入正則化后的cost函數(shù)為:

這里我們只對參數(shù)進行了正則化處理而不對處理。因為為一個常數(shù),相對來說的維度很大,對模型泛化能力的影響很大。

除了L2正則化之外,還有另一張正則化方法,L1正則化,表達式為:

由于 L1 正則化最后得到 w 向量中將存在大量的 0,使模型變得稀疏化,因此 L2 正則化更加常用 。注意,lambda在 Python 中屬于保留字,所以在編程的時候,用lambd代替這里的正則化因子。

在深度學習模型中,L2正則化的表達式為:? ? ? ??

被稱為弗羅貝尼烏斯范數(shù)(Frobenius Norm),所以神經(jīng)網(wǎng)絡(luò)中的正則化項被稱為弗羅貝尼烏斯范數(shù)矩陣。

加入正則化之后,我們的梯度下降計算變?yōu)?#xff1a;

加入正則化之后新的梯度下降公式變?yōu)?#xff1a;

可以看見,權(quán)重衰減,所以L2正則化項也被稱為權(quán)重衰減。


4)Why regularization reduces overfitting(理解)

我們都知道正則化可以有效避免過擬合,但為什么可以避免過擬合呢?我們舉例來說明:下面是欠擬合、剛好擬合和過擬合的情況。

假如我們選擇了非常復雜的神經(jīng)網(wǎng)絡(luò)模型,如上圖左上角所示。在未使用正則化的情況下,我們得到的分類超平面可能是類似上圖右側(cè)的過擬合。但是,如果使用L2 正則化,當λ很大時,w[l]≈0。w[l]近似為零,意味著該神經(jīng)網(wǎng)絡(luò)模型中的某些神經(jīng)元實際的作用很小,可以忽略。從效果上來看,其實是將某些神經(jīng)元給忽略掉了。這樣原本過于復雜的神經(jīng)網(wǎng)絡(luò)模型就變得不那么復雜了,而變得非常簡單化了。如下圖所示,整個簡化的神經(jīng)網(wǎng)絡(luò)模型變成了一個邏輯回歸模型。問題就從high variance變成了high bias了。

因此,選擇合適大小的λ值,就能夠同時避免high bias和high variance,得到最佳模型。

數(shù)學解釋:

假設(shè)神經(jīng)元中使用的激活函數(shù)為tanh函數(shù)。

在加入正則化項后,當 λ 增大,導致??減小,?便會減小。由上圖可知,在 z 較小(接近于 0)的區(qū)域里,tanh(z)函數(shù)近似線性,所以每層的函數(shù)就近似線性函數(shù),整個網(wǎng)絡(luò)就成為一個簡單的近似線性的網(wǎng)絡(luò),因此不會發(fā)生過擬合。


5)Dropout Regularization(重點)

除了L2正則化,還有一種防止過擬合的有效方法:Dropout。dropout(隨機失活是在神經(jīng)網(wǎng)絡(luò)的隱藏層為每個神經(jīng)元結(jié)點設(shè)置一個隨機消失的概率,保留下來的神經(jīng)元形成一個結(jié)點較少、規(guī)模較小的網(wǎng)絡(luò)用于訓練。dropout 正則化較多地被使用在計算機視覺(Computer Vision)領(lǐng)域。下圖為概率為0.5的Dropout的正則化例子。

Dropout有不同的實現(xiàn)方法,接下來介紹一種常用的方法:Inverted dropout。假設(shè)對于第ll層神經(jīng)元,設(shè)定保留神經(jīng)元比例概率keep_prob=0.8,即該層有20%的神經(jīng)元停止工作。dl為dropout向量,設(shè)置dl為隨機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 是因為 中的一部分元素失活(相當于被歸零),為了在下一層計算時不影響 的期望值,因此除以一個keep_prob 。注意,在測試階段不要使用 dropout,因為那樣會使得預(yù)測結(jié)果變得隨機。


6)Understanding Dropout

Dropout通過每次迭代訓練時,隨機選擇不同的神經(jīng)元,相當于每次都在不同的神經(jīng)網(wǎng)絡(luò)上進行訓練,類似機器學習中Bagging的方法,能夠防止過擬合。

對于單個神經(jīng)元,其接收輸入特征并輸出。但是加入了 dropout 后,輸入的特征都存在被隨機消失的可能,所以該神經(jīng)元不會再特別依賴于任何一個輸入特征,即不會給任何一個輸入特征設(shè)置太大的權(quán)重。 因此,通過傳播過程,dropout 將產(chǎn)生和 L2 正則化相同的收縮權(quán)重的效果。

對于不同的層,設(shè)置的keep_prob也不同。一般來說,神經(jīng)元較少的層,會設(shè)keep_prob為 1.0,而神經(jīng)元多的層則會設(shè)置比較小的keep_prob。

dropout 的一大缺點是成本函數(shù)無法被明確定義。因為每次迭代都會隨機消除一些神經(jīng)元結(jié)點的影響,因此無法確保成本函數(shù)單調(diào)遞減。因此,使用 dropout 時,先將keep_prob全部設(shè)置為 1.0 后運行代碼,確保 函數(shù)單調(diào)遞減,再打開 dropout。


7)Other regularization methods(了解)

除了L2 正則化和dropout 正則化之外,還有其它減少過擬合的方法。

一種方法是增加訓練樣本數(shù)量。但是通常成本較高,難以獲得額外的訓練樣本。但是,我們可以對已有的訓練樣本進行一些處理來“制造”出更多的樣本,稱為data augmentation。例如圖片識別問題中,可以對已有的圖片進行水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、任意角度旋轉(zhuǎn)、縮放或擴大等等。如下圖所示,這些處理都能“制造”出新的訓練樣本。雖然這些是基于原有樣本的,但是對增大訓練樣本數(shù)量還是有很有幫助的,不需要增加額外成本,卻能起到防止過擬合的效果。

還有另外一種防止過擬合的方法:early stopping。將訓練集和驗證集進行梯度下降時的成本變化曲線畫在同一個坐標軸內(nèi),當訓練集誤差降低但驗證集誤差升高,兩者開始發(fā)生較大偏差時及時停止迭代,并返回具有最小驗證集誤差的連接權(quán)和閾值,以避免過擬合。這種方法的缺點是無法同時達成偏差和方差的最優(yōu)。


8)Normalizing inputs

在訓練神經(jīng)網(wǎng)絡(luò)時,標準化輸入可以提高訓練的速度。標準化輸入就是對訓練數(shù)據(jù)集進行歸一化的操作,即將原始數(shù)據(jù)減去其均值μ后,再除以其方差:

為什么使用標準化輸入呢?我們來看下面這幅圖:

有圖可知,使用標準化輸入前后,成本函數(shù)的形狀有較大改變。

在不使用標準化的成本函數(shù)中,如果設(shè)置一個較小的學習率,可能需要很多次迭代才能到達全局最優(yōu)解;而如果使用了標準化,那么無論從哪個位置開始迭代,都能以相對較少的迭代次數(shù)找到全局最優(yōu)解。


9)?Vanishing and Exploding gradients

在神經(jīng)網(wǎng)絡(luò)尤其是深度神經(jīng)網(wǎng)絡(luò)中存在這樣一個問題:梯度消失和梯度爆炸。意思是當訓練一個層數(shù)非常多的神經(jīng)網(wǎng)絡(luò)時,計算得到的梯度可能非常小或非常大,甚至是指數(shù)級別的減小或增大。這樣會讓訓練過程變得非常困難。假設(shè)存在下面這個每層包含兩個神經(jīng)元的深度神經(jīng)網(wǎng)絡(luò):

假定 ,對于目標輸出有:

  • 對于 的值>1 的情況,激活函數(shù)的值將以指數(shù)級遞增;
  • 對于的值<?1 的情況,激活函數(shù)的值將以指數(shù)級遞減。

對于梯度計算同樣。因此,在計算梯度時,根據(jù)不同情況梯度函數(shù)會以指數(shù)級遞增或遞減,導致訓練梯度難度上升,梯度下降算法的步長會變得非常小,需要訓練的時間將會非常長。


10)Weight Initialization for Deep Networks(重點)

下面介紹如何改善梯度消失和梯度爆炸這類問題,方法是對權(quán)重進行一些初始化處理。、

深度神經(jīng)網(wǎng)絡(luò)模型中,以單個神經(jīng)元為例,該層的輸入個數(shù)為,其輸出為:

可知,當輸入的數(shù)量 n 較大時,我們希望每個 的值都小一些,這樣它們的和得到的 也較小。

一種方法是在初始化w時,令其方差為。相應(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ù)選擇不同方法。另外,我們可以對這些初始化方法中設(shè)置某些參數(shù),作為超參數(shù),通過驗證集進行驗證,得到最優(yōu)參數(shù),來優(yōu)化神經(jīng)網(wǎng)絡(luò)。


11)Numerical approximation of gradients

Back Propagation神經(jīng)網(wǎng)絡(luò)有一項重要的測試是梯度檢查(gradient checking)。其目的是檢查驗證反向傳播過程中梯度下降算法是否正確。

雙邊誤差求導(即導數(shù)的定義):?

?

當 ε 越小時,結(jié)果越接近真實的導數(shù),也就是梯度值。可以使用這種方法來判斷反向傳播進行梯度下降時,是否出現(xiàn)了錯誤。


12)Gradient checking

介紹完如何近似求出梯度值后,我們將介紹如何進行梯度檢查,來驗證訓練過程中是否出現(xiàn)bugs。

梯度檢查首先要做的是分別將全部連接起來,構(gòu)成一個一維向量。?這樣成本函數(shù)就成為。

同時,對 執(zhí)行同樣的操作得到一維向量?,它和 ?有同樣的維度。

接著利用對每個計算近似梯度,其值與反向傳播算法得到的相比較,檢查是否一致。例如,對于第i個元素,近似梯度為:

計算完所有的近似梯度后,計算和的歐氏距離,公式如下:

一般來說,如果歐氏距離越小,例如,甚至更小,則表明反向梯度計算是正確的,沒有bugs。

如果歐氏距離較大,例如,則表明梯度計算可能出現(xiàn)問題,需要再次檢查是否有bugs存在。

如果歐氏距離很大,例如,甚至更大,則表明梯度下降計算過程有bugs,需要仔細檢查。


13)Gradient Checking Implementation Notes

在進行梯度檢查的過程中有幾點需要注意的地方:

  • 不要在訓練中使用梯度檢驗,它只用于debug;
  • 如果算法的梯度檢驗失敗,要檢查所有項,并試著找出 bug;
  • 當成本函數(shù)包含正則項時,也需要帶上正則項進行檢驗;
  • 梯度檢驗不能與 dropout 同時使用。因為每次迭代過程中,dropout 會隨機消除隱藏層單元的不同子集,難以計算 dropout 在梯度下降上的成本函數(shù) J。建議關(guān)閉 dropout,用梯度檢驗進行雙重檢查,確定在沒有 dropout 的情況下算法正確,然后打開 dropout;

14)Summary

本節(jié)課主要介紹了深度學習的實踐層面。

首先我們講了如何配置訓練集,驗證集和測試集,并如何分析偏差、方差,如何處理欠擬合過擬合問題

然后我們介紹了如何在深度神經(jīng)網(wǎng)絡(luò)模型中應(yīng)用不同形式的正則化,如L2正則化和dropout正則化

最后我們介紹了歸一化輸入,這可以加快神經(jīng)網(wǎng)絡(luò)的訓練速度,以及梯度檢驗。

總結(jié)

以上是生活随笔為你收集整理的2.1)深度学习笔记:深度学习的实践层面的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。