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

歡迎訪問 生活随笔!

生活随笔

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

pytorch

【深度学习】2.1深度学习的实用层面

發布時間:2023/12/18 pytorch 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】2.1深度学习的实用层面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訓練/開發/測試集

訓練數據中包含訓練集、簡單交叉驗證集(也叫驗證集)、測試集
我們對訓練集執行訓練算法,通過驗證集選擇最好的模型,經過充分驗證,選定最終模型,然后就可以在測試集上進行評估了。為了無偏評估算法的運行狀況,在機器學習發展的小數據量時代,通常將所有數據三七分,也就是70%驗證集,30%測試集。如果沒有明確設置驗證集,也可以按照60%訓練集、20%驗證集和20%測試集來劃分。但在大數據時代,數據量可能是百萬級別,那么驗證集和測試集占數據總量的比例會趨向于變得更小。因為驗證集的目的就是驗證不同的算法,檢驗哪種算法更有效,因此驗證集要足夠大才能評估;測試集的主要目的是正確評估分類器的性能。假如有100萬條數據,其中1萬條作驗證集,1萬條作測試集即可,即訓練集占98%、驗證集和測試集各占1%。對于數據量過百萬的應用,訓練集可以達到99.5%,驗證集和測試集各占0.25%或者測試集占0.4%、測試集占0.1%。
不管哪種劃分,一定要確保驗證集和測試集的數據來自同一分布。因為要用驗證集來評估不同的模型,盡可能地優化性能,但由于深度學習算法需要大量的訓練數據,為了獲取更大規模的訓練數據集,可以采用當前流行的各種創意策略,例如網頁抓取,代價就是訓練集數據與驗證集和測試集數據有可能不是來自同一分布。但只要遵循這個經驗法則,機器學習算法會變得更快。
最后一點,就算沒有測試集也沒關系,測試集的目的是對最終所選定的神經網絡系統做出無偏評估。如果不需要無偏評估,也可以不設置測試集。所以如果只有驗證集,沒有測試集,要做的就是在訓練集上訓練,嘗試不同的模型框架,在驗證集上評估這些模型,然后迭代并選出適用的模型。因為驗證集中已經涵蓋測試集數據,所以它不再提供無偏性能評估。
在機器學習中,如果只有一個訓練集和一個驗證集,而沒有獨立的測試集,那么訓練集仍被稱為訓練集,但驗證集被稱為測試集。
總結一下, 搭建訓練集、驗證集和測試集能夠加速神經網絡的集成,也可以更有效地衡量算法的偏差和方差,從而幫助我們更高效地選擇合適的方法來優化算法

偏差/方差

如果給一個數據集擬合一條直線,可能得到一個邏輯回歸擬合,但它并不能很好地擬合該數據集,這是偏差高的情況,也稱為“欠擬合”。

如果擬合一個非常復雜的分類器,比如深度神經網絡或含有隱藏單元的神經網絡,但分類器方差較高,數據過度擬合,稱為“過擬合”。

在這兩者之間,有一種復雜程度適中,數據擬合適度的分類器,稱為“適度擬合”。

在一個只有x1和x2兩個特征的二維數據集中,可以繪制數據,將偏差和方差可視化。在多維空間數據中,繪制數據和可視化分割邊界無法實現,但可以通過幾個指標來研究偏差和方差。

沿用貓咪分類的例子,左邊的是貓咪,右邊的圖不是:
理解偏差和方差的兩個關鍵數據是訓練集誤差和驗證集誤差。舉幾個例子:
1.
假設我們可以辨別圖片中的小貓,訓練集錯誤率是1%,驗證集錯誤率是11%。可以看出,訓練集設置得非常好,而驗證集設置相對較差。這可能是因為我們過度擬合了訓練集,某種程度上,驗證集并沒有充分利用交叉驗證集的作用。我們稱這種情況為“高方差”。通過訓練集誤差和驗證集誤差,便可以判斷算法是否具有高方差。
2.
假設訓練集錯誤率是15%,驗證集錯誤率是16%,該案例中人的錯誤率幾乎為0%(人們瀏覽這些圖片可以分辨出是不是貓),算法并沒有在訓練集中得到很好訓練,如果訓練數據的擬合度不高,就是數據欠擬合,就可以說這種算法偏差比較高。相反,它對于驗證集產生的結果卻是合理的,驗證集中的錯誤率只比訓練集的多了1%,所以這種算法偏差高,因為它甚至不能擬合訓練集。
3.
假設訓練集錯誤率是15%(偏差相當高),但驗證集的評估結果更糟糕,驗證集錯誤率是30%。我們會認為這種算法偏差高,因為它在訓練集上結果不理想;方差也很高;這是方差偏差都很糟糕的情況。
4.
假設訓練集錯誤率是0.5%,驗證集錯誤率是1%,這種情況偏差和方差都很低。

