使用 TensorFlow 了解權重衰減

Leo Chiu
手寫筆記
Published in
5 min readAug 22, 2018

權重衰減的方法與原理

過擬合與欠擬合這篇文章中提到模型的容量與資料的多寡皆會影響訓練的結果,如果模型容量過高或者是訓練資料過少很容易造成過擬合,在這篇文章中我們要談到一種對抗過擬合的方法:權重衰減 (weight decay)

權重衰減 (weight decay) 的主要目的是「抑制更新參數的幅度」,在訓練模型時預測的結果會通過損失函數評估與真實值的差距,再藉由梯度下降更新參數,而權重衰減的方法是在損失函數加上一個懲罰項

線性回歸中的例子,損失函數為 loss(w, b),我們在這個損失函數後加上一個帶有 L2 范數的懲罰項,其中 λ 是懲罰項的倍率,當 λ=0 時,則權重衰減不會發生;當 λ 越大時,懲罰的比率較高,權重衰減的程度也就跟著變大。

我們使用梯度下降更新權重,會得到以下式子。你會發現與沒有加上懲罰項的差別在於 w 多了 (1- λ) 這個係數,其主要的思想在於強制約束權重,不讓模型擬合時過度依賴某一些權重,進而達到正則化的效果。

實現權重衰減

在這個範例中,我們要預測一個多項式函數的輸出值,在訓練模型時,定義訓練資料與測試資料的筆數分別為 20 與 100 筆。在先前過擬合與欠擬合那篇文章有提到,資料筆數過少,在訓練時會發生模型過擬合的結果,所以我們讓模型發生過擬合,再藉由權重衰減的方法使得模型的表現更好。

引入相依套件

我們會使用 numpy 產生訓練資料與測試資料,TensorFlow 作為建立線性迴歸模型的框架,最後,我們藉由視覺化模型的誤差觀察使用權重衰減前與使用後的結果。

產生資料

我們根據上述公式產生 200 維度的資料,而我們刻意將訓練資料與測試資料分別設定為 20 筆與 100 筆,讓訓練資料遠少於測試資料,使得模型發生過擬合。

此外,我們在 label 的每一個數字都加上一個噪音標準差為 1 的 ε,這讓我們更容易觀察過擬合的情況。

設定超參數

在這個範例中,除了設定批量大小(batch size)、迭代次數(epochs)、步幅(learning rate) 之外,我們還要再定義是懲罰項的係數 λ。

定義網路模型

我們要擬合的是一個高維度的超平面,與線性回歸這篇文章提到的模型建立方法一樣,不需要使用激勵函數。

定義損失函數與優化器

在定義損失函數時,得加上一個懲罰項,抑制更新參數的梯度。在這個例子中,使用一般的梯度下降方法優化參數。

設定迭代器

tf.data 是 TensorFlow 在 1.4 版本後從 tf.contrib 移至核心 API, 是一個可以用來迭代資料的函式庫。我們使用 tf.data.Dataset 作為迭代資料的工具。

訓練模型

在訓練模型前記得初始化所有在計算圖中的變數,以及初始化迭代模型的迭代器。在每次的迭代 (epoch) 時,我們特意跑完所有的訓練資料,加速優化模型,並且同時記錄訓練誤差與測試誤差。

視覺化訓練誤差與測試誤差

最後,我們藉由視覺化訓練誤差與測試誤差觀察模型訓練的結果,並設定 y 軸為對數座標,便於我們觀察過擬合發生的情況。

當 lambd 設定為 0 時,沒有發生權重衰減,因此,測試誤差遠大於訓練誤差,模型發生嚴重地過擬合

lambd=0

當 lambd 設定為 5 時,模型發生的權重衰減,從視覺化誤差的結果可以發現,訓練誤差與測試誤差相較於沒有使用權重衰減時的更接近,有助於減少模型的過擬合。但是訓練誤差卻明顯增長,換句話說,我們是使用權重衰減的方法「增加訓練誤差進而降低測試誤差」。而另一方面,模型訓練不好的主要原因還是在於擬合高維度的函數時使用的資料過少。

lambd=5

結論

權重衰減 (weight decay) 是一種對抗模型過擬合的正則化方法,我們可以看到在這篇文章中的實驗,在加上懲罰項後有效地對應過擬合的問題。

此外,我們了解到透過修改懲罰項的係數 λ,改變權重衰減的倍率對於訓練模型會有不一樣的效果,如果 λ 越大則權重衰減的倍率越高,如果 λ 越低甚至接近於 0,則權重衰減的倍率越低。

未來,當你遇到了過擬合的問題,也許可以嘗試使用權重衰減這個方法。

參考資料

延伸閱讀

--

--

Leo Chiu
手寫筆記

每天進步一點點,在終點遇見更好的自己。 Instragram 小帳:@leo.web.dev