TShopping

 找回密碼
 註冊
搜索
查看: 1068|回復: 0
打印 上一主題 下一主題

[教學] [機器學習 ML]Overfitting 過度學習

[複製鏈接]
跳轉到指定樓層
1#
發表於 2021-2-5 16:20:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
在訓練的時候,經常會出現Overfitting的情況,也是就過度學習的情況,我一開始在實作的時候也遇過很多次,因此就去研究了一下,Overfitting是什麼,然後有那些常見的解決方法。

什麼是Overfitting(過度學習)

Overfitting顧名思義就是過度學習訓練資料,變得無法順利去預測或分辨不是在訓練資料內的其他資料,我用個自己認知的簡單例子來表達

假設現在我要訓練一個模型可以辨識是不是貴賓狗,因此這個模型學習到貴賓的特徵:耳朵長而寬,頭較窄且長,尾巴與身體成一斜角,身體背部短之類的特徵,但因為訓練資料都給黑色的貴賓狗,所以模型過度依賴訓練資料而把黑色的特徵也學習起來了,因此在預估的時候遇到不同顏色的貴賓便會有準確度的問題,這就是過度學習。



來自wiki,藍色跟紅色為當時訓練分類器的資料,黃色為新加入要分類的資料

以上圖來看,綠線就是Overfitting的結果,黑線代表正常的分類模型,綠線雖然完全把訓練資料分類出來,但如果現在有一個新的資料進來(黃色點點),就會造成分類錯誤,因為綠色線的模型在訓練資料的準確率是非常高的,不過在新資料的分類下錯誤率變會提升,以下有個方法可以偵測是否有Overfitting的情況發生





將所有的Training data坼成二部分,一個是Training Set跟Validate Set,Training Set就是真的把資料拿去訓練的,而Validate Set就是去驗證此Model在訓練資料外的資料是否可行。(原來每個實作這樣做的原因是要去偵測Overfitting啊!!恍然大悟)

機器學習的目標就是要訓練機器擁有人類的思考,並且擁有解決一般問題的能力,即使看到沒有包含在訓練資料的資料,也是要可以正確辨識的。而且現在訓練資料越來越龐大,訓練時間越來越久的時況下,避免跟解決Overfitting是機器學習上重要一個課題。

這裡有個連結,是用scikit-learn (python的一個學習套件,之後有時間會做介紹跟實作),來implement Underfitting 跟Overfitting在Linear Regression上的情況

http://scikit-learn.org/stable/auto_examples/model_selection/plot_underfitting_overfitting.html

造成Overfitting的原因與解決方式

  • 訓練資料太少

  • 取得更多的資料

這個方法就是收集更多的資料,或是自行生成更多的有效資料(如果你生成一些跟模型無關的資料去訓練只會越來越糟 ,所以必需確正自行生成的資料對訓練模型是有幫助)

  • 擁有太多的參數,功能太強的模型

  • 減少參數或特徵或者是減少神經層數
  • 在相同參數跟相同資料量的情況下,可以使用Regularization(正規化)
  • 在相同參數跟相同資料量的情況下,可以使用Dropout

第一種方法其實就是在降低模型的大小,複雜的模型容易造成過度學習

第二種跟第三種下面會逐一介紹,此二種方法都是現在機器學習中常見用來防止Overfitting的方法。

Regularization (正規化)

  • Weight decay(權重衰減)

Weight decay的意思就是對擁有較大權重的參數,課以罰金,藉此控制Overfitting的情況,因為Overfitting就是Weight 太大的時候可能會發生的問題。

Weight decay的方式就是在loss function (損失函數)加入參數權重的L2 norm,就可以抑制權重變大,我這邊就先不複習L2 norm是什麼,這個應該在線性代數裡面都有教過(但我其實也很久沒看線代有些忘了),我直接用以下公式來介紹 —





L2 norm就是把全部weight的平方和除2



加入weight decay後的gradient decent 更新變更

以上是使用Weight decay後的Gradient decent的參數更新推導, L是loss function,也就是損失函數,做Weight decay就是在loss function上加上Weight的L2 norm,進而推導出weight 更新就是上面的那個公式,可以看出跟原本的gradient decent更新比較,在一開始原本的weight乘上了(1- ηλ),因為 η,λ都為正,因此可以減少原本的weight的影響,越大的weight就變越小,越小的weight改變就不大,這就是Weight decay的由來。

另外補充一下,除了L2 norm以外,L1 norm跟L ∞ norm 都可以做為regular的方法。
  • Dropout

我們直接上一張圖來解釋Dropout的情況 —