以上這些分析都是基于假設預測的,假設人眼辨別的錯誤率接近0%。一般來說,最優誤差也被稱為貝葉斯誤差,所以最優誤差接近0%。
如果最優誤差或貝葉斯誤差非常高,比如15%,那么上面情況2的分類器中,15%的訓練集錯誤集就是合理的,偏差不高,方差也非常低。

但是,當所有分類器都不適用時,如何分析偏差和方差呢?
比如,圖片很模糊,即使是人眼,或者沒有系統可以準確無誤地識別圖片,這種情況下,最優誤差會更高。那么分析過程就要有一些改變了。
對于訓練數據,訓練集誤差可以判斷數據擬合情況,可以判斷是否有偏差問題,然后查看錯誤率有多高。當完成訓練集訓練,開始驗證集驗證時,我們可以判斷方差是否過高。從訓練集到驗證集的這個過程中,可以判斷方差是否過高。以上分析的前提都是假設基本誤差很小,訓練集和驗證集數據來自相同分布。如果沒有這些假設作為前提,分析過程會更加復雜,之后會討論。

機器學習基礎

在訓練神經網絡時用到的基本方法為:
初始模型訓練完成后,首先要知道算法的偏差高不高。如果偏差較高,試著評估訓練集或訓練數據的性能;如果偏差的確很高,甚至無法擬合訓練集,那么就需要選擇一個新網絡,比如含有更多隱層或者隱藏單元的網絡,或者花費更多時間來訓練算法,或者嘗試更先進的優化算法。訓練學習算法時,需要不斷嘗試這些方法,反復嘗試,直到解決掉偏差問題可以擬合數據為止,這是最低標準。
如果網絡足夠大,只要能擴大網絡規模,通常可以很好的擬合訓練集。
一旦偏差降低到可接受的數值,就需要去檢查一下方差有沒有什么問題。為了評估方差,需要查看驗證集性能。一個性能理想的訓練集就能推出驗證集的性能也理想嗎?如果方差高,最好的方法就是采取很多數據。但有時無法獲得更多數據,那么就可以嘗試通過正則化來減少過擬合。但是如果能找到更合適的神經網絡框架,就有可能同時減少偏差和方差。
總之就是不斷嘗試,直到找到一個低偏差、低方差的框架。
其中,需要注意以下兩點:
1.
高偏差和高方差是兩種不同的情況,后續要嘗試的方法也可能完全不同。通常用訓練驗證集來判斷算法是否存在偏差或方差問題,然后根據結果選擇嘗試部分方法。比如,若算法存在高方差問題,可以準備更多訓練數據;若算法存在高偏差問題,準備更多數據可能用處不大。
2.
在機器學習的初期階段,關于所謂的偏差方差權衡的探討屢見不鮮。因為我們能嘗試的方法很多,但在初期,我們很難只減少偏差或方差卻不影響到另外一方。但在當前的深度學習和大數據時代,只要持續訓練一個更大的網絡,只要準備了更多數據,那么只要正則適度,通常構建一個更大的網絡就可以在不影響方差的同時減少偏差;而采用更多數據通常可以在不過多影響偏差的同時減少方差。這兩步實際要做的工作就是訓練網絡,選擇網絡或者準備更多數據。

正則化

如果神經網絡過度擬合了數據,即存在高方差問題,那么正則化是一個很有效的方法;另一個解決高方差的方法就是準備更多數據,這也是非常可靠的方法。正則化是一種非常實用的減少方差的方法,通常有助于避免過度擬合或減少網絡誤差。正則化時會出現偏差方差權衡問題,偏差可能略有增加,如果網絡足夠大,增幅通常不會太高。

