天天看點

深度學習模型調優方法(Deep Learning學習記錄)

深度學習模型的調優,首先需要對各方面進行評估,主要包括定義函數、模型在訓練集和測試集拟合效果、交叉驗證、激活函數和優化算法的選擇等。

那如何對我們自己的模型進行判斷呢?——通過模型訓練跑代碼,我們可以分别從訓練集和測試集上看到這個模型造成的損失大小(loss),還有它的精确率(accuracy)。

目錄

  前言

  1、定義模型函數

  2、交叉驗證(Cross-validation)

  3、優化算法

  4、激活函數(activation)

  5、dropout

  6、early stopping

  模型訓練實戰案例

前言

  1. 最初可從分析資料集的特征,選擇适合的函數以及優化器。
  2. 其次,模型在訓練集上的效果。至少模型在訓練集上得到理想的效果,模型優化方向:激活函數(activation function)、學習率(learning rate)。
  3. 再者,模型在訓練集上得到好的效果之後,對測試集上的拟合程度更為重要,因為我們訓練之後目的就是去預測并達到好的結果。模型優化方向:正則化(regularization)、丢棄參數(dropout)、提前停止訓練(early stopping)。

以下介紹具體的方法和過程,圖文結合,一目了然,這樣友善學習記憶!

1、定義模型函數

 衡量方法通常用到真實f與預測f*的方差(variance)和偏差(bias),最後對資料集的拟合程度可分為4種情況。如下:

bias/variance low high
low 模型過于複雜
high 模型過于簡單 ×

這好比資料模型預測對準靶心後的偏移和分散程度,期望達到的效果就是(low,low),模型的偏差相當于與目标的偏離程度,而方差就是資料之間的分散程度。

 定義一個模型函數後結果會遇到(low,high)和(high,low),顯然,如果是(high,high)說明函數完全與模型不比對,可重新考慮其他函數模型。那出現其他情況如何評估這個函數呢?

  1. 小偏差,大方差:所謂模型過拟合,在訓練資料上得到好的效果,而在測試集上效果并不滿意。優化方向:增加資料量;資料正則化處理。增加資料可以提高模型的魯棒性,不被特殊資料影響整個模型的偏向;正則化是另一種方法,為了減小variance,但直接影響到bias,需要權衡。 
  2. 大偏差,小方差:模型過于簡單,在訓練上沒有得到好的效果。優化:增加模型參數(特征),更好去拟合資料。

2、交叉驗證(Cross-validation)

在訓練一個模型時候,通常會将資料分為:訓練集,測試集,開放集(小型訓練集)。這裡交叉驗證是在訓練集上進行的,選擇最優模型。

假設一個劃分為:

training-set testing-set
90% 10%

這裡進行十折交叉驗證,每一輪訓練去9份資料作為訓練集,1份作為測試集,并且每一輪的訓練集與測試集對換,實作了所有資料都作為樣本訓練,所得到的模型避免了過拟合與低拟

合的問題。

 K折交叉驗證類似。

優點:

(1)每一輪訓練中幾乎所有的樣本資料用于訓練模型,這樣最接近原始樣本的分布,評估所得的結果比較可靠。

(2)訓練模型過程中較少随機特殊因素會影響實驗資料,魯棒性更好。

3、優化算法

模型優化算法選擇根據要訓練的模型以及資料,選擇合适的算法,常用優化算法有:Gradient descent,Stochastic gradient descent,Adagrad,Adam,RMSprop。

前兩種算法原理好了解,這裡給出後面三種的算法原理如圖,具體就不介紹了,寫代碼時候通常直接指定算法就行,算法原理了解就OK啦。

Adagrad

 RMSprop

 Adam

 4、激活函數(activation)

選擇合适的激活函數對模型訓練也有很大的影響,需要适應訓練任務,比如任務是二分類、多分類或許更新參數梯度問題等。常用的有:sigmoid、tanh、relu、softmax。

sigmoid

 功能特點:平滑函數,連續可導,适合二分類,存在梯度消失問題。

tanh

 功能特點:與sigmoid相同的缺點,存在梯度消失,梯度下降的速度變慢。一般用在二分問題輸出層,不在隐藏層中使用。

relu

功能特點:ReLU在神經網絡中使用最廣泛的激活函數。根據圖像x負半軸的特點,relu不會同時激活所有的神經元,如果輸入值是負的,ReLU函數會轉換為0,而神經元不被激活。這意味着,在一段時間内,隻有少量的神經元被激活,神經網絡的這種稀疏性使其變得高效且易于計算。

softmax

 功能特點:又稱歸一化指數函數。它是二分類函數sigmoid在多分類上的推廣,目的是将多分類的結果以機率的形式展現出來。softmax通常在分類器的輸出層使用。

在模型訓練任務中激活函數通過指定選擇,我們了解原理後幫助選擇正确的函數,具體無需自己實作。

5、dropout

它解決深度神經網絡的過拟合(overfitting)和梯度消失(gradient vanishing)問題,簡單了解就是,當模型在訓練集上得到較好的效果,而在測試集效果并不樂觀,此時使用dropout對訓練時候的參數進行優化調整(減少訓練時候的參數),在學習過程中通過将隐含層的部分權重或輸出随機歸零,降低節點間的互相依賴性,使得模型在測試集上得到較好的結果的一種方法。相當于運用新的神經網絡結構訓練模型,在模型訓練時候可在每一層指定設計。

6、early stopping

在訓練時候觀察模型在training-set和testing-set上的損失(loss),我們想要得到的模型是在測試時候損失誤差更小,訓練時候在訓練集上可能不是最好的效果,是以需要提前停止保證了模型預測得到較好的結果。了解如圖:

 模型訓練實戰案例

(X_train, Y_train), (X_test, Y_test) = load_data()
model = keras.Sequential()
model.add(Dense(input_dim=28 * 28, units=690,
                activation='relu'))  # tanh  activation:Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout、softmax
model.add(Dense(units=690, activation='relu'))
model.add(Dense(units=690, activation='relu'))  # tanh

model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam',
              metrics=['accuracy'])  # loss:mse,categorical_crossentropy,optimizer: rmsprop 或 adagrad、SGD(此處推薦)
model.fit(X_train, Y_train, batch_size=100, epochs=20)
result = model.evaluate(X_train, Y_train, batch_size=10000)
print('Train ACC:', result[1])
result = model.evaluate(X_test, Y_test, batch_size=10000)
print('Test ACC:', result[1])      
案例中深度學習模型調優總結:
前三層sigmoid,輸出層softmax,損失函數categorical_crossentropy,優化器SGD,訓練集上達到86%
前三層換為relu,隐藏層加10層,其他不變,訓練集上達到99.97%,測試集上95.9%,不加10層,Train-acc:100%,Test-acc:95.54%
優化器adam,訓練速度提高,99.98%和96.7%      
上面模型調優的理論方法,了解之後進行實戰演練,可參考上一篇文章《mnist手寫數字識别——深度學習入門項目(tensorflow+keras+Sequential模型)》,自行根據理論方法對模型進行調優,體驗一下簡單深度學習模型訓練和模型調優的過程!

      

我的CSDN部落格:https://blog.csdn.net/Charzous/article/details/107822055

我的部落格園:https://www.cnblogs.com/chenzhenhong/p/13437132.html