Pytorch学习笔记十六:正则化

一、weight decay(权值衰减)

正则化(regularization):减小方差的策略。
那什么是方差呢?

误差 = 偏差 + 方差 + 噪声
偏差:度量了学习算法的期望预测与真实结果之间的偏离程度,即刻画了学习算法的拟合能力;
方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;
噪声:表达了当前任务上任何学习算法所能达到的期望泛化误差的下届。

可从下图来理解:
在这里插入图片描述
从上图中可看出方差就是描述训练集与验证集之间的差异,偏差是描述训练集和真实集之间的差异,刻画学习算法的拟合能力。正则化(regularization)就是解决方差过大的问题。下面通过一个线性回归的例子来加深理解一下方差和偏差的概念:
在这里插入图片描述
上图中蓝色的点是训练集,红色的点是测试集,假设训练的模型可以很好的拟合训练集的数据,而对测试集的数据拟合的不是很好,这就出现训练集和测试集相差较大,也就是高方差,通常将这种现象称为过拟合。引入正则化的目的就是降低方差,防止出现过拟合的现象。下面就来看一下正则化的方法。

L1和L2正则化

正则化的思想就是在目标函数中加入正则项:
在这里插入图片描述
通常正则项是用来约束模型的复杂度的,有L1和L2正则项,表达式如下:
在这里插入图片描述
加入正则项就是希望代价函数小的同时Wi的值也小,这样每个样本的权重都很小,这样模型就不太会关注某种类型的样本,模型的参数也不会太复杂,有利于缓解过拟合现象。
在这里插入图片描述
上图的左侧是L1正则项,彩色的圆圈是Cost的等高线,也就是在同一条线上Cost的值是相同的,不如在A、B、C三点的Cost的值是相同的,但L1正则项的值是不同的,B点的正则项的值是最小的,也就是说B的目标函数是最小的,所以在L1正则项下找最优解,既能损失最小,又要保证权值最小,那么这个最优解在做坐标轴上,也就是上图中的B点,这时W1的值为0,有参数的权值为0。也就是说L1正则化会产生一些稀疏的解。

上图的右侧是L2正则化,同样在D、E、F三点的Cost值是相同的,但是E点的L2正则项的值是最小的,所以E的目标函数也是最小的。与L1正则化相比,L2正则化不会出现权值为0的情况,因此每一个参数的权值都不会是0.

【总结:L1和L2正则化的特点】
L1 正则化的特点:

  • 不容易计算, 在零点连续但不可导, 需要分段求导
  • L1 模型可以将 一些权值缩小到零(稀疏)
  • 执行隐式变量选择。这意味着一些变量值对结果的影响降为 0, 就像删除它们一样 其中一些预测因子对应较大的权值, 而其余的(几乎归零)
  • 由于它可以提供稀疏的解决方案, 因此通常是建模特征数量巨大时的首选模型
  • 它任意选择高度相关特征中的任何一个,并将其余特征对应的系数减少到0
  • L1 范数对于异常值更具提抗力

L2 正则化的特点:

  • 容易计算, 可导, 适合基于梯度的方法
  • 将一些权值缩小到接近 0
  • 相关的预测特征对应的系数值相似
  • 当特征数量巨大时, 计算量会比较大
  • 对于有相关特征存在的情况,它会包含所有这些相关的特征, 但是相关特征的权值分布取决于相关性。
  • 对异常值非常敏感
  • 相对于 L1 正则会更加准确

下面来通过代码学习一下pytorch中的L2正则项,L2 正则项又叫做 weight decay (权值衰减)。那为什么叫权值衰减?是如何衰减的呢?
参数的更新公式: w i + 1 = w i − ∂ L o s s ∂ w i w_{i+1} = w_{i} -\frac{\partial Loss }{\partial w_{i} } wi+1=wiwiLoss
在Obj 加一个L2正则项 O b j = L o s s + λ 2 ∗ ∑ i N w i 2 Obj = Loss + \frac{\lambda }{2} * \sum_{i}^{N}w _{i}^{2} Obj=Loss+2λiNwi2 ,那么参数的更新方式为:
在这里插入图片描述
λ \lambda λ的取值是 0-1 的,那么就是说每一次迭代之后,这个参数 Wi 本身也会发生一个衰减。也就是加上 L2 正则项与没有加 L2 正则项进行一个对比的话,加入 L2 正则项, 这里的 Wi 就会发生数值上的一个衰减。故这就是这个 L2 正则项称为权值衰减的原因。

# ============================ step 1/5 数据 ============================
def gen_data(num_data=10, x_range=(-1, 1)):

    w = 1.5
    train_x = torch.linspace(*x_range, num_data).unsqueeze_(1)
    train_y = w*train_x + torch.normal(0, 0.5, size=train_x.size())
    test_x = torch.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值