日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

过拟合是什么 怎么解决?

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 过拟合是什么 怎么解决? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載來源:https://blog.csdn.net/u010899985/article/details/79471909

一.過擬合
在訓練數據不夠多時,或者over-training時,經常會導致over-fitting(過擬合)。其直觀的表現如下圖所所示。

隨著訓練過程的進行,模型復雜度,在training data上的error漸漸減小。可是在驗證集上的error卻反而漸漸增大——由于訓練出來的網絡過擬合了訓練集,對訓練集以外的數據卻不work。

在機器學習算法中,我們經常將原始數據集分為三部分:訓練集(training data)、驗證集(validation data)、測試集(testing data)。

1.validation data是什么?

它事實上就是用來避免過擬合的。在訓練過程中,我們通經常使用它來確定一些超參數(比方,依據validation data上的accuracy來確定early stopping的epoch大小、依據validation data確定learning rate等等)。那為啥不直接在testing data上做這些呢?由于假設在testing data做這些,那么隨著訓練的進行,我們的網絡實際上就是在一點一點地overfitting我們的testing data,導致最后得到的testing accuracy沒有什么參考意義。因此,training data的作用是計算梯度更新權重,testing data則給出一個accuracy以推斷網絡的好壞。

2.防止過擬合方法主要有:

1.正則化(Regularization)(L1和L2)

2.數據增強(Data augmentation),也就是增加訓練數據樣本

3.Dropout

4.early stopping

二、正則化
正則化(Regularization)包含L1、L2(L2 regularization也叫權重衰減,weight decay)

1.L1 regularization

在原始的代價函數后面加上一個L1正則化項,即全部權重w的絕對值的和,再乘以λ/n(這里不像L2正則化項那樣,須要再乘以1/2)。

先計算導數:

上式中sgn(w)表示 w 的符號,那么權重w的更新規則為:

比原始的更新規則多出了這一項。

當w為正時,sgn(w)>0, 則更新后的w變小。

當w為負時,sgn(w)>0, 則更新后的w變大——因此它的效果就是讓w往0靠,使網絡中的權重盡可能為0,也就相當于減小了網絡復雜度,防止過擬合。

另外,上面沒有提到一個問題,當w為0時怎么辦?當w等于0時,|W|是不可導的。所以我們僅僅能依照原始的未經正則化的方法去更新w,這就相當于去掉 ηλsgn(w)/n 這一項,所以我們能夠規定sgn(0)=0,這樣就把 w=0 的情況也統一進來了。

