本篇部落格將介紹深度學習時所用到的一些tips。
我們知道,機器學習的三大步驟(function set, goodness of function, pick up the best function),那如果我們最終得到的結果壞掉了怎麼辦。如果壞掉了,到底是這三步的哪乙個步驟出現了問題呢?
結果的壞掉有兩種情況,一種是訓練資料的符合率很低,還有一種是測試資料的命中率比較低。在第一種情況下,很可能是在gradient descent的時候,由於某種原因而致使所得到的權重並不是l(
w1,w
1,⋯,
wn,b
) 最小值點,所以需要我們調整loss function或者是權重的初始值以及learning rate。那如果是測試資料的時候結果壞掉了呢?那基本上就可以確定是出現了過擬合的情況,所以可能需要我們重新調整模型,下面的這張圖很好地描述了這個過程。
下面介紹幾種比較常用的方法
i.對於訓練資料的時候出現問題的解決辦法:
對於某些機器學習問題,有時候會隨著網路深度的遞增而遞減。那為什麼會出現這種現象呢?解釋是:vanishing gradient. 在以sigmoid函式為啟用函式的神經網路中,由於sigmoid函式的影響導致網路中靠近input layer的引數偏導數很小,而靠近output layer的引數偏導數較大,這樣就導致靠近output layer的引數收斂得很快,而靠近input layer的引數直到學習結束都幾乎都沒有被更新。
那怎麼去解決這個問題呢?你當然可以採用乙個動態的learning rate去使不同引數盡量收斂,但是這種解決方案顯然只是治標不治本,因為導致這個問題的元凶在sigmoid函式。那我們能不能通過更換啟用函式來解決這個問題呢?答案是完全可行!事實上我們也是這麼做的。
下面介紹兩種比較常用的來更換sigmoid函式的啟用函式:
那這個函式怎麼求導呢?
根據上一次的weight與輸入我們是能夠求出每個神經元的具體輸出的,那麼就將輸出z1
=w1x
+b,z
2=w2
x+b 中較小的那乙個從神經網路中剔除,然後訓練這乙個更淺一點的神經網路,操作如下圖
這種方法有很多具體的實現方式,比較著名的有adagrad、rmsprop、momentum.
<1>adagrad:
adagrad的具體表達如下: wt
+1←w
t−η∑
ti=0
g2i−
−−−−
−√⋅g
i 其中g
i=∇l
<2>rmsprop wt
+1←w
t−ησ
t⋅gt
其中σt
=ασ2
t−1+
(1−α
)g2t
−−−−
−−−−
−−−−
−−√,
σ0=g
0,gt
=∇l
<3>momentum
不做過多解釋,請讀者參考下圖
ii.對於測試資料時出現問題的解決方法
解決方法主要有:early stopping,regularization,dropout
下面簡短地介紹一下regularization與dropout,early stopping比較簡單,請讀者查閱相關資料,不在這裡贅述
1.regularization
regularization其實就是要調整我們做梯度遞減的函式,在該函式後面加上λ|
θ|2 : l′
(θ)=
l(θ)
+λ|θ
|2用這個新的函式來做gradient descent: ∂l
′∂w=
∂l∂w
+λw
wt+1
←wt−
(η∂l
∂w)−
ηλwt
=(1−
ηλ)w
t−(η
∂l∂w
) 2.dropout
這種處理方式的做法是,每次引數更新,每個神經元有
p %的概率被隨機丟棄
最終得到的結果要用每個引數乘上1−
p %
機器學習 學習記錄六
本篇部落格將介紹semi supervised learning的實現方法 介紹 之前我們所介紹的機器學習所提到的資料都是帶有label的。而現實是,蒐集這些帶有label的資料並不是一件簡單的事情,但是蒐集一些不帶有label的資料就要容易很多。semi supervised learning指的...
機器學習實戰學習記錄
1 k近鄰演算法 k近鄰演算法的一般流程 1 收集資料 可以使用任何方法。2 準備資料 距離計算所需要的數值,最好是結構化的資料格式。3 分析資料 可以使用任何方法。4 測試演算法 計算錯誤率。5 使用演算法 首先需要輸入樣本資料和結構化的輸出結果,然後執行k近鄰演算法判定輸入資料分別屬於哪個分類,...
python學習記錄 機器學習
首先安裝了anaconda3軟體,安裝的是最新版,安裝時勾選了寫入環境變數,支援的是python3.7.3版本。然後設定了清華大學的映象,主要是用管理員身份執行 anaconda prompt命令列,然後執行conda config命令,然後執行 然後,需要更新spyder3.3.3為3.3.4,仍...