Lec 8-1 噪声和概率目标
有噪声的数据
回顾 learning flow,我们有一个target function,这个target function 会产生一堆的example 资料,除了从target function 得到资料的 y 以外,它的 x 的部分是由某一个我们所不知道的distribution所产生的。未来在测试的时候,我们也会用一样的distribution。我们的演算法A想办法从这些资料还有一个hypothesis set 里面找出一个好的 hypothesis。
我们现在有一个观念说,好的hypothesis set 是 VC dimension 是 finite (有限)的;而好的hypothesis 是Ein 最低的。经过第第七章的推导,我们已经证明,在这样的流程下是成立的。但我们之前也提到过,如果在这个图里加上了noise 噪声,对我们整个理论的推导会不会有影响呢?
有噪声时的推导
我们之前讲pocket演算法时讲到过,我们的资料可能会有noise,例如说银行发信用卡的例子,有一个顾客应该要发信用卡给他,但资料里面因为记录错误或人为错误或其他原因,我们没有发信用卡给他;还有可能有两笔差不多条件的资料,但一个人发了信用卡,另一个人没发给他。对应到2D的图中就是,一个本来是⚪,但被划分成了X;以及两个点叠在一起,但一个是⚪,一个是X。另外,除了y可能有噪音,x也可能会有噪音,即收集顾客资料时搜集得不精准。但在原来的流程里面,我们是没有考虑这些的。
那么有了噪音,我们推导出来的VC bound 是不是还能工作得很好?那么VC bound 的核心是什么? 回想一下,我们在证明VC bound 的时候,一开始的假设都是我们有一个罐子,我们不知道罐子里有多少橘色弹珠,如果我们抓一把出来的话,就可以估计橘色的弹珠是多少。假设这些橘色的弹珠就是我们犯错误的地方。
我们把每一个弹珠就看做一个一个的x,对应到学习里面,就是一个一个的输入,然后我们从某一个几率分布P,把它抽出来。再来呢,弹珠的颜色怎么决定的?我们就看看,我们的hypothesis 的预测,我们的 h 就对应到一个罐子,这个罐子 h 的预测跟我们目标函数 f 的预测到底是一样还是不一样,不一样就记成橘色,一样就记成绿色。这是我们之前推导VC bound 最核心的部分。
那现在呢,如果有噪声会怎么样?噪声的意思是什么,噪声是说,也许我有一个真实的 x 在那边,但是呢,今天我拿到的 y 并不一定是f(x) 。我们想象一种特别的弹珠,它的颜色会不断地变化,每一个时间点,它就有可能从橘色变绿色,或者绿色变橘色,它的颜色不是固定的,而是有时候是橘色,有时候是绿色。如果从时间的比例来切割的话,我们想象每一颗弹珠,它60%的时候是橘色,40%的时候是绿色。这样,每一颗弹珠都是一个变色龙,但从整体来看,整个罐子还是有一个橘色和绿色的比例的。那我们要怎样知道,整个罐子里面,橘色和绿色的比例到底是多少?同样,我可以从中抽样,并且赶快记录抽出来的瞬间那些弹珠的颜色,同样可以估计说那个时刻罐子里橘色弹珠的比例,尽管弹珠的颜色是变来变去的,但因为它整体还是有分布规律的,所以仍然可以抽样估计。
我们也可以把整个VC 的证明重新写一次,用会变色的弹珠写一次,也就是我们现在要想象说,我们的 y ,也就是label 并不是来自 f(x),而是来自取样的过程,来自 P(y|x),也就是已经是这些弹珠的状况下,到底它的颜色会怎么样变来变去,这是由 P(y|x) 决定的。那我们现在有了x 和 y 的分布,只要把VC 的复杂证明再重新写一次,VC bound 还是可以work。
我们可以把这两个部分整合起来,这实际上告诉我们说,只要我们的每一个example 的(x, y) y 来自某一个 joint distribution P(x, y),在训练时是这样,在测试时也是这样,那么整个VC 的大架构都还是能够用得上来。
P( y | x) 我们一般把它叫做 target 的 distribution, 也就是说不是一个目标函数,而是一个目标分布,因为对每一个弹珠来说,把它的预测称为mini-target,对这个x 可以做一个预测,mini-target 对这个 x 上面,到底最理想的预测是什么。什么意思呢?这个distribution告诉我们说,最理想是什么,然后其他不理想部分是什么,哪些是噪声。
例如说:我今天有个P,这个P长这样子,如果我拿一颗弹珠,它是⚪的几率是0.7, 它是X 的几率是0.3,那么请问你要猜⚪还是X?那么大家都更愿意猜⚪,这样错误率只有30%。虽然⚪是比较好的选择,但还是有30%的几率是错误的,那么这30%就可以想象是在这个最好的选择上的噪声。所以这个目标分布可以告诉我们,最好的选择是什么,然后噪声是多少,这是一种对target distribution的看法。
那或者呢,我们把之前一直所适用的deterministic target function ,也就是固定的目标函数,也可以看作target distribution的一个特殊的例子:如果今天,我的 y 跟我的 f (x) 是一样,完全没有噪声,是最好的预测。适用target distribution的时候跟以前使用target function 的时候基本上没有什么不一样。
所以现在我们learning 的目标就有两个部分了:
① 一个是 p (x), 它告诉我们哪些点是重要的,如果某些点的p(x) 很大,它常常会被sample 到,在Ein里面常常会被采到,在Eout的时候它也会比较重要一点。
②这些常常被sample到的点,我们要预测得尽量接近 mini-target, 这个mini-target 是从 P(y|x) 来的,它告诉我们说最理想的mini-target是什么。
在常见的事情上做得好,这就是learning要做的事情。
所以加上噪声以后,现在左上角不再是一个target function了,而是一个target distribution p(y|x),它所产生的 y 会给trainning的部分,并且我们用同样的distribution来产生这些 y 来做测试看 g 到底跟 f 一样还是不一样。
对于pocket算法,在A那边,我们尽量想办法去让Ein越小越好,那这个Ein越小,后面真的会变成Eout 越小?会,因为在有noise 的情况下,只要我们想象说,这个noise,是由这个target distribution来做描述的话,我们还是可以把事情学得很好。
Lec 8-2 错误估计
讲完了噪声,现在来看看,在整个learning flow 里面,我们一直有这个最后一步:想要知道 g 跟 f 到底一不一样。我们整个的推导都在想办法说服人家,我们的g 跟 f 是很像的。我们前面使用的是Eout来衡量 g 跟 f sample出来的点是否一样等等。更一般地来说,实际上要回答这个问题,我们心里要有个想好的说到底要怎么打分数,人家给了你一个 g,你心里有个你想要的 f ,你总要有个打分数的方式来告诉人家好或不好。
那我们之前使用的这个 g 呢,有三个特性:
① out-of-sample:我们看的事情是未来抽样出来的这些 x 。
② pointwise :可以在每一个 x 上个别衡量,而不是说一定要抽10个 x 然后有一个综合的衡量,只用看一个 x 好不好,然后最后做抽样的平均就可以了。
③ classification:我们之前讨论的是二元分类,就看对或不对就行了。classification的错误通常又被叫做 0/1 错误。
好,以上是错误的衡量,很多时候,我们所碰到的错误衡量,都可以像之前做的一样,只考虑每个点上,到底有多少错误,然后再把它加起来或者做平均的方式。这种方式就把他叫做pointwise,每个点上的error measure,用 err 来表示,有了这个 err 之后,我们就可以看看说我们的Ein和 Eout 会长什么样子?
这些 f(xn) 在比较有noise 的情况下,其实就是 y(n)。
那么归纳一下,有哪些衡量错误的方式:
① 0/1 错误:通常用在分类;
② squared error 平方错误: 通常用在预测,实数的回归,用来衡量y~ 和 y 到底有多接近,离得越远,平方的错误越大,而不是像0/1错误一样,对就是对,错就是错。
我们未来会讲更多不同的错误的衡量,这两个基本的先有个概念,想跟大家说,我们对错误的衡量会影响到,到底,我们刚才讲过说,在 p(y | x)的时候,我们有那个最理想的mini-target,迷你的目标,这个迷你的目标跟错误有关,也跟 p(y | x)有关。什么意思呢?好,我们来看看到底错误的衡量,同一个 p(y | x), 这边举了个例子说:
我有三个可能的输出,y=1 的几率是0.2;y=2的几率是0.7; y=3 的几率是0.1,加起来就是1了。那我们来看看说,在这个状况下,最理想的mini-target 长什么样子。
假如你想象的错误是 0/1 错误,当你的hypothesis说是 1 时,可能的错误率是0.8,如果你的hypothesis 说是2呢?那么可能的错误率是0.3, 如果说是3的话,可能的错误率是0.9;当然这个hypothesis 不可能说是1.9,因为这是个分类问题。所以在这个例子里,最好的答案是猜2,这样你只有0.3的几率犯错误。
如果我们今天的错误衡量是squared 呢?平方的错误。你的hypothesis 说是 1,有0.2的机会它没有犯错,有0.7的机会它犯错 (2-1)^2 = 1, 有0.1 的机会它犯错(3-1)^2 = 4, 加权后为0.7*1 + 0.1 * 4 = 1.1。依次算出hypothesis 预测是其他各个值时的错误率,最低的为推测1.9时,为0.29。你看,在0/1错误时不可能出现的1.9,在平方错误时,反而是犯错几率最小的推测。
这里想说明,你要用什么样的错误衡量,配合上说 P 长什么样子,会告诉我们,最理想化的目标函数到底是长什么样子。
一般来说,在0/1 错误里面,一般来说,选P最大的那个就对了;而在squared 错误里面,则需要选的是平均值,也就是最中间的那个,它的加权平均值最小。
现在我们有了错误衡量的观念,错误衡量会影响到 f 到底长什么样子。我们的learning flow里面,不能够只有我们不知道的p 和 f 在那边,实际上必须要告诉我们的演算法说,我们要用什么样的错误衡量。然后,另外呢,我们也希望,用这样错误衡量最后真的来衡量说我最后学到的 g 到底好还是不好。这个错误衡量最好要告诉演算法,如果不告诉演算法怎么去找好的g,可能它自己觉得它把0/1 做得很好,结果我们要算的是squared error,结果可能就天差地别了,所以错误衡量是很重要的一部分。
VC 的整个推导还有整个精神,对于很多不同的hypothesis set ,还有很多不同的错误衡量来说,都会work。也就是说,如果我要做得不是classification,不是分类,而是做回归分析,要输入实数的那个回归分析,把VC 的一些推导做一些定义上的修改,例如我要定义说,我今天是实数输出的VC dimension是怎么算的,做完这些修改之后,我是可以用得到几乎一样,非常类似的VC bound,也会起到作用。
Lec 8-3 算法的错误衡量
案例:指纹辨识
你的分类器可能会犯两种错误:
① false accept:本应被拒绝,而通过了验证
② false reject:本应该通过验证,而拒绝通过
对于我们之前的 0/1 错误分类问题,对两种类型错误的惩罚力度是一样的。但实际的应用中,有可能更侧重于其中的某一类。
① 超市给常客打折:
false accept 虽然不应该给折扣,但错误地给了,影响并不大,无非是少赚一点钱。
false reject 错误地拒绝了客户,客户得不到应有的折扣,客户会非常生气,以后可能再也不来了,对于超市来说可能是很大的损失。
所以对超市来说,false accept 错误没那么糟糕,但false reject 错误影响很大。所以超市心里应该有一个犯错的成本表:
f 为 +1 打折而 g 判定 为-1 不打折时,成本为10,比false accept 大10倍。
② CIA 美国中情局系统身份认证:
false accept:错误地接受登入系统,可能导致数据泄露,产生严重错误
false reject:错误地拒绝登入系统,员工可能会不开心,但对CIA整体的目标来说,没有那么重要。
所以对CIA来说的错误成本表可能是:
f 为-1不接受登入,但g推测说可以登入,false accept 的错误成本是1000,为false reject 的1000倍。
所以不同的应用会想要不同的错误衡量,二元分类不是只搜集二元错误就能搞定,超市打折和CIA登录的案例是不同的两种情形,你想要的分类器是长得不一样的。所以在我们设计演算法的时候就要想办法把这些错误的衡量考虑进去。最理想的情况是你想怎么衡量,就直接告诉演算法具体值,错误的成本是多少,但实际上你不可能跑去问CIA,他们就会告诉你用1000还是5000来做成本惩罚,所以,要生出真正的错误衡量很困难,要把心里想的东西数字化,数学化是很困难的。在设计演算法时,常常会采用替代的方式,通常有两种替代方式:
① 找一些有意义的错误衡量:
pocket 中的 0/1 错误:如果分不对,想象一定是有翻转噪声(+1 变 -1, -1 变 +1),并且量很小。如果量很小的话,如果我们想办法去让 0/1 错误很小,是一个好的方法。所以我们找一些理由说服我们就对了。
平方错误为什么要用平方?如果你噪声跟我原来的偏离是高斯分布的,你想象高斯分布里面那个平方项会在期望里面出现,如果我们把这个平方项减小,有点像说,我们就是在找出最小的高斯噪声在哪里。
这是说服我们自己的方式。我们把它叫做err~,代表它跟使用的真的有兴趣的错误衡量不见得完全一样,不过如果使用者也说不出个所以然来的话,这看起来是我们在演算法里面可以做的一个方式。
不过回头来看,我们在讲0/1的时候,如果我们要算一堆线,要找出Ein最小的那个的话非常地困难—— NP-hard 问题。
② friendly 方式:
所以设计演算法有时非常地困难,不好设计演算法,所以我们常常还会采用另外一种叫做friendly 。friendly的意思是说,很友善,我们比较好设计演算法。我们知道,演算法我们是在寻求,Ein越小越好,我们可能会用一些替代品,让我们更容易地找到,到底哪一些是Ein更小的。例如说:
如果我今天列出来的式子,可以都很容易地就求到closed-form solution,我有一个演算法,你照着这个算下去,马上就算出解来,这是一种。
然后,或者是,在最佳化里面,有所谓的convex optimization, 也就是说今天是一个凸的,所以你在做最小化的时候,只要像一个球从山上面滚下来,滚到山谷里面就好,那这通常也是好的方式。这个我们之后会提到。
我们最需要的是使用者告诉我们他想要什么,不过如果使用者不告诉我们想要什么,我们在设计演算法的时候,我们可能可以采用,1. 能说服我们自己的方式,我们叫plausible;2.对我们演算法设计容易一点的方式,叫friendly。我们未来会讲到更多相关的东西。这个err~对于演算法设计是非常重要的。
所以有了这个err~的概念之后,我们可以把learning flow 再做一个更新:
我们真的有兴趣的是那个err,不过我们在这个地方说,我们的演算法里面,有一个小小的部分,它实际上是用到了某个err~来做的,试图让我们的演算法好过一点,这是很多演算法核心的部分。
如果你今天是CIA的话,我们之前有讲到说,你要的 Ein ,不再是原来的 0/1 错误,而是错误成本加权后的Ein,那你要的Ein到底长什么样子? 答案选②,y = -1, g(x) = +1 是 false accept,错误成本为1000。
Lec 8-4 加权分类
讲机器学习中另一个问题,之前讲二元分类,现在呢,错误在不同的情形下有着不同的重要性,我们把它叫做weighted classification。它的惩罚成本我们把它叫做 cost Matrix,或者Error Matrix, Loss Matrix:
基于cost Matrix,计算Error时就会根据错误的不同情况进行加权:
所以现在我们的 Ein 就变成了有权重的Ein w,我们要怎样才能让Ein w 最小化?
Systematic route(reduction)
回想我们已经学过的算法:
PLA : PLA假设线性可分,跑完后Ein是0, Ein w 当然也是0,PLA根本不用管权重;不过大部分时候不是这样,如果资料不是线性可分的,PLA停不下来,怎么办?
pocket:pocket 演算法有什么步骤跟原来的0/1 的Ein有关的?如果新找到的 w 比口袋里的好的话,就把口袋里的换掉,那么我们就看看这一步就好了:那么现在这个 w 和口袋里的比的话,不是在比有几个错误,而是比谁的加权错误更小。
但我们原来只是说pocket 有一些理论上的保证,能让Ein 在0/1 错误的时候越来越小,那对Ein w有多少的保证?接下来讲怎样修改一下演算法,让pocket有和原来一样的保证。
在原来的资料里面,+1的不变,如果是-1的,就把它复制一千倍,这样的话,假如有一个h,在这份资料上犯了false accept (-1 判为 +1)的错误,因为我们已经把这个点复制了一千次,那么它只要在这个点上犯错误,就相当于在1000个点上犯了错误,我们会收他1000倍的错误成本。在+1 上犯错误和原来一样,因为+1的点没有变。所以在这份新的资料上,不管是+1 还是 -1 的从错误,我们每个都收它一块钱,就跟在旧的资料上 -1 犯错误收1000块钱是一样的结果。所以在右边和原来一样的0/1错误上的pocket 演算法,跟左边这样专门设计一个支持加权成本的pocket演算法,实际上是对等的。
但因为复制的动作一般会增加计算成本、硬件成本、时间成本,所以一般不会真的做复制的动作,而是在设计演算法时,我们脑袋里想着我们有复制的动作。
如果有这个复制的动作的话,那么,配合原来的pocket算法,就能得到新的演算法,这个新的演算法会有什么改变呢:
① 首先这个pocket里面会不会被替换掉,原来是由Ein决定,现在要由Ein w来决定;
② 在pocket里面还有一步跟复制有关,就是我们到底要有多频繁地拜访每一个点,因为Pocket下面有个PLA,拜访点的时候是随机的,假设我复制了一千次,所以我在拜访点的时候,这些被我复制了一千次的点,应该要有一千倍的几率来被拜访到,也就是我要常常检查-1有没有错误,少一些检查+1有没有错误。
这样做的好处是,如果今天权重不是整数倍,而是比如10.26倍,你不能复制出9.26个数据,但你能把拜访的几率调到10.26倍。