方法
權重衰減等價於 l2 範數正則化(regularization)。正則化通過為模型損失函式新增懲罰項使學出的模型引數值較小,是應對過擬合的常用手段。
l2 範數正則化(regularization)
l2 範數正則化在模型原損失函式基礎上新增 l2 範數懲罰項,從而得到訓練所需要最小化的函式。 l2 範數懲罰項指的是模型權重引數每個元素的平方和與乙個正的常數的乘積。以線性回歸中的線性回歸損失函式為例
ℓ(w1,w2,b)=1n∑i=1n12(x(i)1w1+x(i)2w2+b−y(i))2
其中 w1,w2 是權重引數, b 是偏差引數,樣本 i 的輸入為 x(i)1,x(i)2 ,標籤為 y(i) ,樣本數為 n 。將權重引數用向量 w=[w1,w2] 表示,帶有 l2 範數懲罰項的新損失函式為
ℓ(w1,w2,b)+λ2n|w|2,
其中超引數 λ>0 。當權重引數均為0時,懲罰項最小。當 λ 較大時,懲罰項在損失函式中的比重較大,這通常會使學到的權重引數的元素較接近0。當 λ 設為0時,懲罰項完全不起作用。上式中 l2 範數平方 |w|2 展開後得到 w21+w22 。 有了 l2 範數懲罰項後,在小批量隨機梯度下降中,我們將線性回歸一節中權重 w1 和 w2 的迭代方式更改為
w1w2←(1−ηλ|b|)w1−η|b|∑i∈bx(i)1(x(i)1w1+x(i)2w2+b−y(i)),←(1−ηλ|b|)w2−η|b|∑i∈bx(i)2(x(i)1w1+x(i)2w2+b−y(i)).
可見, l2 範數正則化令權重 w1 和 w2 先自乘小於1的數,再減去不含懲罰項的梯度。因此, l2 範數正則化又叫權重衰減。權重衰減通過懲罰絕對值較大的模型引數為需要學習的模型增加了限制,這可能對過擬合有效。
def
fit_and_plot_pytorch
(wd)
:# 對權重引數衰減。權重名稱一般是以weight結尾
net = nn.linear(num_inputs,1)
nn.init.normal_(net.weight, mean=
0, std=1)
nn.init.normal_(net.bias, mean=
0, std=1)
optimizer_w = torch.optim.sgd(params=
[net.weight]
, lr=lr, weight_decay=wd)
# 對權重引數衰減
optimizer_b = torch.optim.sgd(params=
[net.bias]
, lr=lr)
# 不對偏差引數衰減
train_ls, test_ls =
,[]for _ in
range
(num_epochs)
:for x, y in train_iter:
l = loss(net(x)
, y)
.mean(
) optimizer_w.zero_grad(
) optimizer_b.zero_grad(
)
l.backward(
)# 對兩個optimizer例項分別呼叫step函式,從而分別更新權重和偏差
optimizer_w.step(
) optimizer_b.step(
), train_labels)
.mean(
).item())
, test_labels)
.mean(
).item())
d2l.semilogy(
range(1
, num_epochs +1)
, train_ls,
'epochs'
,'loss'
,range(1
, num_epochs +1)
, test_ls,
['train'
,'test'
])
多層感知機中神經網路圖描述了乙個單隱藏層的多層感知機。其中輸入個數為4,隱藏單元個數為5,且隱藏單元 hi ( i=1,…,5 )的計算表示式為
hi=ϕ(x1w1i+x2w2i+x3w3i+x4w4i+bi)
這裡 ϕ 是啟用函式, x1,…,x4 是輸入,隱藏單元 i 的權重引數為 w1i,…,w4i ,偏差引數為 bi 。當對該隱藏層使用丟棄法時,該層的隱藏單元將有一定概率被丟棄掉。設丟棄概率為 p ,那麼有 p 的概率 hi 會被清零,有 1−p 的概率 hi 會除以 1−p 做拉伸。丟棄概率是丟棄法的超引數。具體來說,設隨機變數 ξi 為0和1的概率分別為 p 和 1−p 。使用丟棄法時我們計算新的隱藏單元 h′i
h′i=ξi1−phi
由於 e(ξi)=1−p ,因此
e(h′i)=e(ξi)1−phi=hi
即丟棄法不改變其輸入的期望值。讓我們對之前多層感知機的神經網路中的隱藏層使用丟棄法,一種可能的結果如圖所示,其中 h2 和 h5 被清零。這時輸出值的計算不再依賴 h2 和 h5 ,在反向傳播時,與這兩個隱藏單元相關的權重的梯度均為0。由於在訓練中隱藏層神經元的丟棄是隨機的,即 h1,…,h5 都有可能被清零,輸出層的計算無法過度依賴 h1,…,h5 中的任乙個,從而在訓練模型時起到正則化的作用,並可以用來應對過擬合。在測試模型時,我們為了拿到更加確定性的結果,一般不使用丟棄法
%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
"/home/kesci/input"
)import d2lzh1981 as d2l
defdropout
(x, drop_prob)
: x = x.
float()
assert
0<= drop_prob <=
1 keep_prob =
1- drop_prob
# 這種情況下把全部元素都丟棄
if keep_prob ==0:
return torch.zeros_like(x)
mask =
(torch.rand(x.shape)
< keep_prob)
.float()
return mask * x / keep_prob
動手學深度學習12 模型選擇,欠擬合和過擬合
小結模型選擇 欠擬合和過擬合 前幾節給予fashion mnist資料集的實驗中,我們評價了機器學習模型在訓練集合測試集上的表現。通常得到的結果都是訓練資料集上更準確時,它在測試集上表現不一定更好,這就涉及到了模型的選擇以及擬合程度的選擇。訓練誤差和泛化誤差 模型選擇 從嚴格意義上講,測試集只能在所...
深度學習(七) 過擬合欠擬合
整體 從標準正態分佈中隨機抽取資料組成張量,形狀由sizes定義 函式原型 torch.randn sizes,out none 應用 features torch.randn n train n test,1 生成200 1的張量在給定維度上對輸入的張量序列seq進行連線操作。0為行,1為列。對輸...
欠擬合與過擬合
在用機器學習搭建模型時,經常會碰到這樣一種情況,你的模型演算法在樣本資料中匹配的非常完美。但用新資料測試,發現模型結果和實際差距非常大。那麼恭喜你!你掉進了機器學習中常見的乙個大坑 過擬合。什麼是過擬合呢?機器學習本質上是通過建立資料模型,使其和現有資料相吻合,從而找到資料中內在的規律。如下面三張圖...