日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【神经网络】权重衰减(weight-decay)

發(fā)布時(shí)間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【神经网络】权重衰减(weight-decay) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

權(quán)重衰減(weight-decay)

  • 權(quán)重衰減
    • 方法
    • 高維線性回歸實(shí)驗(yàn)
    • 從零開始實(shí)現(xiàn)
      • 初始化模型參數(shù)
      • 定義L2L_2L2?范數(shù)懲罰項(xiàng)
      • 定義訓(xùn)練和測試
      • 觀察過擬合
      • 使用權(quán)重衰減
    • 簡潔實(shí)現(xiàn)
    • 小結(jié)

權(quán)重衰減

上一節(jié)中我們觀察了過擬合現(xiàn)象,即模型的訓(xùn)練誤差遠(yuǎn)小于它在測試集上的誤差。雖然增大訓(xùn)練數(shù)據(jù)集可能會(huì)減輕過擬合,但是獲取額外的訓(xùn)練數(shù)據(jù)往往代價(jià)高昂。本節(jié)介紹應(yīng)對過擬合問題的常用方法:權(quán)重衰減(weight decay)。

方法

權(quán)重衰減等價(jià)于 L2L_2L2? 范數(shù)正則化(regularization)。正則化通過為模型損失函數(shù)添加懲罰項(xiàng)使學(xué)出的模型參數(shù)值較小,是應(yīng)對過擬合的常用手段。我們先描述L2L_2L2?范數(shù)正則化,再解釋它為何又稱權(quán)重衰減

L2L_2L2?范數(shù)正則化在模型原損失函數(shù)基礎(chǔ)上添加L2L_2L2?范數(shù)懲罰項(xiàng),從而得到訓(xùn)練所需要最小化的函數(shù)。L2L_2L2?范數(shù)懲罰項(xiàng)指的是模型權(quán)重參數(shù)每個(gè)元素的平方和與一個(gè)正的常數(shù)的乘積。以3.1節(jié)(線性回歸)中的線性回歸損失函數(shù)

?(w1,w2,b)=1n∑i=1n12(x1(i)w1+x2(i)w2+b?y(i))2\ell(w_1, w_2, b) = \frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right)^2 ?(w1?,w2?,b)=n1?i=1n?21?(x1(i)?w1?+x2(i)?w2?+b?y(i))2

為例,其中w1,w2w_1, w_2w1?,w2?是權(quán)重參數(shù),bbb是偏差參數(shù),樣本iii的輸入為x1(i),x2(i)x_1^{(i)}, x_2^{(i)}x1(i)?,x2(i)?,標(biāo)簽為y(i)y^{(i)}y(i),樣本數(shù)為nnn。將權(quán)重參數(shù)用向量w=[w1,w2]\boldsymbol{w} = [w_1, w_2]w=[w1?,w2?]表示,帶有L2L_2L2?范數(shù)懲罰項(xiàng)的新?lián)p失函數(shù)為

?(w1,w2,b)+λ2n∥w∥2,\ell(w_1, w_2, b) + \frac{\lambda}{2n} \|\boldsymbol{w}\|^2,?(w1?,w2?,b)+2nλ?w2,

其中超參數(shù) λ>0\lambda > 0λ>0。當(dāng)權(quán)重參數(shù)均為0時(shí),懲罰項(xiàng)最小。當(dāng)λ\lambdaλ較大時(shí),懲罰項(xiàng)在損失函數(shù)中的比重較大,這通常會(huì)使學(xué)到的權(quán)重參數(shù)的元素較接近0。當(dāng)λ\lambdaλ設(shè)為0時(shí),懲罰項(xiàng)完全不起作用

上式中L2L_2L2?范數(shù)平方∥w∥2\|\boldsymbol{w}\|^2w2展開后得到w12+w22w_1^2 + w_2^2w12?+w22?。有了L2L_2L2?范數(shù)懲罰項(xiàng)后,在小批量隨機(jī)梯度下降中,我們將線性回歸一節(jié)中權(quán)重w1w_1w1?w2w_2w2?的迭代方式更改為:

