定义
首先要确定的两个概念是Underfit(欠拟合)和Overfit(过拟合),也被称为high bias和high viarance。在表征线性回归模型的下面三张图中,左图使用一条直线来做预测模型,很明显无论如何调整起始点和斜率,该直线都不可能很好的拟合给定的五个训练样本,更不要说给出的新数据;右图使用了高阶的多项式,过于完美的拟合了训练样本,当给出新数据时,很可能会产生较大误差;而中间的模型则刚刚好,既较完美的拟合训练数据,又不过于复杂,基本上描绘清晰了在预测房屋价格时Size和Prize的关系。
对于逻辑回归,同样存在此问题,如下图:
机器学习中的泛化:
在机器学习中,我们描述从训练数据学习目标函数的学习过程成为归纳性的学习。
泛化:是指机器学习模型学到的概念在遇到新的数据时表现的好坏(预测准确度等)。
拟合:是指模型逼近目标函数的远近程度。
过拟合(High Viarance)
模型在训练集(training set)上表现的很好,但是在测试集上效果差,也就是说在已知的数据集合中非常好,但是在添加一些新的数据进来训练效果就会差很多,造成这样的原因是考虑影响因素太多,超出自变量的维度过于多了。
欠拟合(High Bias)
模型拟合不够,在训练集(training set)上表现的效果就很差差,没有充分的学习到数据的特征信息,预测的准确度低。
误差(Error)
Error = Viarance + Bias
Bias 反映的是:模型在样本上的输出值与真实值之间的误差,即模型的精确度。
Variance反映的是:模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。
如上图所示:
偏差值的是模型的输出值与红色中心的距离;方差指的是模型的每一个输出结果与期望之间的距离。就像我们射箭,低偏差指的是我们瞄准的点与红色中心的距离很近,而高偏差指的是我们瞄准的点与红色中心的距离很远。低方差是指当我们瞄准一个点后,射出的箭中靶子的位置与我们瞄准的点的位置距离比较近;高方差是指当我们瞄准一个点后,射出的箭中靶子的位置与我们瞄准的点的位置距离比较远。
- 低偏差低方差时,是我们所追求的效果,此时预测值正中靶心(最接近真实值),且比较集中(方差小)。
- 低偏差高方差时,预测值基本落在真实值周围,但很分散,此时方差较大,说明模型的稳定性不够好。
- 高偏差低方差时,预测值与真实值有较大距离,但此时值很集中,方差小;模型的稳定性较好,但预测准确率不高,处于"一如既往地预测不准"的状态。
- 高偏差高方差时,是我们最不想看到的结果,此时模型不仅预测不准确,而且还不稳定,每次预测的值都差别比较大。
产生原因
- 过拟合:
过拟合主要是因为给定的数据集相对过于简单,使得模型在拟合函数时过分地考虑了噪声等不必要的数据间的关联。或者说相对于给定数据集,模型过于复杂、拟合能力过强
- 欠拟合:
对于给定数据集,欠拟合的原因大多是模型不够复杂、拟合函数的能力不够。
解决方案
防止欠拟合
- 做特征工程,添加更多的特征项。即提供的特征不能表示出那个需要的函数;
- 减少正则化参数。即使得模型复杂一些;
- 使用更深或者更宽的模型。
- 使用集成方法。融合几个有差异的弱模型,使其成为一个强模型。
- 减少正则化参数
防止过拟合
-
数据扩增:
人为增加数据量,可以用重采样、上采样、增加随机噪声、GAN、图像数据的空间变换(平移旋转镜像)、尺度变换(缩放裁剪)、颜色变换、增加噪声、改变分辨率、对比度、亮度等。其中增加噪声,可以在原始数据上直接加入随机噪声(更接近真实环境),也可以在权重上增加噪声。
-
直接降低模型复杂度:
即减少模型参数数量。例如:对于LR,减少目标函数的因子数;对于DT,减少树的深度、剪枝等;对于DNN,减少层数和每层权向量长度。
-
针对神经网络,采用dropout方法:
间接减少参数数量,也相当于进行了数据扩增。弱化了各个参数(特征)之间的单一联系,使起作用的特征有更多组合,使从而模型不过分依赖某个特征。
-
提前停止训练:
也就是减少训练的迭代次数。从上面的误差率曲线图可以看出,理论上能够找到一个训练程度,此时验证集误差率最低,视为拟合效果最好的点。
-
多模型投票方法:
类似集成学习方法的思想,不同模型可能会从不同角度去拟合,互相之间取长补短,即使单独使用某个模型已出现过拟合,但综合起来却有可能减低过拟合程度,起到正则作用,提高了泛化效果。特别是使用多个非常简单的模型,更不容易产生过拟合
-
添加正则项,也叫正则化(regularization)
正则项的作用主要是通过λ参数来控制模型的复杂度
-
(针对DNN)Batch Normalization
BN,既能够提高泛化能力,又大大提高训练速度,现在被广泛应用在DNN中的激活层之前。BN的提出最初是针对DNN在训练过程中会出现数据内部的协方差偏移现象,导致输出数据分布发生额外的改变,并随着层数的增加偏移加剧,使得模型不得不根据输出分布的改变重新学习,这又导致训练速度减慢。公式如下:
具体过程: 首先对某层的输入样本做白化处理,等价于零均值化处理(均值为0,方差为1),使输入样本之间互不相关,且每层的输入服从相同分布,克服了内部协方差偏移的影响。采用分批处理数据的方式,减少了计算量。
主要优势: 减小了梯度对参数大小和初始值的依赖,将参数值(特征)缩放在[0,1]区间(若针对Relu还限制了输出的范围),这样反向传播时梯度控制在1左右,使网络即使在较高学习率下也不易发生梯度爆炸或弥散(也预防了在使用sigmoid作为激活函数时训练容易陷入梯度极小饱和或极大的极端情况)。
正则化
数学基础:
范数,用||x||表示范数
向量范数是衡量某个向量空间中向量的大小或长度;矩阵范数表征矩阵引起变化的大小。一种非严密的解释就是,对应向量范数,向量空间中向量都是有大小的,这个大小如何度量,就是用范数来度量的,不同的范数都可以来度量这个大小,就好比米和厘米都可以来度量长度一样;对于矩阵范数,学过线性代数,我们知道,通过运算AX=B,可以将向量X变化为B,矩阵范数就是来度量这个变化大小的。
L-P范数
L-P范数不是一个范数,而是一组范数,其定义如下:
根据P的变化,范数也有着不同的变化,一个经典的有关P范数的变化图如下:
L0范数
当p=0时,也就是L0范数,由上面可知,L0范数并不是一个真正的范数,它主要是被用来度量向量中非零元素的个数。定义为:
这里就有点问题了,我们知道非零元素的零次方为1,但零的零次方,非零数开零次方都是什么鬼,很不好说明L0的意义,所以在通常情况下,大家都用的是如下公式来表示向量x中非零元素的个数。
对于L0范数,其优化问题为:
即能令Ax=b成立的维度最少数量的x,即寻找一个向量,能够使Ax=b,并且x中所包含的特征比较少。在实际应用中,由于L0范数本身不容易有一个好的数学表示形式,给出上面问题的形式化表示是一个很难的问题,故被人认为是一个NP难问题。所以在实际情况中,L0的最优问题会被放宽到L1或L2下的最优化。
L1范数
L1范数是我们经常见到的一种范数,它主要表示各个参数绝对值之和, 定义如下:
表示向量中非零元素的绝对值之和。(一个向量中非零元素的绝对值之和,例如向量[1,-1,2],它的L1范数是|1||+||-1||+||2||=4||。
L1范数有很多的名字,例如我们熟悉的曼哈顿距离、最小绝对误差等。使用L1范数可以度量两个向量间的差异,如绝对误差和(Sum of Absolute Difference):
对于L1范数,它的优化问题如下:
由于L1范数的天然性质,对L1优化的解是一个稀疏解,因此L1范数也被叫做稀疏规则算子。通过L1可以实现特征的稀疏,去掉一些没有信息的特征,例如在对用户的电影爱好做分类的时候,用户有100个特征,可能只有十几个特征是对分类有用的,大部分特征如身高体重等可能都是无用的,利用L1范数就可以过滤掉。
L2范数
L2范数是我们最常用的范数了,我们用的最多的度量距离欧氏距离就是一种L2范数,主要标识各个参数的平方的和的开方值, 定义如下:
表示向量元素的平方和再开方。
像L1范数一样,L2范数也可以度量两个向量间的差异,如平方差和(Sum of Squared Difference):
对于L2范数,它的优化问题如下:
L2范数通常会被用来做优化目标函数的正则化项,防止模型为了迎合训练集而过于复杂造成过拟合的情况,从而提高模型的泛化能力。
讨论
- 实现参数的稀疏有什么好处
- 可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据效果可能很差。
- 参数变少可以使整个模型获得更好的可解释性。
- 参数越小值代表模型越简单吗
是的。为什么参数越小,说明模型越简单呢?这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。
参考
- https://www.cnblogs.com/yejintianming00/p/9338917.html#_Toc519803895
- https://blog.csdn.net/dyx810601/article/details/82141789
- https://blog.csdn.net/tuai4532/article/details/81208243
- https://blog.csdn.net/qq_26598445/article/details/82844393