上週我發布了一篇關於如何建立簡單神經網絡,特別是多層感知器的文章。本文將深入探討神經網路的細節,討論如何透過調整神經網路的配置來最大限度地提高神經網路的效能。
訓練模型時,您可能會認為如果模型訓練得夠多,模型就會變得完美無缺。這可能是真的,但這只適用於它所訓練的資料集。事實上,如果你給它另一組值不同的數據,模型可能會輸出完全錯誤的預測。
為了進一步理解這一點,假設您每天都在不移動方向盤的情況下直線駕駛來練習駕駛考試。 (請不要這樣做。)雖然您可能會在直線加速賽中表現出色,但如果在實際考試中被告知要左轉,您最終可能會變成停車標誌。
這種現象稱為過度擬合。您的模型可以學習其訓練資料的所有方面和模式,但如果它學習的模式與訓練資料集過於緊密地結合,那麼當給定新資料集時,您的模型將表現不佳。同時,如果您沒有充分訓練模型,那麼您的模型將無法正確識別其他資料集中的模式。在這種情況下,您將欠擬合。
在上面的範例中,當驗證損失達到最小值時,停止訓練模型的最佳位置是正確的。可以透過提前停止來做到這一點,一旦在任意數量的訓練週期(時期)後驗證損失沒有改善,它就會停止訓練。
訓練模型就是在過度擬合和欠擬合之間找到平衡,同時在必要時利用提前停止。這就是為什麼您的訓練資料集應該盡可能代表總體人群,以便您的模型可以更準確地對其未見過的資料進行預測。
也許可以調整的最重要的訓練配置之一是損失函數,它是模型的預測與其實際值之間的「不準確性」。 「不準確度」可以用多種不同的數學方式來表示,最常見的一種是均方誤差(MSE):
哪裡 ˉˉˉ>欄{y_i} y我 是模型的預測, yi >yi
是真正的價值。有一個類似的變體,稱為平均絕對誤差(MAE)這兩個有什麼差別,哪個比較好?真正的答案是這取決於多種因素。讓我們考慮一個簡單的二維線性迴歸範例。
在許多情況下,可能存在異常值的資料點,即遠離其他資料點的點。就線性迴歸而言,這意味著有幾個點 xy
- 距離其他飛機較遠的飛機。如果您還記得統計課上的內容,那麼像這樣的點會顯著影響計算的線性迴歸線。 =xy = x xy = x
y=x11(5, 1)
y = 0.2x 1.6
一個簡單圖形,其點位於(1, 1)、(2, 2)、(3, 3)、(4, 4) 和(5,1 ) ),並有一條線性迴歸線穿過它。 yy > 什麼時候
x=5x = 5 5x = 5 x = 5 x = 5 x=5 是 5,但由於異常值及其 MSE,迴歸線顯著「向下拉」。 這只是一個簡單的例子,但這提出了一個問題,作為機器學習開發人員,您需要停下來思考:我的模型對異常值應該有多敏感? 如果您想要如果模型對異常值更加敏感,那麼您會選擇像MSE 這樣的指標,因為在這種情況下,由於平方,涉及異常值的錯誤會更加明顯,並且您的模型會自行調整以最大限度地減少這種情況。否則,您會選擇像 MAE 這樣的指標,它不太關心異常值。
在我之前的文章中,我還討論了反向傳播、梯度下降的概念,以及它們如何最小化模型的損失。 梯度是一個指向最大變化方向的向量。梯度下降演算法將計算該向量並向完全相反的方向移動,使其最終達到最小值。
大多數最佳化器都有特定的學習率,通常表示為 αα
他們所堅持的。本質上,這表示演算法每次計算梯度時將向最小值移動多少。[Tensorflow 的神經網路遊樂場](https://playground.tensorflow.org) 展示瞭如果將學習率設定得太大會發生什麼。請注意測試和訓練損失都是“NaN”。
隨機梯度下降
標準梯度下降最受歡迎的替代方案之一是稱為Adam 優化器 Adam 這個名字源自於自適應矩估計。它本質上結合了 SGD 的兩種變體,根據每次訓練迭代期間更新的頻率來調整每個輸入參數的學習率(自適應學習率
)。同時,它還追蹤過去的梯度計算作為移動平均值以平滑更新(把它們放在一起
現在舉個例子!
如果您對 Python 有點陌生,別擔心!我添加了一些解釋來討論每個部分中發生的事情。
反射 雖然這顯然沒有涵蓋有關優化神經網路的所有內容,但我想至少涵蓋一些您在訓練自己的模型時可以利用的最重要的概念。希望您本週學到了一些東西,感謝您的閱讀!以上是優化你的神經網絡的詳細內容。更多資訊請關注PHP中文網其他相關文章!