L2正則化、L1正則化。
如果用的是L1正則化,W最終會是稀疏的,也就是說W向量中有很多0,這其實并沒有降低太多存儲內存。更常用的是L2正則化。
λ是正則化參數,通常使用驗證集或交叉驗證來配置這個參數。在python編程語言中,λ(lambda)是一個保留字段,因此我們將正則化參數寫為lambd,以免與python中的保留字段沖突。
如何在神經網絡中實現L2正則化呢?
神經網絡含有一個成本函數,該函數中包含從w[1]、b[1]到w[L]、b[L]所有參數,其中L表示神經網絡所含的層數。因此成本函數等于損失總和乘以訓練數據m的總和,正則項為λ/2m乘以參數矩陣W的總和。稱||W[l]||2為范數平方。這個矩陣范數(即平方范數)被定義為矩陣中所有元素的平方和,也被叫做**“弗羅貝尼烏斯范數”**,用下表F標注。


L2正則化有時也被稱為“權重衰退”,因為它就像一般的梯度下降,w被更新為少了α乘以backprop輸出的最初梯度值,同時w也乘以了這個小于1的系數。

為什么正則化可以減少過擬合?

在增加正則化項時,應用之前定義的代價函數J,增加了一項是為了預防權重過大。如果使用梯度下降函數,在調試梯度下降時,其中一步就是把代價函數J設計成對于梯度下降的每個調幅都單調遞減的函數;如果使用正規化函數,此時J已經有了新的定義(多了一項),若再使用原函數J,也就是第一個正則化項,缺少第二個正則化項時,可能看不到單調遞減的現象了。
總之,L2正則化是訓練深度學習模型時最常用的一種方法。

Dropout正則化

它也是一個非常實用的正則化方法,dropout意為隨機失活。
假設在訓練下圖這樣的神經網絡,它存在過擬合,這就是Dropout正則化需要處理的。

首先復制這個神經網絡,dropout會遍歷網絡的每一層,并設置消除神經網絡中節點的概率。假設網絡中的每一層每個節點都以拋硬幣的方式設置概率,那么每個節點得以保留和消除的概率都是0.5,設置完節點概率,就會消除一些節點。

然后刪掉從該節點進出的連線,最后得到一個節點更小、規模更小的網絡。

然后用backprop方法進行訓練,這是網絡節點精簡后的一個樣本。對于其他樣本,照舊以拋硬幣的方式設置概率,保留一類節點集合,刪除其他類型的節點集合。對于每個訓練樣本,都將采用一個精簡后的神經網絡(neural networks)來訓練他。
不過針對每個樣本訓練規模極小的網絡,正則化就更為重要了。

那么如何實施dropout呢?
方法有好幾種,最常用的方法為反向隨機失活(inverted dropout)。用一個三層(l=3,layer)網絡來舉例說明:
首先定義向量d:d3表示一個三層的dropout向量。如果對a3進行因子分解,效果也是一樣的。

d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob

keep_prob是一個具體數字,在本例中令它為0.8,它表示保留某個隱藏單元的概率(在最開始的示例中這個數值為0.5),0.8意為消除任意一個隱藏單元的概率時是0.2,它的作用就是生成隨機矩陣。

l = 3 keep_prob = 0.8#此段代碼應在上一段代碼之前

d3是一個矩陣,每個樣本和每個隱藏單元其在d3中的對應值為1的概率都是0.8,其對應值為0的概率是0.2。

接下來要從第三層中獲取激活函數,即a3含有要計算的激活函數,

a3 = np.multiply(a3, d3)#此處也可寫作a3 *= d3

讓a3和d3相乘的作用就是過濾d3中所有等于0的元素,在python中d3是一個布爾型數組,值為true和false,而不是1和0,但乘法運算依然有效,python會自動將true和false翻譯為1和0。

最后,向外擴展a3,用它除以0.8或者除以keep_prob參數

a3 /= keep_prob

假設第三隱層上有50個單元或50個神經元,在一維上a3是50,通過因子分解將它拆分為50×m維的,保留和刪除它們的概率分別是80%和20%,這意味著最后被刪除或歸零的單元平均有10個,那么z[4] = w[4]a[3] + b[4],我們的預期是a[3] 減少20%,也就是說a[3] 中有20%的元素被歸零。為了不影響z[4]的期望值,需要用w[4]a[3]除以0.8,它將會修正或彌補我們所需的那20%,a[3]的期望值也不會變。
a3 /= keep_prob就是所謂的反向dropout方法,它的功能是不論keep_prob的值是多少,0.8、0.9或1(若設為1,那么就不存在dropout,因為它會保留所有節點),通過除以0.8,確保a1的期望值不變。

現在我們使用的是d向量,不同的訓練樣本,清除的隱藏單元也不同。實際上,如果通過相同訓練集多次傳遞數據,每次訓練數據的梯度不同,那么就會隨機對不同隱藏單元歸零;有時卻并非如此,比如需要將相同隱藏單元歸零,第一次迭代梯度下降時,把一些隱藏單元歸零,第二次迭代梯度下降時,也就是第二次遍歷訓練集時,對不同類型的隱層單元歸零。向量d或d3用來決定第三層中哪些單元歸零,無論用foreprop還是backprop。

在測試階段,已經給出了X,或是想預測的變量,用的是標準計數法。第0層的激活函數標注為測試樣本X,a[0] = X。
我們在測試階段不采用dropout方法,尤其是z[1] = w[1]a[0] + b[1],a[1] = g[1](z[1]),z[2] = w[2]a[1] + b[2],a[2] = g[2](z[2]),…,直到最后一層預測值為y hat。

理論上,只需要多次運行預測處理過程,每一次不同的隱藏單元會被隨機歸零,預測處理遍歷它們,但是計算效率低,得出的結果也幾乎相同,與這個不同程序產生的結果極為相似。反向dropout方法沒必要在測試階段額外添加尺度參數,這與訓練階段不同。

理解Dropout

dropout的功能類似于L2正則化,不同的是被應用的方式不同,dropout也會有所不同,甚至更適用于不同的輸入范圍。
實施dropout的另一個細節是要選擇keep_prob參數的值,并且不同層的keep_prob也可以變化。

對于上面這個,第一層矩陣w[1]是3×7,第二個權重矩陣是7×7,w[3]是7×3,以此類推。這樣,w[2]是最大的權重矩陣,因為w[2]擁有最大參數集,即7×7。為了預防矩陣的過擬合,對于這一層,即第二層,它的keep_prob值應該相對較低,假設是0.5(缺點是為了使用交叉驗證,需要搜索更多的超級參數);對于其它層,過擬合的程度可能沒那么嚴重,它們的keep_prob值可能高一些,假設是0.7;如果在某一層,不必擔心其過擬合的問題,那么keep_prob可以為1(keep_prob=1意味著保留所有單元,并且不在這一層使用dropout)。對于有可能出現過擬合且含有諸多參數的層,可以把keep_prob值設置成比較小的值,以便應用更強大的dropout。事實上,也可以對輸入層使用dropout,但我們一般讓其為1或比較高的值,如0.9。
dropout在計算機視覺領域是很常用的,因為在此領域沒有足夠的數據,所以一直存在過擬合,它幾乎成為一種默認方法。但是!dropout是一種正則化方法,它有助于預防過擬合,因此,除非算法過擬合,不然是不用使用dropout,所以它在其他領域應用的比較少。
dropout的一大缺點就是代價函數J不再被明確定義,每次迭代都會隨機移除一些節點,且所優化的代價函數J實際上并沒有明確定義,或者說在某種程度上很難計算。
排除dropout的bug的方法就是:先不使用dropout,即令keep_prob值為1,看看代價函數J是否是單調下降的,再去設置keep_prob值

其他正則化方法

除了L2正則化和隨機失活(dropout)正則化,還有幾種方法可以減少神經網絡中的過擬合。

1.數據擴增
假設我們正在擬合貓咪圖片分類器,想要通過擴增訓練數據來解決過擬合,但擴增訓練數據代價高,而且有時無法擴增數據,但可以通過隨意翻轉、裁剪圖片來增加訓練集,額外生成假訓練數據。雖然訓練集有冗余,不如額外收集一組新圖片好,但這樣節省了獲取更多貓咪圖片的花費。
像這樣人工合成數據的話,還要通過算法驗證,比如圖片裁剪之后貓還在上面。
對于光學字符識別,可以通過隨意旋轉或扭曲數字來擴增數據。

2.early stopping
運行梯度下降時,可以繪制訓練誤差或只繪制代價函數J的優化過程,在訓練集上用0-1記錄分類誤差次數,呈單調下降趨勢。通過early stopping還可繪制驗證集誤差,它可以是驗證集上的分類誤差,或是驗證集上的代價函數、邏輯損失和對數損失等。
驗證集誤差通常會先呈下降趨勢,然后在某個節點處開始上升。early stopping的作用就是神經網絡已經在這個迭代過程中表現得很好了,就在還未上升處停止訓練,得到驗證集誤差
其工作原理就是:當還未在神經網絡上運行太多迭代過程的時候,參數w接近0,因為隨機初始化w值時,它的值可能都是較小的隨機值。所以在長期訓練神經網絡之前,w依然很小,在迭代過程和訓練過程中,w的值會變得越來越大。當神經網絡中參數w的值已經非常大了,early stopping要做的就是在中間點停止迭代過程,從而得到一個w值中等大小的佛羅貝尼烏斯范數。early stopping就表示提早停止訓練神經網絡
機器學習過程包括的步驟中,其中一步是選擇一個算法來優化代價函數J,可以用梯度下降來解決這個問題,也可以用momentum算法、RMSprop、Adam等等。但是優化代價函數J之后,不希望發生過擬合,就可以通過正則化、擴增數據等方法去解決。在機器學習中,超級參數激增,算法的選擇也變得復雜。如果用一組工具優化代價函數J ,留意w和b,讓J(w,b)的值越小越好,機器學習就會變得簡單。在預防過擬合的同時,也要減小方差。在一個時間做一個任務,這個原理有時被稱為“正交化”。而early stopping的缺點就是不能獨立地處理降低方差和預防過擬合這兩個問題,因為提早停止梯度下降,也就是停止了優化代價函數J,所以代價函數J可能不是很小,同時又不希望出現過擬合。
early stopping的優點是只運行一次坡度下降,就可以找出w的較小值、中間值和較大值,而無需像L2正則化那樣,嘗試超級參數λ的很多值。
(個人比較偏向L2正則化,多嘗試一些值,少做一些計算)

正則化輸入

加速神經網絡訓練的方法之一就是歸一化輸入,它需要兩個步驟,即零均值化和歸一化方差(讓x1、x2…的方差均為1)。然后用同樣的方法調整測試集,而不是在訓練集和測試集上分別預估μ和σ2,因為希望訓練數據和測試數據都是通過相同的μ和σ2定義的相同數據轉換,其中μ和σ2都是通過數據計算得到的。
如果輸入特征處于不同范圍內,可能有些特征值從0到1,有些從1到1000,那么歸一化特征值就非常重要了;如果特征值處于相似范圍內,那么歸一化就不是很重要了。但執行這類歸一化并不會產生什么危害。

梯度消失與梯度爆炸

當訓練神經網絡時,導數或坡度有時會變得非常大,或非常小,甚至以指數方式變小,這會加大訓練的難度。

假設正在訓練這樣一個極深的神經網絡:

假設使用線性激活函數g(z),忽略b,那么
y hat= w[L] w[L-1] w[L-2]… w[3] w[2] w[1]X = w[L] w[L-1] w[L-2]… w[3] w[2] z[1] = w[L] w[L-1] w[L-2]… w[3] z[2] = …,其中w[1]X = z[1],a[1] = g(z[1]) = z[1],a[2] = g(z[2]) = g(w[2]a[1])。
假設每個權重矩陣w[l] = [[1.5, 0], [0, 1.5]](比1稍微大一點),那么y hat= w[L][[1.5, 0], [0, 1.5]]L-1X = 1.5L-1X,對于一個深度神經網絡來說,L值較大,那么y hat的值也會非常大,因此對于一個神經網絡,y的值將爆炸式增長。
相反的,如果權重是0.5,它比1小,該項會變成0.5L,因此每個矩陣都小于1,假設x1、x2都是1,那么激活函數將變成0.5,0.5,第二層就是0.25…直到最后一項變成1/2L,所以作為自定義函數,激活函數的值將以指數級下降,它是與網絡層數量L相關的函數。
權重w[l]只比1大一點,或者說只比單位矩陣大一點,深度神經網絡的激活函數將爆炸式增長;如果w[l]比1略小一點,在深度神經網絡中,激活函數將以指數級遞減。

神經網絡的權重初始化

針對梯度消失和梯度爆炸問題,提出了一個不完整的解決辦法,雖然不能徹底解決問題,卻有助于為神經網絡更好地選擇隨機初始化參數。
先舉一個神經單元權重初始化的例子,然后再演變到整個深度網絡。

只有一個神經元時:

單個神經元可能有4個輸入特征,從x1到x4,經過a=g(z)處理,最終得到y hat。
z = w1x1 + w2x2 +…+ wnxn ,令b=0,暫時忽略它。為了預防z值過大或過小,可以看出,n越大,希望 wi越小,最合理的方法就是設置 wi = 1/n,其中n表示神經元的輸入特征數量。事實上要做的就是設置某層權重矩陣W[l]
W[l] = np.random.randn(shape) * np.sqrt(1/n[l-1])。
如果使用的是Relu激活函數,g[l](z)=Relu(z),那么方差設置為2/n,而不是1/n效果會更好。

