互联网应用下的大规模在线学习算法(四)-为什么要正则化

在前面谈到了一些正则化的思路和方法,接下来思考另外一个问题:为什么要正则化?

首先来讨论机器学习中的几个基础的问题,通过这几个问题的理解,希望可以尽可能的回答为什么要正则化这样一个问题(很多都是自己的理解,不准确,欢迎讨论)。

1. 训练数据不一定能近似真实的分布

机器学习算法的目标还是希望使用traning data得出的模型能够在test data上有良好的效果,也就是traning出的model能更接近数据真实的情况。但是这个目标并不那么容易达成,原因主要是现实中,观察到数据的全貌往往是不可能的,因此就造成了training set 和 test set的分布不一致。如下图所示,选择training set 1 和training set 2 可以得到不同的分类器,显而易见的时这个分类器的泛化能力非常差。也就是在现实中训练数据往往和真实数据的分布是有差距的,因此采用某些方法对于训练数据进行约束是非常有必要的。








2. Expected Loss 和 over fitting

在学习一个问题的时候,首先会定义loss function,就是要照什么样的准则去学习。

a. Expected Loss :对于一个trainning set人们自然的会想到使用平均的loss来衡量预测值和真实值的一致性,这就是expected Loss(期望损失):




就是模型f关于联合概率分布P(x,y)的平均意义下的损失,因为x,y都是随机变量,所以损失函数的期望是,学习的目标就是选择f,使得期望损失最小。但是这里面的问题是联合概率是未知的,所以这个期望无法求出。在只能观察到训练数据的情况下,则定义了另外一个损失函数经验损失empirical loss(经验损失):基于训练样本的平均损失




大数定律告诉我们,在重复的实验中,随着试验次数的增减,事件发生的概率趋于一个稳定值,这个稳定值就是期望。由这个定律出发,很自然的可以想到使用经验损失来预估期望损失,但这里要注意真实情况是数据并没有趋近无穷,因此经验风险在数据量不够大的情况下,需要添加新的约束。

b. Over fitting现象的产生:通常意义上,只要hypothesis space足够的复杂(对应于参数的数量,但并不等同),training set的loss就可能无限的逼近0,最后的经验损失为0,也就是很好的拟合了训练数据。下面是使用多项式来拟合二次曲线的的例子,可以看到当多项式的为3的时候可以拟合的比较精确,当为9的时候,所有点都在最后拟合的曲线上,也就是经验损失为0,出现了过拟合,但这样的模型在test上面往往是无效的。




3. Structural risk minimisation

为了避免over fitting现象的出现,人们提出了structural risk minimization(结构化风险最小化)的思路。统计学习理论提出了一种新的策略,即把函数集构造为一个函数子集序列,使各个子集按照VC维的大小排列;在每个子集中寻找最小经验风险,在子集间折衷考虑经验风险和置信范围,取得实际风险的最小。这种思想称作结构风险最小化(Structural Risk Minimization)。

a. VC维:VC维是有关函数集学习性能的一个重要指标,VC维越大则学习机器越复杂。比如在一个平面上(这是一个2维空间)我们使用一条直线(一个学习机)就可以把这个平面上的任意的3个点以任意的分类完全的分开(四个点就不可以:四个点对角的两个点为一类,那么一条直线无论如何是不可能把他们分开的)那么我么就说这条直线的vc维就是3。

b. VC维和empiricalrisk的关系:VC维越大,也就是学习机越复杂,越容易出现过拟合。VC维度越小,学习机越简单,过拟合现象不容易出现,但是经验风险精度会下降。所以学习的目的是在模型的复杂度以及精度之间找一个折中,以便经验风险可以得到控制。

c. Generation error(泛化误差):generalization ability是值得学习方法学习到的模型对于未知数据的预测能力,而这个预测能力是通过test error来进行评价的,泛化误差实际上就是所学习到的模型的expectedrisk。




因为P(x,y)不容易得到,于是就通过研究泛化误差的界来研究泛化误差。泛化误差R(f)和经验误差R_hat(f)有这样一种关系:




这个公式来自于李航博士的《统计学习方法》,其中d是函数集个数,N是训练数据的数量,delta是一个可调节项。在zhang tong老师2012年龙星计划第三讲的slides中,这个公式简化成了下面这个公式,其实是一个意思。




对于理解来说,可以先不深究后边epsilon项的具体表达,它就是一个与函数集个数、训练数据相关的一个多次项。(如想深入了解,可以看一下李航博士的《统计学习方法》以及一些论文)


4. 正则化

上面的几个问题完全是为了解释正则化所作的准备工作。前面提到了结构化的风险最小化,下面就是具体的公式:



后边的J(f)是和模型复杂度相关的一个函数,就是zhang tong老师那个公式中的 O(d/n),那这个式子表达的意思是

