本文共 4929 字,大约阅读时间需要 16 分钟。
网易公开课,第10,11课
notes,
Model Selection
首先需要解决的问题是,模型选择问题,如何来平衡bais和variance来自动选择模型?比如对于多项式分类,如何决定阶数k,对于locally weighted regression如何决定窗口大小,对于SVM如何决定参数C
For instance, we might be using a polynomial regression model , and wish to decide if k should be 0, 1, . . . , or 10. Alternatively, suppose we want to automatically choose the bandwidth parameter τ for locally weighted regression, or the parameter C for our ℓ1-regularized SVM.
Cross validation
最典型的就是交叉验证,有3种方法,
hold-out cross validation (also called simple cross validation)
用70%的数据作为训练集,用30%数据作为测试集,找出训练误差最小的h(7:3是比较典型的比例) 这个方法的问题是,我们浪费了30%的数据,即使你在选定model后,拿整个数据集再做一遍训练,也无法改变你只用了70%来选择最优模型的事实 尤其对于一些领域,数据集的收集的代价是很高的,就不太合适k-fold cross validation,通常k=10
把数据集随机分为k份,用k-1份来训练,用剩下的那份来测试,这样的过程可以进行k次(不同的组合) 最终选取平均测试误差最小的h 这个的问题,显然是计算量比较大leave-one-out cross validation
k-fold的特例,k=m,即k等于样本数,一份就是一个样本 适用于样本非常少的情况
Feature Selection
One special and important case of model selection is called feature selection.
对于比如文本分类问题,垃圾邮件分类,会有很大量的features,但其实只有其中一小部分和分类问题相关,比如很多stop word,a,the,都和分类不相关,而buy,shop等比较相关的只是一小部分,所以我们需要减少feature数来降低复杂度Given n features, there are possible feature subsets, thus feature selection can be posed as a model selection problem over possible models.
显然计算和比较那么多的模型是不现实的,所以我们用heuristic search procedure,启发式的方式,去找到一个good feature subset,
forward search OR backward search
属于贪心算法,forward是一个个加,backward是一个个减,然后每次加减都通过cross validation做次局部最优的选择,即加个误差最小的,或减个误差最大的
这种需要通过训练测试的方式来选择的,称为wrapper model feature selection,因为它就像wrapper,需要反复调用学习算法来评估feature。 wrapper模型效果还是不错的,问题就是计算量比较大,需要调用这个数量级的次数的训练算法Filter feature selection
效果没有wrapper那么好,但是比较cheaper,思路就是计算每个feature的score S(i) that measures how informative each feature xi is about the class labels y,最终我们只需要pick分数最高的那k个features就可以了,最常用的score就是mutual information
In practice, it is more common (particularly for discrete-valued features xi) to choose S(i) to be the mutual informationMI(xi, y) between xi and y:为了更直观的理解mutual information,这个式子还可以表示成,Kullback-Leibler (KL) divergence:
这个KL表示p(xi, y) and p(xi)p(y)的差异程度,
如果x和y是没有关系的,即独立的,那么 ,即KL-divergence为0
,这篇综述很好,看这个就ok了
Bayesian statistics and regularization
这节内容主要讨论如何用贝叶斯规范化来解决过拟合(overfit)问题
可以想想前面碰到的回归问题,都是用的最大似然估计,
即找到让训练集最为正确的那组参数,这样很容易过拟合
从统计学上看,最大似然估计,是一种frequentist statistics,即仅仅用频率来客观的估计概率,不加入任何主观的先验观念 对于这里,就是完全根据客观出现的训练集来估计真实的参数 并且对于frequentist 而言,最优参数是客观存在的,这里只是估计出他的真实值,所以式子中用的是“;”而不是“,”,表示本身并不作为条件Frequentist or Bayesian
那么在统计学中,对应于frequentist statistics的学派,叫Bayesian statistics
对于Bayesian而言,首先参数是个随机值,任何值都有可能,只是出现概率不同而已 再者,对于未知的参数,Bayesian会先给出主观的先验概率p()作为基础,再结合客观频率,综合给出结果根据bayes定理,S表示训练集
分子比较好理解,分母我不理解,不过没事,反正仅仅需要比较大小,分母都是可以略去的
于是可以得到,
可以看看和上面极大似然的差别,
首先这里是作为条件的,注意是“,”而不是前面的“;”,但这其实并不影响p的计算,无论“,”或“;”,p的计算公式都是一样的 所以真正的不同只是加上了先验概率p()为何加上先验概率就可以防止过拟合?
对于先验概率p(),常常是使用高斯分布(当然也可以使用其他的,但是高斯最常见)
你可以想想对于均值为0的高斯分布,如果要让p() max,那么就越接近于0
当为0时,相当于消除了一维,就达到了balance模型复杂度的效果实际的效果证明, Bayesian logistic regression在文本分类上有很好的效果,即便对于文本分类,特征数n要远远大于训练集m
下面的内容其实在第11课占很多的时间,但是在讲义中是没有的
关注的问题,其实可以说是ML实战,觉得挺有意义的,所以记录在这里Debugging Learning Algorithms
在使用ML算法,一定会碰到的问题是,如果算法实验的效果或准确率很差,我们应该怎样改进?
比如,用贝叶斯logistics回归做垃圾邮件过滤,结果误差有20%,如何改进?
原因有可能有很多, 训练样本集不够多,增加训练样本 (高variance) 特征太多,减少特征数 (高variance) 特征太少,增加特征数 (高bias) 特征选取的不恰当,选取更好的特征 (高bias)梯度下降迭代的不够多,没有收敛 (优化算法问题)
或应该使用其他的最优化算法,如牛顿 (优化算法问题) 目标函数中的参数不够合理,调节参数 (目标函数问题) 可能应该使用SVM。。。。。。 (目标函数问题)当然可能有几百种改进的方法,其中一些是有效的,也许是无效的,但都会耗费很多的时间
所以,我们需要准确的找到优化的方向首先需要确定的一点就是,当前的误差是高bias还是高variance?
这个其实很简单,
如果训练误差远远小于测试误差,那么一定是高variance误差 如果是高bias,那么训练误差也一定会很大,比如用线性函数去拟合二次函数那么对于高variance误差,增加训练集就会比较有效果
因为随着训练集m的增大,测试误差会逐渐变小,而训练误差会逐渐变大,从而缩小他们之间的差距 为何训练集m变大,训练误差会变大,因为训练集越大,就越难完美的拟合而对于高bias误差,训练误差已经超出预期,那么增加训练集是没有任何效果的,因为增加训练集只会更多增加训练误差,而也无法减小测试误差
其次,需判断的是,到底是因为优化算法有问题导致没有收敛,还是目标函数本身就选择的不对? 比如还是上面的例子,
你用贝叶斯logistics回归做垃圾邮件过滤,发现结果不是很满意,于是你使用SVM试了下,发现结果比较好,但是出于简单和效率考虑,你还是想用贝叶斯logistics回归 此时如何定位问题? 这里对于贝叶斯logistics回归或SVM,最终的目标都是拟合出最优的θ参数,即找到使目标函数J(θ)最大的θ 那么这里我们可以把logistics回归或SVM得到的参数θ1和θ2,都代入贝叶斯logistics回归的目标函数J(θ)中,如果J(θ1) < J(θ2), 即SVM确实找到了更优的参数θ,那么一定是我们的优化函数有问题,没有收敛到最优参数
如果J(θ1) > J(θ2), 即SVM找到的参数不是更优参数,但是他实际的分类效果却比贝叶斯logistics回归好,说明当前的目标函数无法很好的描述这个问题,需要改变目标函数其实我觉得这个方法有个问题,就是一定要找到类似SVM这样比当前算法效果好的相应算法
NG又举了个他做直升机自动驾驶的例子,如果发现效果不好,可能的原因有 直升机模拟器,无法模拟真实环境 使用的强化学习算法有问题,无法收敛 目标函数或Cost function有问题那么他是如何来进行诊断的?
首先他要确认是否是模拟环境的问题,方法是用训练出的参数,分别在模拟环境和真实环境中实验,如果模拟环境中运行的很好,而真实环境的效果很差,那么就是模拟环境有问题 再者,和上面的思路一样,要找到一个比当前效果好的case 上面使用的是SVM,而这里他是让人来实际驾驶直升机从而得到一组参数,人驾驶的效果一定是很好的 下面就和上面一样,如果这组参数是更优参数,那么就是最优化算法的问题,否则就是目标函数有问题
Error Analysis
这个其实是一个比较简单的思路
因为在实际系统中,会有很多组件组成,当我们要优化这个系统时,首先需要知道这个系统的bottleneck在什么地方
比如,NG举例,从图片中识别人的系统, 会有,背景去除,人脸识别,眼睛识别,鼻子识别,logistics回归算法。。。 到底优化哪个会对系统的整体提升最大方法是,如果要知道这个模块提升的空间,就将该模块替换成基准值,即100%正确的值,这样看系统准确率的提升
比如将背景去除替换成基准值时,准确率从80%提升到81%,那么你就知道这是不值得优化的,因为就是优化到100%也只能提升整体的1%
如果将人脸识别替换成基准值,准确率从80%提升到90%,那么你就知道这就是系统的bottleneck另外一个思路也很自然,就是当系统有很多特性的时候,你想知道到底每个特性对系统的贡献有多大?
比如对于垃圾邮件分类,你加了一些特别的特性,发送IP,标点符号,语法分析 如果想知道,每个特性对系统的贡献,方法是,把这个特性拿掉,看看系统的损失是多大,称为ablate分析
转载地址:http://wtgfo.baihongyu.com/