目錄算法
第二週(優化算法)session
目標: 如何有效運做神經網絡,內容涉及超參數調優,如何構建數據,以及如何確保優化算法快速運行,從而使學習算法在合理時間內完成自我學習。機器學習
如何選取一個神經網絡的訓練集、驗證集和測試集呢?函數
若是數據量比較少,例如只有100條,1000條或者1萬條數據,按照60%、20%、20%劃分是比較合理的,可是在目前大部分數據都是遠遠大於這個數理級,也能夠說是大數據規模的級別。那麼,此時選擇的比例比較合適的爲訓練集佔98%,驗證集和測試集各佔1%。性能
在對於驗證集和測試集的數據選擇上,儘可能確保這兩部分數據來自同一分佈,這樣處理的是會使得算法的性能驗證結果更加精確。學習
優化神經網絡性能的基本思路測試
合理地分析訓練集在訓練算法產生的偏差和驗證集上驗證算法產生的偏差來診斷算法是否存在高誤差和高方差,對系統地優化算法有很大的幫助。大數據
在訓練神經網絡時,若是算法的誤差很高,甚至沒法擬合訓練集,那麼此時須要選擇一個新的網絡,好比含有更多隱藏層或者隱藏單元的網絡,或者花費更多時間來訓練網絡,或者嘗試更先進的優化算法。
訓練網絡完成後,驗證其性能時,若是方差很高,最好的解決辦法就是採用更多數據,若是可以作到,會有必定的幫助,但有時候,咱們沒法得到更多數據,咱們也能夠嘗試經過正則化來減小過擬合。
L2正則化方法
L2正則化更新W值過程
爲何正則化有利於預防過擬合呢?
若是正則化參數很大,激活函數的參會會相對較小,由於代價函數的參數變大了。若是W很小,相對來講,z也會很小。此時,激活函數g(z)大體呈線性,和線性迴歸函數同樣,此時就能夠很好地解決過擬合問題。具體以下圖:
dropout正則化
使用數據擴增能夠有效減小神經網絡中的過擬合,例如把已有數據進行相關處理,能夠把圖片翻轉或者變形壓縮等處理,這樣就大大增長了已有樣本數據集的數量。
此外,還能夠選擇採用early stopping方式來減小神經網絡中的過擬合。例以下圖:
梯度檢驗應用的注意事項
首先,不要在訓練中使用梯度檢驗,它只用於調試。
第二點,若是算法的梯度檢驗失敗,要檢查全部項,檢查每一項,並試着找出bug。
第三點,在實施梯度檢驗時,若是使用正則化,請注意正則項。
第四點,梯度檢驗不能與dropout同時使用,由於每次迭代過程當中,dropout會隨機消除隱藏層單元的不一樣子集,難以計算dropout在梯度降低上的代價函數J。
最後一點,也是比較微妙的一點,現實中幾乎不會出現這種狀況。當w和b接近0時,梯度降低的實施是正確的,在隨機初始化過程當中……,可是在運行梯度降低時,w和b變得更大。可能只有在w和b接近0時,backprop的實施纔是正確的。可是當W和b變大時,它會變得愈來愈不許確。你須要作一件事,我(吳恩達老師)不常常這麼作,就是在隨機初始化過程當中,運行梯度檢驗,而後再訓練網絡,w和b會有一段時間遠離0,若是隨機初始化值比較小,反覆訓練網絡以後,再從新運行梯度檢驗。
Mini-batch梯度降低簡單介紹
mini-bach梯度降低法,核心是把輸入數據以及輸出數據,以必定數量組分組變成向量化的結果進行相關計算,這樣作的好處就是循環次數大大減小,也可以提升運行效率。下圖可參考:
使用batch(批量)梯度降低法,一次遍歷訓練集只能讓你作一個梯度降低,使用mini-batch梯度降低法,一次遍歷訓練集,能讓你作5000個梯度降低。固然正常來講你想要屢次遍歷訓練集,還須要爲另外一個while循環設置另外一個for循環。因此你能夠一直處理遍歷訓練集,直到最後你能收斂到一個合適的精度。
若是你有一個丟失的訓練集,mini-batch梯度降低法比batch梯度降低法運行地更快,因此幾乎每一個研習深度學習的人在訓練巨大的數據集時都會用到。
mini-bathc梯度降低法和batch梯度降低法隨着訓練次數的關係圖:
若是mini-batch中設置的分組數目大小爲1,此時算法就變成了隨機梯度降低法。
樣本集較小時,推薦直接使用batch梯度降低法,此時沒有必要使用mini-batch梯度降低法。
使用mini-batch梯度降低法注意點
在使用mini-batch梯度降低法時要注意選定的分組數目要合理,通常選擇2的指數次,例如64或者512。若是選擇的數目不合理,會由於你訓練所在的CPU/GPU內存不相符,致使算法的表現得不到預期效果。
理解指數加權平均數
指數加權平均數,相似一個等比數列和等差數列的組合體,計算第n項須要不斷迭代,以下圖:
動量梯度降低法
加快學習算法的一個辦法就是隨時間慢慢減小學習率,咱們將之稱爲學習率衰減。
梯度降低
在機器學習中,最簡單就是沒有任何優化的梯度降低(GD,Gradient Descent),咱們每一次循環都是對整個訓練集進行學習,這叫作批量梯度降低(Batch Gradient Descent),咱們以前說過了最核心的參數更新的公式,這裏咱們再來看一下:
由梯度降低算法演變來的還有隨機梯度降低(SGD)算法和小批量梯度降低算法,隨機梯度降低(SGD),至關於小批量梯度降低,可是和mini-batch不一樣的是其中每一個小批量(mini-batch)僅有1個樣本,和梯度降低不一樣的是你一次只能在一個訓練樣本上計算梯度,而不是在整個訓練集上計算梯度。
包含動量的梯度降低
Adam算法
Adam的一些優勢包括相對較低的內存要求(雖然比梯度降低和動量降低更高)和一般運做良好,即便對參數進行微調(除了學習率α)。
調試處理
在訓練神經網絡時,有不少參數須要調整來使得訓練結果變得更加合理,其中常常須要調試的參數爲學習速率a。
當有多個超參數須要調節時,能夠採用由粗糙到精細的策略,即估算出最佳參數的調節範圍,而後再在縮小的調節範圍中精細調節。
超參數調試的實踐
(1) 你照看一個模型,一般是有龐大的數據組,但沒有許多計算資源或足夠的CPU和GPU的前提下,基本而言,你只能夠一次負擔起試驗一個模型或一小批模型,在這種狀況下,即便當它在試驗時,你也能夠逐漸改良。類比哺乳動物照看孩子,例如熊貓,通常只能照看一個孩子
(2) 同時試驗多種模型,你設置了一些超參數,儘管讓它本身運行,或者是一天甚至多天,而後你會得到不一樣的學習曲線,這能夠是損失函數J或實驗偏差或損失或數據偏差的損失,但都是你曲線軌跡的度量。類比魚產卵,能夠由不少不少,但其中只要有成功存活就能夠。
Batch歸一化一次只能處理一個mini-batch數據,它在mini-batch上計算均值和方差。 使用Batch歸一化,可以訓練更深的網絡,讓學習算法運行速度更快。
Softmax迴歸
有一種logistic迴歸的通常形式,叫作Softmax迴歸,能讓你在試圖識別某一分類時作出預測,或者說是多種分類中的一個,不僅是識別兩個分類。 Softmax迴歸或Softmax激活函數將logistic激活函數推廣到C類,而不只僅是兩類。能夠參考下圖的輸出層:
Tesorflow框架使用
初始化Tensorflow變量後,進行相關運算時,例如乘法運算,運算前須要建立一個session,而後調用session.run()方法才能成功完成相關運算。
參考資料: