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

Charzueus發表於2020-08-05

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

那如何對我們自己的模型進行判斷呢?——通過模型訓練跑程式碼,我們可以分別從訓練集和測試集上看到這個模型造成的損失大小(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 descentAdagrad,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

相關文章