前言
学习理论是一系列的理论与方法,用于保证训练出的模型能高效稳定工作。机器学习算法主要有4个阶段:
- 训练样本准备。充分有效的训练样本是模型训练的基本前提。
- 特征选择。训练样本是多种多类的,有效提取能表达其本质特性的量,保证类内一致性和类间区分性,是模型训练成功的重要因素。
- 模型选择。如何选择合适的模型,保证其工作时既有较高的准确率也有较好的抗干扰能力,对整个学习系统有着决定性影响。
- 结果验证。同一个问题或同一组训练样本,可以基于多种特征和模型来学习分类,如何衡量不同模型的好坏也是必不可少的。
训练样本准备
在前面实现的算法中,每个算法对训练样本都有一定要求,比如正负样本的数量需要均衡或者服从其先验分布,GDA中还要求训练样本数量不得小于样本维数等,这些都是从算法原理上分析的具体要求。在目前的条件下,充分有效的数据往往比一个好的模型能表现出更好的结果。通常情况下,样本数量越多,样本越完备,训练出的模型准确性越高。
首先,训练误差为误判的训练样本比例,即:
egin{aligned} varepsilon(h)=frac{1}{m}sum_{i=1}^m{I(h(x_i)
eq y_i)} end{aligned}
那么,在给定训练误差的前提下,训练样本的数量下限约束如下:
- 模型空间有限
假设模型有k种可能,要保证在不低于概率(1-delta)下训练误差不超过上限(gamma),那么训练样本数m需满足:
egin{aligned} m>=frac{1}{2gamma^2}log;frac{2k}{delta}=O(frac{1}{gamma^2}log;frac{k}{delta})end{aligned} - 模型空间无限
假设模型空间的VC维是d,要保证在概率(1-delta)下训练误差不超过上限(gamma),那么训练样本数m需满足:
egin{aligned}m=O_{r,delta}(d)end{aligned}
也就是说样本数量和模型空间的VC维成线性关系。
特征选择
对于一个待解决问题,我们可能会对样本提取多种特征,但特征之间的相关性以及各个特征的重要性通常是未知的。如何选择表现最好的特征?特征选择有封装模型特征选择和过滤特征选择两种方法。这两种方法确定出所有特征的重要性。
- 封装模型特征选择
一种封装模型特征选择方法——前向搜索的过程如下:
A.已选中特征集初始化为空。
B.依次加入1个未选中特征,训练模型并使用交叉验证来选出最佳的那个特征,将其放到已选中特征集中。
C.若仍存在未选中的特征,则继续B步,否则结束。
可以看到前向搜索是逐个增加特征,同样地还有后向搜索,那自然就是逐个减少特征。这两种方法需要训练的次数为(n+(n-1)+(n-2)+…+1=O(n^2)),显然当候选特征数较多时,计算量会非常大。
- 过滤特征选择
相对于到上述前向/后向搜索方法的巨大计算量,过滤特征选择可采用更快速的方法来进行特征选择,其主要思想为计算每一个特征与样本标签的相关性,相关性越高,说明特征越 重要,越能表达样本的本质特性。对于离散特征通常是计算其于类别标签的互信息:
egin{aligned}MI(x_i,y)=sum_{x_i}{sum_y{p(x_i,y)logfrac{p(x_i,y)}{p(x_i)p(y)}}}end{aligned}
通过上述前向/后向搜索或过滤选择的方法,可以将所有特征按其重要性递减排序,最后则需要选择其中前k个作为最终的特征用于训练模型。如何确定k的取值呢?再一次地采用交叉验证的方法来得出最优的k值。
模型选择
模型是对实际问题的一种理想的抽象化描述,合理恰当的模型就如同一座高楼的地基。选择合适的模型来解决问题需要考虑到哪些因素?总体说来就两方面,准确性和稳定性。
-
方差与偏差
通常使用泛化误差来评价模型的性能,泛化误差是针对所有样本应用该模型产生的误差的期望。泛化误差由方差和偏差两部分组成。偏差表征模型对模型的拟合程度,方差表征模型的可变程度。模型越复杂,模型对数据的拟合性越好但需要更多参数,则其对应的偏差越小,方差越大;反之,模型越简单,偏差越大而方差越小。对应地,方差表达了模型的稳定性,而偏差表达模型的准确性。
一个合适的模型需要权衡方差与偏差两个方面,以达到最终的泛化误差最小。方差与偏差的权衡实质上就是欠拟合与过拟合的权衡。模型训练好后,偏差可以比较容易计算,若偏差过大,可逐渐增加模型复杂度以达到要求。但随着模型越来越复杂,方差也在不断增大,且方差也难以直观估计,如何有效防止方差过大呢?可以采用下面的正则化方法。 -
正则化方法
在前面的回归算法以及GDA和朴素贝叶斯中,算法都是基于最大似然推导,即:
egin{aligned} heta_{ML}=underset{ heta}{argmax}prod_{i=1}^m{p(y|x_i; heta)} end{aligned}
然后通过求导直接求得参数( heta)。这里是认为( heta)是一个确定的未知量。
另一种观点是认为( heta)是一个随机变量,服从先验分布(p( heta))。对于给定一个样本集S,理论上可以求出标签y的后验分布,从而求出y的期望作为最终预测值。但这样计算难以实现,在上述条件,我们可以求在给定S的条件下,( heta)最可能是那个值,也就是最大化( heta)的后验概率。这就是正则化方法。
根据贝叶斯公式有:
egin{aligned} p( heta|S)=frac{p(S| heta)p( heta)}{p(S)} end{aligned}
由此可知,采用正则化方法求解的形式为:
egin{aligned} heta_{MAP} &=underset{ heta}{argmax};p( heta|S)\&= underset{ heta}{argmax};p(S| heta)p( heta)\&= underset{ heta}{argmax} prod_{i=1}^m{p(y^{(i)}|x^{(i)} heta)p( heta)}\ end{aligned}
通常认为( heta ;sim; N(0, kI) )。
通过上述正则化方法求得的参数( heta)一般比最大似然函数求得的( heta)范数更小,从而稳定性更高。在很多算法优化时,常常增加一个需最小化的正则项为所有参数的绝对值的和,也就是这个道理。
交叉验证
在前面特征选择和模型选择中,都需要不断验证每个特征或模型的好坏程度,对于给定一个训练样本集,一般采用交叉验证的方法来评估特征与模型。主要的交叉验证有以下几种:
- 保留交叉验证
保留交叉验证是把训练样本分为2部分,用其中一部分训练,另一部分测试。用于测试部分的样本就是保留样本,其通常为所有样本的1/4—1/3,通常取30%。 - K层交叉验证
对于1个特征或模型,保留交叉验证只处理1次,这样验证结果好坏可能会爆RP,采用k层交叉验证可以提升验证结果的说服力。具体作法为:将样本集随机均分为k组,第i次用第i组作为测试样本,其他k-1组作为训练样本,最后将k次验证的结果平均值作为最终结果。通常k取值为10,LWF上的人脸比对测试就是采用这种方法。 - 留1交叉验证
留1交叉验证实质上就是k层交叉验证,只不过k的取值就是样本数量,这样每组只有1个样本。显然这种验证会非常耗时,通常用于样本获取比较困难或代价很大的情况。
结语
对于实现一些研究相对成熟的应用,如行人检测、人脸识别等,很多paper已经做了特征和模型选择的工作,我们实现时最主要的工作是搜集样本;而对于某些需要自己独立解决的问题,则上面的几个方面都能帮助你选择一种最优的方案,同时避免在此过程中走弯路。