本章节,单独开一章,为了学习机器学习、深度学习中过拟合的解决方案以及其中细节和原因。
1. 定义
对于一个监督学习模型来说,过小的特征集合使得模型过于简单,过大的特征集合使得模型过于复杂。
对于特征集过小的情况,称之为欠拟合(underfitting)
对于特征集过大的情况,称之为过拟合(overfitting)
过拟合:对训练集的过度学习,使得模型过于复杂,拟合结果仅仅反映了所给的特定数据(训练集)的特质,反过来可以说样本数目不足以支持巨大的特征集。因此此时偏差很低,方差很高。
欠拟合:对训练集的欠学习,使得模型比较简单(特征集小,比如仅有x1,x2),不能很好的拟合训练集。进而偏差和方差都很低。
2. 过拟合的解决
1. 在视觉任务重,很自然可以联想到数据增强 or 增加数据量
2. L1正则化:获得具有稀疏性的权重/参数,能够用于特征选择,即特征工程,筛选组合得到更高质量的特征。
一般情况下,线性回归损失函数如右图所示:
首先要理解,认真的讲,0范数(L0范数是指向量中非0的元素的个数)和1范数都能求得稀疏解,但是因为低1范数的都不是凸的,所以L0范数很难优化求解(NP难问题,L0为一个0-1跃阶函数),NP难我也不太懂,反正先写了!!
总之在实现稀疏解的问题上,通常使用L1范数。以此为前提。
(1)为什么L1范数会使权值稀疏?????????以下解释比较官方(比较完美)。。So很难理解。
1)它是L0范数的最优凸近似。
2)任何的规则化算子,如果它在的地方不可微,并且可以分解为一个“求和”的形式,那么这个规则化算子就可以实现稀疏。意思可以理解为,W的L1范数是绝对值,|w|在w=0处是不可微。
(2)但是为什么L1可以解决过拟合问题那?
因为L1正则化可以产出稀疏的模型,通常来讲我们认为稀疏模型具有更好的特性去处理高维的数据特征。
1)模型压缩:随着训练的进行,那些真正有用的特征的重要性逐渐提高。
2)特征选择:可以帮助我们知道哪些特征是重要(1)和(2)的,哪些特征是不重要的。
3)在这里用图+理论+公式的方式统一解决下,(1)和(2)
先来了解下定义:
损失函数:Loss Function 是定义在单个样本上的,算的是一个样本的误差。
代价函数:Cost Function 定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。
目标函数:Object Function 最终需要优化的函数。等于经验风险+结构风险(也就是Cost Function + 正则化项)。
我们假定代价函数是L1规则的 ,
根据公式,我们可以简单的把它理解成2维的目标函数,理解成约束条件,那么就有了下图(目标函数+约束项)。
彩色等高线就是在二维(w1, w2)下,平面上可视化的需要优化的目标函数,菱形就是约束条件(|w1|+|w2|<=C,这一看就是),
若要使得目标函数越小就要满足两个条件 :(1)参数值在等高线上的圆圈越来越接近中心的紫色圆圈(2)菱形越小越好( C 越小越好)。我们以红色线作为例子,会发现当Cost Function一致时候,与红线相切的菱形使得C最小,因此等高线和约束项首次相交的地方就是最优解。可以发现约束项是有‘角’的存在,因此首次相交的点大概率是轴上的点(轴上的点w1和w2必有0,可以想象如果是三维以及更高维度的空间,这类角或者说轴会更多,轴上的点更有可能成为最有值的点,那么就会有更多的参数被归为0),因此产生稀疏性,这也就解释了(1)。
总的来说,L1会趋向于产生少量的特征,而其他的特征都是0,因此Lasso在特征选择时候非常有用(解释了(2)中的特征选择)。
再来进一步理解,如果没有L1正则化项的约束,我们知道越接近于等高线的中心点,偏差越小(偏差,方差概念可能需要你们自己去学习一下),没有L1那么最优参数可能越接近中心,因此产生过拟合。L1正则项保证了在误差允许的范围内却不过于逼近中心点,即保持较好的泛化能力冒
(4)L1正则化的优化方法?可以用SGD?
本质上可以使用任何优化算法去优化Lasso,包括梯度下降。
最常见的优化算法是gradient descent,L1在0处不可导(不是处处可导),因此就有了次梯度下降(subgradient descent),而且这个方法不能完全保证下降也不能保证得到稀疏解,因此一般不推荐用。TF里面也没有实现原版的次梯度下降,而是选择忽略了不可导的地方。
因此,一般来说都会使用优化Lasso的大杀器 ’ 近似梯度下降‘ proximal gradient descent(Lasso优化中大名鼎鼎的ISTA),proximal方法相当把原问题拆解成了两个子问题,首先更新平滑部分的参数(L1以外的部分),拿着更新好的结果,跑一遍proximal operator(soft threshold函数)让它也尽量更接近满足L1的条件,处理过后的才是新的参数(近似更新)。
或者说使用最小角回归(Least Angle Regression, LARS)算法才能说能够获得真正的稀疏解。
(5)实验证明加L1正则是无法获得真正的稀疏解的
1. 实践中如果想获得稀疏解,可以先给目标函数加 L1 正则,然后在训练过程中或者训练结束后把绝对值较小的参数抹成零
3. L2正则化:
当加入L2正则化的时候,分析和L1正则化是类似的,也就是说我们仅仅是从菱形变成了圆形而已,同样还是求原曲线和圆形的切点作为最优解。当然与L1范数比,我们这样求的L2范数的从图上来看,不容易交在坐标轴上,但是仍然比较靠近坐标轴。因此这也就是我们老说的,L2范数能让解比较小(靠近0),但是比较平滑(不等于0)。
4. dropout
定义:dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
起作用的解释:(1)相当于很多个模型的组合 (2)相当于数据增强
数据量小的时候,dropout效果不好,数据量大了,dropout效果好。
当然在测试过程中是不能用dropout的!!!!
5. 提前终止这一类训练方法
其实模型在训练的时候,我们是要平衡偏差和方差的,偏差意味着对训练集的拟合程度,方差意味着泛化性,所以当达到某个平衡点的时候,我们可以选择停止训练。
6 BN 批量归一化
BN的初衷 是用来解决梯度下降算法本质的缺陷,但是实验证明,BN却似有助于提升泛化性。
原因在于:BN可以看做正则化的一种方法,因为每层的输出,每个激活值和这些输出都来源于输入X以及批量中被采样的其他样本。因为你将通过这一批样本的经验化均值对输入数据进行归一化,所以,它不再对给定的训练样本提供确定性的值,而是将这些输入放入批中,因为它不再是确定值,就像往X中加入一些抖动,从而实现正则化的效果。
7. 选择合适的模型
使得模型简单一些。
8. Bagging算法 可以参考随机森林
在同一个训练集合中,随机有放回的抽取相同数目(m)的样本(自助抽样法),训练不同的模型(弱分类器),最后通过多数人投票等机制构建强分类器。
这个方法主要是为了增加模型的泛化性,即减少方差。
9. Bootstrap
是一种线性迭代的集成算法,在每一次迭代后,根据损失函数值,重构训练集的分布,使得难或者错误样本拥有更大的权重,然后使用新的样本继续训练新的弱学习器,如此重复直到弱学习器or基学习器的数目达到预先给定的值T,最终将这T个基学习器进行加权结合。
这个方法既能减少偏差又能减少方差。
10. 贝叶斯方法 (我没有学好,不写了)
3. 欠拟合的解决:
解决方法:
1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。
3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
补充:
泛化误差(generalization error)可以分解为三个部分: 偏差(bias), 方差(variance) 和噪声(noise).