[動手學(xué)深度學(xué)習(xí)-PyTorch版]-3.12深度學(xué)習(xí)基礎(chǔ)-權(quán)重衰減

3.12 權(quán)重衰減

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

3.12.1 方法

image.png

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

image.png
%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=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:]

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

image.png

3.12.3.1 初始化模型參數(shù)

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

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

3.12.3.2 定義L2范數(shù)懲罰項(xiàng)

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

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

下面定義如何在訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集上分別訓(xùn)練和測試模型船庇。與前面幾節(jié)中不同的是,這里在計(jì)算最終的損失函數(shù)時添加了L2范數(shù)懲罰項(xiàng)侣监。

batch_size, num_epochs, lr = 1, 100, 0.003
net, loss = d2l.linreg, d2l.squared_loss

dataset = 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())

3.12.3.4 觀察過擬合

接下來鸭轮,讓我們訓(xùn)練并測試高維線性回歸模型。當(dāng)lambd設(shè)為0時橄霉,我們沒有使用權(quán)重衰減窃爷。結(jié)果訓(xùn)練誤差遠(yuǎn)小于測試集上的誤差。這是典型的過擬合現(xiàn)象姓蜂。

fit_and_plot(lambd=0)

輸出:

L2 norm of w: 15.114808082580566
image

3.12.3.5 使用權(quán)重衰減

下面我們使用權(quán)重衰減按厘。可以看出钱慢,訓(xùn)練誤差雖然有所提高逮京,但測試集上的誤差有所下降。過擬合現(xiàn)象得到一定程度的緩解束莫。另外懒棉,權(quán)重參數(shù)的
L2范數(shù)比不使用權(quán)重衰減時的更小,此時的權(quán)重參數(shù)更接近0览绿。

fit_and_plot(lambd=3)

輸出:

L2 norm of w: 0.035220853984355927
image

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

這里我們直接在構(gòu)造優(yōu)化器實(shí)例時通過weight_decay參數(shù)來指定權(quán)重衰減超參數(shù)策严。默認(rèn)下,PyTorch會對權(quán)重和偏差同時衰減饿敲。我們可以分別對權(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()

            # 對兩個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
image
fit_and_plot_pytorch(3)

輸出:

L2 norm of w: 0.09631537646055222
image

小結(jié)

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壶栋,隨后出現(xiàn)的幾起案子辰如,更是在濱河造成了極大的恐慌,老刑警劉巖贵试,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉兜,死亡現(xiàn)場離奇詭異凯正,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豌蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門廊散,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梧疲,你說我怎么就攤上這事允睹。” “怎么了幌氮?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵缭受,是天一觀的道長。 經(jīng)常有香客問我该互,道長米者,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任宇智,我火速辦了婚禮蔓搞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘普筹。我一直安慰自己败明,他們只是感情好隘马,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布太防。 她就那樣靜靜地躺著,像睡著了一般酸员。 火紅的嫁衣襯著肌膚如雪蜒车。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天幔嗦,我揣著相機(jī)與錄音酿愧,去河邊找鬼。 笑死邀泉,一個胖子當(dāng)著我的面吹牛嬉挡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汇恤,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庞钢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了因谎?” 一聲冷哼從身側(cè)響起基括,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎财岔,沒想到半個月后风皿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體河爹,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年桐款,在試婚紗的時候發(fā)現(xiàn)自己被綠了咸这。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲁僚,死狀恐怖炊苫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冰沙,我是刑警寧澤侨艾,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拓挥,受9級特大地震影響唠梨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侥啤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一当叭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盖灸,春花似錦蚁鳖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徙垫,卻和暖如春讥裤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姻报。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工己英, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吴旋。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓损肛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荣瑟。 傳聞我的和親對象是個殘疾皇子治拿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容