a. 是在最小化 经验误差+ 模型复杂度,
b. 最小化泛化误差的上界,最小化置信区间,使得training error和test error尽量接近
c.折衷考虑经验风险和置信范围,降低模型的VC维

5. 如何理解1范数或者2范数对于模型复杂度的影响

再来进一步理解,后面的这个J(f),使用2范数或者1范数,这样做就可以降低模型的复杂度吗?答案是肯定的。

以正则化选项为2范数为例,lambda*||w||, 这个最小化实际上限制了所有参数的取值范围,也就是将w的取值限制在了一个非常小的范围内,这个造成了什么样的结果呢?首先,函数集合的数目(d)降低了,w取的值少了,函数集合自然小了;其次,w取值少了,函数复杂度降低了;再次,由于w的总体范数限制在一个较小的范围内,会使得各个wi不至于差别太大,保证了优化的稳定性。

6. 从优化角度来理解正则化

前面介绍了结构化风险的思路就是把函数集构造成一个子序列,通过在子序列中寻优来找的解,这个实际上就是对应着优化问题中把约束最优化问题转化为无约束最优化问题,通过求解无约束最优化问题,来得到约束问题的解,即时序列无约束最小化方法,说的很玄乎,实际上大家都接触过:惩罚函数法、乘子法(我呵呵)

惩罚函数法的一个核心思想就是增大目标函数在非可行域出的目标函数值,一个基本的罚函数构造如下,其中c(x)<=0就是constraint。




大家可以看到其中delta的作用,在非可行域,也就是边界c(x) =0的时候,delta尽可能的大,这样可以让函数值变的很大,从而使得优化结果尽量出现在c(x)<=0的范围内。在delta趋近无穷的时候,P(x)的极值点和原问题f(x)的极值点就无限接近,这个证明很简单,通过求导,然后求极限就可以证明。

我们再回到正则化这个问题,正则化中的lambda*||w||_2 实际上就承担了罚函数的功能。在zhang tong老师的slides中提到这样一个等价,如下所示:




A是一个极小的值,也就是让所有的w尽可能的分布在一个较小的范围内,有了这个条件,也很容易通过求导,求极限这样的步骤来证明这两个式子是等价的。从直观上来分析,lambda越小,那么w的范围越大,函数复杂就度越高,VC维就会越高,test error的上界就越大,函数的泛化能力就越弱。但是反过来看,如果lambda过大,罚函数通常是一个病态函数,也就是其Hesse矩阵会出现条件数过大的问题,导致数值计算的不稳定。

lambda的调节:lambda过大或者增加的过快,会使得收敛速度变快,但不精确;反之,精确度高,但收敛速度会变慢,因此在实际中,要选取适当的lambda的初始值以及适当的lambda的步长,很多优化算法也在围绕lambda的选择做文章。

顺带提一个有意思的问题,在zhang tong老师的slides中推倒出了使用2范数正则化的最后的解析表达式,如下,这个式子对应了LM优化算法的公式,实际上LM优化算法就是通过添加2范数的正则化得到的,可见数学公式在物理上还都是有意义的。




7. 总结一下

a. 从机器学习的角度来讲:机器学习的最终目的实际上是想让训练的模型能够在test set有更好的性能,这就提出了于最小化泛化误差;直接最小化有问题,那么就提出了最小化泛化误差的上界,而这个上界是经验风险和模型复杂度的函数,而后面的这个模型复杂度函数就对应了正则化项,从而就有了正则化.

b. 从优化角度来讲:正则化就对应着一个惩罚函数,通过惩罚来确保函数能够在可行域内寻优。

c. 从概率角度来讲:(在前面的博文中提到)加正则化项的目标函数实际上对应着后验概率,正则化项对应着参数的分布


主要参考文献(都可以在网上找到):

李航博士 《统计学习方法》
zhang tong 老师在2012年龙星计划上的第三讲 《overfitting and regularization
袁亚湘 《最优化理论与方法》
唐杰老师 《Pattern Recognition and M

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章&#160;jquery.validate使用攻略1 第二章&#160;jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = &#39;ye wen jun&#39;;let ans = name.replace(/\s/g, &#39;&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod(&quot;letters&quot;, function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) &lt;script type=&quot;text/javascript&quot;&gt; function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from &quot;@/utils/validate&quot;; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: &lt;!-- 表单 --&gt; &lt;el-form ref=&quot;rulesForm&quot; :rules=&quot;formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 &lt;input type=&quot;text&quot; maxlength=&quot;5&quot; /&gt; //可以 &lt;input type=&quot;number&quot; maxlength=&quot;5&quot; /&gt; //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 &lt;input type=&quot;text&quot; onkeyup=&quot;value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf