DL2 - Improving Deep Neural Networks- Hyperparameter tuning, Regularization and Optimization
title: DL2 - 在實(shí)際應(yīng)用中如何使得神經(jīng)網(wǎng)絡(luò)高效工作
date: 2019-08-14 02:40:57
tags: deeplearning
categories: deeplearning
Welcome to MyBlog!
本文所有截圖和文字均借鑒于:Coursera
1 如何設(shè)置你的訓(xùn)練集/開發(fā)集/測(cè)試集
在訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)時(shí), 你必須做出許多決定, 例如你的神經(jīng)網(wǎng)絡(luò)將會(huì)有多少層啊 并且每一層中包含多少個(gè)隱藏神經(jīng)元啊, 學(xué)習(xí)速率是多少啊, 還有每一層你想用什么激活函數(shù)啊 當(dāng)你開始一個(gè)新的應(yīng)用時(shí), 你幾乎不可能一次性就正確地猜到上面提及的, 以及未提及的超參數(shù)的準(zhǔn)確數(shù)值 因此在實(shí)際應(yīng)用中 機(jī)器學(xué)習(xí)是一個(gè)***高度迭代的過程***。
機(jī)器學(xué)習(xí)的應(yīng)用是相當(dāng)反復(fù)的迭代的過程, 你只需要將這個(gè)循環(huán)進(jìn)行許多次, 就有希望能為你的應(yīng)用中的網(wǎng)絡(luò)找出好的參數(shù), 所以有一件事能決定你能多快地取得進(jìn)展, 那就是你進(jìn)行迭代過程時(shí)的效率, 而恰當(dāng)?shù)貙⒛愕臄?shù)據(jù)集分為訓(xùn)練集, 開發(fā)集和測(cè)試集讓你的迭代效率更高
1.1 比例
當(dāng)樣本個(gè)數(shù)只有100、1000、10000時(shí),被廣泛認(rèn)為的最佳比例是60/20/20%。
但是在大數(shù)據(jù)時(shí)代,當(dāng)你有100萬(wàn)個(gè)訓(xùn)練樣本時(shí),可能只需要1萬(wàn)個(gè)用作開發(fā)集和測(cè)試集就足夠了。
1.2 確保開發(fā)集和測(cè)試集中的數(shù)據(jù)分布相同
你需要用開發(fā)集對(duì)許多不同的模型進(jìn)行評(píng)估, 費(fèi)盡全力改善模型在開發(fā)集上的性能, 如果開發(fā)集和測(cè)試集的數(shù)據(jù)分布相同就很方便, 但是因?yàn)樯疃葘W(xué)習(xí)算法對(duì)訓(xùn)練數(shù)據(jù)量需求巨大, 我能看到一種趨勢(shì)是用各種有創(chuàng)意的辦法, 比如爬取網(wǎng)頁(yè), 來(lái)獲得比其它途徑大得多的訓(xùn)練集, 即使這會(huì)帶來(lái)一些代價(jià), 也就是訓(xùn)練集的數(shù)據(jù)分布, 與開發(fā)集和測(cè)試集的數(shù)據(jù)分布不同, 但你只需要遵守這個(gè)經(jīng)驗(yàn)法則, 你的算法進(jìn)步速度就會(huì)更快
2 bias(偏差)和variance(方差)
2.1 偏差和方差的區(qū)別
偏差:預(yù)測(cè)值或者估計(jì)值期望與真實(shí)值期望之間的差距。
方差:預(yù)測(cè)結(jié)果的分布情況/分布范圍/離散程度。
偏差:評(píng)價(jià)對(duì)象時(shí)單個(gè)模型,期望輸出和真實(shí)標(biāo)記的差別。
方差:評(píng)價(jià)對(duì)象時(shí)多個(gè)模型,表示多個(gè)模型差異程度。
以上圖為例:
2.2 過擬合和欠擬合
高方差:你的訓(xùn)練集誤差是1%,而對(duì)于開發(fā)集誤差 為了便于討論 我們假設(shè)是11% 在這個(gè)例子里 你的模型對(duì)訓(xùn)練集處理得非常好 但是相對(duì)來(lái)說(shuō),開發(fā)集處理得就有些不盡如人意 所以這可能是在處理訓(xùn)練集時(shí)過擬合了
高偏差:假設(shè)訓(xùn)練集的誤差是15%,假設(shè)你的開發(fā)集誤差是16%, 在這種情況下,我們假設(shè)人工識(shí)別誤差是0% 因?yàn)槿丝梢灾苯涌吹竭@些圖片,并判斷出這是否是一只貓, 所以看上去,這個(gè)算法在訓(xùn)練集上的表現(xiàn)并不盡如人意 如果它并未將訓(xùn)練集數(shù)據(jù)處理得很好 這就是欠擬合。
3 機(jī)器學(xué)習(xí)的基本準(zhǔn)則
high bias: bigger network、train longer、更高級(jí)的優(yōu)化算法、更換神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
high variance: more data、正則化?、更適合的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
只要你能不斷擴(kuò)大所訓(xùn)練的網(wǎng)絡(luò)的規(guī)模 只要你能不斷獲得更多數(shù)據(jù) 雖然這兩點(diǎn)都不是永遠(yuǎn)成立的 但如果這兩點(diǎn)是可能的 那擴(kuò)大網(wǎng)絡(luò)幾乎總是能夠 減小偏差而不增大方差 只要你用恰當(dāng)?shù)姆绞秸齽t化的話 而獲得更多數(shù)據(jù)幾乎總是能夠 減小方差而不增大偏差 所以歸根結(jié)底 有了這兩步以后 再加上能夠選取不同的網(wǎng)絡(luò)來(lái)訓(xùn)練 以及獲取更多數(shù)據(jù)的能力 我們就有了能夠且只單獨(dú)削減偏差 或者能夠并且單獨(dú)削減方差 同時(shí)不會(huì)過多影響另一個(gè)指標(biāo)的能力 我認(rèn)為這就是諸多原因中的一個(gè) 它能夠解釋為何深度學(xué)習(xí)在監(jiān)督學(xué)習(xí)中如此有用
4 regularization正則化
4.1 什么是L2正則化
在神經(jīng)網(wǎng)絡(luò)中 你有一個(gè)代價(jià)函數(shù) 它是你所有參數(shù)的函數(shù) 包括w[1] b[1]到w[L] b[L] 這里大寫的L是神經(jīng)網(wǎng)絡(luò)的層數(shù) 因此 代價(jià)函數(shù)是m個(gè)訓(xùn)練樣本上 的損失之和 至于正則化 再加上lambda/2m 乘以所有參數(shù)W的范數(shù)的平方之和 這里W是你的參數(shù)矩陣 這里矩陣范數(shù)的平方定義為 對(duì)于i和j 對(duì)矩陣中每一個(gè)元素的平方求和
L2正則化也被稱為權(quán)重衰減(表現(xiàn)在目標(biāo)函數(shù)/參數(shù)更新)
4.2 為什么正則化可以防止過擬合(減少方差問題)
如果不加此項(xiàng),模型必定傾向于最小化損失函數(shù)J(θ)
,這么一來(lái)就很可能發(fā)生overfitting。引入該項(xiàng)后,如果模型過于復(fù)雜,該項(xiàng)的次數(shù)(degree)也更高,引發(fā)的懲罰(penalization)值也更大,由此抑制了模型的過度復(fù)雜化,λ也被稱為懲罰因子。
λ過小,則對(duì)“防止過擬合”幾乎無(wú)影響。λ過大,則使損失函數(shù)前半部分的權(quán)重大大降低,試想如果λ接近無(wú)限大,最終的結(jié)果是所有的θ都接近0,因此需要選擇適當(dāng)?shù)摩恕?/p>
舉一個(gè)極端的例子,當(dāng)lanbda非常大的時(shí)候,神經(jīng)網(wǎng)絡(luò)的許多神經(jīng)節(jié)點(diǎn)將被弱化,看起來(lái)就像一個(gè)不容易過擬合的小型網(wǎng)絡(luò)。
4.3 隨機(jī)失活正則化(丟棄發(fā)dropout)
4.4 其他防止過擬合的方法
1 數(shù)據(jù)集擴(kuò)充:比如水平翻轉(zhuǎn),隨機(jī)裁剪、隨機(jī)扭曲、隨機(jī)放大來(lái)變化圖片(廉價(jià)的方式)
2 早終止法:
5 標(biāo)準(zhǔn)化處理
如果你對(duì)左圖的那種代價(jià)函數(shù)使用梯度下降法 那可能必須使用非常小的學(xué)習(xí)率 因?yàn)榧偃鐝倪@里開始 梯度下降法需要經(jīng)歷許多步 反復(fù)輾轉(zhuǎn) 才能好不容易終于挪到這個(gè)最小值 而如果等值線更趨近于圓形 那無(wú)論從何開始 梯度下降法幾乎都能直接朝向最小值而去 你可以在梯度下降中采用更長(zhǎng)的步長(zhǎng) 而無(wú)需像左圖那樣來(lái)回?fù)u擺緩慢挪動(dòng) 當(dāng)然在實(shí)踐中 w是一個(gè)高維向量 把它畫在二維空間中可能無(wú)法正確傳遞出高維中的感覺 但大體上的感覺是你的代價(jià)函數(shù)會(huì)更圓 優(yōu)化過程更容易進(jìn)行 因?yàn)楦鞣N特征的尺度會(huì)比較接近
6 梯度 消失/爆發(fā)
當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí)我們會(huì)遇到一個(gè)問題 尤其是當(dāng)訓(xùn)練層數(shù)非常多的神經(jīng)網(wǎng)絡(luò)時(shí) 這個(gè)問題就是梯度的消失和爆炸 它的意思是當(dāng)你在訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò)的時(shí)候 損失函數(shù)的導(dǎo)數(shù)或者說(shuō)斜率 有時(shí)會(huì)變得非常大 或者非常小甚至是呈指數(shù)級(jí)減小 這使訓(xùn)練變得很困難
針對(duì)此問題的***部分***解決方法:雖然不能完全解決它 但幫助很大 該方法就是更好 更細(xì)致地隨機(jī)初始化你的神經(jīng)網(wǎng)絡(luò)
7 梯度檢測(cè)
導(dǎo)數(shù)的正式定義 就是對(duì)于很小的𝜀 計(jì)算[f(𝜃+𝜀)-f(𝜃-𝜀)]/(2𝜃) 就是對(duì)于很小的𝜀 計(jì)算[f(𝜃+𝜀)-f(𝜃-𝜀)]/(2𝜃)
原因:對(duì)于一個(gè)非零的𝜀值 你可以證明這個(gè)近似的誤差 在𝜀平方這個(gè)階上 𝜀是個(gè)很小的數(shù) 如果𝜀是0.01 就像這里 那么𝜀平方就是0.0001 這個(gè)大O記號(hào)就表示誤差就是某個(gè)常數(shù)乘以這個(gè) 這就是我們的近似誤差 這個(gè)例子中的大O的常數(shù)恰好就是1 相比而言 如果我們用這邊的另一個(gè)公式 誤差就在𝜀這個(gè)階上 當(dāng)𝜀是一個(gè)小于1的數(shù)時(shí) 𝜀就比𝜀平方大很多 這也就是為什么 這個(gè)公式不如左邊這個(gè)公式精確 這也就是為什么我們做梯度檢驗(yàn)時(shí)采用雙側(cè)差值 你計(jì)算f(𝜃+𝜀)-f(𝜃-𝜀)再除以2𝜀 而不使用這個(gè)不夠精確的單側(cè)差值
怎么進(jìn)行雙側(cè)差值梯度檢測(cè)
從W1,B1,一直到,WL,bL 要實(shí)現(xiàn)梯度檢查算法 首先要把你的所有參數(shù) 重新拼成一個(gè)巨大的參數(shù)向量θ 你要把W矩陣轉(zhuǎn)化成一個(gè)向量 把所有的W矩陣都轉(zhuǎn)化成向量 然后把他們首尾相接拼在一起 成為一個(gè)巨大的參數(shù)向量θ 之前代價(jià)函數(shù)J是所有W和b的函數(shù) 經(jīng)過向量轉(zhuǎn)化后它變成了θ的函數(shù) W和b按照同樣的順序轉(zhuǎn)化后 你也可以把dW[1],dB[1]等等參數(shù)都轉(zhuǎn)化成 和θ的維度相同的向量dθ 和之前一樣,把dW[1]轉(zhuǎn)化成向量 db[1]已經(jīng)是向量 把所有的dW矩陣轉(zhuǎn)化成向量 記住dW[1]和W[1]的維度相同 db[1]和b[1]的維度相同 經(jīng)過相同的矩陣轉(zhuǎn)化和向量拼接之后 你就把所有的微分也轉(zhuǎn)化成 一個(gè)參數(shù)向量dθ dθ和θ的維度一樣
在實(shí)際中 我取ε為10的負(fù)7次方 這樣 如果這個(gè)式子的結(jié)果 小于10的負(fù)7次方 那就認(rèn)為計(jì)算正確 它表示你的微分近似是對(duì)的 因?yàn)?誤差)很小 如果該式的結(jié)果在10的負(fù)5次方的量級(jí)的話 我會(huì)很仔細(xì)地檢查一遍 有可能式子也是對(duì)的 但我會(huì)再三檢查這個(gè)向量的每個(gè)分量 確定沒有某個(gè)分量很大 如果某個(gè)分量很大的話 那么可能你的式子里有錯(cuò)誤了 如果左面的式子在10的負(fù)3次方的量級(jí)的話 我覺得你一定要檢查代碼 它很可能有錯(cuò)誤 它的結(jié)果應(yīng)該遠(yuǎn)遠(yuǎn)小于10的負(fù)3次方 如果(某個(gè)分量)大于10的負(fù)3次方 我很擔(dān)心你的代碼有錯(cuò)誤
梯度檢測(cè)的使用原則如下:
總結(jié)
以上是生活随笔為你收集整理的DL2 - Improving Deep Neural Networks- Hyperparameter tuning, Regularization and Optimization的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 AppFuse 的七个理由之二
- 下一篇: 简历模板哪里找?这几个免费网站一定要收藏