過擬合、欠擬合

過擬合(over-fitting): 

其實就是所建的機器學習模型或者是深度學習模型在訓練樣本中表現得過於優越,導致在驗證數據集以及測 試數據集中表現不佳。

舉個例子:假設有一個看照片識別物種的模型,訓練時,你把你的大量照片輸入進去進行訓練。然後測試時,當輸入你的照片,無論什麼姿勢什麼造型,模型都能準確識別,咦,這是個人。當你把好朋友的照片輸進去,滿心等待輸出人時,結果很意外,輸出的不是個人。這種情況下就是模型把你所有的特徵都進行學習,測試別人時有特徵偏差就得不到正確結果,差不多除了你之外就識別不出人來了。這就是缺乏泛化能力,模型出現過擬合。模型過擬合,雖然在訓練集上表現得很好,但是在測試集中表現得恰好相反

欠擬合(under-fitting):

相對過擬合,欠擬合還是比較容易理解。還是拿剛纔的模型來說,可能模型學習的特徵較少,你輸入一張猴子的照片,輸出也是人。 這種情況下導致訓練出來的模型不能很好地匹配

過擬合:在訓練數據上表現良好,在未知數據上表現差。 
欠擬合:在訓練數據和未知數據上表現都很差。                      
避免過擬合的方式:

early stop, 數據集的擴增,正則化,dropout

early stop: 在發生過擬合之前提前結束訓練。理論上是可以的,但是這個點不好把握

數據集的擴增: 就是讓模型見到更多的的情況, 可以最大化的滿足全樣本, 但實際應用中對於未來的事件預測卻顯得鞭長莫及
正則化(regularization): 就是通過引入範數概念, 增強模型的範湖能力, 包括L1、l2(l2 regularization也叫weight decay)
dropout:是網絡模型中的一種方法,每次訓練時捨去一些節點來增強泛化能力。

下面主要介紹 正則化 和dropout
正則化(regularization):

就是在神經網絡計算損失值的過程中,在損失之後再加一項。這樣損失值所代表的輸出與標準結果間的誤差就會受到干擾,導致學習參數無法按照目標方向來調整,實現模型無法與樣本完全擬合的結果,從而達到防止過擬合的效果。

那麼如何加干擾項:
1)當欠擬合時,希望他對模型誤差的影響越小越好,以便讓模型快速擬合實際
2)過擬合時,希望他對模型誤差的影響越大越好,以便讓模型不要產生過擬合的效果
由此引入了兩個範數:
L1:所有學習參數w的絕對值的和

L2:所有學習參數w的平方和然後求平方根

loss(0)代表真實的loss值,loss(0)後面的那一項就代表正則化了。爲一個可以調節的參數,用來控制正則化對loss的影響。

對於L2,將其乘以1/2是爲了方向傳播時對其求導正好可以將數據規整。

dropout:
dropout意思就是每次訓練過程中,隨機選擇一部分節點不去學習。
看一下這樣做的原理:從樣本數據來看,數據本身不可能是純淨的,即任何一個模型不能100%把數據完全分開,在某一類中一定會有一些異常的數據,過擬合的問題的問題恰恰是把這些異常數據當成規律來學習了,對於模型來說,我們希望他是有點'智商'的,把異常數據過濾掉,只關心有用的規律數據。異常數據的特點是,他與主流樣本中的規律不同,但是量非常少,相當於在一個樣本中出現的概率比主流數據出現的概率低的多。就利用這個特性,通過在每次模型中忽略一些節點的數據學習,將概率的異常數據獲得的學習機會降低,這樣這些數據對模型的影響就會更小了
tensorflow中的dropout的函數原型:
def dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
參數:
    x: 輸入的模型節點
    keep_prob:保持率。如果爲1,則代表全部進行學習,如果爲0.8,則代表丟棄0.2
    noise_shape:代表指定的x中,哪些維度可以使用dropout技術,爲None時,表示所有維度都是用dropout技術,也可以將某個                          維度標誌爲1,來表示該維度使用dropout技術,例如shape爲[n, len, w, ch],使用noise_shape爲[n,1,1,ch],這表明                          會對x中的第二維度len和第三維度w進行dropout
    seed:隨機選取節點的過程中隨機數的種子值
    dropout改變了神經網絡的網絡結構,他僅僅是屬於訓練時的方法,所以一般在進行測試時要將keep_prob變爲1

實驗源代碼參考:https://gitee.com/wangfuchao/AI.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章