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