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