归纳
我们认识世界有两个重要途径——演绎deduction和归纳induction。演绎是从已知前提出发进行逻辑推断的过程,归纳则是将一些观测或者信息推广至一般化的过程。可以看到,“从已知前提出发”是要进行演绎的必须条件,一个没有任何知识的大脑要进行演绎也怕是难为无米之炊。那么,我们是否可以将这个世界的知识编码进机器,让机器通过逻辑推理规则来演绎,以此来达成人工智能(artificial intelligence, AI)?20世纪时对此就有过一些尝试,但难度可想而知,由人来把知识总结出来再教给机器是一件多么机械而棘手的事,这种硬编码知识的知识库方法最终也逐渐淡出人们视野。这启发我们,机器想要智能,我们可以考虑让它有自己获取知识的能力——我们的思路就由deduction转移到了induction。我们可以提供给机器足够的样例,让其从样例中进行“归纳”,这就是世人所称的机器学习(machine learning)。“学习”这一名字非常贴切,我们人类从一无所知到略有所知正是靠着学习这一过程。如今正值大数据时代,“提供足够的样例”很多时候也不再是件难事。
那么,如何机器学习?或者,更具体地说,机器如何处理数据?一般地,我们会将数据集的每个样本\boldsymbol x都用一系列特征(feature) x _ i (i=1,2,\dots)来表示。有时,学习的目标是学习出每个\boldsymbol x与其对应的一个标签(label) y之间的关系,这种叫做监督学习(supervised learning),例如当y取值是一些类别时,这个任务就是分类(classification),当y取值是连续的实值时,这个任务就是回归(regression)。有时,学习的目标是学习出\boldsymbol x一些普遍的结构规律,这种叫做无监督学习(unsupervised learning),例如在给定一些\boldsymbol x的基础上,我们希望机器在学习后能生成和它们类似的新\boldsymbol x。有时,我们要根据这些数据进行决策、行动,机器就在一个动态的环境中学习,通过与环境的互动获取经验,从而变得更为“智能”——从之前的历史信息中学习,得出接下来的最优行动。这种叫做强化学习(reinforcement learning)。这些就是机器学习的三个经典分类。
这种分类只是习惯上的分类,监督学习和无监督学习之间的界限就是模糊的。例如要无监督地学习p(\boldsymbol x),我们可以拆分成监督学习的问题:p(\boldsymbol x)=\prod p(x _ i|x _ 1,\dots,x _ {i-1});另一方面要监督学习p(y|\boldsymbol x),可以先无监督学习p(\boldsymbol x,y),再得到p(y|\boldsymbol x)=p(\boldsymbol x,y)\mathbin/ \sum _ {y'} p(\boldsymbol x,y')。
泛化
为了衡量学习的效果,需要确定用以衡量的定量的准则。对于一些任务,有一些简单的准则可供使用,例如分类里,分类准确率就是常用的可选项,再如强化学习以行动累积的回报作为衡量准则。对于某些任务,尤其是无监督学习任务,准则的选用则没有那么显然。准则一旦选定后,就可以定量地计算机器在数据集上的表现,要学习的目标也就量化成待最大化或最小化的目标函数,这就变成了一个最优化问题。
我们会希望机器在给定的一些样本进行训练(training)后,机器能在给定样本之外的数据里也能有良好的表现,也就是“泛化”(generalization)。数据集会被分为训练集和测试集,测试集就是用来测试(test)、评估机器的“泛化”表现。要很好地泛化,我们需要对数据的采集,或者说数据的生成,有一定的要求,最常见的就是假设训练集、测试集的所有样本都是独立同分布的(i.i.d.),我们记这个分布为p _ {\mathrm{data}}。IID时,训练集上的期望表现等于测试集上的期望表现,于是训练得好时就代表有了好的泛化。
过拟合、欠拟合
在实际的训练中,我们不知道p _ {\mathrm {data}},计算的只是在训练集上的样本的经验分布的表现,这就导致了训练集上的效果和泛化效果之间产生一定差异的现象。当训练集表现很好而测试集很差时,这就是所说的“过拟合”(overfitting)现象。这是因为机器除了学普遍的p _ {\mathrm{data}}上的规律外,还将随机性导致的样本独有的特性也学习进去了。与过拟合相对的是欠拟合(underfitting),表现为训练集上的表现很差,模型尚未能很好地拟合数据。
形式地说,如果训练集的数据确定的经验分布为\hat p _ {\mathrm {data}},那么我们想要优化的目标函数和实际优化的目标函数分别为
L=\mathbb E _ {\mathbf x\sim p _ {\mathrm {data}}}[l(\mathbf x)],\quad \hat L=\mathbb E _ {\mathbf x\sim \hat p _ {\mathrm {data}}}[l(\mathbf x)]=\frac1n\sum _ {i=1}^n l(\boldsymbol x _ i),其中l(\mathbf x)表示\mathbf x的优异衡量(不妨设这是个要最小化的损失函数),\{\boldsymbol x _ i\} _ {i=1}^n表示训练集。学习得到的模型最小化了\hat L,而当优化后的\hat L与L相去甚远时,过拟合就发生了。另一方面,在统计学里我们已经知道\hat p _ {\mathrm{data}}一致地收敛于p _ {\mathrm{data}},那么
\hat L\to L,\quad n\to\infty.因而训练集样本量n越大,过拟合越不易发生。学习也就越好。
正则化
过拟合与欠拟合,与我们选用的模型的复杂度直接相关。例如一个用带微扰的二次函数生成10个样本,我们可以用一个九次函数模型完美拟合样本,但由于选用模型的复杂度太高,在这10个样本点之外的点拟合效果可以相当的差;类似地,只用一次函数拟合,显然“欠拟合”了。
一种控制模型复杂度的办法就是让我们可选的模型不能太多,亦即,控制假设空间(hypothesis space)的规模。例如九次函数可选的就比二次函数多太多了。
再例如,机器学习常用正则化(regularization)的方法控制模型复杂度。例如,回归问题中假设我们选用参数为\boldsymbol\theta的参数模型,要使得目标损失函数,训练集的均方误差\mathrm{MSE}(X _ {\mathrm{train}};\boldsymbol\theta),尽可能小。正则化则修改了目标函数,为
L(\boldsymbol\theta)=\mathrm{MSE}(X _ {\mathrm{train}};\boldsymbol\theta)+\frac\lambda2\boldsymbol\theta^\mathsf T\boldsymbol\theta.其中\lambda是事先选好的数,除以2仅是习惯上为了推导的方便。第二项即是正则项,它使得训练出的模型偏好于L2范数较小的。
超参数、交叉验证
像上面的\lambda这样,要提前给定的数,称作超参数(hyperparameter)。超参数的选取一般并不容易,因而一般会从训练集中进一步划分出一份验证(validation)集,用以选取超参数,这个过程即是“调参”(parameter tuning)。由于测试集不能用于模型选择,自然也不能用于超参数的选取。
对于测试集,一般占比比较小(相对于训练集),可能会出现\frac1{n _ {\mathrm{test}}}\sum _ {j}l(\boldsymbol x _ {j})和\mathbb E _ {\mathbf x\sim p _ {\mathrm {data}}}[l(\mathbf x)]有较大相差的情况。因而为了更准确地估计泛化误差,可以考虑采用“交叉验证”(cross-validation)的方法。k折交叉验证是将数据集划分为k个子集,每次用一个子集作为测试集,其余作为训练集,这样就可以用k次平均的测试误差来估计泛化误差。
算法
当我们有了数据集及其划分,再根据评估准则确定一个目标函数(一般是取为要最小化的损失函数),以及选定假设空间之后,就可以执行学习算法了。一个经典的机器学习算法核心步骤如下:
- 得到训练集和测试集、确定损失函数、假设空间;
- 构建一个初始模型;
- 对损失函数进行优化。
优化完毕后输出的模型就可以在测试集上评估泛化效果了。
举例来说,优化的经典常用算法是随机梯度下降(stochastic gradient descent, SGD)。计算损失函数对一些参数的梯度,数据集较大时只在一部分样本上计算来估计,按这个梯度进行参数更新,从而得到优化。
一般我们可以将机器学习的模型分为参数模型和非参数模型,其区别相当于参数统计与非参数统计。如果我们建立的模型数学形式已知,而只包含固定个数的有限个未知的参数,那么这个模型就可以说是参数模型;否则,就是非参数模型。
首先来看参数模型,设模型形式为p _ {\mathrm{model}}(\mathbf x;\boldsymbol \theta),表示我们对数据生成分布的估计。我们有n个数据x _ 1,\dots,x _ n\sim p _ {\mathrm{data}}(\mathbf x)。要估计\boldsymbol \theta时,统计领域里习惯划分出两个派别:频率派和贝叶斯派。
极大似然估计
假设我们的建模是合适的,我们先视数据生成分布中的\boldsymbol \theta为固定的实值参数,那么似然函数就可以写作p _ {\mathrm{model}}(X;\boldsymbol \theta)=\prod _ i p _ {\mathrm{model}}(\boldsymbol x _ i;\boldsymbol \theta),那么\boldsymbol \theta的极大似然估计(maximum likelihood estimation, MLE)就是
\boldsymbol \theta _ {\mathrm{MLE}}=\operatorname*{\arg\max} _ {\boldsymbol \theta}\sum _ {i=1}^n\ln p(\boldsymbol x _ i;\boldsymbol \theta).习惯上,我们会取对数从而便于计算,这样就不用计算n个概率的乘积了。
MLE是极为常用的估计方法,因为它可以说是渐进最优的。如果\hat {\boldsymbol \theta}满足\hat{\boldsymbol \theta}-\boldsymbol \theta\stackrel d\to N(\boldsymbol 0,V),那么“渐近方差越小”,我们就认为这个\hat {\boldsymbol \theta}越好。当n充分大时,\hat {\boldsymbol \theta}几乎是无偏估计,由Cramér-Rao不等式,方差有下界I(\boldsymbol \theta)^{-1},即Fisher信息的逆。那么,如果渐进分布的V恰为I(\boldsymbol \theta)^{-1},那么该\hat {\boldsymbol \theta}自然是最好的。MLE的性质恰好就是它满足这个渐进分布,因而可说是渐进最优的。(非严格分析)
还有一种理解MLE的方式是MLE最小化了p _ {\mathrm{model}}和经验分布\hat p _ {\mathrm{data}}之间的KL散度:
\begin{aligned}
\operatorname*{\arg\min} _ {\boldsymbol \theta}D _ {\mathrm{KL}}(\hat p _ {\mathrm{data}}\|p _ {\mathrm{model}})&=\operatorname*{\arg\min} _ {\boldsymbol \theta}{-}\mathbb E _ {\mathbf x\sim \hat p _ {\mathrm{data}}}\Big[\ln\frac{p _ {\mathrm{model}}(\mathbf x)}{\hat p _ {\mathrm{data}}(\mathbf x)}\Big]\\
&=\operatorname*{\arg\max} _ {\boldsymbol \theta}\mathbb E _ {\mathbf x\sim \hat p _ {\mathrm{data}}}\ln p _ {\mathrm{model}}(\mathbf x)\\
&=\boldsymbol \theta _ {\mathrm{MLE}}.
\end{aligned}
Bayes估计
现在我们换到Bayesian的思路。这种思路首先将我们对\boldsymbol \theta的所有认识归结到一个分布,称作先验分布(prior distribution)中,设为p(\boldsymbol \theta)。然后用数据来更新对\boldsymbol \theta的认识,由贝叶斯定理,这个过程可写作
p(\boldsymbol \theta|X )\propto p(\boldsymbol \theta)p(X|\boldsymbol \theta).这个p(\boldsymbol \theta|X)就叫后验分布(posterior distribution)。
Bayes估计会使用整个后验分布来作为\boldsymbol \theta的估计,而不是仅采用一个点估计,这是与MLE的重大区别之一。例如对新数据\mathbf x的预测,Bayes估计为
p(\boldsymbol x|X)\boldsymbol =\int p(\boldsymbol x|\boldsymbol \theta)p(\boldsymbol \theta|X)\, \mathrm d\boldsymbol \theta.
尽管如此,对于点估计的需求还是非常常见的。一种方案是在后验分布中取最大后验估计MAP (maximum a posteriori),此即选择使得后验概率最大的\boldsymbol \theta:
\boldsymbol \theta _ {\mathrm{MAP}}=\operatorname*{\arg\max} _ {\boldsymbol \theta}p(\boldsymbol \theta|X).另一种理解MAP的方式是MAP最小化了后验期望损失:
\operatorname*{\arg\min} _ {\boldsymbol \theta}\int (1-\delta(\hat{\boldsymbol \theta}-\boldsymbol \theta))p(\boldsymbol \theta|X)\, \mathrm d\boldsymbol \theta=\operatorname*{\arg\min} _ {\boldsymbol \theta}[1-p(\hat{\boldsymbol \theta}|X)].其中\delta(\cdot)表示Dirac delta函数。类似地,当损失函数从1-\delta(\hat{\boldsymbol \theta}-\boldsymbol \theta)换为其它函数时,得到其它点估计,例如取(\hat{\boldsymbol \theta}-\boldsymbol \theta)^2时即为后验均值\mathbb E[{\boldsymbol \theta}|X]。
非参数模型
非参数模型对数据结构的假设更少,因而提供了较高的灵活性。
举例来说,监督学习里,k近邻法、核方法、支持向量机(SVM)、基于树的方法、集成的方法,都是很经典的非参数模型。我们通常需要一个相似度度量,或者一个距离度量,模型则依赖新样本\boldsymbol x与诸训练集数据\boldsymbol x _ i的相似度或距离构建。在这个度量的基础上构建模型,最简单、最基础的构建例如投票(对分类),以及平均(对回归),在此基础上的复杂构建则可以得到高级的模型。集成学习则可以将多个模型进行恰当的结合,以得到比单个模型更好的集成模型。
再如,无监督学习里,核密度估计(KDE)、主成分分析(PCA)、聚类分析都是十分经典的。后两者都可以看作是对数据的尽可能好的压缩,PCA是把数据的诸多特征只用很少量的主成分来表示,聚类分析则可以看作是把每个样本压缩到了cluster的index上。事实上,它们也需要一个相似度度量或距离度量(很多时候是默认的欧氏距离度量)。
深度学习、强化学习
深度学习、强化学习是机器学习下比较大的流行分支。可参看如下二文:
发表回复