過擬合現象,即模型的訓練誤差遠⼩於它在測試集上的誤差。雖然增⼤訓練數據集可能會減輕過擬合,但是獲取額外的訓練數據往往代價⾼昂。本節介紹應對過擬合問題的常⽤⽅法:權重衰減(weight decay)。
一、方法
權重衰減等價於 范數正則化(regularization)。正則化通過為模型損失函數添加懲罰項使學出的模型參數值較⼩,是應對過擬合的常⽤⼿段。我們先描述 范數正則化,再解釋它為何⼜稱權重衰減。
范數正則化在模型原損失函數基礎上添加 范數懲罰項,從⽽得到訓練所需要最⼩化的函數。 范數懲罰項指的是模型權重參數每個元素的平⽅和與⼀個正的常數的乘積。以3.1節(線性回歸)中的線性回歸損失函數:
為例,其中 \(w_1,W_2\) 是權重參數, \(b\) 是偏差參數,樣本 \(x_1^{i},x_2^{i}\) 的輸⼊為 ,標簽為 \(y^{i}\),樣本數為 \(n\) 。將權重參數⽤向量 \(w = [w1,w2]\) 表示,帶有 \(L_2\) 范數懲罰項的新損失函數為
二、實現
( 一 )導包
%matplotlib inline
import torch
import torch.nn as nn
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
n_train, n_test, num_inputs = 20,100,200
true_w, true_b = torch.ones(num_inputs,1) * 0.01,0.05
features = torch.randn((n_train + n_test, num_inputs))
labels = torch.matmul(features,true_w) + true_b
labels += torch.tensor(np.random.normal(0,0.01,size=lables.size()),dtype=torch.float)
train_features, tensorst_features = featuresatures[:n_train,:],features[n_train:, :]
train_labels, test_labels = labels[:n_train],labels[n_train:]
( 二 )定義隨機初始化模型參數的函數。該函數為每個參數都附上梯度。