(在編程的時候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)

  • L2 regularization(權重衰減)
    L2正則化就是在代價函數后面再加上一個正則化項:
  • C0代表原始的代價函數,后面那一項就是L2正則化項。它是這樣來的:全部參數 w 的平方和,除以訓練集的樣本大小n。

    λ 就是正則項系數,權衡正則項與C0項的比重。另外另一個系數1/2,1/2經常會看到,主要是為了后面求導的結果方便,后面那一項求導會產生一個2,與1/2相乘剛好湊整。L2正則化項是怎么避免overfitting的呢?我們推導一下看看,先求導:

    能夠發現L2正則化項對 b 的更新沒有影響,可是對于w的更新有影響:

    在不使用L2正則化時。求導結果中 w 前系數為 1,經變化后w前面系數為 1?ηλ/n ,由于η、λ、n都是正的。所以 1?ηλ/n小于1,它的效果是減小w,這也就是權重衰減(weight decay)的由來。

    當然考慮到后面的導數項,w 終于的值可能增大也可能減小。

    另外,必須提一下,對于基于mini-batch的隨機梯度下降,w 和 b 更新的公式跟上面給出的有點不同:

    對照上面 w 的更新公式。能夠發現后面那一項變了,變成全部導數加和,乘以η再除以m,m是一個mini-batch中樣本的個數。

    在此我們僅僅是解釋了L2正則化項有讓w“變小”的效果,可是還沒解釋為什么w“變小”能夠防overfitting?

    一個所謂“顯而易見”的解釋就是:更小的權值w,從某種意義上說,表示網絡的復雜度更低,對數據的擬合剛剛好(這個法則也叫做奧卡姆剃刀),而在實際應用中,也驗證了這一點,L2正則化的效果往往好于未經正則化的效果。當然,對于非常多人(包含我)來說,這個解釋似乎不那么顯而易見,所以這里加入一個略微數學一點的解釋(引自知乎):

    過擬合的時候,擬合函數的系數往往非常大,為什么?例如以下圖所看到的,過擬合。就是擬合函數須要顧忌每個點。終于形成的擬合函數波動非常大。在某些非常小的區間里,函數值的變化非常劇烈。

    這就意味著函數在某些小區間里的導數值(絕對值)非常大,由于自變量值可大可小,所以僅僅有系數足夠大,才干保證導數值非常大。而L2正則化是通過約束參數的范數使其不要太大,所以能夠在一定程度上降低過擬合情況。

    3.在什么情況下使用L1,什么情況下使用L2?

    L1和L2的差別,為什么一個讓絕對值最小,一個讓平方最小,會有那么大的差別呢?我看到的有兩種幾何上直觀的解析:

    (1)下降速度:

    我們知道,L1和L2都是規則化的方式,我們將權值參數以L1或者L2的方式放到代價函數里面去。然后模型就會嘗試去最小化這些權值參數。而這個最小化就像一個下坡的過程,L1和L2的差別就在于這個“坡”不同,如下圖:L1就是按絕對值函數的“坡”下降的,而L2是按二次函數的“坡”下降。所以實際上在0附近,L1的下降速度比L2的下降速度要快,所以會非常快得降到0。不過我覺得這里解釋的不太中肯,當然了也不知道是不是自己理解的問題。

    L1稱Lasso,L2稱Ridge。

    總結就是:L1會趨向于產生少量的特征,而其他的特征都是0,而L2會選擇更多的特征,這些特征都會接近于0。Lasso在特征選擇時候非常有用,而Ridge就只是一種規則化而已。

    三. 數據集擴增(data augmentation)
    訓練模型有時候不是由于算法好贏了,而是由于擁有海量的數據才贏了。”

    不記得原話是哪位大牛說的了,hinton?從中可見訓練數據有多么重要,特別是在深度學習方法中,海量的訓練數據,意味著能夠用更深的網絡,訓練出更好的模型。

    既然這樣,收集大量數據不就OK啦?假設能夠收集很多其它能夠用的數據,當然好。可是非常多時候,收集很多其它的數據意味著須要耗費很多其它的人力物力。尤其在對數據集進行人工標注的同學就知道,效率特別低,簡直是粗活。

    所以。能夠在原始數據上做些改動,得到很多其它的數據,以圖片數據集舉例,能夠做各種變換,如:

    將原始圖片旋轉一個小角度

    加入隨機噪聲

    一些有彈性的畸變(elastic distortions),論文《Best practices for convolutional neural networks applied to visual document analysis》對MNIST做了各種變種擴增。

    截取(crop)原始圖片的一部分,比方DeepID中,從一副人臉圖中,截取出了100個小patch作為訓練數據,極大地添加了數據集。

    感興趣的能夠看《Deep learning face representation from predicting 10,000 classes》.

    大量訓練數據意味著什么?

    用50000個MNIST的樣本訓練SVM得出的accuracy94.48%,用5000個MNIST的樣本訓練KNN得出accuracy為93.24%,所以很多其它的數據能夠使算法表現得更好。

    在機器學習中,算法本身并不能決出勝負,不能武斷地說這些算法誰優誰劣,由于數據對算法性能的影響非常大。

    四.Dropout
    L1、L2正則化是通過改動代價函數來實現的,而Dropout則是通過改動神經網絡本身來實現的,它是在訓練網絡時用的一種技巧(trike),它的流程例如以下:

    假設我們要訓練上圖這個網絡,在訓練開始時,我們隨機地“刪除”一部分的隱層單元,視它們為不存在,得到例如以下的網絡:

    保持輸入輸出層不變,依照BP算法更新上圖神經網絡中的權值(虛線連接的單元不更新,由于它們被“暫時刪除”了)。

    以上就是一次迭代的過程,在第二次迭代中,也用相同的方法,僅僅只是這次刪除的那一部分隱層單元,跟上一次刪除掉的肯定是不一樣的。由于我們每一次迭代都是“隨機”地去刪掉一部分。

    第三次、第四次……都是這樣,直至訓練結束。

    以上就是Dropout,它為什么有助于防止過擬合呢?能夠簡單地這樣解釋,運用了dropout的訓練過程,相當于訓練了非常多個僅僅有部分隱層單元的神經網絡,每個這種半數網絡,都能夠給出一個分類結果,這些結果有的是正確的,有的是錯誤的。

    隨著訓練的進行,大部分半數網絡都能夠給出正確的分類結果。那么少數的錯誤分類結果就不會對終于結果造成大的影響。

    刪除神經單元,不工作,通常keep_prob取0.5

    在編程時可以利用TensorFlow中 DropoutWrappera函數

    在訓練過程引入Dropout 策略,其Dropout層保留節點比例(keep_prob),每批數據輸入時神經網絡中的每個單元會以1-keep_prob的概率不工作,防止過擬合。

    lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.5)
    更加深入地理解。能夠看看Hinton和Alex兩牛2012的論文《ImageNet Classification with Deep Convolutional Neural Networks》

    五、提前終止(Early stopping)
    對模型進行訓練的過程即是對模型的參數進行學習更新的過程,這個參數學習的過程往往會用到一些迭代方法,如梯度下降(Gradient descent)學習算法。Early stopping便是一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練數據集迭代收斂之前停止迭代來防止過擬合。

    Early stopping方法的具體做法是,在每一個Epoch結束時(一個Epoch集為對所有的訓練數據的一輪遍歷)計算validation data的accuracy,當accuracy不再提高時,就停止訓練。這種做法很符合直觀感受,因為accurary都不再提高了,在繼續訓練也是無益的,只會提高訓練的時間。那么該做法的一個重點便是怎樣才認為validation accurary不再提高了呢?并不是說validation accuracy一降下來便認為不再提高了,因為可能經過這個Epoch后,accuracy降低了,但是隨后的Epoch又讓accuracy又上去了,所以不能根據一兩次的連續降低就判斷不再提高。一般的做法是,在訓練的過程中,記錄到目前為止最好的validation accuracy,當連續10次Epoch(或者更多次)沒達到最佳accuracy時,則可以認為accuracy不再提高了。此時便可以停止迭代了(Early Stopping)。這種策略也稱為“No-improvement-in-n”,n即Epoch的次數,可以根據實際情況取,如10、20、30……

    六、從數據預處理角度
    1.對原始數據通過PCA, t-SNE等降維技術進行降維處理

    2.平衡不同類數據的權重等

    參考:

    1.《Neural networks and deep learning》概覽 中第三章的一部分

    總結

    以上是生活随笔為你收集整理的过拟合是什么 怎么解决?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。