實時爬蟲網(wǎng)站是怎么做的蘇州網(wǎng)站seo服務(wù)
4.5.1 范數(shù)與權(quán)重衰減
整節(jié)理論,詳見書本。
4.5.2 高維線性回歸
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
# 生成一些數(shù)據(jù),為了使過擬合效果更明顯,將維數(shù)增加到 200 并使用一個只包含 20 個樣本的小訓(xùn)練集。
n_train, n_test, num_inputs, batch_size = 20, 100, 200, 5
true_w, true_b = torch.ones((num_inputs, 1)) * 0.01, 0.05 # 設(shè)置真實參數(shù)
train_data = d2l.synthetic_data(true_w, true_b, n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)
4.5.3 從零開始實現(xiàn)
- 初始化模型參數(shù)
def init_params():w = torch.normal(0, 1, size=(num_inputs, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)return [w, b]
- 定義 L 2 L_2 L2? 范數(shù)懲罰
def l2_penalty(w):return torch.sum(w.pow(2)) / 2
-
定義訓(xùn)練代碼實現(xiàn)
損失函數(shù)直接通過 d2l 包導(dǎo)入,損失包含了懲罰項。
def train(lambd):w, b = init_params()net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_lossnum_epochs, lr = 100, 0.003animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',xlim=[5, num_epochs], legend=['train', 'test'])for epoch in range(num_epochs):for X, y in train_iter:# 增加了L2范數(shù)懲罰項,# 廣播機制使l2_penalty(w)成為一個長度為batch_size的向量l = loss(net(X), y) + lambd * l2_penalty(w)l.sum().backward()d2l.sgd([w, b], lr, batch_size)if (epoch + 1) % 5 == 0:animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范數(shù)是:', torch.norm(w).item())
- 忽略正則化直接訓(xùn)練
train(lambd=0)
w的L2范數(shù)是: 14.042692184448242
- 使用權(quán)重衰減
train(lambd=3)
w的L2范數(shù)是: 0.35160931944847107
4.5.4 簡潔實現(xiàn)
def train_concise(wd):net = nn.Sequential(nn.Linear(num_inputs, 1))for param in net.parameters():param.data.normal_()loss = nn.MSELoss(reduction='none')num_epochs, lr = 100, 0.003trainer = torch.optim.SGD([{"params":net[0].weight,'weight_decay': wd}, # PyTorch默認同時衰減權(quán)重和偏置,此處使用 weight_decay指定僅權(quán)重衰減{"params":net[0].bias}], lr=lr)animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',xlim=[5, num_epochs], legend=['train', 'test'])for epoch in range(num_epochs):for X, y in train_iter:trainer.zero_grad()l = loss(net(X), y)l.mean().backward()trainer.step()if (epoch + 1) % 5 == 0:animator.add(epoch + 1,(d2l.evaluate_loss(net, train_iter, loss),d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范數(shù):', net[0].weight.norm().item())
train_concise(0)
w的L2范數(shù): 12.836501121520996
train_concise(3)
w的L2范數(shù): 0.3978956639766693
練習(xí)
(1)在本節(jié)的估計問題中使用 λ \lambda λ 的值進行實驗。繪制訓(xùn)練精度和測試精度有關(guān) λ \lambda λ 的函數(shù)圖,可以觀察到什么?
隨著 λ \lambda λ 的增大可以改善過擬合的現(xiàn)象,但是 λ \lambda λ 過大也會影響收斂。
for i in (0, 2, 8, 32, 128, 256):train_concise(i)
w的L2范數(shù): 0.008308843709528446
(2)使用驗證集來找最優(yōu)值 λ \lambda λ。它真的是最優(yōu)值嗎?
不至于說是最優(yōu)的,畢竟再怎么樣驗證集也和訓(xùn)練集分布有些許區(qū)別,只能說是比較接近最優(yōu)值。
(3)如果我們使用 ∑ i ∣ w i ∣ \sum_i|w_i| ∑i?∣wi?∣ 作為我們選擇的懲罰( L 1 L_1 L1?正則化),那么更新的公式會是什么樣子?
如果使用 L 1 L_1 L1? 正則化則最小化預(yù)測損失和懲罰項之和為:
L R ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w T x ( i ) + b ? y ( i ) ) 2 + λ ∑ i = 1 n ∣ w i ∣ LR(\boldsymbol{w},b)=\frac{1}{n}\sum_{i=1}^n\frac{1}{2}(\boldsymbol{w}^T\boldsymbol{x}^{(i)}+b-y^{(i)})^2+\lambda\sum^n_{i=1}|w_i| LR(w,b)=n1?i=1∑n?21?(wTx(i)+b?y(i))2+λi=1∑n?∣wi?∣
L 1 L_1 L1? 范數(shù)有求導(dǎo)問題,在此,規(guī)定在不可導(dǎo)點 x = 0 x=0 x=0 的導(dǎo)數(shù)為 0,則:
w ← w ? η ? L R ( w , b ) ? w = w ? η ∣ B ∣ ∑ i ∈ B x ( i ) ( w T x ( i ) + b ? y ( i ) ) ? λ η sign ( w ) \boldsymbol{w}\gets\boldsymbol{w}-\eta\ \frac{\partial LR(\boldsymbol{w},b)}{\partial\boldsymbol{w}}=\boldsymbol{w}-\frac{\eta}{|B|}\sum_{i\in B}\boldsymbol{x}^{(i)}(\boldsymbol{w}^T\boldsymbol{x}^{(i)}+b-y^{(i)})-\lambda\ \eta\ \text{sign}(\boldsymbol{w}) w←w?η??w?LR(w,b)?=w?∣B∣η?i∈B∑?x(i)(wTx(i)+b?y(i))?λ?η?sign(w)
(4)我們知道 ∣ ∣ w ∣ ∣ 2 = w T w ||\boldsymbol{w}||^2=\boldsymbol{w}^T\boldsymbol{w} ∣∣w∣∣2=wTw。能找到類似的矩陣方程嗎?(見 2.3.10 節(jié)中的弗羅貝尼烏斯范數(shù))
弗羅貝尼烏斯范數(shù)時矩陣元素平方和的平方根:
∣ ∣ X ∣ ∣ F = ∑ i = 1 m ∑ j = 1 n x i j 2 ||\boldsymbol{X}||_F=\sqrt{\sum^m_{i=1}\sum^n_{j=1}x^2_{ij}} ∣∣X∣∣F?=i=1∑m?j=1∑n?xij2??
和L2范數(shù)的平方相似,弗羅貝尼烏斯范數(shù)的平方:
∣ ∣ X ∣ ∣ F 2 = X T X ||\boldsymbol{X}||_F^2=\boldsymbol{X}^T\boldsymbol{X} ∣∣X∣∣F2?=XTX
(5)回顧訓(xùn)練誤差和泛化誤差之間的關(guān)系。除了權(quán)重衰減、增加訓(xùn)練數(shù)據(jù)、使用適當(dāng)復(fù)雜度的模型,還有其他方法來處理過擬合嗎?
Dropout暫退法、多種模型組合等
(6)在貝葉斯統(tǒng)計中,我們使用先驗和似然的乘積,通過公式 P ( w ∣ x ) ∝ P ( x ∣ w ) P ( w ) P(w|x)\propto P(x|w)P(w) P(w∣x)∝P(x∣w)P(w) 得到后驗。如何得到正則化的 P ( w ) P(w) P(w)?
以下參見王木頭大佬的視頻《貝葉斯解釋“L1和L2正則化”,本質(zhì)上是最大后驗估計。如何深入理解貝葉斯公式?》
使用最大后驗估計,令:
w = arg ? max ? w P ( w ∣ x ) = arg ? max ? w P ( x ∣ w ) P ( x ) ? P ( w ) = arg ? max ? w P ( x ∣ w ) ? P ( w ) = arg ? max ? w log ? ( P ( x ∣ w ) ? P ( w ) ) = arg ? max ? w ( log ? P ( x ∣ w ) + log ? P ( w ) ) \begin{align} w&=\mathop{\arg\max}\limits_{w}P(w|x)\\ &=\mathop{\arg\max}\limits_{w}\frac{P(x|w)}{P(x)}\cdot P(w)\\ &=\mathop{\arg\max}\limits_{w}P(x|w)\cdot P(w)\\ &=\mathop{\arg\max}\limits_{w}\log(P(x|w)\cdot P(w))\\ &=\mathop{\arg\max}\limits_{w}(\log P(x|w)+\log P(w))\\ \end{align} w?=wargmax?P(w∣x)=wargmax?P(x)P(x∣w)??P(w)=wargmax?P(x∣w)?P(w)=wargmax?log(P(x∣w)?P(w))=wargmax?(logP(x∣w)+logP(w))??
其中:
- ( 2 ) ? ( 3 ) (2)\Rightarrow(3) (2)?(3) 是由于分母 P ( x ) P(x) P(x) 是與 w w w 無關(guān)的常數(shù),故可以忽略。
- ( 3 ) ? ( 4 ) (3)\Rightarrow(4) (3)?(4) 是由于習(xí)慣上添加 log ? \log log 運算。
P ( w ) P(w) P(w) 作為先驗概率可以任取
- 如果取高斯分布 w ~ N ( 0 , σ 2 ) w\sim\mathrm{N}(0,\sigma^2) w~N(0,σ2),則出現(xiàn) L 2 L_2 L2? 正則化:
log ? P ( w ) = log ? ∏ i 1 σ 2 π e ? ( w i ? 0 ) 2 2 σ 2 = ? 1 2 σ 2 ∑ i w i 2 + C \begin{align} \log P(w)&=\log\prod_i\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(w_i-0)^2}{2\sigma^2}}\\ &=-\frac{1}{2\sigma^2}\sum_iw_i^2+C \end{align} logP(w)?=logi∏?σ2π?1?e?2σ2(wi??0)2?=?2σ21?i∑?wi2?+C??
- 如果取拉普拉斯分布 w ~ L a p l a c e ( 0 , b ) w\sim\mathrm{Laplace}(0,b) w~Laplace(0,b),則出現(xiàn) L 1 L_1 L1? 正則化:
log ? P ( w ) = log ? ∏ i 1 2 b e ? ∣ w i ? 0 ∣ b = ? 1 b ∑ i ∣ w i ∣ + C \begin{align} \log P(w)&=\log\prod_i\frac{1}{2b}e^{-\frac{|w_i-0|}}\\ &=-\frac{1}\sum_i|w_i|+C \end{align} logP(w)?=logi∏?2b1?e?b∣wi??0∣?=?b1?i∑?∣wi?∣+C??
太奇妙了!