梯度的數值逼近

在實施backprop時,有一個測試叫做梯度檢驗,其作用是確保backprop正確實施。為了逐漸實現梯度檢驗,首先對計算梯度做數值逼近

較大的三角形(底邊從0.99-1.01)的高寬比值更接近于θ的導數,我們得到的是一個雙邊公差,而不是單邊公差。
對于這個大三角形,右邊式子就是它的高寬比:

g(θ)和大三角形的高寬比非常接近,逼近誤差為0.0001。所以使用雙邊誤差的方法更逼近導數。
在梯度檢驗和反向傳播中使用該方法時,它與運行兩次單邊公差的速度一樣,但結果更準確,因此還是很值得使用的。

梯度檢驗

梯度檢驗可以用來調試和檢驗backprop,非常好用。假設網絡中含有參數W[1]、b[1]、…、W[L]、b[L]
1.為了執行梯度檢驗,首先需要把所有參數轉換為一個巨大的向量數據,也就是把所有矩陣W轉換成向量,作連接運算,得到一個巨型向量θ。代價函數J則有:J(W[1],b[1],…,W[L],b[L]) = J(θ)。

2.接著可以得到與W和b順序相同的數據dW[1], db[1], …, dW[L], db[L]。用他們來初始化大向量dθ,dθ和θ的維度相同。同樣的,dW[1]也轉化成一個矩陣,且它與W[1]具有相同維度;db[1]與b[1]具有相同維度。經過相同的轉換和連接運算操作之后,就可以把所有導數轉換成一個大向量dθ。

3.dθ和代價函數J的梯度或坡度的關系就是實施梯度檢驗(grad check)的過程。現在J是超級參數θ的一個函數,J(θ) = J(θ1, θ2,…),不論超級參數向量θ的維度是多少。為了實施梯度檢驗,需要做的就是循環執行,從而對每個i,也就是對每個θ組成元素,使用雙邊誤差計算dθapprox[i] = [J(θ1, θ2, … , θi+ε, …) - J(θ1, θ2, … , θi-ε, …)] / 2ε,只對θi加減ε,其他項保持不變。這個值應該逼近dθ[i] = δJ/ δθi ,對i的每個值都執行這個運算。

4.最后得到兩個向量dθapprox和dθ,它們具有相同的維度,需要我們驗證它們是否接近。
計算這兩個向量的距離(歐幾里得范數)||dθapprox - dθ||2,即誤差平方之和,然后求平方根,得到歐式距離。
然后用向量長度做歸一化,結果為||dθapprox - dθ||2 / [||dθapprox||2 + ||dθ||2],分母是用于預防這些向量太小或太大,分母使這個方程式變成比率。如果我們使用的ε為10-7,算出來的這個值小于或接近10-7,那么導數逼近就很有可能是正確的;如果算出來的值接近10-5,就需要注意了,也許這個值沒問題,但還需要再次檢查這個向量的所有項,確保沒有一項誤差過大,否則可能有bug;如果算出來是10-3,就需要很擔心是否存在bug了,計算結果應該比10-3小很多才對,應檢查所有的θ項,看是否有一個具體的i值,使得dθapprox和dθ大不相同,并用它來追蹤一些求導計算是否正確。

關于梯度檢驗實現的注記

  • 不要在訓練中使用梯度檢驗,它只用于調試。
  • 如果算法的梯度檢驗失敗,要檢查所有項。
  • 在實施梯度檢驗時,如果使用正則化,要注意正則項(代價函數J不要少項)。
  • 梯度檢驗不能與dropout同時使用。
    因此dropout可作為優化代價函數J的一種方法,但是代價函數J被定義為對所有指數極大的節點自己求和,而在任何迭代過程中,這些節點都有可能被消除,所以很難計算代價函數J。
  • 在隨機初始化過程中,當W和b接近0時,梯度下降的實施是正確的;但在運行梯度下降時,W和b變得更大,可能只有在W和b接近0時,backprop的實施才是正確的,但是當W和b變大時,它會變得越來越不準確的。

  • 3 ??

  • 總結

    以上是生活随笔為你收集整理的【深度学习】2.1深度学习的实用层面的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。