【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减

【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减

    • 正则化与偏差—方差分解
          • `正则化Regularization定义`
          • `什么是方差?`
          • `正则化Regularization`
    • Pytorch中的L2正则项—weight decay

本节的主要内容分为2大部分:(1)正则化与偏差—方差分解:什么是正则化,正则化与偏差-方差分解之间的关系?(2)Pytorch中的L2正则项—weight decay。

正则化与偏差—方差分解

正则化Regularization定义

所谓正则化就是一系列用来减少方差的策略、方法。

什么是方差?

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

说明:
【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第1张图片

从上图可以看出,红色线是验证集的Loss曲线,橙色线为训练集的Loss曲线,通常训练是希望Loss最终可以达到0这一位置。观察一下两条曲线相对于“0”这一完美位置还相差什么?

(1)训练集曲线与0之间的差异:主要是两部分组成,噪声+偏差。由于噪声是不可抗因素,通常,不考虑噪声,因此,把训练集的误差直接认为是偏差,也就是刻画学习算法当前的拟合能力。
(2)验证集曲线与0之间的差异:主要由3部分组成,噪声+偏差+方差,多出来的方差在于:当前模型在更换数据集为验证集后达到新的Loss,表现出了验证集与训练集之间的差异,刻画了数据扰动造成的影响。

而正则化regularization就是来减小方差的,减小数据扰动的影响,使得验证集、训练集在模型上均达到良好的效果。

【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第2张图片
图1 过拟合现象

图1中,红色点为测试集,蓝色点为验证集。如图所示的红色曲线模型经过一定训练后能够很好拟合所有训练集,所有的蓝色点都拟合到了,但是却在测试集上表现很差。这就是一个典型的“高方差、过拟合”现象;通常说1个模型过拟合现象,就是指该模型在训练集上表现非常好、测试集上表现非常差,其所对应的特征就是高方差。
正则化策略就是用来降低方差,以解决过拟合问题。

正则化Regularization

【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第3张图片

如果加上L1、L2,模型会产生什么变化呢?

L1正则化项

【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第4张图片
L2正则化项
【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第5张图片

L1、L2通常使得参数值比较小,从而约束模型的复杂度。

Pytorch中的L2正则项—weight decay

理论
L2 Regularization = weight decay (权值衰减)
【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第6张图片

实验
在回归模型中,使用随机梯度下降法分别对两个带有weight decay和不带weight decay网络模型进行迭代训练

-----代码来自余老师-----
# ================ step 3/5 优化器 ====================
optim_normal = torch.optim.SGD(net_normal.parameters(), lr=lr_init, momentum=0.9)
optim_wdecay = torch.optim.SGD(net_weight_decay.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)


# =============== step 5/5 迭代训练 ==============

writer = SummaryWriter(comment='_test_tensorboard', filename_suffix="12345678")
for epoch in range(max_iter):

    # forward
    pred_normal, pred_wdecay = net_normal(train_x), net_weight_decay(train_x)
    loss_normal, loss_wdecay = loss_func(pred_normal, train_y), loss_func(pred_wdecay, train_y)

    optim_normal.zero_grad()
    optim_wdecay.zero_grad()

    loss_normal.backward()
    loss_wdecay.backward()

结果
【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第7张图片

【学习笔记】Pytorch深度学习—正则化之weight decay权值衰减_第8张图片

你可能感兴趣的:(深度学习)