这一份总结里的主要内容不是算法,是关于如何对偏差和方差进行权衡、如何选择模型、如何选择特征的内容,通过这些可以在实际中对问题进行更好地选择与修改模型。
图一最左边的图,用线性模型去拟合一个二次模型,无论该训练集中有多少样本,都会不可避免地出现较大的误差,这种情况被称为欠拟合,对应着高偏差;
图一最右边的图,用高次模型去拟合一个二次模型,虽然它能够让图中每个样本点都经过该曲线,但是对于新来的数据可能会强加上一些它们并不拥有的特性(一般是训练样本带来的),这会让模型非常的敏感,这种情况被称为过拟合,对应着高方差。
如何选择一个模型使得它在偏差与方差之间取得一个平衡,是学习理论要解决的问题。在下面“一致收敛的推论”一节中,会得到一个用来权衡偏差、方差的公式,接下来会从头开始推导这个公式。
开始推导之前要先把一些准备知识提出来,这样从“一致收敛”中开始的推导会很顺利。
引理:令 A1,A2,⋯,Ak 是k个事件,组合成k集,它们可能相互独立,也可能步相互独立,对此,我们有:
引理:令 Z1,Z2⋯,Zm 为m个独立同分布事件,它们都服从伯努利分布,则有:
下面以二分类问题进行说明。
给定一个训练集 S{(x(i),y(i));i=1,2,⋯,m} , (x(i),y(i)) 是服从概率分布 D 的独立同分布变量,那么对于一个假设 h ,我们将假设 h 的训练误差(Training error)——也称为经验风险(Empirical risk)或者是经验误差(Empirical error)——定义为:
相对应的有一般风险,也称为一般误差(Generalization error):
在我的理解中,训练误差是训练中产生的误差,一般误差是实际预测、分类中产生的误差。接下来的推导中它们会一直出现,可能会搞混,要一直理解到它们的意思才行。
假设模型集合为:
由式(4)经验风险的形式化定义,有经验风险最小化(简称ERM)为:
还有另外一种ERM的等价表示方法,其ERM的定义为:
它表示:选择一个假设函数 h ,使得经验风险最小。
此处的一致收敛有两个前提。一是由第二种ERM推导,二是式(6)中假设函数的数量是有限的情况下的。
一致收敛的意义是:训练误差与一般误差的差值大于某阈值的概率存在着上界。还有一点扩展就是这个上界会因样本数量的上升而急速下降。由一致收敛我们可以推导出偏差/方差权衡的方式。
首先,假设类的集合 H={h1,h2,⋯,hk} ,它的成员数量是有限的,为k。
其次,用 Zj=I{hi(x(j))≠y(j)} 表示,假设类 hi 把样本 ((x(j)),y(j)) 错误分类了。
于是我们有假设类 hi 的训练误差:
一致收敛中,有三个参数,分别是样本数量 m ,误差阈值 γ ,以及误差概率。
当固定了 m,γ ,我们得出了概率,推导出了一致收敛的结论。下面对剩下的两个参数关联进行说明。
给定误差阈值 γ 与一个 δ>0 ,需要多大的样本数量,才能保证至少有有 1−δ 的概率,使得训练误差与一般误差的差值在 γ 之内?
令 δ=2kexp(−2γ2m) 并对 m 求解,就能得到:
再看另一个。给定样本数量 m 与 δ ,至少有 1−δ 的概率,误差阈值会落在什么范围内?沿用上面的不等号方向,有:
由经验风险最小化公式,我们有如下定义。
使训练误差最小的函数 h^ :
下面,由式(17)一致收敛定理的应用,把 h^ 带入 h ,我们得到:
把式(19)与式(16)代入式(23),能得到下面的定理。
令 |H|=k ,固定任意的 m,δ ,那么至少有 1−δ 的概率,有:
还有一个推论:令 |H|=k ,固定任意的 m,δ ,那么至少有 1−δ 的概率使 ε(h^)≤ε(h∗)+2γ 成立的前提是:
关于VC维有如下两个定义。
定义一:给定一个集合 S={x(i),⋯,x(d)} ,当对于集合 S 的任何一种标记方式,模型集合 H 中总存在着某个假设 h ,可以将其线性分开,则称 H 可以分散 S 。
定义二:对一个模型集合来说,它的VC维,记为 VC(H) ,是其能够分散的最大集合的大小。
下面举一个具体的例子。
对于一个模型集合来说,不管它是有限的还是无限的,都可以根据VC维来获得其一致收敛定理。这里直接给出结论(Ng在课上说,他在读博期间花了一个星期的时间,每天早9晚6一直在看,才看明白VC维证明过程,所以课上也没有给出证明)。
定理:对于模型集合 H ,令 d=VC(H) ,那么至少有 1−δ 的概率,对于模型集合中所有的 h 来说,有:
引理:为使 ε(h)−ε^(h)≤γ 对模型集合 H 中的所有 h ,都有至少 1−δ 的概率成立,那么样本数量必须满足:
对于同一个问题,可以以有多种模型来解决。如一个分类问题,可以用logistic回归、SVM、朴素贝叶斯等,那么如何选择一个最好的模型呢。
首先会想到的是,对每个模型,用训练集合去训练他们,取训练误差最小的模型。
但是这有明显的缺陷,因为这将会得到一个最复杂的模型(比如一个10次多项式),产生严重的过拟合。
下面提供一些选择模型的标准方法。
保留交叉验证也称为简单交叉验证(Simple cross validation),做法如下:
(1)把训练集合随机分成 Strain (如训练集合的70%)与 Stest (如训练集合的30%)
(2)在 Strain 上训练模型
(3)在 Stest 上做测试
(4)选择测试误差最小的模型
有些情况下样本来之不易,比如一些代表着苦痛的临床病例,如果使用上面的简单交叉验证,资源存在着一定的浪费,所以稍作改进就得到了K重交叉验证法:
(1)把样本随机分成k份
(2)留下第1份作为测试集,在其他 k−1 份上训练模型
(3)留下第2份作为测试集,在其他 k−1 份上训练模型
⋮
(n)留下第k份作为测试集,在其他 k−1 份上训练模型
(n+1)选择测试误差最小的模型
这样,训练与测试结束后,样本集中的每一个样本都会产生自己的分类结果。
常见的做法是取 k=10 。
为了使样本能够作为训练集合更充分地在每一次训练中被使用,还有一种留一验证法,即令 k=m ,意思是在整个样本集中只留下一个样本进行测试,其他全部用来训练模型。做法与上面的K重交叉验证法一样,是它的一个极端。
对于一些机器学习问题,可能会遇到非常高维的特征空间,输入特征向量的维数可能非常高,像文本分类问题,特征值很容易就达到了30000-50000个,在如此高维的特征下,模型很容易过拟合,如果可以减少特征的数量,就可以减小算法的方差,从而降低过拟合的风险,对于文本分类的问题,可能只有少数相关特征,能对文本分类起到较大的作用。如“like”、“a”、“the”、“of”这样的单词,对于判断一个邮件是否是垃圾邮件没有帮助。
如何选择与学习算法真正相关的特征,减少与学习内容无关或者影响不大的特征,从而降低VC维,得到更为有效的模型?下面将会提供几种特征选择算法。
前向选择法步骤如下:
①初始化若干特征为特征子集 F=Φ
②对不属于 F 的每个特征,计算添加该特征后模型精度的提升
③选择提升最大的特征
④重复第②步与第③步,直到收敛
收敛的判断依据有,达到预期的一般误差,或者是精度不再上升。
根据前向选择法,我们容易得到后向选择法(Backward search):初始化全部特征,每次减少一个特征计算下降的精度,去掉精度下降最不大的的特征。
前后选择法可以达到较优的特征选择结果,但是它要反复训练模型,计算量很大,尤其是样本数据很大的时候。为了使特征选择更简单,这里提出了一个更简单的特征选择方法——特征过滤法,相比起前后向选择法,它的计算量非常小。
特征过滤法的思路是,计算每一个特征 xi 与标签 y 的相关性,得到每个特征的评分,从而选择出与标签 y 最相关的特征。
得到每个特征的评分之后,使用多少个特征才能可以让模型的效果最好呢?标准的方法还是采用交叉验证,排序选出 k 个最有效特征。
下面是获取评分的两个方式。
互信息(Mutual information,MI)方式,当 xi 是离散型变量的时候,MI的计算方式如下:
KL(Kullback-Leibler)距离方式:
前面的特征选择算法都是直接消减特征,使得模型变得更简单,防止过拟合。接下来会介绍另外一种防止过拟合的方法,它会保留所有的特征,这个方法被称为正则化(Regularization)。
在之前的讲述中,求参数时一般使用最大似然估计法:
在统计学中,还有另外一个学派,称为贝叶斯派,他们认为 θ 是一个随机变量,服从某个先验分布。他们对参数 θ 的最大后验概率(Maximum a posterior,MAP)估计的方式是:
不知道是中西方思维的不同还是个人原因,讲义上的内容有时候会给我一种反过来推导的感觉。正常来说,应该是由一些公理A带着问题出发,从A开始推到B,然后B推到C,C推到D,如此下去,一步一步皆有迹可循;但是讲义中多处出现这种情况:因为D要被C使用,所以直接给出了D,再从虚空中拿出C、或者从别的什么地方推导出C,然后说C是怎么使用D的(B和A也一样)。这就给人一种思维上断层的感觉,难有引导的作用,虽然最后看懂了会感到整个讲述的东西还是清晰的,但是在一开始完全不理解的情况下从头看下来、理解下来的过程实在是太痛苦了。
Ng在前面先给出了一些忠告:避免过早优化以及局部优化,因为这样做很可能无法使系统性能得到提升,让很多时间被白白浪费掉。
①判断算法存在高方差还是高偏差
高偏差:模型本身不合适——需要更多、更好的特征增加模型的复杂度。
高方差:过拟合问题——减少特征数量,降低VC维;或者增加样本数量,使训练更充分。
②目标(损失)函数是否正确(下面用 J 表示损失函数)
J(算法)>J(实际) :令损失函数更收敛(多迭代几次梯度下降/牛顿法)。
J(算法)<J(实际) :损失函数错误,不能反映真实需要,需对其本身进行改进。
①误差分析
一个系统由各个部件组成,对每个部件用基准值代替算法输出,观察性能变化,取得性能提升最多的部件,对该部件进行优化。
②销蚀分析
做一个初始分类容器,将部件逐个剔除,观察性能的下降幅度,去掉无下降或者下降少的特征。
注意:以上两种方法都需要注意增减特征部件的顺序,因为它们的效果是累积的,顺序不同会有相应的影响。
①研究新算法时——仔细构建:深入分析->提取特征->构建算法
②工程应用型——创建->修改法:创建一个较差的系统->诊断->修改->诊断->修改……
③分析数据:对样本数据的理解、预处理很重要
④着眼于真正有用的关键问题
⑤三分之一到一半的时间花在诊断上都是可以接受的