首先来讨论机器学习中的几个基础的问题,通过这几个问题的理解,希望可以尽可能的回答为什么要正则化这样一个问题(很多都是自己的理解,不准确,欢迎讨论)。
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
3. Structural risk minimisation
为了避免over fitting现象的出现,人们提出了structural risk minimization(结构化风险最小化)的思路。统计学习理论提出了一种新的策略,即把函数集构造为一个函数子集序列,使各个子集按照VC维的大小排列;在每个子集中寻找最小经验风险,在子集间折衷考虑经验风险和置信范围,取得实际风险的最小。这种思想称作结构风险最小化(Structural Risk Minimization)。
a. VC维:VC维是有关函数集学习性能的一个重要指标,VC维越大则学习机器越复杂。比如在一个平面上(这是一个2维空间)我们使用一条直线(一个学习机)就可以把这个平面上的任意的3个点以任意的分类完全的分开(四个点就不可以:四个点对角的两个点为一类,那么一条直线无论如何是不可能把他们分开的)那么我么就说这条直线的vc维就是3。
b. VC维和empirical
c. Generation error(泛化误差):generalization
因为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.
5. 如何理解1范数或者2范数对于模型复杂度的影响
再来进一步理解,后面的这个J(f),使用2范数或者1范数,这样做就可以降低模型的复杂度吗?答案是肯定的。
以正则化选项为2范数为例,lambda*||w||, 这个最小化实际上限制了所有参数的取值范围,也就是将w的取值限制在了一个非常小的范围内,这个造成了什么样的结果呢?首先,函数集合的数目(d)降低了,w取的值少了,函数集合自然小了;其次,w取值少了,函数复杂度降低了;再次,由于w的总体范数限制在一个较小的范围内,会使得各个wi不至于差别太大,保证了优化的稳定性。
6. 从优化角度来理解正则化
前面介绍了结构化风险的思路就是把函数集构造成一个子序列,通过在子序列中寻优来找的解,这个实际上就是对应着优化问题中把约束最优化问题转化为无约束最优化问题,通过求解无约束最优化问题,来得到约束问题的解,即时序列无约束最小化方法,说的很玄乎,实际上大家都接触过:惩罚函数法、乘子法(我呵呵)
惩罚函数法的一个核心思想就是增大目标函数在非可行域出的目标函数值,一个基本的罚函数构造如下,其中c(x)<=0就是constraint。
大家可以看到其中delta的作用,在非可行域,也就是边界c(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. 从优化角度来讲:正则化就对应着一个惩罚函数,通过惩罚来确保函数能够在可行域内寻优。