w1←(1?ηλ∣B∣)w1?η∣B∣∑i∈Bx1(i)(x1(i)w1+x2(i)w2+b?y(i)),w2←(1?ηλ∣B∣)w2?η∣B∣∑i∈Bx2(i)(x1(i)w1+x2(i)w2+b?y(i)).\begin{aligned} w_1 &\leftarrow \left(1- \frac{\eta\lambda}{|\mathcal{B}|} \right)w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_1^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right),\\ w_2 &\leftarrow \left(1- \frac{\eta\lambda}{|\mathcal{B}|} \right)w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}x_2^{(i)} \left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right). \end{aligned} w1?w2??(1?Bηλ?)w1??Bη?iB?x1(i)?(x1(i)?w1?+x2(i)?w2?+b?y(i)),(1?Bηλ?)w2??Bη?iB?x2(i)?(x1(i)?w1?+x2(i)?w2?+b?y(i)).?

可見,L2L_2L2?范數(shù)正則化令權(quán)重w1w_1w1?w2w_2w2?先自乘小于1的數(shù),再減去不含懲罰項(xiàng)的梯度。

因此,L2L_2L2?范數(shù)正則化又叫權(quán)重衰減權(quán)重衰減通過懲罰絕對值較大的模型參數(shù)為需要學(xué)習(xí)的模型增加了限制,這可能對過擬合有效。實(shí)際場景中,我們有時(shí)也在懲罰項(xiàng)中添加偏差元素的平方和。

高維線性回歸實(shí)驗(yàn)

下面,我們以高維線性回歸為例來引入一個(gè)過擬合問題,并使用權(quán)重衰減來應(yīng)對過擬合。設(shè)數(shù)據(jù)樣本特征的維度為ppp。對于訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集中特征為x1,x2,…,xpx_1, x_2, \ldots, x_px1?,x2?,,xp?的任一樣本,我們使用如下的線性函數(shù)來生成該樣本的標(biāo)簽:

y=0.05+∑i=1p0.01xi+?y = 0.05 + \sum_{i = 1}^p 0.01x_i + \epsilon y=0.05+i=1p?0.01xi?+?

其中噪聲項(xiàng)?\epsilon?服從均值為0、標(biāo)準(zhǔn)差為0.01的正態(tài)分布。為了較容易地觀察過擬合,我們考慮高維線性回歸問題,如設(shè)維度p=200p=200p=200;同時(shí),我們特意把訓(xùn)練數(shù)據(jù)集的樣本數(shù)設(shè)低,如20。

%matplotlib inline import torch import torch.nn as nn import numpy as np import sys sys.path.append("..") import d2lzh_pytorch as d2ln_train, n_test, num_inputs = 20, 100, 200 true_w, true_b = torch.ones(num_inputs, 1) * 0.01, 0.05features = 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=labels.size()), dtype=torch.float) train_features, test_features = features[:n_train, :], features[n_train:, :] train_labels, test_labels = labels[:n_train], labels[n_train:]

從零開始實(shí)現(xiàn)

下面先介紹從零開始實(shí)現(xiàn)權(quán)重衰減的方法。我們通過在目標(biāo)函數(shù)后添加L2L_2L2?范數(shù)懲罰項(xiàng)來實(shí)現(xiàn)權(quán)重衰減。

初始化模型參數(shù)

首先,定義隨機(jī)初始化模型參數(shù)的函數(shù)。該函數(shù)為每個(gè)參數(shù)都附上梯度。

def init_params():w = torch.randn((num_inputs, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)return [w, b]

定義L2L_2L2?范數(shù)懲罰項(xiàng)

下面定義L2L_2L2?范數(shù)懲罰項(xiàng)。這里只懲罰模型的權(quán)重參數(shù)。

def l2_penalty(w):return (w**2).sum() / 2

定義訓(xùn)練和測試

下面定義如何在訓(xùn)練數(shù)據(jù)集測試數(shù)據(jù)集上分別訓(xùn)練和測試模型。

與前面幾節(jié)中不同的是,這里在計(jì)算最終的損失函數(shù)時(shí)添加了L2L_2L2?范數(shù)懲罰項(xiàng)。

batch_size, num_epochs, lr = 1, 100, 0.003 net, loss = d2l.linreg, d2l.squared_lossdataset = torch.utils.data.TensorDataset(train_features, train_labels) train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True)def fit_and_plot(lambd):w, b = init_params()train_ls, test_ls = [], []for _ in range(num_epochs):for X, y in train_iter:# 添加了L2范數(shù)懲罰項(xiàng)l = loss(net(X, w, b), y) + lambd * l2_penalty(w)l = l.sum()if w.grad is not None:w.grad.data.zero_()b.grad.data.zero_()l.backward()d2l.sgd([w, b], lr, batch_size)train_ls.append(loss(net(train_features, w, b), train_labels).mean().item())test_ls.append(loss(net(test_features, w, b), test_labels).mean().item())d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'loss',range(1, num_epochs + 1), test_ls, ['train', 'test'])print('L2 norm of w:', w.norm().item())

