[关闭]
@frank-shaw 2015-08-03T18:44:04.000000Z 字数 7681 阅读 2626

网易《机器学习》第11课--学习理论03

网易机器学习 机器学习理论


回顾我们一开始学习的线性回归当中,我们求解具体参数的时候使用的是极大似然估计(MLE)方法,即:

θMLE=argmaxθi=1mP(y(i)|x(i);θ)(1)

在上式中,我们认为θ是一个固定的未知值或向量,通过极大似然估计可以得到θ的值。这是频率学派的观点,该学派认为参数是固定的,使用统计学习方法可以估计出这些值。
在统计学中,还有另一个学派:贝叶斯学派。与频率学派的观点不同,该学派认为参数θ是一个随机变量,服从某一先验分布,即θP(θ)。其中P(θ)表示先验概率。

假设训练集为S={x(i),y(i)},i=1,...,m。后验概率的求解方法如下:

P(θ|S)=P(S|θ)P(θ)P(S)=(mi=1P(y(i)|x(i),θ))P(θ)(mi=1P(y(i)|x(i),θ))P(θ)dθ(2)

注意到公式(2)与公式(1)中条件概率的差别,公式(2)中P(y(i)|x(i),θ)x(i)θ逗号相隔,表示θ是随机变量;公式(1)中P(y(i)|x(i)θ)x(i)θ分号相隔,表示θ为固定值。

在公式(2)中,P(y(i)|x(i),θ)的表达式形式取决于问题所用的模型。比如,你使用贝叶斯Logistic回归模型,则P(y(i)|x(i),θ)=hθ(x(i))y(i)(1hθ(x(i)))1y(i),其中hθ(x(i))=11+exp(θTx(i))

在对新样本xnew进行预测时,使用如下公式计算各个y值的概率:

P(y|xnew,S)=P(y|xnew,θ)P(θ|S)dθ(3)

由(3)式可知,每个y值对应的概率都可求得,那么可求得期望(最终预测函数)为:
E[y|xnew,S]=yP(y|xnew,S)dy(4)

但是,利用公式(3)(4)的方法求解时,由于θ的积分使得计算量变得很大,当θ是高维向量时,往往是一个NP难问题。所以在实际应用中,往往通过最大化后验概率得到参数θ的估计值,然后将θ代入到模型中直接预测。该方法称为极大后验概率(Maximum A Posteriori,MAP)方法,计算公式如下:
θMAP=argmaxθi=1mP(y(i)|x(i)θ)P(θ)(5)

比较θMLEθMAP,可知道差别仅仅在于θMAP末尾添加了先验概率P(θ)而已。

在实际应用中,普遍选择正态分布作为θ的先验概率,即θN(0,τ2I)。实践表明,采用MAP方法得到的参数比使用MLE方法得到的参数更加不容易过拟合,即降低了过拟合的概率。
在之前的笔记中,已经分析了在线性回归模型中平方Loss与极大似然估计MLE的关系,那么MAP方法与此相对应的Loss函数该如何解释呢?

mini=1y(i)θTx(i)2   (MLE)mini=1y(i)θTx(i)2+τθ2   (MAP)(6)

我们看到MAP方法需要优化的Loss函数目标和MLE相比多了一个τθ2τθ2被称为正则项。正则项在很多地方使用,如改进SVM算法中的惩罚项。

在线学习

之前学的算法都是批处理算法,即在训练集上得到模型后,再去对测试集或者训练集本身进行评测,得到训练误差或测试误差。而在线学习并不是这样,而是首先有一个初始的分类器,当第一个样本到来时,对该样本进行预测,得到预测结果,然后利用该样本的信息对分类器进行更新;然后第二个样本到来时做同样的操作,以此类推。这样,我们就对m个样本都有一个预测值,只不过它们都是在训练过程中得到的。对这些预测值进行统计,就得到了在线训练误差。这就是过程上在线学习和批处理学习的不同之处。

对于感知器算法来说,如果正负样本线性可分,那么其在线学习算法也是收敛的。

感知器在线学习收敛性证明

为证明方便,我们使用标签y{1,1},其假设函数为:

hθ(x)=g(θTx)={1,   θTx01,θTx0

感知器算法参数更新法则:当一个新样本(x,y)到来时,若hθ(x)=y,则参数不变,否则更新法则为:θ:=θ+yx

下面证明感知器算法在线学习收敛(在正负样本线性可分的条件下)。
首先,解释何为正负样本线性可分。设样本用{x(i),y(i)},i=1,...,m 来表示,假设对所有先行样本,均有二范数x(i)2D。线性可分的意义即为存在一个单位向量u(u=1),对所有样本,均存在如下公式:

y(i)(uTx(i))γ

上式的解析为:当y(i)=1,(uTx(i))γ;当y(i)=1,(uTx(i))γ;因此,单位向量u至少以间隔γ将正负样本分离。

在这样的前提下,可证明如下收敛定理:

线k(D/γ)2

证:感知器算法只有在错误分类时才会更新参数,令θ(1)=0⃗ ,令θ(k)表示第k此错分时的参数,假设第k次错分发生在样本(x(i),y(i))上,则有 g((x(i))Tθ(k))y(i),意味着:
(x(i))Tθ(k)y(i)0

另外,由θ(k+1)=θ(k)+y(i)x(i),有:
(θ(k+1))Tu=(θ(k))Tu+y(i)(x(i))Tu(θ(k))Tu+γ

根据递推法则,可得:
(θ(k+1))Tukγ

类似的,我们可得到:
θ(k+1)2=θ(k)+y(i)x(i)2=θ(k)2+x(i)2+2y(i)(x(i))Tθ(k)θ(k)2+x(i)2θ(k)2+D2

也由递推法则可得:
θ(k+1)2kD2

将上面得到的两个式子放在一起,有:
kDθ(k+1)(θ(k+1))Tukγ

第二个不等式来自于基本事实:u是单位向量(zTu=zucosϕzu,其中ϕuz之间的夹角)。
因此,可得:
k(D/γ)2

得证。

机器学习算法应用建议

机器学习中有很多算法,那么在实际问题中该如何使用这些算法呢?同样的算法对同一个问题,不同的人做出的结果可能截然相反的。当算法遇到瓶颈时该朝什么样的方向来对算法加以改进?相应的建议就是为了解决这一类问题。这些建议是针对实际应用机器学习算法应用到实际问题上的,对研究新的算法并没有太大帮助。
该部分分为三个主要内容:

在对具体的内容分析之前,先介绍一个很有用的建议:避免过早优化
在我们进行项目开发或课题研究时,往往会遇到一些问题,在没有弄清楚问题之前,即没有明确的证据说明问题确实出自某个原因之前,我们往往想当然的认为对自己认为出问题的地方进行改进或优化,运气好时能够解决问题,运气不好时则会浪费大量时间。此外,在项目开发时,过早的优化代码段(虽然代码段并不是瓶颈)。虽然该段代码被优化得很快,但对系统性能的提高的作用确实微乎其微,可以说是浪费了时间。而对研究来说,过早地去做一些不能解决问题的事情,浪费的时间可能会更多。因此我们必须找到能够判断问题关键所在的办法,这就引出了一下内容:

ML算法诊断

设想垃圾邮件过滤问题,目前的研究现状如下:
——>在5000个特征中选择了100个特征;
——>使用贝叶斯Logistic回归模型算法,用态度下降优化目标函数;
——>目前的误差率为20%。
显然,20%的误差率难以接受,那么可能的解决办法如下:

  1. 更多的数据:数据量变多往往有助于模型变好;
  2. 更少的特征;
  3. 更多的特征;
  4. 选择更好的特征;
  5. 梯度下降法多迭代几次:解决算法没有收敛的问题;
  6. 尝试牛顿方法:牛顿方法更容易收敛;
  7. 调整目标函数中γ的值;
  8. 使用SVM算法(一般不建议随意更换算法);

可能的办法数以百计,但我们暂时只列出这么多吧。对于上述8种改进方法,如果一一尝试的话会非常耗时。比如,第1种收集更多数据会达到好效果(通常是这样),但是对于某些实际应用来说,收集数据是非常耗时的事情。盲目行动的效果并不好

面对以上8种方法,我们如何选择呢?拼rp?当然不是。如果我们能够找到几种标准,排除上面的绝大多数,只留下一两种,那么成功的概率会高很多。

方差/偏差分析
第一个标准就是判断问题是出在高偏差还是高方差上。一般说来,高方差针对的是过拟合问题,即训练误差很小但生成误差很大。而高偏差针对的是模型本身不合适的情况,如特征数目过少等问题,表现即是训练误差和生成误差都很大。
方差偏差分析
由左上图可看到,在高偏差下,训练误差和生成误差都会大于预期的性能。这个时候,增加样本的数目是不可能解决问题的,可以看到Test Error和Train Error到最后已不再随着样本数m的增大而变化。
由右上图可以看到,在高方差下,可以比较训练误差和测试误差,如果它们之间相差很大,那么通过增加样本数目使得系统的过拟合程度减小,提高性能。(看Test Error和Train Error的差距来判断高方差or高偏差)

根据上面的分析,我们就可以对8条办法的前四条进行分类了:更多的数据、更少的特征解决的是高方差的问题;更多的特征和更好的特征可以增加模型的复杂度,提高模型在数据中的拟合程度,因而对应解决高偏差问题。

是否收敛于目标函数是否正确的判断
考虑下面的情景,仍然是针对垃圾邮件分类问题:
——>使用贝叶斯Logistic回归模型(BLR)可以达到正常邮件上2%的错误率,垃圾邮件上2%的错误率;
——>使用SVM模型可以达到正常邮件上0.01%的错误率,垃圾邮件上10%的错误率;

对于BLR来说,正常邮件上2%的错误率是不能容忍的,因为一般人一般情况下不愿意错过朋友发来的邮件或重要邮件。显然,此时SVM比BLR要好。
此时我们会有两个可能的分析:
a.贝叶斯Logistic回归模型是否收敛?
b.贝叶斯Logistic回归模型的目标函数是否选对?

这两者情况都有可能造成结果中SVM由于BLR。即如果BLR没有收敛,而SVM收敛,那么SVM效果更好;如果模型的目标函数没有找对,那么在当前的目标函数上,BLR可能逊于SVM,但BLR在正确的目标函数上却能达到更好的效果,这也是有可能的。

对于上面SVM优于BLR的问题,我们根据实际情况找到实际的需要优化的函数:

α(θ)=1mi=1mw(i)1(y(i)=hθ(x(i)))

加入w(i)的原因:通过对正常样本和垃圾样本的错误的惩罚进行加权,我们可以更好地将目标锁定在提高垃圾邮件识别率的同时更好地保护正常邮件不被错判。
根据假设可知:α(θSVM)>α(θBLR)
现在,我们可以判断在BLR的目标函数(即似然函数J)上θSVMθBLR的表现,来判断到底发生了了什么问题。可能的情形如下:
(1) α(θSVM)>α(θBLR)J(θSVM)>J(θBLR)
这就表明BLR的算法收敛程度还不够,还需要继续迭代。原因是这样:参数θBLR的目标就是为了让J(θ)实现最大化,但现在J(θSVM)>J(θBLR)则表明θBLR并没有实现最大化。

(1) α(θSVM)>α(θBLR)J(θSVM)<J(θBLR)
这就表明BLR的目标函数有待改进,选得不够好。原因是这样:一个不能使得J(θ)实现最大化的参数J(θSVM)取得的效果竟然好过使得使得J(θ)最大的那个θBLR,那就肯定出问题了。表明J(θ)的形式需要改变。

因此,我们就可以对8种解决方案中的后4种做出分类了。算法迭代次数增加与尝试牛顿方法是为了收敛性更好。调整γ与使用SVM则是改进了目标函数。

如何开始ML问题的解决

在ML上开始研究一般有两种做法:
第一种是仔细构造法。对问题进行深入的分析,提取正确的特征,收集需要的数据,设计正确的算法结构,这样往往能够一次就得到较好的具有可拓展性的算法。
第二种是创建-修改法。这种做法一般是先创建一个较差的系统,然后利用上面的诊断法对系统进行修改,从而得到较好的系统。这种做法比较广泛应用,因为互联网上的成功产品,往往不是最好的,而是最早的。

如果在ML上开始做解决方案的话,一个较好的建议是先对数据进行分析,比如为什么数据中的这些属性值是负的。当找出数据中的规律或者数据中的错误的时候,往往会发现系统性能差不是需要更复杂的算法,而是更加强大的预处理。
在做研究的过程中,要把注意力集中在关键问题上,不要轻易的相信某些结论对算法有用而花大量的时间在那些理论上。Ng谈到自己的经验时,说道花在设计、诊断上的时间通常都很有价值;一般来说,三分之一或者一般的时间花在诊断和设计上都是可以接受的。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注