深度學習模型的調優,首先需要對各方面進行評估,主要包括定義函式、模型在訓練集和測試集擬合效果、交叉驗證、啟用函式和優化演算法的選擇等。
那如何對我們自己的模型進行判斷呢?——通過模型訓練跑程式碼,我們可以分別從訓練集和測試集上看到這個模型造成的損失大小(loss),還有它的精確率(accuracy)。
目錄
- 最初可從分析資料集的特徵,選擇適合的函式以及優化器。
- 其次,模型在訓練集上的效果。至少模型在訓練集上得到理想的效果,模型優化方向:啟用函式(activation function)、學習率(learning rate)。
- 再者,模型在訓練集上得到好的效果之後,對測試集上的擬合程度更為重要,因為我們訓練之後目的就是去預測並達到好的結果。模型優化方向:正則化(regularization)、丟棄引數(dropout)、提前停止訓練(early stopping)。
以下介紹具體的方法和過程,圖文結合,一目瞭然,這樣方便學習記憶!
衡量方法通常用到真實f與預測f*的方差(variance)和偏差(bias),最後對資料集的擬合程度可分為4種情況。如下:
bias/variance | low | high |
low | √ | 模型過於複雜 |
high | 模型過於簡單 | × |
這好比資料模型預測對準靶心後的偏移和分散程度,期望達到的效果就是(low,low),模型的偏差相當於與目標的偏離程度,而方差就是資料之間的分散程度。
定義一個模型函式後結果會遇到(low,high)和(high,low),顯然,如果是(high,high)說明函式完全與模型不匹配,可重新考慮其他函式模型。那出現其他情況如何評估這個函式呢?
- 小偏差,大方差:所謂模型過擬合,在訓練資料上得到好的效果,而在測試集上效果並不滿意。優化方向:增加資料量;資料正則化處理。增加資料可以提高模型的魯棒性,不被特殊資料影響整個模型的偏向;正則化是另一種方法,為了減小variance,但直接影響到bias,需要權衡。
- 大偏差,小方差:模型過於簡單,在訓練上沒有得到好的效果。優化:增加模型引數(特徵),更好去擬合資料。
在訓練一個模型時候,通常會將資料分為:訓練集,測試集,開放集(小型訓練集)。這裡交叉驗證是在訓練集上進行的,選擇最優模型。
假設一個劃分為:
training-set | testing-set |
90% | 10% |
這裡進行十折交叉驗證,每一輪訓練去9份資料作為訓練集,1份作為測試集,並且每一輪的訓練集與測試集對換,實現了所有資料都作為樣本訓練,所得到的模型避免了過擬合與低擬
合的問題。
K折交叉驗證類似。
優點:
(1)每一輪訓練中幾乎所有的樣本資料用於訓練模型,這樣最接近原始樣本的分佈,評估所得的結果比較可靠。
(2)訓練模型過程中較少隨機特殊因素會影響實驗資料,魯棒性更好。
模型優化演算法選擇根據要訓練的模型以及資料,選擇合適的演算法,常用優化演算法有:Gradient descent,Stochastic gradient descent,Adagrad,Adam,RMSprop。
前兩種演算法原理好理解,這裡給出後面三種的演算法原理如圖,具體就不介紹了,寫程式碼時候通常直接指定演算法就行,演算法原理理解就OK啦。
Adagrad
RMSprop
Adam
選擇合適的啟用函式對模型訓練也有很大的影響,需要適應訓練任務,比如任務是二分類、多分類或許更新引數梯度問題等。常用的有:sigmoid、tanh、relu、softmax。
sigmoid
功能特點:平滑函式,連續可導,適合二分類,存在梯度消失問題。
tanh
功能特點:與sigmoid相同的缺點,存在梯度消失,梯度下降的速度變慢。一般用在二分問題輸出層,不在隱藏層中使用。
relu
功能特點:ReLU在神經網路中使用最廣泛的啟用函式。根據影像x負半軸的特點,relu不會同時啟用所有的神經元,如果輸入值是負的,ReLU函式會轉換為0,而神經元不被啟用。這意味著,在一段時間內,只有少量的神經元被啟用,神經網路的這種稀疏性使其變得高效且易於計算。
softmax
功能特點:又稱歸一化指數函式。它是二分類函式sigmoid在多分類上的推廣,目的是將多分類的結果以概率的形式展現出來。softmax通常在分類器的輸出層使用。
在模型訓練任務中啟用函式通過指定選擇,我們理解原理後幫助選擇正確的函式,具體無需自己實現。
它解決深度神經網路的過擬合(overfitting)和梯度消失(gradient vanishing)問題,簡單理解就是,當模型在訓練集上得到較好的效果,而在測試集效果並不樂觀,此時使用dropout對訓練時候的引數進行優化調整(減少訓練時候的引數),在學習過程中通過將隱含層的部分權重或輸出隨機歸零,降低節點間的相互依賴性,使得模型在測試集上得到較好的結果的一種方法。相當於運用新的神經網路結構訓練模型,在模型訓練時候可在每一層指定設計。
在訓練時候觀察模型在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