觀察過擬合

接下來,讓我們訓(xùn)練并測試高維線性回歸模型。當(dāng)lambd設(shè)為0時(shí),我們沒有使用權(quán)重衰減。結(jié)果訓(xùn)練誤差遠(yuǎn)小于測試集上的誤差。

這是典型的過擬合現(xiàn)象

fit_and_plot(lambd=0)

輸出:

L2 norm of w: 15.114808082580566

使用權(quán)重衰減

下面我們使用權(quán)重衰減。可以看出,訓(xùn)練誤差雖然有所提高,但測試集上的誤差有所下降。過擬合現(xiàn)象得到一定程度的緩解

另外,權(quán)重參數(shù)L2L_2L2?范數(shù)比不使用權(quán)重衰減時(shí)的更小,此時(shí)的權(quán)重參數(shù)更接近0。

fit_and_plot(lambd=3)

輸出:

L2 norm of w: 0.035220853984355927

簡潔實(shí)現(xiàn)

這里我們直接在構(gòu)造優(yōu)化器實(shí)例時(shí)通過weight_decay參數(shù)來指定權(quán)重衰減超參數(shù)。

默認(rèn)下,PyTorch會(huì)對權(quán)重偏差同時(shí)衰減。我們可以分別對權(quán)重偏差構(gòu)造優(yōu)化器實(shí)例,從而只對權(quán)重衰減

def fit_and_plot_pytorch(wd):# 對權(quán)重參數(shù)衰減。權(quán)重名稱一般是以weight結(jié)尾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) # 對權(quán)重參數(shù)衰減optimizer_b = torch.optim.SGD(params=[net.bias], lr=lr) # 不對偏差參數(shù)衰減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()# 對兩個(gè)optimizer實(shí)例分別調(diào)用step函數(shù),從而分別更新權(quán)重和偏差optimizer_w.step()optimizer_b.step()train_ls.append(loss(net(train_features), train_labels).mean().item())test_ls.append(loss(net(test_features), test_labels).mean().item())d2l.semilogy(range(1, num_epochs + 1), train_ls, 'epochs', 'loss',range(1, num_epochs + 1), test_ls, ['train', 'test'])print('L2 norm of w:', net.weight.data.norm().item())

與從零開始實(shí)現(xiàn)權(quán)重衰減的實(shí)驗(yàn)現(xiàn)象類似,使用權(quán)重衰減可以在一定程度上緩解過擬合問題

fit_and_plot_pytorch(0)

輸出:

L2 norm of w: 12.86785888671875

fit_and_plot_pytorch(3)

輸出:

L2 norm of w: 0.09631537646055222

小結(jié)

  • 正則化通過為模型損失函數(shù)添加懲罰項(xiàng)使學(xué)出的模型參數(shù)值較小,是應(yīng)對過擬合的常用手段。
  • 權(quán)重衰減等價(jià)于L2L_2L2?范數(shù)正則化,通常會(huì)使學(xué)到的權(quán)重參數(shù)的元素較接近0。
  • 權(quán)重衰減可以通過優(yōu)化器中的weight_decay超參數(shù)來指定。
  • 可以定義多個(gè)優(yōu)化器實(shí)例對不同的模型參數(shù)使用不同的迭代方法。

注:本節(jié)除了代碼之外與原書基本相同,原書傳送門

本人出于學(xué)習(xí)的目的,引用本書內(nèi)容,非商業(yè)用途,推薦大家閱讀此書,一起學(xué)習(xí)!!!


加油!

感謝!

努力!

總結(jié)

以上是生活随笔為你收集整理的【神经网络】权重衰减(weight-decay)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。