這部份內容是我在看Andreg Ng深度學習視頻,而後又閱讀了一些文章整理後記錄下來的html
視頻鏈接:http://mooc.study.163.com/smartSpec/detail/1001319001.htmpython
在瞭解這些內容以前,先推薦看一下下面幾篇博客,我僅僅只是對這些內容進行一下總結。算法
1.什麼是高/低方差、高/低誤差網絡
2.驗證集、誤差與方差、學習曲線app
(1) 先來介紹一下,訓練集,校驗集,以及測試集函數
訓練集:學習樣本數據集,經過匹配一些參數來創建一個分類器。創建一種分類的方式,主要是用來訓練模型的。工具
驗證集:對學習出來的模型,調整分類器的參數,如在神經網絡中選擇隱藏單元數。驗證集還用來肯定網絡結構或者控制模型複雜程度的參數。學習
測試集:主要是測試訓練好的模型的分辨能力(識別率等)。測試
小數據時代七三分或者六二二分是個不錯的選擇,在大數據時代各個數據集的比例可能須要變成 98%: 1%: 1%,甚至訓練集的比例更大。 有些時候訓練集和驗證集、測試集的數據有所不一樣時,好比訓練集的圖片高像素、高質量,而驗證集和測試集則像素較低,那麼有一條經驗法則是確保驗證集和測試集來自於同一分佈;但因爲深度學習須要大量的訓練數據,爲了獲取更大規模的訓練數據集,可能會進行網頁抓取,代價是訓練集數據與驗證集和測試集數據有可能不是來自於同一分佈。
還有一種狀況,就算沒有測試集也是能夠的,測試集的目的是對最終所選定的神經網絡系統作出無偏估計,若是不須要無偏估計也能夠不設置測試集。
因此搭建訓練驗證集合測試集可以加速神經網絡的集成,也能夠更有效地衡量算法的誤差和方差,從而幫助咱們更高效地選擇合適的方法來優化你的算法。
(2) 接下來介紹一下什麼是誤差,什麼是方差
誤差:通常描述的是預測值(估計值)的指望與真實值之間的差距。誤差越大,越偏離真實數據集。(對象是單個模型, 指望輸出與真實標記的差異)
方差:描述的是預測值的變化範圍,離散程度,也就是離其指望值的距離。方差越大,預測結果數據的分佈越散。(若是對象是多個模型,表示多個模型差別程度。)
基於誤差的偏差:所謂基於誤差的偏差是咱們模型預期的預測與咱們將要預測的真實值之間的差值。誤差是用來衡量咱們的模型的預測同真實值的差別。
基於方差的偏差:基於方差的偏差描述了一個模型對給定的數據進行預測的可變性。好比,當你屢次重複構建完整模型的進程時,方差是,在預測模型的不一樣 關係間變化的多少。
通常來講,誤差、方差和模型的複雜度之間的關係以下圖所示:
越複雜的模型誤差越小,而方差越大。
咱們用一個參數少的,簡單的模型進行預測,會獲得低方差,高誤差,一般會出現欠擬合。
而咱們用一個參數多的,複雜的模型進行預測,會獲得高方差,低誤差,一般出現過擬合。
實際中,咱們須要找到誤差和方差都較小的點。從上圖能夠看出在誤差和方差都較小的點處,total Error是最少的。
例子
讓咱們來看一看咱們在什麼狀況下應該怎樣選擇:
針對訓練神經網絡過程當中誤差過大(欠擬合),或者方差過大(過擬合)咱們能夠採用哪些方法?
(1) 深度學習在現在大數據時代能夠經過構建一個更大的網絡即可在不影響方差的同時減小你的誤差。
(2)採用更多的數據能夠在不過多影響誤差的同時減小方差。擴增數據代價比較高,並且有時沒法擴增數據,但咱們能夠經過水平翻轉、隨意翻轉和裁剪圖片來增長訓練數據 。
以上兩步實際要作的工做是訓練網絡,選擇網絡或者準備更多數據,如今咱們有工具能夠作到僅僅減小誤差或者僅僅減小方差,不對另外一方產生過多不良影響。
(3)正則化是一種很是實用的減小方差的方法,正則化會出現誤差方差權衡問題,誤差可能會略有增長,但若是網絡足夠大的話,增幅一般不會太大 。
這裏主要講解如下L2規範化技術。二次代價函數,以及交叉熵代價函數,柔性最大值正則化後的形式以下:
其中C0爲原始代價函數。第二項加入的就是全部權重(每一個元素)的平方和,λ成爲規範化參數,規範化能夠當作一種尋找小的權重和最小原始代價函數之間的折中,λ越小,就越偏向於最小化原始代價函數,反之傾向於小的權重。
經常使用正則化方法來防止過擬合,所以須要思考參數的選擇問題。
(4)利用棄權來下降過擬合。(主要應用在計算機視覺,其餘領域應用較少)
假設左圖存在過擬合,這就是 dropout 所要處理的,咱們複製這個神經網絡, dropout 會遍歷網絡的每一層,並機率性地設置消除神經網絡中的節點,假設每一個節點都以拋硬幣的方式設置機率,每一個節點得以保留和消除的機率都是 0.5;設置完節點機率,咱們會消除一些節點,而後刪掉從該節點進出的連線,最後獲得一個節點更少、規模更小的網絡,而後用bcakprop 方法進行訓練,這是網絡節點精簡後的一個版本。對於其餘樣本,照舊以拋硬幣的方式設置機率,保留一類節點集合,刪除其餘類型的節點集合,對於每個訓練樣本,都將採用一個精簡的後的神經網絡來訓練它。也許你會認爲這個方法有點怪,單純遍歷節點,編碼也是隨機,可它真的有效。
咱們怎麼去理解棄權?
啓發式的看,當咱們棄掉不一樣的神經元集合時,有點像咱們在訓練不一樣的神經網絡。因此,棄權過程就如同大量不一樣的神經網絡效果的平均那樣
棄權如何實現?
對於l層,咱們先向量 向量dl,其維數和al.shape一致(al表示第l層激活函數輸出列向量), dl表示 dropout 向量,而後看它是否小於某數,這個數叫作 keep_prob, 是一個具體的數,表示棄權的機率,咱們假設該值爲它0.8,它表示保留某個隱藏單元的機率,它的做用就是生成隨機矩陣。dl是一個矩陣,每一個樣本和每一個隱藏單元其在 dl中的對應值爲 1 的機率都是 0.8,其對應值爲 0 的機率是 0.2.接下來要作的是從l層獲取激活函數 al, al 含有須要計算的激活函數 al*=dl(元素相乘),它的做用就是過濾 dl 中全部等於 0 的元素,若是用python 實現的話, dl 是個布爾型數值, true 或者 false,而不是 0 或 1;乘法運算會把 true 或者 false 翻譯爲 1 和 0。最後咱們向外擴張 a3,用它除以 keep_prob 參數(why?假設第l層有 50 層神經元,在一維上 al 等於 50,咱們經過因式分解將它拆成 50Xm 維的,保留和刪除它們的機率分別爲 80%和 20%,這意味着最後被刪除或歸零的單元平均有 10 個, zˆ[l+1] = wˆ[l]*al+bˆ[l+1], 咱們預期是 al減小 20%,也就是說 al中有 20%的元素被歸零,爲了避免影響 zˆ[l+1]的指望值,咱們須要用 (wˆ[l+1]*al) / 0.8,它將會修正或彌補咱們所需的 20%,這樣 al的指望不會變)。
dl = np.random.rand(al.shape[0],al.shape[1]) < keep_prob #dropout向量 al = np.multply(al,dl) #乘法運算會把 true 或者 false 翻譯爲 1 和 0。 過濾掉dl中元素爲1的神經元
al = al/keep_prob
棄權有什麼不穩定的因素?
對於咱們已經訓練好的神經網絡,咱們只需計算前向輸出,因爲棄權矩陣dl是隨機的,給定一個輸入,則網絡的輸出也會動態變化,有時候輸出結果並不會太令咱們滿意。
(5)利用提早中止來下降過分擬合
在運行梯度降低時,你能夠繪製訓練偏差圖或者回執代價函數 J 的優化過程圖,在訓練集上用 0-1 記錄分類偏差次數,能夠看到它呈單調降低的趨勢;由於在訓練過程當中,咱們但願訓練偏差、代價函數 J 都在降低,經過 early stopping 不只能夠看到上述這些圖,還能夠繪 制驗證集偏差圖,你會發現驗證集偏差一般會先呈降低趨勢,而後在某個節點處開始上升。early stoping 在神經網絡中隨機初始化w 值,它的值可能都是較小的值,隨着迭代增大,而它是在中間點中止迭代過程,獲得一箇中等大小的 w;與L2 正則化類似,選擇參數w範數較小的神經網絡,但願神經網絡過分擬合不嚴重。
early stopping 的學術意思是提前中止訓練神經網絡,一旦校驗數據集上分類準確率已經飽和,就中止訓練。但也有一個缺點:不能獨立處理如下兩個狀況,由於提前中止梯度降低,也就中止下降代價函數 J,因此代價函數可能不會比較小,這樣作的話你沒有采用不一樣的方式來解決這個問題,你須要考慮的東西就變得更復雜了。
若是不用 early stopping,另外一種方法是 L2 正則化,訓練神經網絡的時間就可能很長,將致使參數搜索空間更容易分解,也更容易搜索, 但缺點是你必須嘗試不少正則化參數 λ 的值, 也致使搜索大量 λ 值得計算代價過高。 early stopping 的優勢是隻運行一次梯度降低, 你能夠找出 W 的較小值,中間值和較大值, 而無需嘗試 L2 正則化超參數 λ 的不少值。
在訓練神經網絡中,咱們有哪些方法能夠加速神經網絡的訓練速度?
歸一化輸入(normalized)
假設一個訓練集有兩個特徵x1,x2,輸入特徵爲 2 維, 歸一化須要兩個步驟: 1.零均值化 2.歸一化方差; 咱們但願不管是訓練集和測試集都是經過相同 的 μ 和 σ^2定義的數據轉換, 這兩個是由訓練集得出來的 。
1.首先計算每一個特徵的平均值μ,針對每一個樣本進行如下計算:xi = xi - μ。
2.針對新獲得的樣本計算方差方差σ2。而後在進行如下計算:xi = xi/σ。
3.獲得的新的樣本每個特徵則服從標準正態分佈μ(0,1).
爲何要標準化輸入特徵 ?
咱們能夠把左邊的圖當作沒有歸一化的代價函數曲線圖,右邊爲通過歸一化的代價曲線圖。左圖的話,你必須使用一個很是小的學習率,可能須要屢次迭代,直到找到最小值,但函數若是是右圖的話,不管從哪裏開始,梯度降低法都能更直接地找到最小值,你可使用 較大的步長,這使得函數 J 優化起來更簡單快速。實際上 W 是個高維向量,所以二維繪製 W 並不能正確地表達清楚,直觀理解能夠是代價函數更圓一些,並且更容易優化,前提是特徵在類似範圍內,而不是從 1 到 1000, 0 到 1的範圍,而是早-1 到 1 範圍內或類似的方差。因此輸入特徵處於不一樣範圍時,那麼歸一化特徵就很重要;若是特徵處於類似範圍內,歸一化就不太須要了,固然也能夠執行,一般使用歸一化無論它可否提升訓練和算法速度。
咱們可使用梯度檢驗來調試或檢驗 backprop 的實施是否正確。 假設網絡有 以下參數,爲了執行梯度檢驗,首先要把全部參數換成一個巨大的向量數據,你要作的就是把矩陣 W 轉換成一個向量,把全部 W 矩陣轉化爲向量後作鏈接運算,獲得一個巨型向量 θ; 代價函數 J 是全部 W 和 b 的函數,也就是獲得了一個 θ 的代價函數 J。求導各個 w,b, 再轉換成一個大向量 dθ。
爲了實施梯度檢驗, 你要作的是循環執行, 從而對每一個 i, 也就是每一個 θ 組成元素計算dθ [i](approx)的值,運用雙邊偏差求得的值應該逼近 dθ[i],目的就是檢驗 dθ[i](approx)和 dθ[i] 是否相等。 先計算這兩個向量的距離, 而後用向量長度進歸一化, ε 可能爲 10 的-7 次方, 使用這個取值範圍內的 ε, 你若是發現方程式獲得的值爲 10 的-7 次方或者更小, 這就很好, 這意味着導數逼近頗有多是正確的,它的值很是小;若是在 10 的-5 方範圍內,要當心,也許這個值沒問題,但須要再次檢查這個向量的全部項,確保沒有一項偏差過大,若是有一項偏差很是大,可能就存在 BUG。
如何應用?
咱們在調試程序的時候能夠用以下公式計算:
dθ [i](approx)= (J(θ [1],θ [2],...,θ [i]+ε,...θ [n]) - J(θ [1],θ [2],...,θ [i]-ε,...θ [n])) / ||2ε||
而後與咱們公式推導計算的dθ比較,看結果是否接近。