iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

在訓練機器學習模型和深度學習模型時,有時碰到欠擬合(Underfitting)和過擬合(Overfitting)的情形,其中Overfitting相較於Underfitting更需注意。

下圖為兩類情形的示意圖,左圖為Underfitting的狀況,模型所訓練的結果為紅色線段,由於僅使用線性的模型來劃分類別,導致模型的表現極差;中間的圖為配適較為合適的模型;右邊為Overfitting的結果,此示意圖呈現了多數模型overfitting的情況,模型已經過度依賴訓練資料,產生了一個過於複雜的模型。
https://ithelp.ithome.com.tw/upload/images/20221005/20151279IdTypfubWX.png
圖片來源:連結

欠擬合(Underfitting)

相較於overfitting,underfitting的問題較容易處理。

造成underfitting的原因及處理辦法

  1. 模型的訓練時間不足(迭代次數過少)
    -> 解決方法:增加模型的迭代次數
  2. 模型複雜度不足(神經網路結構過於簡單)所導致
    -> 解決方法:改變神經網路的結構,如:調整神經元數量、增加模型深度等

過擬合(Ovefitting)

當模型訓練時間過長、迭代次數過多時,常會有過擬合的問題,如何確認模型是否過擬合,則需要觀察訓練集的Error以及測試集的Error。當兩種Error的數值開始出現較大的差距時(如下圖),則模型可能已經o形verfitting了。
https://ithelp.ithome.com.tw/upload/images/20221005/20151279pXThgsUbbO.png

造成overfitting的原因及處理辦法

  1. 模型迭代次數過多:
    過度的訓練會使得模型已記住訓練資料的特徵,導致模型無法在其他資料集中有較好的表現
    -> 解決方法:可觀察兩種Error的圖型,來設置early stopping的標準。early stopping往往是根據測試資料集的Loss之變化來判斷是否停止訓練。
from keras.callbacks import EarlyStopping, ModelCheckpoint
## patience=10,但代表當測試資料集中的loss在經過10個epoch後都沒有下降,則會停止訓練
earlystop = EarlyStopping(monitor='test_loss', patience=10, verbose=1)

## 在callbacks中放入early stopping的設定
model.fit(x_train,y_train,batch_size=100,epochs=100, validation_data = (x_test, y_test),callbacks = [earlystop])
  1. 訓練資料過少
    訓練資料過少,會導致模型僅學習少量資料中的特徵,因此在測試資料集中並不會有好表現
    -> 解決方法:搜集更多的訓練資料,但增加資料集往往較為困難,因此目前有發展出Data augmentation的方法(如下圖),來增加樣本的數量
    https://ithelp.ithome.com.tw/upload/images/20221005/20151279QkllXRJAye.jpg
    照片來源:連結
  2. 模型過於複雜
    -> 解決辦法:
    (1) Dropout:
    此方法在2014年被提出,其概念為在訓練的的時候會隨機將一些神經元關閉,避免神經元會有過度依賴的情形發生,使用此方法也可降低模型overfitting的問題。詳細的原理可以參考網上其他相關的文章。
    (2) Regularization:
    正規化最常使用的是L1 Regularization & L2 Regularization,此方法就是在Loss function中加上兩個正規化所對應的懲罰項
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras import regularizers
model = Sequential()
# 使用L2正規化
model.add(Dense(output_dim=200,activation='relu',kernel_regularizer=regularizers.l2(l=0.001)))  
##lambda為正規化需要設定的超參數,若太小會導致懲罰項無用,若太大則會影響模型收斂的情形

model.add(Dropout(p=0.5))  # p會決定每個神經網路是否關閉的機率

# 使用L1正規化
model.add(Dense(output_dim=50,activation='relu',kernel_regularizer=regularizers.l1(0.001)))

總結

在訓練模型時,需要留意模型是否有出現underfitting以及overfitting的問題,在使用上述幾個技巧後,仍需要多加注意,才能使模型能夠有更好的表現


上一篇
[Day25] RNN, CNN
下一篇
[Day27] 時頻譜 (Spectrogram)
系列文
人類行為數據分析- 以R和Python進行實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言