Pytorch4.5权重衰减
正则化
预备知识
1.范数
距离的定义是⼀个宽泛的概念。只要是满⾜①⾮负②⾃反③三⾓不等式就可以称之为距离。范数是⼀种强化了的距离概念,它在定义上⽐距离多了⼀条数乘的运算法则。我们可以将范数当成是⼀种距离来理解。
(1)L-P 范数
||L ||p =(n ∑i =1|x p i |)1p x =(x 1,x 2,x 3,⋯,x n )
(2)据此我们很容易得到 : L-1范数||L ||1=
(n ∑i =1|x 1i |)11x =(x 1,x 2,x 3,⋯,x n )||L ||1=n
∑i =1|x i |(3)L-2范数||L ||2=(n ∑i =1|x 2i |)1
2x =(x 1,x 2,x 3,⋯,x n )||L ||2=2n ∑i =1x 2i
权重衰减
在训练参数化机器学习模型时, 权重衰减(weight decay )是最⼴泛使⽤的正则化的技术之⼀, 它通常也被称为 L 2 正则化。我们在上⼀篇⽂章中有讲到过,参数范围越⼤,越容易使得模型的函数更加尖锐,容易过拟合,为了使我们的函数更加平滑,具有更好的泛化性能,我们要引⼊⼀个正则化。 具体原理如下:
L (w ,b )=1n n ∑i =11
2w ⊤x (i )+b −y (i )2L (w ,b )+λ2‖w ‖2
其中 L (w ,b ) 是我们的损失函数 λ2‖w ‖2 是我们的正则化项,λ=0 时相当于没有引⼊,λ>0 时正则化正则化项求导 λw  ,恰好是我们的权重张量。我们仅考虑惩罚项,优化算法在训练的每⼀步衰减权重。 与特征选择相⽐,权重衰减为我们提供了⼀种连续的机制来调整函数的复杂度。 较⼩的 λ 值对应较少约束的 w  , ⽽较⼤的 λ 值对 w  的约束更⼤。
w ←(1−ηλ)w −η
||∑i ∈x (i )w ⊤x (i )+b −y (i ).
提⽰:我们⼀般不会对偏置项进⾏正则化,在于说,求导之后⼏乎都是⼀个常数。简单实现下权重衰减
step1.库函数
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
step2.初始化参数
我们选择标签是关于输⼊的线性函数。 标签同时被均值为0,标准差为0.01⾼斯噪声破坏。 为了使过拟合的效果更加明显,我们可以将问题的维数增加到 d =200 , 并使⽤⼀个只包含20个样本的⼩训练集。
n_train, n_test, num_inputs, batch_size = 20,100,200,5
true_w, true_b = s(size=(num_inputs,1))*0.01 ,0.05
train_data = d2l.synthetic_data(true_w,true_b,n_train) # type(train_data) tuple
train_iter = d2l.load_array(train_data,batch_size)  # torch.utils.data.dataloader.DataLoader
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False) # Q1:为什么测试数据集不⽤随机化样本
√()()
def init_params():
w = al(0, 1, size=(num_inputs, 1), requires_grad=True)
b = s(1, requires_grad=True)
return [w, b]
step3.定义正则项和训练函数
def l2_penalty(w):
return torch.sum(w.pow(2)) / 2
def train(lambd):
w, b = init_params()
net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss
num_epochs, lr = 100, 0.003
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:
# 增加了L2范数惩罚项,
# ⼴播机制使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范数是:', (w).item())
# 忽略正则化
train(lambd=0)
w的L2范数是:
13.449113845825195
#正则化的lambda = 1
torch(1)
w的L2范数是:
4.180489540100098
正则化定义
1. 在本节的估计问题中使⽤λ的值进⾏实验。绘制训练和测试精度关于λ的函数。你观察到了什么?
2. 使⽤验证集来到最佳值λ。它真的是最优值吗?这有关系吗?
3. 如果我们使⽤ ∑i|w i| 作为我们选择的惩罚(L1正则化),那么更新⽅程会是什么样⼦?
4. 我们知道w∥2=w⊤w。你能到类似的矩阵⽅程吗(见 2.3.10节中的Frobenius范数)?
5. 回顾训练误差和泛化误差之间的关系。除了权重衰减、增加训练数据、使⽤适当复杂度的模型之外,你还能想出其他什么⽅法来处理
过拟合?
6. 在贝叶斯统计中,我们使⽤先验和似然的乘积,通过公式P(w∣x)∝P(x∣w)P(w) 得到后验。如何得到带正则化的P(w) ?Processing math: 100%

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。