赞
踩
为了应对过拟合问题的常用方法:权重衰减法(weight decay)
权重衰减等价于L2范数正则化(regularization)
解释下我自己认为书本里面没有解释清楚的东西:
我们知道监督学习就是
其中第一项是为了模型尽可能拟合训练样本。第二项是规则化项也称为正则项或惩罚项,以增大训练误差为代价来减少测试误差的所有策略我们都可以称作为正则化。
①L2范数是什么?
我们知道L2范数是向量各元素的平方和然后求平方根。
我们让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。对于数据不够重要的权重抑制的大一些,对数据分布越起作用的权重抑制越小
②L2范数的优势
从学习理论的角度来说防止过拟合,提高数据的泛化能力。从优化计算的角度来说L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题。(condition number是一个矩阵(或者它所描述的线性系统)的稳定性或者敏感度的度量,如果远大于1,那么它就是ill-conditioned的,也就是输出对输入过于敏感)
③L2范数是如何抑制过拟合的?
我们知道xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,我们可以通过抑制他们的权重从而减少他们对于输出结果的影响,最后达到抑制过拟合的目的。
我们使用L2范数==》抑制模型中产生过拟合的参数==》防止了过拟合
④λ强凸函数 λ-strongly convex
convex 性质是指函数曲线位于该点处的切线,也就是线性近似之上,而 strongly convex 则进一步要求位于该处的一个二次函数上方
对于左边的图,当wt与最优解w较近的时候,f(wt)和f(w)相差较远,这样我们才可以在比较少的迭代次数内达到w*。对于右边的图,当wt与最优解w很远的时候,f(wt)和f(w)相差就已经较近,这样∂f/∂w很小,w就会缓慢变化移向w*。
那么如何获得强凸呢?最简单的方法就是加入(α/2)*||w||2。
例如在“线性回归”一节中的线性损失函数
加入L2惩罚项后的新损失函数为:
权重的迭代方式更改为:
L2范数正则化令权重w1和w2先自乘小于1的数,再减去不含惩罚项的梯度。因此,L2范数正则化又叫权重衰减。
使用线性回归函数来生成标签
其中噪声项ϵϵ服从均值为0、标准差为0.01的正态分布。为了较容易地观察过拟合,我们考虑高维线性回归问题,如设维度p=200;同时,我们特意把训练数据集的样本数设低,如20。
过程大致如下:
①确定训练样本数为20,测试样本数为100,输入维度为200,真实的权重和真实的偏差
②特征features为120×200的正态分布,标签labels为权重true_w*features+true_b+噪声项
③对于数据进行分割,成训练和测试数据
初始化模型参数:
定义函数init_params():
返回的是偏差为1,并且形状为num_inputs×1的正态分布的w和只有一个元素值为0的矩阵b
例如:
定义L2范数惩罚项:
定义函数 l2_penalty(w):
返回的值是对矩阵w中每一个元素平方后求和再÷2得到的。
定义训练和测试:
定义函数fit_and_plot(labmd)
回顾之前定义的函数:
def linreg(X, w, b): # 本函数已保存在d2lzh包中方便以后使用
return nd.dot(X, w) + b//定义线性回归函数
def squared_loss(y_hat, y): # 本函数已保存在d2lzh包中方便以后使用
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2//定义损失函数
过程和前几节基本一致,采用的是从零开始而不是简洁实现,与前面几节中不同的是,这里在计算最终的损失函数时添加了L2范数惩罚项。
观察过拟合:
令labmd=0,也就是没有增加惩罚项:
使用权重衰减:
可以分别对权重和偏差构造Trainer实例,从而只对权重衰减。
定义函数fit_and_plot_gluon(wd)
对比一下从零开始和简洁实现的方法可以发现,主要是从零开始是自定义了net函数,loss函数,sgd函数,而简洁实现通过gluon中的net,loss以及Trainer实例进行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。