今天咱们聊聊机器学习中出现的很是频繁的问题:过拟合与规则化。咱们先简单的来理解下经常使用的L0、L一、L2和核范数规则化。最后聊下规则化项参数的选择问题。这里由于篇幅比较庞大,为了避免吓到你们,我将这个五个部分分红两篇博文。知识有限,如下都是我一些浅显的见解,若是理解存在错误,但愿你们不吝指正。谢谢。算法
监督机器学习问题无非就是“minimizeyour error while regularizing your parameters”,也就是在规则化参数的同时最小化偏差。最小化偏差是为了让咱们的模型拟合咱们的训练数据,而规则化参数是防止咱们的模型过度拟合咱们的训练数据。多么简约的哲学啊!由于参数太多,会致使咱们的模型复杂度上升,容易过拟合,也就是咱们的训练偏差会很小。但训练偏差小并非咱们的最终目标,咱们的目标是但愿模型的测试偏差小,也就是能准确的预测新的样本。因此,咱们须要保证模型“简单”的基础上最小化训练偏差,这样获得的参数才具备好的泛化性能(也就是测试偏差也小),而模型“简单”就是经过规则函数来实现的。另外,规则项的使用还能够约束咱们的模型的特性。这样就能够将人对这个模型的先验知识融入到模型的学习当中,强行地让学习到的模型具备人想要的特性,例如稀疏、低秩、平滑等等。要知道,有时候人的先验是很是重要的。前人的经验会让你少走不少弯路,这就是为何咱们平时学习最好找个大牛带带的缘由。一句点拨能够为咱们拨开眼前乌云,还咱们一片晴空万里,醍醐灌顶。对机器学习也是同样,若是被咱们人稍微点拨一下,它确定能更快的学习相应的任务。只是因为人和机器的交流目前尚未那么直接的方法,目前这个媒介只能由规则项来担当了。机器学习
还有几种角度来看待规则化的。规则化符合奥卡姆剃刀(Occam's razor)原理。这名字好霸气,razor!不过它的思想很平易近人:在全部可能选择的模型中,咱们应该选择可以很好地解释已知数据而且十分简单的模型。从贝叶斯估计的角度来看,规则化项对应于模型的先验几率。民间还有个说法就是,规则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项(regularizer)或惩罚项(penalty term)。函数
通常来讲,监督学习能够看作最小化下面的目标函数:性能
其中,第一项L(yi,f(xi;w)) 衡量咱们的模型(分类或者回归)对第i个样本的预测值f(xi;w)和真实的标签yi以前的偏差。由于咱们的模型是要拟合咱们的训练样本的嘛,因此咱们要求这一项最小,也就是要求咱们的模型尽可能的拟合咱们的训练数据。但正如上面说言,咱们不只要保证训练偏差最小,咱们更但愿咱们的模型测试偏差小,因此咱们须要加上第二项,也就是对参数w的规则化函数Ω(w)去约束咱们的模型尽可能的简单。学习
OK,到这里,若是你在机器学习浴血奋战多年,你会发现,哎哟哟,机器学习的大部分带参模型都和这个不但形似,并且神似。是的,其实大部分无非就是变换这两项而已。对于第一项Loss函数,若是是Square loss,那就是最小二乘了;若是是Hinge Loss,那就是著名的SVM了;若是是exp-Loss,那就是牛逼的 Boosting了;若是是log-Loss,那就是Logistic Regression了;还有等等。不一样的loss函数,具备不一样的拟合特性,这个也得就具体问题具体分析的。但这里,咱们先不究loss函数的问题,咱们把目光转向“规则项Ω(w)”。测试
规则化函数Ω(w)也有不少种选择,通常是模型复杂度的单调递增函数,模型越复杂,规则化值就越大。好比,规则化项能够是模型参数向量的范数。然而,不一样的选择对参数w的约束不一样,取得的效果也不一样,但咱们在论文中常见的都汇集在:零范数、一范数、二范数、迹范数、Frobenius范数和核范数等等。这么多范数,到底它们表达啥意思?具备啥能力?何时才能用?何时须要用呢?不急不急,下面咱们挑几个常见的娓娓道来。优化
1、L0范数与L1范数google
L0范数是指向量中非0的元素的个数。若是咱们用L0范数来规则化一个参数矩阵W的话,就是但愿W的大部分元素都是0。这太直观了,太露骨了吧,换句话说,让参数W是稀疏的。OK,看到了“稀疏”二字,你们都应该从当下风风火火的“压缩感知”和“稀疏编码”中醒悟过来,原来用的漫山遍野的“稀疏”就是经过这玩意来实现的。但你又开始怀疑了,是这样吗?看到的papers世界中,稀疏不是都经过L1范数来实现吗?脑海里是否是处处都是||W||1影子呀!几乎是抬头不见低头见。没错,这就是这节的题目把L0和L1放在一块儿的缘由,由于他们有着某种不寻常的关系。那咱们再来看看L1范数是什么?它为何能够实现稀疏?为何你们都用L1范数去实现稀疏,而不是L0范数呢?编码
L1范数是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。如今咱们来分析下这个价值一个亿的问题:为何L1范数会使权值稀疏?有人可能会这样给你回答“它是L0范数的最优凸近似”。实际上,还存在一个更美的回答:任何的规则化算子,若是他在Wi=0的地方不可微,而且能够分解为一个“求和”的形式,那么这个规则化算子就能够实现稀疏。这说是这么说,W的L1范数是绝对值,|w|在w=0处是不可微,但这仍是不够直观。这里由于咱们须要和L2范数进行对比分析。因此关于L1范数的直观理解,请待会看看第二节。spa
对了,上面还有一个问题:既然L0能够实现稀疏,为何不用L0,而要用L1呢?我的理解一是由于L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,并且它比L0范数要容易优化求解。因此你们才把目光和万千宠爱转于L1范数。
OK,来个一句话总结:L1范数和L0范数能够实现稀疏,L1因具备比L0更好的优化求解特性而被普遍应用。
好,到这里,咱们大概知道了L1能够实现稀疏,但咱们会想呀,为何要稀疏?让咱们的参数稀疏有什么好处呢?这里扯两点:
1)特征选择(Feature Selection):
你们对稀疏规则化趋之若鹜的一个关键缘由在于它能实现特征的自动选择。通常来讲,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然能够得到更小的训练偏差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
2)可解释性(Interpretability):
另外一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的几率是y,而后咱们收集到的数据x是1000维的,也就是咱们须要寻找这1000种因素究竟是怎么影响患上这种病的几率的。假设咱们这个是个回归模型:y=w1*x1+w2*x2+…+w1000*x1000+b(固然了,为了让y限定在[0,1]的范围,通常还得加个Logistic函数)。经过学习,若是最后学习到的w*就只有不多的非零元素,例如只有5个非零的wi,那么咱们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但若是1000个wi都非0,医生面对这1000种因素,累觉不爱。
2、L2范数
除了L1范数,还有一种更受宠幸的规则化范数是L2范数: ||W||2。它也不逊于L1范数,它有两个美称,在回归里面,有人把有它的回归叫“岭回归”(Ridge Regression),有人也叫它“权值衰减weight decay”。这用的不少吧,由于它的强大功效是改善机器学习里面一个很是重要的问题:过拟合。至于过拟合是什么,上面也解释了,就是模型训练时候的偏差很小,但在测试的时候偏差很大,也就是咱们的模型复杂到能够拟合到咱们的全部训练样本了,但在实际预测新的样本的时候,糟糕的一塌糊涂。通俗的讲就是应试能力很强,实际应用能力不好。擅长背诵知识,却不懂得灵活利用知识。例以下图所示(来自Ng的course):
上面的图是线性回归,下面的图是Logistic回归,也能够说是分类的状况。从左到右分别是欠拟合(underfitting,也称High-bias)、合适的拟合和过拟合(overfitting,也称High variance)三种状况。能够看到,若是模型复杂(能够拟合任意的复杂函数),它可让咱们的模型拟合全部的数据点,也就是基本上没有偏差。对于回归来讲,就是咱们的函数曲线经过了全部的数据点,如上图右。对分类来讲,就是咱们的函数曲线要把全部的数据点都分类正确,以下图右。这两种状况很明显过拟合了。
OK,那如今到咱们很是关键的问题了,为何L2范数能够防止过拟合?回答这个问题以前,咱们得先看看L2范数是个什么东西。
L2范数是指向量各元素的平方和而后求平方根。咱们让L2范数的规则项||W||2最小,可使得W的每一个元素都很小,都接近于0,但与L1范数不一样,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为何越小的参数说明模型越简单?我也不懂,个人理解是:限制了参数很小,实际上就限制了多项式某些份量的影响很小(看上面线性回归的模型的那个拟合的图),这样就至关于减小参数个数。其实我也不太懂,但愿你们能够指点下。
这里也一句话总结下:经过L2范数,咱们能够实现了对模型空间的限制,从而在必定程度上避免了过拟合。
L2范数的好处是什么呢?这里也扯上两点:
1)学习理论的角度:
从学习理论的角度来讲,L2范数能够防止过拟合,提高模型的泛化能力。
2)优化计算的角度:
从优化或者数值计算的角度来讲,L2范数有助于处理 condition number很差的状况下矩阵求逆很困难的问题。哎,等等,这condition number是啥?我先google一下哈。
这里咱们也故做高雅的来聊聊优化问题。优化有两大难题,一是:局部最小值,二是:ill-condition病态问题。前者俺就不说了,你们都懂吧,咱们要找的是全局最小值,若是局部最小值太多,那咱们的优化算法就很容易陷入局部最小而不能自拔,这很明显不是观众愿意看到的剧情。那下面咱们来聊聊ill-condition。ill-condition对应的是well-condition。那他们分别表明什么?假设咱们有个方程组AX=b,咱们须要求解X。若是A或者b稍微的改变,会使得X的解发生很大的改变,那么这个方程组系统就是ill-condition的,反之就是well-condition的。咱们具体举个例子吧:
我们先看左边的那个。第一行假设是咱们的AX=b,第二行咱们稍微改变下b,获得的x和没改变前的差异很大,看到吧。第三行咱们稍微改变下系数矩阵A,能够看到结果的变化也很大。换句话来讲,这个系统的解对系数矩阵A或者b太敏感了。又由于通常咱们的系数矩阵A和b是从实验数据里面估计获得的,因此它是存在偏差的,若是咱们的系统对这个偏差是能够容忍的就还好,但系统对这个偏差太敏感了,以致于咱们的解的偏差更大,那这个解就太不靠谱了。因此这个方程组系统就是ill-conditioned病态的,不正常的,不稳定的,有问题的,哈哈。这清楚了吧。右边那个就叫well-condition的系统了。
仍是再啰嗦一下吧,对于一个ill-condition的系统,个人输入稍微改变下,输出就发生很大的改变,这很差啊,这代表咱们的系统不能实用啊。你想一想看,例如对于一个回归问题y=f(x),咱们是用训练样本x去训练模型f,使得y尽可能输出咱们期待的值,例如0。那假如咱们遇到一个样本x’,这个样本和训练样本x差异很小,面对他,系统本应该输出和上面的y差很少的值的,例如0.00001,最后却给我输出了一个0.9999,这很明显不对呀。就好像,你很熟悉的一我的脸上长了个青春痘,你就不认识他了,那你大脑就太差劲了,哈哈。因此若是一个系统是ill-conditioned病态的,咱们就会对它的结果产生怀疑。那到底要相信它多少呢?咱们得找个标准来衡量吧,由于有些系统的病没那么重,它的结果仍是能够相信的,不能一刀切吧。终于回来了,上面的condition number就是拿来衡量ill-condition系统的可信度的。condition number衡量的是输入发生微小变化的时候,输出会发生多大的变化。也就是系统对微小变化的敏感度。condition number值小的就是well-conditioned的,大的就是ill-conditioned的。
若是方阵A是非奇异的,那么A的conditionnumber定义为:
也就是矩阵A的norm乘以它的逆的norm。因此具体的值是多少,就要看你选择的norm是什么了。若是方阵A是奇异的,那么A的condition number就是正无穷大了。实际上,每个可逆方阵都存在一个condition number。但若是要计算它,咱们须要先知道这个方阵的norm(范数)和Machine Epsilon(机器的精度)。为何要范数?范数就至关于衡量一个矩阵的大小,咱们知道矩阵是没有大小的,当上面不是要衡量一个矩阵A或者向量b变化的时候,咱们的解x变化的大小吗?因此确定得要有一个东西来度量矩阵和向量的大小吧?对了,他就是范数,表示矩阵大小或者向量长度。OK,通过比较简单的证实,对于AX=b,咱们能够获得如下的结论:
也就是咱们的解x的相对变化和A或者b的相对变化是有像上面那样的关系的,其中k(A)的值就至关于倍率,看到了吗?至关于x变化的界。
对condition number来个一句话总结:conditionnumber是一个矩阵(或者它所描述的线性系统)的稳定性或者敏感度的度量,若是一个矩阵的condition number在1附近,那么它就是well-conditioned的,若是远大于1,那么它就是ill-conditioned的,若是一个系统是ill-conditioned的,它的输出结果就不要太相信了。
好了,对这么一个东西,已经说了好多了。对了,咱们为何聊到这个的了?回到第一句话:从优化或者数值计算的角度来讲,L2范数有助于处理 condition number很差的状况下矩阵求逆很困难的问题。由于目标函数若是是二次的,对于线性回归来讲,那其实是有解析解的,求导并令导数等于零便可获得最优解为:
然而,若是当咱们的样本X的数目比每一个样本的维度还要小的时候,矩阵XTX将会不是满秩的,也就是XTX会变得不可逆,因此w*就没办法直接计算出来了。或者更确切地说,将会有无穷多个解(由于咱们方程组的个数小于未知数的个数)。也就是说,咱们的数据不足以肯定一个解,若是咱们从全部可行解里随机选一个的话,极可能并非真正好的解,总而言之,咱们过拟合了。
但若是加上L2规则项,就变成了下面这种状况,就能够直接求逆了:
这里面,专业点的描述是:要获得这个解,咱们一般并不直接求矩阵的逆,而是经过解线性方程组的方式(例如高斯消元法)来计算。考虑没有规则项的时候,也就是λ=0的状况,若是矩阵XTX的 condition number 很大的话,解线性方程组就会在数值上至关不稳定,而这个规则项的引入则能够改善condition number。
另外,若是使用迭代优化的算法,condition number 太大仍然会致使问题:它会拖慢迭代的收敛速度,而规则项从优化的角度来看,其实是将目标函数变成λ-strongly convex(λ强凸)的了。哎哟哟,这里又出现个λ强凸,啥叫λ强凸呢?
当f知足:
时,咱们称f为λ-stronglyconvex函数,其中参数λ>0。当λ=0时退回到普通convex 函数的定义。
在直观的说明强凸以前,咱们先看看普通的凸是怎样的。假设咱们让f在x的地方作一阶泰勒近似(一阶泰勒展开忘了吗?f(x)=f(a)+f'(a)(x-a)+o(||x-a||).):
直观来说,convex 性质是指函数曲线位于该点处的切线,也就是线性近似之上,而 strongly convex 则进一步要求位于该处的一个二次函数上方,也就是说要求函数不要太“平坦”而是能够保证有必定的“向上弯曲”的趋势。专业点说,就是convex 能够保证函数在任意一点都处于它的一阶泰勒函数之上,而strongly convex能够保证函数在任意一点都存在一个很是漂亮的二次下界quadratic lower bound。固然这是一个很强的假设,可是同时也是很是重要的假设。可能还很差理解,那咱们画个图来形象的理解下。
你们一看到上面这个图就全明白了吧。不用我啰嗦了吧。仍是啰嗦一下吧。咱们取咱们的最优解w*的地方。若是咱们的函数f(w),见左图,也就是红色那个函数,都会位于蓝色虚线的那根二次函数之上,这样就算wt和w*离的比较近的时候,f(wt)和f(w*)的值差异仍是挺大的,也就是会保证在咱们的最优解w*附近的时候,还存在较大的梯度值,这样咱们才能够在比较少的迭代次数内达到w*。但对于右图,红色的函数f(w)只约束在一个线性的蓝色虚线之上,假设是如右图的很不幸的状况(很是平坦),那在wt还离咱们的最优势w*很远的时候,咱们的近似梯度(f(wt)-f(w*))/(wt-w*)就已经很是小了,在wt处的近似梯度∂f/∂w就更小了,这样经过梯度降低wt+1=wt-α*(∂f/∂w),咱们获得的结果就是w的变化很是缓慢,像蜗牛同样,很是缓慢的向咱们的最优势w*爬动,那在有限的迭代时间内,它离咱们的最优势仍是很远。
因此仅仅靠convex 性质并不能保证在梯度降低和有限的迭代次数的状况下获得的点w会是一个比较好的全局最小点w*的近似点(插个话,有地方说,实际上让迭代在接近最优的地方中止,也是一种规则化或者提升泛化性能的方法)。正如上面分析的那样,若是f(w)在全局最小点w*周围是很是平坦的状况的话,咱们有可能会找到一个很远的点。但若是咱们有“强凸”的话,就能对状况作一些控制,咱们就能够获得一个更好的近似解。至于有多好嘛,这里面有一个bound,这个 bound 的好坏也要取决于strongly convex性质中的常数α的大小。看到这里,不知道你们学聪明了没有。若是要得到strongly convex怎么作?最简单的就是往里面加入一项(α/2)*||w||2。
呃,讲个strongly convex花了那么多的篇幅。实际上,在梯度降低中,目标函数收敛速率的上界其实是和矩阵XTX的 condition number有关,XTX的 condition number 越小,上界就越小,也就是收敛速度会越快。
这一个优化说了那么多的东西。仍是来个一句话总结吧:L2范数不但能够防止过拟合,还可让咱们的优化求解变得稳定和快速。
好了,这里兑现上面的承诺,来直观的聊聊L1和L2的差异,为何一个让绝对值最小,一个让平方最小,会有那么大的差异呢?我看到的有两种几何上直观的解析:
1)降低速度:
咱们知道,L1和L2都是规则化的方式,咱们将权值参数以L1或者L2的方式放到代价函数里面去。而后模型就会尝试去最小化这些权值参数。而这个最小化就像一个下坡的过程,L1和L2的差异就在于这个“坡”不一样,以下图:L1就是按绝对值函数的“坡”降低的,而L2是按二次函数的“坡”降低。因此实际上在0附近,L1的降低速度比L2的降低速度要快。因此会很是快得降到0。不过我以为这里解释的不太中肯,固然了也不知道是否是本身理解的问题。
L1在江湖上人称Lasso,L2人称Ridge。不过这两个名字还挺让人迷糊的,看上面的图片,Lasso的图看起来就像ridge,而ridge的图看起来就像lasso。
2)模型空间的限制:
实际上,对于L1和L2规则化的代价函数来讲,咱们能够写成如下形式:
也就是说,咱们将模型空间限制在w的一个L1-ball 中。为了便于可视化,咱们考虑两维的状况,在(w1, w2)平面上能够画出目标函数的等高线,而约束条件则成为平面上半径为C的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:
能够看到,L1-ball 与L2-ball 的不一样就在于L1在和每一个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得很是好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有w1=0,而更高维的时候(想象一下三维的L1-ball 是什么样的?)除了角点之外,还有不少边的轮廓也是既有很大的几率成为第一次相交的地方,又会产生稀疏性。
相比之下,L2-ball 就没有这样的性质,由于没有角,因此第一次相交的地方出如今具备稀疏性的位置的几率就变得很是小了。这就从直观上来解释了为何L1-regularization 能产生稀疏性,而L2-regularization 不行的缘由了。
所以,一句话总结就是:L1会趋向于产生少许的特征,而其余的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候很是有用,而Ridge就只是一种规则化而已
L1 Norm 和L2 Norm的区别(核心:L2对大数,对outlier更敏感!):
考虑一个很简单的最小Norm的优化问题:
MINIMIZE ∥x∥ WITH RESPECT TO Ax=b
假设Ax=b有无数可行解,那么再假设a=(0.5,0.5)和b=(-1,0)都是可行解,那么计算这个两个向量的L1和L2 Norm,
||a||1=1, ||b||1=1; ||a||2=1/squre(2), ||b||2=1。很明显,a和b L1 Norm相同,而可是b的L2 Norm却大于a的L2 Norm。
L2 Norm对大数的惩罚比小数大! 由于使用L2 Norm求出来的解是比较均匀的,而L1 Norm经常产生稀疏解。
L1是蓝色的线,L2是红色的线,很明显,L1的分布对极端值更能容忍。
那么若是数据损失项使用L1 Norm,很明显,L1 Norm对outlier没有L2 Norm那么敏感;若是正则化损失项使用L1的话,那么使学习到的参数倾向于稀疏,使用L2 Norm则没有这种倾向。