Dropout的情形,左邊為一般的深層網路,右邊為dropout過後的深層網路

從上圖來看,經過dropout的網路,每一層都有神經元被打X,在消除上並沒有看見什麼規律性,因此我們可以看出Dropout的方法就是一邊"隨機”消除神經元,一邊訓練的方法。

我就直接拿Keras(python的一個Machine learning套件,之後有時間會做介紹跟實作)內建的dropout source code來做一個介紹,Keras的dropout code比較直觀,tensorflow內建的dropout必需使用tensor去完成,相對於Keras內建的code會比較難懂一些(我看了很久…),但觀念都是一樣的,有興趣的可以自行至以下網址研究https://github.com/tensorflow/tensorflow/blob/r1.10/tensorflow/python/ops/nn_ops.py

  1. def dropout(x, level, noise_shape=None, seed=None):
  2.    
  3.     """
  4.     #以下是參數介紹
  5.         x:輸入
  6.         level:0~1 的浮點數,需要被消除的神經元比例
  7.         noise_shape : 整數張量,為將要應用在輸入上的二值Dropout mask的shape,例如你的輸入為(batch_size, timesteps, features),並且你希望在各個時間步上的Dropout mask都相同,則可傳入noise_shape=(batch_size, 1, features)
  8.         seed : 隨機數種子
  9.     """
  10.    
  11.     if level < 0. or level >= 1:
  12.         raise ValueError('Dropout level must be in interval [0, 1[.')
  13.     if seed is None:
  14.         seed = np.random.randint(1, 10e6)
  15.     if isinstance(noise_shape, list):
  16.         noise_shape = tuple(noise_shape)
  17.     #以上為參數check
  18.    
  19.     rng = RandomStreams(seed=seed)
  20.    
  21.     retain_prob = 1. - level
  22.     #神經元能被保留的機率
  23.    
  24.     if noise_shape is None:
  25.         random_tensor = rng.binomial(x.shape, p=retain_prob, dtype=x.dtype)
  26.         #建立一個跟x一樣大小的白努利隨機函數 (0,1的隨機數列),p為是1的機率,也就是被保留的機率"
  27.     else:
  28.         random_tensor = rng.binomial(noise_shape, p=retain_prob, dtype=x.dtype)
  29.         random_tensor = T.patternbroadcast(random_tensor,
  30.                                            [dim == 1 for dim in noise_shape])
  31.     x *= random_tensor
  32.     #將輸入的input與0,1相乘,乘0的神經元就會被屏蔽,1的就會留下,這便是dropout隨機消除神經元的方法
  33.     x /= retain_prob
  34.     #將output做rescale,也就是所謂的inverted dropout,下面會介紹
  35.    
  36.     return x
複製代碼



從上面的code來看,其實就是這一層的神經元乘以一個白努利隨機數列(0,1的數列),乘以0的就是會被消除的神經元





原本一般的神經網路公式(來自dropout論文)



加入dropout的神經網路公式,乘上了白努利函數(來自dropout 論文)

而在code最後有做了一個rescale,這是所謂的inverted dropout,因為使用dropout的時候,訓練只有 1-level比例的神經元會參與訓練,在預測的時候所有神經元都要參與,這樣的話結果相比於訓練時平均要大1/(1-level),所以在正常預測的時候要乘以1-level,然後在這裡做的就是inverted dropout,直接在訓練的時候做rescale,這樣在預測的時候就不會有這個問題了。





來自dropout 論文,以下有連結

總結

Overfitting 對機器學習來說是常遇到的一個問題,不論是Regularization或是Dropout的技術都是很重要的一環,深入了解才會更加知道何時用Droput,何時用Reularization,這對之後遇到Overfitting有很大的幫助,解決了過度學習才有辦法訓練出一個完善的Neural Network 的Model。

參考資料

EliteDataScience

理解dropout

Overfitting wiki

Deep Learning 書籍


文章出處


 

臉書網友討論

8.png (6.53 KB, 下載次數: 5)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

7.png (21.5 KB, 下載次數: 4)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

6.png (11.6 KB, 下載次數: 4)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

5.png (5.94 KB, 下載次數: 3)

5.png

4.png (79.87 KB, 下載次數: 5)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

3.png (7.18 KB, 下載次數: 4)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

2.png (3.21 KB, 下載次數: 3)

機器學習 Overfitting 過度擬合

機器學習  Overfitting 過度擬合

1.png (72.54 KB, 下載次數: 5)

1.png
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-27 08:16 , Processed in 0.048146 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表