万字长文-机器学习大盘点
本文内容来自于机器学习相关的书籍、网络资料等,旨在通过一篇文章快速介绍大部分机器学习相关的知识。
1. 模型评估
1.1 常见评估指标
在机器学习中,常见的评估指标有准确率、精确率、召回率、均方误差等。对于特定的任务(比如推荐系统),还有一些其它指标。下面我们来整理下这些指标的含义和作用。
- 准确率(Accuracy)表示分类正确的样本数占总样本的比例。准确率容易受到样本不均衡的影响,所以有时我们也会用到平均准确率。
- 精确率(Precision)表示分类正确的正样本个数占分类器判定为正样本的样本个数比例,通常用于二分类任务中。它的计算公式是\(\text{True Positive}/(\text{True Positive} + \text{False Positive})\)。
- 召回率(Recall)表示分类正确的正样本个数占真正的正样本个数的比例,通常和精确率一起使用。它的计算公式是\(\text{True Positive}/(\text{True Positive} + \text{False Negative})\)。精确率和召回率往往具有跷跷板效应,所以更准确的是它们的调和平均数F1值,即\(F1 = (2 \times P \times R) / (P + R)\)。
- 均方根误差(Root Mean Square Error,RMSE)通常用来衡量回归任务的效果,但容易受到离群点的影响,一般的改进方式是使用平均绝对百分比误差。
还有一些在排序模型中经常会使用到的评价指标,这里也简单整理一下:
- HitRate@K表示Top-K结果中命中测试集的比例。比如我们给用户推荐\(K\)个商品,该用户在测试集中总共有\(T\)个正样本,\(K\)个商品中有\(M\)个样本在测试机正样本中,那么该用户的HitRate@K指标就是\(M/T\)。
- NDCG@K(Normalized Discounted Cumulative Gain)又叫归一化折扣累计收益,常用于listwise模型中,用来衡量模型预估的排序列表和真实排序列表的差距,与其它排序指标相比,NDCG会对排序位置进行惩罚。
- MRR (Mean Reciprocal Rank)是把排序结果中的正样本的排序取倒数,然后多个样本求平均。MRR越大,说明模型把正样本排在了前面。
1.2 PR曲线和ROC曲线
-
PR曲线以召回率作为横坐标,精确率作为纵坐标,主要用于没有确定阈值区分正负样本的排序问题。PR曲线认为模型Top \(N\)结果就是模型判定的正样本,然后计算前\(N\)个位置上的准确率Precision@N和Recall@N,根据不同的\(N\)得到多个点组成曲线。
-
ROC曲线(受试者工作特征曲线)以假阳率(\(FPR = FP / N\))作为横坐标,真阳率(\(TPR = TP / P\))为纵坐标,通常用在二分类问题中,模型输出预测为正样本的概率。将样本按照概率排序,不断移动截断点生成曲线上的关键点。截断点就是区分正负样例预测结果的阈值。
-
AUC(Area Under Curve)被定义为ROC曲线下的面积,是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。
ROC曲线能尽量降低不同数据集带来的干扰,形状比较稳定。PR曲线适用于特定数据集,更直观。
1.3 A/B测试
进行A/B测试的原因有很多,比如1)离线评估可能过拟合;2)线上工程环境不同,离线评估不准确;3)某些商业指标在离线评估时无法计算。一般的方法是针对要测试的方案将用户分桶,分桶时要考虑样本的独立性和采样方式的无偏性。
1.4 模型评估方法
- Holdout检验:是最简单最直接的验证方法,它将原始样本随机划分为训练集和验证集两部分。
- 交叉检验:k-fold交叉验证首先将全部样本划分为\(k\)个大小相等的样本子集。每次将一个子集作为验证集,其它子集作为训练集,最后将\(k\)次平均指标求平均。
- 留p检验:每次留下\(p\)个样本作为验证集,其他样本作为训练集,重复多次。一种特例是留一验证。
- 自助法:通常在样本规模较小时使用。对于总数为\(n\)的样本集合,进行\(n\)次有放回采样,得到大小为\(n\)的样本集合,没有被抽中的样本将作为验证集。大约有36.8%样本(具体可见书中推导)从未选择过,可用作验证集。
1.5 过拟合和欠拟合
- 过拟合,表现为训练集效果好,但泛化能力差。一般通过下面几种方式降低过拟合:
- 获取更多训练数据,让模型学起来更难
- 降低模型复杂度
- 增加正则化,比如添加L1、L2正则化,增加Dropout等
- 集成学习,降低单一模型过拟合风险
- 欠拟合,表现为训练集和测试集效果都很差,一般看到训练集效果差就是了。可以通过下面几种方式降低欠拟合:
- 添加更多特征,可能是数据本身关联关系差
- 增加模型复杂度,提高模型的拟合能力
- 减小正则化系数
2. 经典算法
2.1 支持向量机
支持向量机(Support Vector Machine, SVM)是一种十分出色的监督学习方法。SVM的输入空间为欧式空间或离散空间、特征空间为希尔伯特空间,支持向量机的学习是在特征空间进行的。从简单到复杂,支持向量机包含线性可分支持向量机、线性支持向量机和非线性支持向量机。当数据线性可分时,可以通过硬间隔最大化学习一个线性可分支持向量机。当数据近似线性可分时,可以通过软间隔最大化学习线性支持向量机。当数据线性不可分时,通过核技巧及软间隔最大化学习非线性支持向量机。
下面,我们分别介绍这三个概念。
2.1.1 线性可分支持向量机与硬间隔最大化
2.1.1.1 线性可分支持向量机定义
给定线性可分训练集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面为:
以及相应的分类决策函数
\(f(x)\)称为线性可分支持向量机,此外\(x\)是训练或者预测样本,\(w^*, b^*\)是超平面的参数。显然,这样的解是不唯一的,我们不好直接求解。因此我们需要加入进一步的约束,也就是所谓的硬间隔最大化。
2.1.1.2 函数间隔和几何间隔
我们首先需要引入间隔这个概念。对于给定的训练数据集\(T\)和超平面\((w,b)\),定义超平面关于样本点\((x_i,y_i)\)的函数间隔为
定义超平面关于数据集\(T\)的函数间隔是
对于给定的训练数据集\(T\)和超平面\((w,b)\),定义超平面关于样本点\((x_i,y_i)\)的几何间隔为
定义超平面关于数据集\(T\)的几何间隔是
如果超平面参数\(w\)和\(b\)成比例改变(超平面不变),函数间隔成比例改变,而几何间隔不变。
2.1.1.3 间隔最大化
支持向量机的基本想法是求解能够正确划分训练数据并且几何间隔最大的超平面。对于线性可分数据集来说,线性可分超平面有无穷多个,但是几何间隔最大的超平面是唯一的。这里的间隔最大化也称为硬间隔最大化。对训练集找到几何间隔最大的超平面意味着以充分大的确信度对训练数据进行分类。因此优化目标是
考虑函数间隔和几何间隔的关系\(\gamma = \frac{\hat{\gamma}}{||w||}\),函数间隔\(\hat{\gamma}\)可以取1。同时最大化\(\frac{1}{||w||}\)和最小化\(\frac{1}{2}||w||^2\)是等价的,优化得到线性可分支持向量机学习的最优化问题:
支持向量是指使上述约束条件等号成立的样本点,也就是与分离超平面最近的样本点。在决定超平面时只有支持向量起作用,而其他实例点并不起作用。支持向量的个数一般很少,所以支持向量机是由很少的”重要的“训练样本确定的。该问题一般转换为对偶算法,因为对偶算法更容易求解,也能自然引入核函数,进而推广到非线性分类问题。
2.1.2 线性支持向量机与软间隔最大化
线性可分支持向量机并不能处理线性不可分的数据,因为上述不等式并不能都成立。为了解决这个问题,对于每个样本点\((x_i,y_i)\)引入一个松弛变量\(\xi_i \geq 0\),使函数间隔加上松弛变量后大于等于1。同时,还要为每个松弛变量支付一个代价\(\xi_i\)。于是,线性不可分的线性支持向量机的学习问题变为:
软间隔的支持向量\(x_i\)或者在间隔边界上,或者在间隔边界与分离超平面之间,或者在分离超平面误分一侧。线性支持向量机包含线性可分支持向量机(只需要把松弛变量设置为0)。线性支持向量机试图使软间隔最大化,同时使误分类点的个数尽量小,\(C\)是调和二者的超参数。
2.1.3 非线性支持向量机与核函数
非线性分类是指使用非线性模型才能很好地进行分类的问题,我们可能需要寻找到一个超曲面才能很好地对数据进行分类。解决这个问题一般是进行一个非线性变换,将非线性问题转变为线性问题。
2.1.3.1 核函数定义
核技巧应用到支持向量机,其基本想法就是通过一个非线性变换将输入空间对应于一个特征空间,使得在输入空间的超曲面模型对应于特征空间的超平面模型(支持向量机)。
设\(\mathcal{X}\)为输入空间,\(\mathcal{H}\)为特征空间,如果存在一个从\(\mathcal{X}\)到\(\mathcal{H}\)的映射\(\phi\),使得对所有的\(x,z\in \mathcal{X}\),函数\(K(x,z)\)满足条件
则称\(K(x,z)\)为核函数。在学习和预测中只定义核函数\(K(x,z)\),而不显式地定义映射函数\(\phi\)。通常,直接计算\(K(x,z)\)比较容易,而通过\(\phi(x)\)和\(\phi(z)\)计算\(K(x,z)\)并不容易。注意,对于给定的核函数,\(\phi\)的取法并不唯一。
核函数定义的是\(x,z\)在特征中间的内积关系,常用的核函数一般是正定核函数,包括多项式核函数、高斯核函数、字符串核函数等。在求解支持向量机的对偶问题或者分类决策函数时,用到了大量的实例与实例之间的内积,这部分都可以被核函数所代替。
2.1.4 序列最小最优化算法
序列最小最优化(Sequential Minimal Optimization, SMO)算法要解如下凸二次规划的对偶问题:
在这个问题中,变量是拉格朗日乘子,一个变量\(\alpha_i\)对应于一个样本点\((x_i,y_i)\);变量的总数等于训练样本数。
SMO算法是一种启发式算法,其基本思路是:如果所有变量的解都满足此最优化问题的KKT条件,那么这个最优化问题的解就得到了。因为KKT条件是该最优化问题的充要条件。否则,选择两个变量,固定其他变量,针对两个变量构建一个二次规划问题,这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反KKT条件最严重的那一个,另一个由约束条件自动确定。如此,SMO算法将原问题不断分解成子问题并对子问题求解,进而达到求解原问题的目的。
2.2 逻辑回归与最大熵模型
逻辑回归是经典的分类方法,逻辑回归与最大熵模型都属于对数线性模型。说起逻辑回归,我们容易想到sigmoid函数(\(\sigma(x)=\frac{1}{1+e^{-x}}\)),该函数也和逻辑斯蒂分布的分布函数一致。下面,我们逐步进行讲解。
2.2.1 二项逻辑回归模型
二项逻辑回归一般用于二分类,表示为如下的条件概率分布。其中,\(\mathbf{w}\)内已经包含了偏置\(b\):
一个事件发生的几率是指该事件发生的概率与该事件不发生的概率的比值。对于逻辑回归来说,对数几率表示为:
这就是说,在逻辑回归中,输出\(Y=1\)的对数几率是输入\(x\)的线性函数。线性函数值越大,概率值就越接近1。
2.2.2 参数估计
逻辑回归的的参数就是\(\mathbf{w}\),可以应用极大似然估计法估计该参数,从而得到逻辑模型的决策函数。
设\(P(Y=1|x)=\pi (x), P(Y=0|x)=1-\pi (x)\),显然\(P\)是一个伯努利分布,其似然函数为(标签可以认为是事件发生的次数):
对数似然函数为
对\(\mathcal{L}\)求极大值,得到\(\mathbf{w}\)的估计值。对于无约束优化问题,一般使用梯度下降法或拟牛顿法(不一定存在解析解,或者难以求解)。
2.2.3 多项逻辑回归
多项逻辑回归可用于多类分类。假设随机变量\(Y\)的取值范围是\(\{1,2,\dots, K\}\),多项逻辑回归可以表示为:
每项的归一化项都相同,不同的是分子。最后一项分子为1,其他都是对应的\(\exp(\mathbf{w}_k \cdot x)\),保证概率和为1。
2.2.4 最大熵模型
最大熵原理是概率模型学习的一个准则。最大熵原理表述为在满足约束条件的模型集合中选取熵最大的模型。
2.2.4.1 最大熵模型定义
对于给定训练数据集\(T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\}\),可以确定联合分布\(P(X,Y)\)的经验分布和边缘分布\(P(X)\)的经验分布,分别为:
其中\(v(X=x,Y=y)\)表示训练数据中样本\((x,y)\)出现的频数,\(v(X=x)\)表示\(x\)出现的频数。
用特征函数\(f(x,y)\)描述输入\(x\)和输出\(y\)之间的某个事实(可以看成是特征提取,提取输入输出的共同特征),其定义为:
如果模型能够获取训练数据中的信息,那么特征函数\(f\)关于模型\(P(Y|X)\)与经验分布\(\tilde{P}(X)\)的期望值与特征函数关于经验分布\(\tilde{P}(X=x,Y=y)\)的期望值应该相等:
其中\(P(Y|X)\)是要学习的条件概率模型。假设满足所有约束条件(即上述等式)的模型集合为:
定义在条件概率分布\(P(Y|X)\)上的条件熵为:
则模型集合\(\mathcal{C}\)中条件熵\(H(P)\)最大的模型称为最大熵模型。
2.2.4.2 最大熵模型的学习
最大熵模型的学习可以形式化为约束最优化问题:
可以将约束最优化的原始问题转换为无约束最优化的对偶问题,通过求解对偶问题来求解原始问题,这里就不再详细推导,可以参考《统计学习方法》第6章。
2.2.4.3 逻辑回归与最大熵模型的关系
逻辑回归跟最大熵模型没有本质差别。逻辑回归是最大熵相应类别为二类时的特殊情况。指数簇分布的最大熵等价于其指数形式的最大似然。二项式分布的最大熵解等价于二项式指数形式(sigmoid)的最大似然; 多项式分布的最大熵等价于多项式分布指数形式(softmax)的最大似然。
2.2.5 逻辑回归优缺点
逻辑回归适合做分类算法的基础组件,能够便利地观测样本概率分数,可解释性强。对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决。而且逻辑回归实现简单,被广泛应用。
当特征空间很大时,逻辑回归的性能不是很好,容易欠拟合。而且它本质上是一个线性分类器,适合处理线性可分的数据,如果要处理非线性数据的话需要做非线性变换。
2.3 决策树
决策树的学习通常包含三个步骤:特征选择、树的生成、树的剪枝。决策树的生成采用启发式的方法,只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。
2.3.1 特征选择
首先介绍几种在生成树时用到的基础概念。
2.3.1.1 信息增益
随机变量\(X\)的熵(信息熵)定义为:
熵越大,不确定性越大。从定义可验证:
条件熵\(H(Y|X)\)定义为给定\(X\)时\(Y\)的条件概率分布的熵对\(X\)的数学期望:
特征\(A\)对数据集\(D\)的信息增益,信息增益衡量了给定特征\(A\)的信息后能够降低多少熵:
一般地,熵\(H(Y)\)与条件熵\(H(Y|X)\)之差称为互信息。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
2.3.1.2 信息增益比
以信息增益划分特征,容易偏向于选择取值较多的特征(如ID类特征,因为这类特征能够有效降低信息熵)。为了解决这个问题,定义信息增益比为:
其中,\(H_A(D)=-\sum_{i=1}^n \dfrac{|D_i|}{|D|}\log_2\dfrac{|D_i|}{|D|}\),\(n\)是特征\(A\)取值的个数。注意,\(H(D)\)和\(H_A(D)\)是不同的,后者考虑的是特征\(A\)的取值。
2.3.1.3 基尼指数(Gini)
Gini描述的是数据的纯度,与信息熵的含义类似。之所以使用,是因为相对信息熵而言,它的计算速度更快。Gini指数的定义如下:
其中\(K\)一般是标签数。取值个数为\(n\)的特征A的Gini指数定义为:
2.3.2 决策树的生成
2.3.2.1 ID3算法
在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。具体做法是,从根节点开始,对节点计算所有可能的特征的信息增益,选择最大信息增益的特征作为节点的特征,由该特征的不同取值建立子节点(所以只能处理离散值);再对子节点递归调用上述方法。直到所有特征的信息增益均很小或没有特征可以选择为止。ID3相当于用极大似然法进行概率模型的选择。但是该算法只有树的生成,所以该算法生成的树容易造成过拟合。
2.3.2.2 C4.5算法
C4.5算法与ID3算法类似,只是在生成过程中用最大信息增益比来选择特征。
2.3.3 决策树的剪枝
决策树对训练数据的分类很准确,但容易造成过拟合。原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决办法就是对树进行剪枝。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树\(T\)的叶节点个数为\(|T|\),\(t\)是树\(T\)的叶节点,该叶节点有\(N_t\)个样本点,其中\(k\)类的样本点有\(N_{tk}\)个,\(H_t(T)\)为叶节点\(t\)上的经验熵,\(\alpha \geq 0\)为参数,则决策树的损失函数可以定义为:
其中,叶节点的经验熵为:
在损失函数中,第一项表示模型对训练数据的预测误差,\(|T|\)表示模型的复杂度,\(\alpha \geq 0\)控制两者之间的影响。
2.3.4 CART算法
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”。这样的决策树等价于递归地二分每个特征。算法由两步组成:1)决策树生成,基于训练数据生成决策树,生成的决策树要尽量大;2)决策树剪枝,用验证数据集对已生成的树进行剪枝选择最优子树,这时用损失函数最小作为剪枝的标准。
2.3.4.1 CART回归树生成
-
输入:训练数据集\(D\)
-
输出:回归树\(f(x)\)
-
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建最小二乘回归树。
- 选择最优切分变量\(j\)(特征)与切分点\(s\)(特征的取值),求解:
\[R_1(j,s)=\{x|x^{(j)}\leq s\} \quad R_2(j,s)=\{x|x^{(j)}> s\} \]\[\min \limits_{j,s}\left[ \min \limits_{c_1} \sum \limits_{x_i \in R_1(j,s)}(y_i-c_1)^2+\min \limits_{c_2} \sum \limits_{x_i \in R_2(j,s)}(y_i-c_2)^2 \right] \]遍历变量\(j\),对固定的切分变量\(j\)扫描切分点\(s\),选择使上式最小的对\((j,s)\)。
- 用选定的对\((j,s)\)划分区域并决定相应的输出值:
\[\hat{c}_m=\dfrac{1}{N_m}\sum \limits_{x_i\in R_m(j,s)}y_i,\quad x\in R_m, \ m=1,2 \]- 继续对两个子区域调用上述步骤,直至满足停止条件
- 将输入空间划分为\(M\)个区域\(R_1,R_2,\cdots,R_M\),生成决策树:
\[f(x)=\sum \limits_{m=1}^M \hat{c}_m I(x \in R_m) \]
2.3.4.2 分类树生成
分类树用最小基尼指数选择最优特征,同时决定该特征的最优二值切分点。
如果样本集合\(D\)根据特征\(A\)是否取某一可能值\(a\)被分割为\(D_1\)和\(D_2\)两部分,即:
则在特征\(A\)的条件下,集合\(D\)的基尼指数定义如下:
生成分类树时,在所有可能的特征\(A\)以及它们所有可能的切分点\(a\)中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点,然后生成两个子节点。
2.3.4.3 CART剪枝
- 首先从生成算法产生的决策树\(T_0\)底端开始不断剪枝,直到\(T_0\)的根节点,形成一个子树序列\(\{T_0,T_1,\cdots,T_n\}\);
- 然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
算法如下:
- 输入:决策树\(T_0\)
- 输出:最优决策树\(T_{\alpha}\)
- 设\(k=0, T=T_0\)
- 设\(\alpha=+\infty\)
- 自下而上对给内部结点\(t\)计算\(C(T_t)\),\(|T_t|\)以及\[g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} \]\[\alpha=\min(\alpha,g(t)) \]这里,\(T_t\)表示以\(t\)为根节点的子树,\(C(T_t)\)是对训练数据的预测误差,\(|T_t|\)是\(T_t\)的叶节点个数。
- 对\(g(t)=\alpha\)的内部结点进行剪枝,并对叶节点\(t\)以多数表决法决定其类,得到树\(T\)
- 设\(k=k+1,\alpha_k=\alpha,T_k=T\)
- 如果\(T_k\)不是由根节点及两个子节点构成的树,则回到步骤3,否则令\(T_k=T_n\)
- 采用交叉验证法在子树序列\(\{T_0,T_1,\cdots,T_n\}\)中选取最优子树\(T_{\alpha}\)
上述算法中出现了\(g(t)\),下面对它进行一些解释:
- 对\(T\)的任意内部结点\(t\),以\(t\)为单节点树的损失函数是\[C_{\alpha}(t)=C(t)+\alpha \]
- 以\(t\)为根节点的子树\(T_t\)的损失函数是\[C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| \]
- 随着\(\alpha\)增大到某一处时,\(C_{\alpha}(T_t)和C_{\alpha}(t)\)会逐渐相等,此时:\[\alpha=\frac{C(t)-C(T_t)}{|T_t|-1} \]此时\(T_t\)和\(t\)有相同的损失函数,但是\(t\)的节点少,因此要进行剪枝。
2.3.5 决策树缺失值问题
- 在选择分裂属性的时候,训练样本存在缺失值
- 基本思想是计算没有出现属性缺失的样本子集的信息增益,然后根据这部分样本在总体样本中的比例打个折,作为总体样本在该属性的信息增益。
- 分类属性选择完成,对训练样本分类,发现属性缺失
- 对于一个样本\(x\),如果它在属性\(a\)上的取值已知,则将其划入到与其值对应的子节点。如果它在\(a\)上的属性未知,那么同时将其划归到所有的子节点,且将其在属性值\(a^{(i)}\)对应的子节点上的权重更新为\(\tilde{r_{i}} \cdot a\),其实质就是将一个样本以不同的概率(目标属性的比重)划入到不同的子节点。
- 训练完成,给测试集样本分类,有缺失值
- 这时候,就不能按比例分配了,因为你必须给该样本一个确定的标签。这时候根据投票来确定,或者填充缺失值。
2.4 朴素贝叶斯
2.4.1 基本方法
朴素贝叶斯是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练集,首先基于特征条件独立假设学习输入/输出的联合概率分布。然后基于此模型,对于给定的输入,利用贝叶斯定理求出后验概率最大的输出\(y\)。
朴素贝叶斯法通过训练数据集学习联合概率分布\(P(X,Y)\)。具体地,学习以下先验概率分布及条件概率分布。先验概率分布:
条件概率分布:
于是基于上面两个概率结合贝叶斯定理就学到了联合概率分布。但条件概率分布有指数级数量的参数,其估计实际上是不可行。
于是,朴素贝叶斯法对条件概率分布做了条件独立性假设:
朴素贝叶斯法实际上学习到生成数据的机制,属于生成模型。条件独立假设等于说用于分类的特征在类确定的条件下都是条件独立的。这一假设使朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
对于输入\(x\),后验概率最大的类作为\(x\)的输出标签\(y\):
朴素贝叶斯分类器可表示为:
注意到上述后验概率的计算中,分母对所有\(c_k\)都是相同的,所以
2.4.2 朴素贝叶斯法的参数估计
2.4.2.1 极大似然估计
极大似然估计法通过频率来统计概率。先验概率\(P(Y=c_k)\)的极大似然估计是:
设第\(j\)个特征\(x^{(j)}\)可能取值集合为\(\{a_{j1},\cdots,a_{jS_j}\}\)。条件概率\(P(X^{(j)}=a_{jl}|Y=c_k)\)的极大似然估计为:
2.4.2.2 贝叶斯估计
用极大似然估计可能会出现所要估计的概率为0的情况,这会影响后验概率的计算。可以使用贝叶斯估计。条件概率的贝叶斯估计为:
式中\(\lambda \geq 0\)。等价于在随机变量各个取值的频数上赋予一个正数\(\lambda > 0\)。当\(\lambda=0\)时,就是极大似然估计。常取\(\lambda=1\),这时成为拉普拉斯平滑(Laplace smoothing)。同样,对于先验概率的贝叶斯估计是:
2.4.3 朴素贝叶斯法的优缺点
- 优点:1)有稳定的分类效率;2)对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练;3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 缺点:1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进;2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳;3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率;4)对输入数据的表达形式很敏感。
3. 降维
3.1 主成分分析
主成分分析(Principal Components Analysis, PCA)是一种线性、非监督、全局的降维算法,旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。
3.1.1 PCA最大方差理论
在信号处理领域,信号具有较大方差,噪声具有较小方差。基于此,PCA的目标是最大化投影方差,让数据在主投影方向上方差最大。基于最大方差的PCA求解方法如下:
- 对样本数据进行中心化处理,也就是所有的的向量都减去均值向量。
- 求样本协方差矩阵\(\mathbf{\Sigma}\)。
- 对协方差矩阵进行特征分解,将特征值从大到小排列。
- 取特征值前\(d\)大对应的特征向量\(\mathbf{w}_1, \mathbf{w}_2, \cdots, \mathbf{w}_d\),通过以下变换将\(n\)维样本映射到\(d\)维:
新的\(x^{'}_i\)的第\(d\)维就是\(x_i\)在第\(d\)个主成分\(\mathbf{w}_d\)方向上的投影。
由于PCA是一种线性降维方法,因此具有一定的局限性。可以通过核映射对PCA进行扩展得到核主成分分析(KPCA)进行分线性降维操作。
3.1.2 PCA最小平方误差理论
基于最小平方误差的PCA旨在找到一个\(d\)维超平面,使得数据点到这个超平面的距离平方和最小。如果该超平面由\(d\)个标准正交基\(\mathbf{W}=\{\mathbf{w}_1,\cdots,\mathbf{w}_d\}\)构成,PCA的优化目标是:
其中\(\tilde{x}_k=\sum_{i=1}^d(\mathbf{w}_i^T x_k)\mathbf{w}_i\)是向量\(x_k\)在超平面上的投影向量。如果我们对\(\mathbf{W}\)的\(d\)个基依次求解,就会发现和最大方差理论的方法完全等价。
3.2 线性判别分析
3.2.1 二分类
线性判别分析(Linear Discriminant Analysis, LDA)是一种有监督降维方法。PCA算法没有考虑到数据标签,可能会导致映射后无法进行分类。LDA是为了分类服务的,因此只要找到一个投影方向\(\mathbf{\omega}\),使得投影后的样本尽可能按照原始类别分开。
LDA的中心思想是最大化类间距离和最小化类内距离。对于二分类任务来说,类间距离和类内距离可以通过类间散度矩阵和类内散度矩阵来计算,这两个矩阵的定义如下:
- 类间散度矩阵:\(S_B = (\mu_1 - \mu_2)(\mu_1 - \mu_2)^T\)。其中,\(\mu_1, \mu_2\)是两个类的均值向量。
- 类内散度矩阵:\(S_w = \sum \limits_{x \in C_i}(x - \mu_i)(x - \mu_i)^T\)
我们将目标函数定义为类间距离和类内距离的比值,于是优化目标为:
我们需要最大化\(J(\mathbf{\omega})\),只需要对\(\mathbf{\omega}\)求偏导,并令导数等于0。整理得到:
我们最大化的目标是优化一个矩阵的特征值,于是LDA降维变成了一个求矩阵特征向量的问题。\(J(\mathbf{\omega})\)就对应了矩阵\(S_w^{-1}S_B\)最大的特征值,而投影方向就是这个特征值对应的特征向量。
LDA对数据分布做了强假设,即每个类数据都是高斯分布、各个类的协方差相等。尽管这些假设在实际中并不一定能满足,但LDA仍是一种十分有效的降维方法。主要是因为线性模型对噪声的鲁棒性比较好。但由于模型简单,表达能力有局限性,也可以通过引入核函数处理分布较复杂的数据。
3.2.2 多分类
- 计算数据集每个类别的均值\(\mathbf{\mu_j}\)和总体均值\(\mathbf{\mu}\)。
- 计算类内散度矩阵\(S_w\),全局散度矩阵\(S_t\),并得到类间散度矩阵\(S_B = S_t - S_w\)。
- 对\(S_w^{-1}S_B\)矩阵进行特征值分解,将特征值从大到小排列。
- 取特征值前\(d\)大对应的特征向量\(w_1, w_2, \cdots, w_d\),通过以下变换将\(n\)维样本映射到\(d\)维:
新的\(x^{'}_i\) 的第d维就是\(x_i\)在第d个主成分\(w_d\)方向上的投影。
3.3 PCA和LDA的区别与联系
从LDA多分类的求解方式可见,LDA和PCA的求解过程很类似,但对应的原理却有所区别。首先从目标出发,PCA选择的是投影后数据方差最大的方向,而且是无监督的。LDA选择的是投影后类内方差小、类间方差大的方向,用到了标签信息。从应用角度,对于无监督任务一般使用PCA进行降维,对有监督的任务则使用LDA。
4. 非监督学习
4.1 K近邻算法
K近邻算法(k-Nearest Neighbor),也叫KNN或者K-NN,是一种基本的分类回归方法。KNN输出每个实例的类别,可以取多个类别。给定一个训练集,KNN假定其中的实例类别已定。分类时,对于新实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式预测。因此,KNN不具有显式的学习过程。\(k\)的选择、距离度量及分类决策规则(如多数表决)是k-NN的三个基本要素。KNN使用的模型实际上对应于对特征空间的划分。当训练集、距离度量、k值和分类决策规则确定后,对于任何一个新的输入实例,它所属的类唯一地确定。
4.1.1 K值的选择
- 如果选择较小的K值,相当于用较小的邻域中的训练实例进行预测,只有与输入实例较近的训练实例才会对预测结果起作用。但缺点是预测结果会对近邻的实例点非常敏感,容易受噪声影响。
- 如果选择较大的K值,相当于用较大的邻域中的训练实例进行预测,这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。
- 在实际应用中,一般首先取一个比较小的数值,然后采用交叉验证法来选取最优的\(k\)值。
4.1.2 k-NN的实现:kd树
KNN最简单的实现方式就是线性扫描,即计算输入实例与每一个训练实例的距离,然后进行分类,但这样计算量太大。kd树是一种对k维空间中的实例点进行存储以便对其进行快速搜索的树形数据结构。kd树是二叉树,表示对k维空间的一个划分。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个节点对应于一个k维超矩形区域。
4.1.2.1 构造平衡kd树
下面是平衡kd树(中位数作为切分点)的构造算法。注意,平衡kd树不一定是搜索效率最优的。
- 输入:数据集\(T\),其中\(x_i=(x^{(1)},\cdots,x^{(k)})^T\)是具有\(k\)个特征的实例。
- 输出:构建好的kd树。
- 开始:构造根节点,根节点对应于包含\(T\)的k维空间的超矩形区域。选择\(x^{(1)}\)为坐标轴,以\(T\)中所有的实例的\(x^{(1)}\)坐标的中位数为切分点,将根节点对应的超矩形区域切分为左右两个子区域。将落在切分超平面上的点保存在根节点。
- 对深度为\(j\)的节点,选择\(x^{(l)}\)作为切分坐标轴,\(l=j(mod \ k)+1\)(依次循环选取各坐标轴),取该坐标轴实例的中位数作为切分点,继续切分。
- 直到两个子区域没有实例存在时停止,从而形成kd树的区域划分。
4.1.2.2 搜索kd树
kd树的最近邻搜索算法描述如下:
- 输入:已构造好的kd树,目标点\(x\)。
- 输出:\(x\)的最近邻。
- 在kd树中找出包含目标点\(x\)的叶节点:从根节点出发,递归的向下访问。若目标点\(x\)当前维小于切分点坐标,则移动到左节点,否则移动到右节点。
- 以此叶节点作为“当前最近点”
- 递归向上回退,在每个节点进行如下操作:
- 如果该节点保存的实例点比当前最近点距离目标点近,则以该实例点为“当前最近点”。
- 当前最近点一定存在于该节点一个子节点对应的区域,检查该子节点的父节点的另一子节点对应的区域是否有更近的点。具体地,检查另一子节点对应的区域是否与以目标点为球心,以目标点与“当前最近点”距离为半径的超球体相交。
- 如果相交,可能在另一个子节点对应的区域内存在距目标点更近的点,移动到另一个子节点,接着递归进行搜索。
- 如果不相交,向上回退。
- 回退到根节点时,搜索结束。当前最近点即为\(x\)的最近邻点。
如果实例点是随机分布的,kd树搜索的平均复杂度为\(O(\log N)\),\(N\)为训练样本数。kd树适合训练实例数远大于空间维数的情况。当空间维数接近实例数时,效率接近线性扫描。
4.2 K均值聚类-KMeans
KMeans的基本思想是通过迭代寻找\(K\)个簇的一种划分方法,使得聚类结果对应的代价函数最小。特别地,代价函数可以定义为各个样本距离所属聚类中心的误差平方和,即:
其中\(x_i\)表示样本,\(\mu_{c_i}\)表示第\(i\)个样本所属的聚类中心。\(K\)均值聚类是一种可伸缩的高效聚类算法,但容易受到初始值和离群点的影响导致结果不稳定陷入局部最优,需要手动设置\(K\)值,每个样本只能划分到单一类中。针对K均值算法的缺点,也有一些手段进行改进。例如数据归一化和离群点处理、通过手肘法或者Gap Statistic方法确定最优的\(K\)值、引入核函数增加数据点线性可分的概率等。
4.2.1 具体算法
- 数据预处理,如归一化、离群点处理等。
- 随机选取\(K\)个簇中心,记为\(\mu_1^{(0)}, \cdots, u_k^{(0)}\),也就是随机选择\(K\)个点作为簇中心。
- 定义代价函数:\(J(c, \mu) = \mathop{\min}_{\mu}\mathop{\min}_{c}\sum \limits_{i=1}{M}||x_i - \mu_{c_i}||^2\)。可以看到先为每个点分配簇中心,然后更新簇中心\(\mu\),具体来说,进行下面的迭代直到\(J\)收敛或者达到迭代次数:
- 在第\(t\)步,对于每一个样本\(x_i\),将其分配到最近的簇,从而得到其类别\(c_i^t\):
\[c_i^{t} = \mathop{\arg \min}_k ||x_i - \mu_k^{(t)}||^2 \]- 在第\(t\)步,对于每一个类簇\(k\),根据属于这个类簇的所有样本重新计算该类簇的中心\(\mu_k^t\):
\[\mu_k^{t} = \mathop{\arg \min}_{\mu} \sum \limits_{i:c_i^{(t)}=k} ||x_i - \mu||^2 = \sum \limits_{i:c_i^{(t)}=k} x_i \]
K均值算法在迭代时,假设当前损失函数\(J\)没有达到最小值,那么首先固定类簇中心,调整每个样例所属类别来使\(J\)减小。然后固定样例所属类别,调整类簇中心使\(J\)减少。
4.2.2 EM算法
K均值算法本质上是一种EM算法,其收敛性也可以通过EM算法来说明。所以下面我们简单介绍一些EM算法。
一般地,用\(Y\)表示观测随机变量的数据,\(Z\)表示隐随机变量的数据,\(Y\)和\(Z\)连在一起称为完全数据,观测数据\(Y\)又称为不完全数据。假设给定观测数据\(Y\),其概率分布是\(P(Y|\theta)\),其中\(\theta\)是需要估计的模型参数。那么不完全数据\(Y\)的似然函数是\(P(Y|\theta)\),完全数据的联合概率分布是\(P(Y,Z|\theta)\)。EM算法通过迭代求\(L(\theta)=\log P(Y|\theta)\)的极大似然估计对参数进行估计。每次迭代包含两步:E步,求期望;M步,求极大化。EM算法的流程如下:
- 输入:观测变量数据\(Y\),隐变量数据\(Z\),联合分布\(P(Y,Z|\theta)\),条件分布\(P(Z|Y,\theta)\)。
- 输出:模型参数\(\theta\)。
- 选择参数的初始值\(\theta^{(0)}\),开始迭代。参数的初始值可以任意选择,但需注意EM算法对初始值是敏感的。
- E步:记\(\theta^{(i)}\)为第\(i\)次迭代参数\(\theta\)的估计值,在第\(i+1\)次迭代的E步,计算\(Q\)函数。即固定参数,最大化模型目标。
\[\begin{aligned} Q(\theta,\theta^{(i)}) &=E_Z[\log P(Y,Z|\theta)|Y,\theta^{(i)}] \\ & =\sum_Z \log P(Y,Z|\theta) P(Z|Y,\theta^{(i)}) \end{aligned}\]这里,\(P(Z|Y,\theta^{(i)})\)是在给定观测数据\(Y\)和当前的参数估计下隐变量数据\(Z\)的条件概率分布
3. M步:求使\(Q(\theta,\theta^{(i)})\)极大化的\(\theta\),确定第\(i+1\)次迭代的参数估计值\(\theta^{(i+1)}\)\[\theta^{(i+1)}=\mathop{\arg\max}\limits_{\theta} Q(\theta,\theta^{(i)}) \]- 重复第2和第3步,直到收敛。终止迭代条件,一般是对较小的正数\(\epsilon_1,\epsilon_2\),若满足\(|\theta^{(i+1)}-\theta^{(i)}|<\epsilon_1, |Q(\theta^{(i+1)},\theta^{(i)})-Q(\theta^{(i)},\theta^{(i)})|<\epsilon_2\),则停止迭代。
4.3 高斯混合模型
高斯混合模型假设每个簇的数据都符合高斯分布,当前数据呈现的分布就是各个簇的高斯分布叠加在一起的结果。高斯混合模型用多个高斯分布函数的线性组合来对数据分布进行拟合,是生成式模型。
设有随机变量\(X\),则高斯混合模型可以用下面公式表示:
其中\(\mathcal{N}(x|\mathbf{\mu}_k, \mathbf{\Sigma}_k)\)称为混合模型的第\(k\)个分量,\(\pi_k\)是混合系数,且满足\(\sum_{k=1}^K \pi_k = 1\)。生成过程就是先根据混合系数选择一个高斯分布,然后再根据选定的高斯分布生成一个样本点。高斯混合模型一般使用EM算法求解参数\((\pi_k, \mathbf{\mu}_k, \mathbf{\Sigma}_k)\)。
和K均值算法相比,高斯混合模型也需要指定\(K\)值,也使用EM算法求解,容易陷入局部最优解。但高斯混合模型是基于概率密度的估计,因此能够给出样本属于某类的概率,也能够生成新的样本点。
4.4 自组织映射网络
自组织映射(Self-organizing map, SOM)网络是一种聚类、高维可视化、数据压缩、特征提取算法。它本质上是一个两层的神经网络,包含输入层和输出层(竞争层)输出层中神经元的个数通常是聚类的个数。不同于一般神经网络基于损失函数的反向传递来训练,它运用竞争学习(competitive learning)策略,依靠神经元之间互相竞争逐步优化网络。且使用近邻关系函数(neighborhood function)来维持输入空间的拓扑结构。
与K均值聚类算法相比,自组织映射网络不需要确定类的个数,因为聚类结果的实际簇数可以小于神经元的个数。K均值算法找到一个最相似的类后,只更新这个类参数。自组织映射神经网络更新了临近的节点。所以K均值算法易受噪声的影响,而自组织映射网络准确性可能更低一些。此外,自组织映射神经网络的可视化较好,具有优雅的拓扑关系图。
4.5 聚类算法的评估
这里只讨论没有外部标签的情况,有标签自然通过标签直接判断聚类的效果。我们首先看看数据簇具有哪些特点:
- 以中心定义的数据簇:通常球形分布,集合中的数据到中心的距离相比到其他簇中心的距离更近。
- 以密度定义的数据簇:当数据簇不规则或互相盘绕,并且有噪声和离群点时,常常使用。
- 以连通定义的数据簇:具有连通关系。
- 以概念定义的数据簇:同一集合内数据具有某一相同性质。
基于此,在讨论聚类算法之前,我们首先要评估聚类的可行性,这可以通过检测数据分布是否存在非随机的簇结构来实现。一般有两种方法进行验证:
- 观察聚类误差是否随着聚类类别数目的增加而单调变化(即找不到一个合适的类簇数)。
- 霍普金斯统计量,判断数据在空间上的随机性:
- 首先,在所有样本中随机找\(n\)个点,记为\(p_1, \cdots, p_n\) ,对其中的每一个点,都在样本空间中找到一个离它最近的点并计算它们之间的距离\(x_i\),从而得到距离向量\(x_1, \cdots, x_n\)。然后,从样本的可能取值范围随机生成\(n\)个点,记为\(q_1, \cdots, q_n\),对每个点找到他们最近的样本点计算距离,得到\(y_1, \cdots, y_n\)。霍普金斯统计量\(H\)表示为:
\[H = \frac{\sum \limits_{i=1}^n y_i}{\sum \limits_{i=1}^{n} x_i + \sum \limits_{i=1}^{n} y_i} \]- 如果样本随机分布,则\(H\)接近0.5。如果有聚类趋势,则随机生成的样本点距离应该远大于实际样本点距离,\(H\)的值接近1。
一般通过手肘法或者Gap Statistic方法来得到最优的聚类簇数,并通过类间散度和类内散度来衡量聚类的质量。
5. 概率图模型
概率图模型分为贝叶斯网络(Bayesian Network)和马尔可夫网络(Markov Network)两大类。贝叶斯网络可以用一个有向图结构表示,马尔可夫网络可以表示成一个无向图的网络结构。更详细地说,概率图模型包括了朴素贝叶斯模型、最大熵模型、隐马尔可夫模型、条件随机场、主题模型等。朴素贝叶斯模型和最大熵模型我们在之前介绍过了,下面重点介绍隐马尔可夫模型和条件随机场。
5.1 隐马尔可夫模型
马尔可夫过程是无后效性的随机过程。具体来说,\(t_n\)时刻的状态\(x_n\)的条件分布,仅仅与前一个状态\(x_{n-1}\)有关,即\(P(x_n|x_1,\cdots,x_{n-1})=P(x_n|x_{n-1})\)。时间和状态的取值都是离散的马尔可夫过程又称为马尔可夫链。
在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。隐马尔可夫模型\(\lambda\)可以用三元符号表示
其中,\(A\)是状态转移概率矩阵,\(B\)是观测概率矩阵,\(\pi\)是初始状态概率向量。隐马尔可夫模型包括概率计算问题、预测问题、学习问题三个基本问题:
- 概率计算问题:给定模型\(\lambda\),计算观测序列\(O\)出现的概率,可用前向和后向算法求解。
- 预测问题:也称为解码问题,已知模型参数和观测序列\(O\),计算最可能的隐状态\(I\),可用维特比算法。
- 学习问题:给定观测序列\(O\),估计模型\(\lambda\)的参数,可使用Baum-Welch算法进行参数学习。
下面,我们分别介绍这三个基本问题。
5.1.2 概率计算问题
5.1.2.1 前向算法
给定模型\(\lambda\),定义到时刻\(t\)部分观测序列为\(o_1,o_2,\cdots,o_t\)且状态为\(q_i\)的概率为前向概率,记作:
观测序列概率的前向算法定义为:
-
输入:模型\(\lambda\),观测序列\(O\)。
-
输出:观测序列概率\(P(O|\lambda)\)。
- 初始化前向概率,是初始时刻的状态\(i_1=q_i\)和观测\(o_1\)的联合概率
\[\alpha_1(i)=\pi_ib_i(o_1),\qquad i=1,2,\cdots,N \]- 递推:对\(t=1,2,\cdots,T-1\),
\[\alpha_{t+1}(i)=\left[\sum \limits_{j=1}^N \alpha_t(j)a_{ji}\right]b_i(o_{t+1}) \]其中,\(a_{ji}\)是转移概率,\(b_i\)是发射概率
- 终止
\[P(O|\lambda)=\sum\limits_{i=1}^N \alpha_T(i) \]
5.1.2.2 后向算法
给定模型\(\lambda\),定义在时刻\(t\)状态为\(q_i\)的条件下,从\(t+1\)到\(T\)的部分观测序列为\(o_{t+1},o_{t+2},\cdots,o_T\)的概率为后向概率,记作:
观测序列概率的后向算法:
-
输入:模型\(\lambda\),观测序列\(O\)。
-
输出:观测序列概率\(P(O|\lambda)\)。
- 初始化后向概率,对最终时刻的所有状态\(q_i\)规定\(\beta_T(i)=1\)
\[\beta_T(i)=1,\qquad i=1,2,\cdots,N \]- 递推:对\(t=T-1,T-2,\cdots,1\),
\[\beta_{t}(i)=\sum \limits_{j=1}^N a_{ij}b_j(o_{t+1})\beta_{t+1}(i) \]其中,\(a_{ij}\)是转移概率,\(b_j\)是发射概率
- 终止
\[P(O|\lambda)=\sum\limits_{i=1}^N \pi_ib_i(o_1)\beta_1(i) \]
5.1.3 学习问题
5.1.3.1 监督学习算法
假设已给训练数据集包含\(S\)个长度相同的观测序列和对应的状态序列\(\{(O_1,I_1),\cdots,(O_S,I_S)\}\),那么模型参数可以用极大似然估计求得。但是人工标注数据代价高,所以会利用非监督学习方法
5.1.3.2 Baum-Welch算法
此时隐马尔可夫模型可以看做一个含有隐变量的概率模型:
其中,\(I\)是状态序列,不可观测。它的参数学习可以用EM算法实现:
-
确定完全数据的对数似然函数:所有观测数据写成\(O=(o_1,o_2,\cdots,o_T)\),所有隐数据写成\(I=(i_1,i_2,\cdots,i_T)\),完全数据是\((O,I)=(o_1,\cdots,o_T,i_1,\cdots,i_T)\)。完全数据的对数似然函数是\(\log P(O,I|\lambda)\)。
-
EM算法的E步:求\(Q\)函数\(Q(\lambda,\overline{\lambda})=\sum_I[\log P(O,I|\lambda)|O,\overline{\lambda}]\)
\[Q(\lambda,\overline{\lambda})=\sum_I\log P(O,I|\lambda)P(O,I|\overline{\lambda}) \]其中\(\overline{\lambda}\)是当前参数估计值,\(\lambda\)是要最大化的参数。
\[P(O,I|\lambda)=\pi_{i_1}b_{i_1}(o_1)a_{i_1 i_2}b_{i_2}(o_2)\cdots a_{i_{T-1}i_T}b_{i_T}(o_T) \]于是,\(Q\)函数可以写成:
\[\begin{aligned} Q(\lambda,\overline{\lambda}) &=\sum_I \log \pi_{i_1}P(O,I|\overline{\lambda}) + \sum_I \left(\sum \limits_{t=1}^{T-1}\log a_{i_t i_{t+1}}\right)P(O,I|\overline{\lambda}) + \sum_I \left(\sum \limits_{t=1}^{T}\log b_{i_t}(o_t)\right)P(O,I|\overline{\lambda}) \end{aligned}\] -
EM算法的M步:极大化\(Q\)函数求模型参数\(A,B,\pi\)。由于要极大化的参数单独出现在三项中,所以只需对各项分别极大化,利用拉格朗日乘子法,得到\(\pi_i,a_{ij},b_j(k)\)。
5.1.4 预测问题
5.1.4.1 近似算法
在每个时刻\(t\)选择在该时刻最有可能出现的状态\(i_t^*\),从而得到一个状态序列,将它作为预测的结果。这样做的优点是计算简单,缺点是不能保证预测状态序列整体是最有可能的序列,因为预测的状态序列可能有实际不发生的部分,可能存在转移概率为0的相邻状态。
5.1.4.2 维特比算法
用动态规划求概率最大路径(最优路径)。最优路径具有这样的特性:如果最优路径在时刻\(t\)通过节点\(i^*_t\),那么这一路径从节点\(i^*_t\)到终点\(i^*_T\)的部分路径,对于从\(i^*_t\)到\(i^*_T\)的所有可能的部分路径来说,必须是最优的。根据这一原理,我们只需从时刻\(t=1\)开始,递推地计算在时刻\(t\)状态为\(i\)的各条部分路径的最大概率,直到得到时刻\(t=T\)状态为\(i\)的各条路径的最大概率。时刻\(t=T\)的最大概率即为最优路径的概率\(P^*\),最优路径的终结点\(i^*_T\)也同时得到。之后,从后向前逐步求得节点,得到最优路径。
5.2 最大熵马尔可夫模型
最大熵马尔可夫模型去除了隐马尔可夫模型中观测状态相互独立的假设,考虑了整个观测序列。并直接对标注的后验概率\(P(y|x)\)进行建模。最大熵马尔可夫模型建模如下:
对于\(p(x_i)\),不仅考虑了\(p(x_{i-1})\),还考虑了\(y_{1\cdots n}\)。其中\(p(x_i|x_{i-1},y_{1\cdots n})\)会在局部归一化,即枚举\(x_i\)的所有取值,计算公式为:
其中\(Z\)为归一化因子\(Z(x_{i-1}, y_{1 \cdots n}) = \sum_{x_i}\exp(F(x_i, x_{i-1}, y_{1 \cdots n}))\),\(F\)为\(x_i, x_{i-1}, y_{1,\cdots n}\)所有特征线性相加。
由于局部归一化,隐状态会倾向于转移到那些后续状态可能更少的状态上去,以提高整体的后验概率,这会导致标注偏置问题问题。因此条件随机场使用如下的全局归一化方式:
后续会在条件随机场的介绍中具体展开。
5.3 条件随机场
5.3.1 马尔可夫随机场
概率图模型是由图表示的概率分布。概率无向图模型又称马尔可夫随机场(Markov random field),表示一个联合概率分布,其标准定义为:设有联合概率分布\(P(V)\)由无向图\(G=(V, E)\)表示,图\(G\)中的节点表示随机变量,边表示随机变量间的依赖关系。如果联合概率分布\(P(V)\)满足成对、局部或全局马尔可夫性,就称此联合概率分布为概率无向图模型或马尔可夫随机场。
成对、局部或全局马尔可夫性的定义如下:
- 成对马尔可夫性:设无向图\(G\)中的任意两个没有边连接的节点\(u\),\(v\) ,其他所有节点为\(O\)。成对马尔可夫性指,给定\(Y_O\)的条件下,\(Y_u\)和\(Y_v\)条件独立。
- 局部马尔可夫性:设无向图\(G\)的任一节点\(v\),\(W\)是与\(v\)有边相连的所有节点,\(O\)是\(v\)、\(W\)外的其他所有节点。局部马尔可夫性指,给定\(Y_W\)的条件下,\(Y_v\)和\(Y_O\)条件独立。
- 全局马尔可夫性:设节点集合\(A\)、\(B\)是在无向图\(G\)中被节点集合\(C\)分开的任意节点集合,全局马尔可夫性指,给定\(Y_C\)的条件下,\(Y_A\)和\(Y_B\)条件独立。
5.3.2 条件随机场的定义
5.3.2.1 条件随机场
设\(X\)和\(Y\)是随机变量,\(P(Y|X)\)是在给定\(X\)的条件下\(Y\)的条件概率分布。若随机变量\(Y\)构成一个有无向图\(G=(V,E)\)表示的马尔可夫场,即:
对任意节点\(v\)都成立,则称\(P(Y|X)\)是条件随机场。式中\(w≠v\)表示\(w\)是除\(v\)以外的所有节点,\(w∼v\)表示\(w\)是与\(v\)相连接的所有节点。
5.3.2.2 线性链条件随机场
对于线性链条件随机场来说,图\(G\)的每条边都存在于状态序列\(Y\)的相邻两个节点,最大团\(C\)是相邻两个节点的集合,\(X\)和\(Y\)有相同的图结构意味着每个\(X_i\)都与\(Y_i\)一一对应。
设\(X=(X_1,...,X_n),Y=(Y_1,...,Y_n)\)均为线性链表示的随机变量序列,若在给定随机变量序列\(X\)的条件下,随机变量序列\(Y\)的条件分布\(P(Y|X)\)构成条件随机场,即满足马尔可夫性
则称\(P(Y|X)\)为线性链条件随机场。在标注问题中\(X\)表示输入观测序列,\(Y\)表示对应的状态序列。
5.3.3 条件随机场的形式
5.3.3.1 参数化形式
设\(P(Y|X)\)为线性链条件随机场,则在随机变量\(X\)取值为\(x\)的条件下,随机变量\(Y\)取值为\(y\)的条件概率具有如下形式:
其中
式中,\(t_k\)和\(s_t\)是特征函数,\(\lambda_k\)和\(\mu_l\)是对应的权值。
上式是基本形式,表示给定输入序列\(x\),对输出序列\(y\)预测的条件概率。\(t_k\)是定义在边上的特征函数,称为转移特征,依赖于当前和前一个位置,\(s_l\)是定义在节点上的特征函数,称为状态特征,依赖于当前位置。\(t_k\)和\(s_l\)都依赖于位置,是局部特征函数。通常都是0-1函数。
线性链条件随机场也是对数线性模型(逻辑回归也是)。
5.3.3.2 简化形式
将转移特征和状态特征机器权值用统一的符号表示。设有\(K_1\)个转移特征,\(K_2\)个状态特征,\(K=K_1+K_2\),记
然后,对转移与状态特征在各个位置\(i\)求和,记作
用\(w_k\)表示特征\(f_k(y,x)\)的权值,即
于是,条件随机场可以表示为
还可以把\(w_k\)和\(f_k(y,x)\)表示成向量的形式
5.3.3.3 矩阵形式
引进特殊的起点和和终点状态标记\(y_0=start,y_{n+1}=stop\),这是\(P_w(y|x)\)(简化形式)可以通过矩阵形式表示。
对观测序列\(x\)的每一个位置\(i=1,2,\cdots,n+1\),定义一个\(m\)阶的矩阵(m是标记\(y_i\)取值的个数)
这样,给定观测序列\(x\),相应标记序列\(y\)的非规范化概率可以通过该序列\(n+1\)个矩阵适当元素的乘积\(\prod_{i=1}^{n+1}M_i(y_{i-1},y_i|x)\)表示,于是条件概率\(P_w(y|x)\)是:
其中,\(Z_w(x)\)是规范化因子,是\(n+1\)个矩阵的乘积的(start,stop)元素。
注意,\(y_0=start\)与\(y_{n+1}=stop\)表示开始开始状态和终止状态,规范化因子\(Z_w(x)\)是以start为起点stop为终点通过状态的所有路径\(y_1 y_2 \cdots y_n\)的非规范化概率\(\prod_{i=1}^{n+1}M_i(y_{i-1},y_i|x)\)之和。
6. 优化算法
6.1 有监督学习的损失函数
6.1.1 分类问题
以下均以二分类问题为例,即\(Y=\{1, -1\}\) , \(y = \text{sign}(f(x_i; \theta))\)
6.1.1.1 0-1损失
0-1损失是非凸、非光滑的,因此难以优化。
6.1.1.2 Hinge损失函数
Hinge损失函数是0-1损失的一个代理函数,是0-1损失相对紧的上界,称为合页损失函数,表示为:
在\(f\cdot y=1\)处不可导,因此不能用梯度下降优化,而是用次梯度下降。
6.1.1.3 Logistic损失函数
Losigstic损失函数也是0-1损失的代理函数,并且是凸上界:
该损失函数处处光滑,可用梯度下降。但对所有样本点都有惩罚,因此对异常值更敏感。
6.1.1.4 交叉熵损失函数
交叉熵损失函数也是0-1损失函数的代理函数,是光滑凸上界:
6.1.2 回归问题
6.1.2.1 平方损失函数
平方损失函数是光滑函数,能用梯度下降,但对异常点敏感。因为异常点的平方差可能非常大。
6.1.2.2 绝对损失函数
相当于做中值回归,比平方损失函数鲁棒,但在\(f=y\)处无法求导数。
6.1.2.3 Huber损失函数
Huber损失函数综合考虑可导性和鲁棒性,该损失函数定义为:
在\(|f-y|\)较小时为平方损失,在\(|f-y|\)较大时为线性损失,处处可导,且对异常点鲁棒。
6.2 机器学习中的优化问题
6.2.1 凸优化问题
以逻辑回归为例,标签\(Y={1, -1}\),假设模型参数为\(\theta\),则逻辑回归问题的优化目标为:
可以通过计算目标函数的二阶Hessian矩阵(黑塞矩阵)来验证凸性。令
对该函数求二阶导,有
该矩阵满足半正定性质\(\nabla^2L_i(\theta) \geq 0\),因此\(\nabla^2L(\theta) = \sum \limits_{i=1}^{n}L_i(\theta) \geq = 0\),因此该函数为凸函数。对于凸优化问题,所有的局部最小值都是全局最小值。凸优化问题包括逻辑回归、SVM、线性回归等线性模型。
6.2.2 非凸优化问题
不满足凸函数定义的优化问题就是非凸优化问题,比如PCA问题是非凸优化问题。函数\(L\)是凸函数当且仅当对于定义域内的任意两点\(x,y\)和任意实数\(\lambda \in [0, 1]\)总有
非凸优化问题包括PCA、低秩模型(如矩阵分解)、深度神经网络等。
6.3 经典优化算法
假设我们需要最小化损失函数\(\min L(\theta)\),其中\(L(\cdot)\)是光滑函数。一般有直接法和迭代法两种优化思路。
6.3.1 直接法
使用直接法必须满足两个条件,即要求解的函数必须是凸函数,并且其一阶导数为零的等式有闭式解。满足这两个条件我们就可以直接求解出问题的解。
6.3.2 迭代法
假设优化问题为\(\begin{aligned} \delta_t = \mathop{\arg \min}_{\delta} L(\theta_t+\delta) \end{aligned}\),其中\(\theta_t\)是参数。
6.3.2.1 一阶法
-
对函数\(L(\theta_t+\delta)\)做一阶泰勒展开,得到近似式\(L(\theta_t+\delta) \approx L(\theta_t) + \nabla L(\theta)^T \delta\)
-
由于该近似式只有在\(\delta\)较小时才比较准确,因此在求解\(\delta_t\)时一般加上\(L_2\)正则项
\[\begin{aligned} \delta_t & = \mathop{\arg \min}_{\delta} \left( L(\theta_t) + \nabla L(\theta_t)^T\delta + \frac{1}{2\alpha}||\delta||^2_2 \right) \\ & = -\alpha \nabla L(\theta_t) \end{aligned} \] -
一阶法的迭代公式为
\[\theta_{t+1} = \theta_t - \alpha \nabla L(\theta_t) \]其中\(\alpha\)为学习率
-
也称为梯度下降法,梯度就是目标函数的一阶信息。
6.3.2.2 二阶法
-
对函数\(L(\theta_t+\delta)\)做二阶泰勒展开,得到近似式\(L(\theta_t+\delta) \approx L(\theta_t) + \nabla L(\theta)^T \delta + \frac{1}{2}\delta^T \nabla ^2 L(\theta^T)\delta\)
-
其中\(\nabla^2 L(\theta_t)\)是函数在\(\theta_t\)处的Hessian矩阵。通过求解近似优化问题
\[\begin{aligned} \delta_t & = \mathop{\arg \min}_{\delta} \left( L(\theta_t) + \nabla L(\theta_t)^T\delta + \frac{1}{2}\delta^T \nabla ^2 L(\theta^T)\delta \right) \\ & = -\nabla^2 L(\theta_t)^{-1}\nabla L(\theta_t) \end{aligned} \] -
二阶法的迭代公式为
\[\theta_{t+1} = \theta_t - \nabla^2 L(\theta)^{-1} \nabla L(\theta_t) \] -
也称为牛顿法,Hessian矩阵就是目标函数的二阶信息。二阶法的收敛速度快于一阶法,但在高维情况下,Hessian矩阵求逆计算复杂度很大。而且当目标函数非凸时,可能收敛到鞍点。改进方法主要有拟牛顿法,如BFGS算法。
6.5 随机梯度下降法
随机梯度下降要优化的目标函数一般形式是\(L(\theta) = \mathbb{E}_{(x,y) \sim p_{data}} L(f(x, \theta), y)\),梯度下降的目标是找到平均损失最小的模型参数,也就是求解优化问题\(\theta^{*} = \mathop{\arg \min} L(\theta)\)。
6.5.1 经典梯度下降
经典梯度下降采用所有训练数据的平均损失来近似目标函数,即\(L(\theta) = \frac{1}{M}\sum \limits_{i=1}^{M}L(f(x_i, \theta), y_i)\),梯度定义为:
经典梯度下降需要遍历所有训练数据,计算开销太大,但效果其实最好。
6.5.2 随机梯度下降
随机梯度下降每次用单个训练样本的损失来近似平均损失,即
这种方式能够加快收敛速度,也适合在线更新。但随机梯度下降容易导致梯度波动较大,因此目前常用的是小批量梯度下降法。小批量梯度下降法能够降低随机梯度的方差,使迭代更稳定,并且充分利用高度优化的矩阵运算。小批量梯度下降同时处理m个训练数据\(\{ (x_1, x_2), \cdots, (x_m, y_m) \}\),目标函数及其梯度为
批次大小\(m\)一般选2的幂次,能够充分利用矩阵运算。在挑选数据时,一般会首先对数据进行打散,增加随机性。
6.7 正则化
下图可以用来解释常见的L1, L2正则化。L1正则化能够产生更稀疏的解,L2正则化能够减小参数的范数。
- L1正则化在尖角处更大概率发生碰撞,此时的解\(w_1 = 0\)。
- L2正则化:使得模型的解偏向于范数较小的\(W\),通过限制\(W\)范数的大小实现了对模型空间的限制,从而在一定程度上避免了过拟合。不过岭回归并不具有产生稀疏解的能力,得到的系数仍然需要数据中的所有特征才能计算预测结果,从计算量上来说并没有得到改观。
- L1正则化:能产生稀疏性,导致\(W\)中许多项变成零。稀疏的解除了计算量上的好处之外,更重要的是更具有“可解释性”。
- L0正则化的值是模型参数中非零参数的个数,但难以求解。L1正则是L0正则的最优凸近似。
6.7.1 约束解释
带正则项和带约束条件是等价的。以回归问题为例,为了约束\(w\)的可能取值空间防止过拟合,加上约束(这里的限制条件是2范数,对应于L2正则化)的优化问题变为:
求解该带约束问题对应的拉格朗日函数\(\sum \limits_{i=1}^N(y_i - w^Tx_i)^2 + \lambda (||w||_2^2 - m)\)。若\(w^*\)和\(\lambda^*\)分别是原问题和对偶问题的最优解,则根据KKT条件,它们应满足:
第一个式子对应了上图的L2正则化解空间。
从贝叶斯先验角度来解释,L1正则相当于对模型参数\(w\)引入拉普拉斯先验,L2相当于引入高斯先验,而拉普拉斯先验使参数为0的可能性更大。
7. 采样
7.1 常见的采样方法
给定随机变量的一个取值,可以根据概率密度函数来计算该值对应的概率密度。反过来,根据概率密度函数提供的概率分布信息来生成随机变量的一个取值,这就是采样。
7.1.1 均匀分布随机数
一般只能产生伪随机数,而不是真正的随机数。由于计算机只能处理离散值,无法产生连续均匀分布的随机数,因此只能通过离散分布来逼近连续分布。一般使用线性同余法来产生均匀分布随机数:
其中初始值\(x_0\)称为随机种子,一般会取系统时间。好的线性同余随机数生成器,循环周期要尽可能接近\(m\),需要精心挑选合适的\(a\)和\(m\)。
7.1.2 采样策略
7.1.2.1 函数变换法
如果随机变量\(x\)和\(\mu\)存在变换关系\(\mu = \varphi(x)\),则它们的概率密度函数关系为:
从目标分布\(p(x)\)中不好采样\(x\),可以构造一个变换\(u = \varphi(x)\),使得从变换后的分布\(p(\mu)\)中采样\(\mu\)比较容易,这样可以通过先对\(\mu\)进行采样,然后通过反函数\(x = \varphi^{-1}(\mu)\)来间接得到\(x\)。这么做的前提是\(\varphi\)的逆函数是好求的。
特别地,在函数变换法中,如果变换关系\(\varphi(\cdot)\)是\(x\)的累积分布函数,则得到了逆变换采样(Inverse Transform Sampling)。假设待采样的目标分布的概率密度函数为\(p(x)\),它的累积分布函数为
则逆变换采样法需按如下过程进行采样:
- 从均匀分布\(U(0,1)\)中产生一个随机数\(\mu_i\)。
- 计算\(x_i = \Phi^{-1}(\mu_i)\),其中\(\Phi(\cdot)\)是累积分布函数的逆函数。
7.1.2.2 拒绝采样
拒绝采样(Rejection Sampling)又叫接受/拒绝采样(Accept-Reject Sampling)。对于目标分布\(p(x)\),选取一个容易采样的参考分布\(q(x)\),使得对于任意\(x\)都有\(p(x) \leq M \cdot q(x)\)。\(M \cdot q(x)\)是\(p(x)\)的包络函数。包络函数越紧,采样效率越高。可以按如下过程采样:
- 从参考分布\(q(x)\)中随机抽取一个样本\(x_i\)。
- 从均匀分布\(U(0, 1)\)中产生一个随机数\(\mu_i\)。
- 如果\(\mu_i < \frac{p(x_i)}{M q(x_i)}\),则接受样本\(x_i\)。否则拒绝,重新采样。
在实际应用中,有事很难寻找到一个解析形式的\(q(x)\)。因此延伸出了自适应拒绝采样(Adaptive Rejection Sampling),在目标分布是对数凹函数时,用多段线性函数来覆盖目标分布的对数\(\ln p(x)\)
7.1.2.3 重要性采样
主要用于计算函数\(f(x)\)在目标分布\(p(x)\)上的积分(函数期望),即
首先找到一个容易抽样的参考分布\(q(x)\),并令\(w(x) = \frac{p(x)}{q(x)}\),则有:
这里\(w(x)\)可以看作样本\(x\)的重要性权重。从\(q(x)\)抽取N个样本\(\{x_i\}\),然后按下式估计\(E[f]\):
如果不需要计算函数积分,只想从目标分布\(p(x)\)中采样出若干样本,则可以用重要性重采样(Sampling-Importance Re-samping, SIR)。先从参考分布\(q(x)\)中抽取\(N\)个样本,然后按照他们的权重\(w(x)\)进行重新采样,最终得到的样本服从目标分布\(p(x)\)。
如果是高维空间的随机向量,拒绝采样和重要性重采样经常难以寻找到合适的参考分布,采样效率低下,此时应考虑马尔可夫蒙特卡洛采样法。
7.2 高斯分布的采样
任意高斯分布都可以由标准正态分布通过拉伸和平移得到,所以这里只考虑标准正态分布的采样。
7.2.1 逆变换法
首先产生\([0, 1]\)上的均匀分布随机数\(\mu\),令\(z = \sqrt{2} \text{erf}^{-1}(2\mu - 1)\),则\(z\)服从标准正态分布。其中erf是高斯误差函数,它是标准正态分布的累积分布函数经过简单平移和拉升变换后的形式,定义如下
这种方法的缺点是erf的逆函数不好求解,计算起来比较麻烦。
7.2.2 Box-Muller算法
考虑两个独立的高斯分布的联合分布,假设\(x,y\)是两个服从标准正态分布的独立随机变量,具体采样过程如下:
- 产生\([0, 1]\)上的两个独立的均匀分布随机数\(\mu_1, \mu_2\)。
- 令\(\begin{cases} x = \sqrt{-2\ln(\mu_1)}\cos2\pi \mu_2 \\ y = \sqrt{-2\ln(\mu_1)}\sin2\pi \mu_2 \end{cases}\),则\(x,y\)服从标准正态分布,并且是相互独立的。
Box-Muller算法需要计算三角函数,比较耗时。Marsaglia polar方法则避开了三角函数的计算: - 在单位圆盘上产生均匀分布随机数对\((x,y)\)。
- 令\(s = x^2 + y^2\),则\(x\sqrt{\frac{-2\ln s}{s}}\), \(y\sqrt{\frac{-2\ln s}{s} }\)是两个服从标准正态分布的样本。
7.2.3 拒绝采样法
选择指数分布作为参考分布,取\(\lambda = 1\)的指数分布,其密度函数为\(q(x)=e^{-x}\),对应的累积分布函数及其逆函数分别为:
利用逆变换法很容易得到指数分布的样本,再根据拒绝采样法决定是否接受该样本,接受概率为:
其中\(p(x)=\frac{2}{\sqrt{2\pi}}e^{-\frac{x^2}{2}}\ (x \geq 0)\)是标准正态分布压缩到正半轴后的概率密度函数,常数因子\(M\)需要满足如下条件:
$$p(x) \leq M \cdot q(x)$$
计算后得到接受概率:
$$A(x) = e {-\frac{(x-1)2}{2}}$$
具体采样过程如下:
- 产生\([0,1]\)上的均匀分布随机数\(\mu_0\),计算\(x = F^{-1}(\mu_0)\)得到指数分布的样本\(x\)。
- 再产生\([0,1]\)上的均匀分布随机数\(\mu_1\),若\(\mu_1 < A(x)\),则接受\(x\),否则重新采样。
- 再产生\([0,1]\)上的均匀分布随机数\(\mu_2\),若\(\mu_2 < 0.5\),则将\(x\)转化为\(-x\),否则保持不变。
拒绝采样的效率取决于接受概率的大小。Ziggurat算法采用多个阶梯矩形来逼近目标分布,提高接受概率,而且实现起来并不复杂。
7.3 马尔可夫蒙特卡洛采样
马尔可夫蒙特卡洛采样(Markov Chain Monte Carlo, MCMC)可以用于比较复杂的分布的采样,并且在高维空间中也能使用。蒙特卡洛法是指基于采样的数值型近似求解方法,而马尔可夫链则用于采样。MCMC基本思想是:针对目标分布,构造一个马尔可夫链,使得该马尔可夫链的平稳分布就是目标分布;从任何一个初始状态出发,沿着马尔可夫链进行转移;最终的状态转移序列会收敛到目标分布,得到一系列样本。
在实际操作中,核心点就是构造合适的马尔可夫链,即确定马尔可夫链的状态转移概率。
7.3.1 Metropolis-Hastings采样法
对于目标分布\(p(x)\),选择一个易采样的参考条件分布\(q(x^*|x)\),并令
然后根据如下过程进行采样:
- 随机选一个初始样本\(x^{(0)}\)
- For \(t = 1, 2, 3\dots\)
- 根据参考条件分布\(q(x^{*}|x^{(t-1)})\)抽取一个样本\(x^{*}\)
- 根据均匀分布\(U(0,1)\)产生随机数\(u\)
- 若\(u < A(x^{(t-1)}, x^*)\),则令\(x^{(t)} = x^*\),否则令\(x^{(t)} = x^{(t-1)}\)
\(A\)就是转移概率,\(x\)之间构成马尔可夫链。样本序列\(\{ \dots, x^{(t-1)}, x^{(t)} \}\)最终会收敛到目标分布\(p(x)\)。
7.3.2 吉布斯采样法
吉布斯采样是Metropolis-Hastings算法的特例,其核心思想是每次只对样本的一个维度进行采样和更新。对于目标分布\(p(x)\),其中\(x=(x_1, \cdots, x_d)\)是多维向量,按如下过程采样:
- 随机选择初始状态\(x^{(0)}=(x_1^{(0)}, \cdots, x_d^{(0)})\)
- For \(t = 1, 2, 3 \dots\):
- 对于前一步产生的样本\(x^{(t-1)} = (x_1^{(t-1)},\cdots, x_d^{(t-1)})\),依次采样和更新每个维度的值,即依次随机抽取分量\(x_1^{(t)} \sim p(x_1|x_2^{(t-1)}, x_3^{(t-1)},\dots,x_d^{(t-1)}),\dots,p(x_d|x_1^{(t)}, x_2^{(t)},\dots,x_{d-1}^{(t)})\)
- 形成新的样本\(x^{(t)} = (x_1^{(t)}, \cdots, x_d^{(t)})\)
每个维度的采样都是从以其他维度为条件的条件概率中采样的。该条件分布包含本轮已经采样的维度或者上轮采样的维度。每个维度的抽样和更新,可以是随机顺序。
与拒绝采样不同,MCMC采样法每一步都会产生一个新的样本,只是有时候这个样本与之前的样本一样而已。另外,MCMC采样法是在不断迭代中逐渐收敛到平稳分布的,因此在实际应用中一般会对得到的序列进行“burn-in"处理,即截除掉序列中最开始的一部分样本,只保留后面的样本。
7.3.3 采样相互独立样本
MCMC采样法得到的样本序列中相邻样本不独立,因为后一个样本是由前一个样本根据特定转移概率得到的。如果仅仅是采样的话,不需要样本之间相互独立。如果需要产生独立同分布的样本,可以同时运行多条马尔可夫链,不同链上的样本是独立的。或者在同一条马尔可夫链上每隔若干个样本取一次,这样取出来的样本也是近似独立的。
7.4 贝叶斯网络的采样
贝叶斯网络,又称信念网络或有向无环图模型,它是一种概率图模型,利用有向无环图来刻画一组随机变量之间的条件概率分布关系。
7.4.1 贝叶斯网络采样
- 祖先采样:根据有向图的顺序,先对祖先节点进行采样,只有当某个节点的所有父节点都已完成采样,才对该节点进行采样。
- 祖先采样得到的样本服从贝叶斯网络的联合概率分布。
7.4.2 部分随机变量的边缘分布
- 用祖先采样对所有随机变量进行采样。
- 忽视那些不需要的变量的采样值,就得带了一部分随机变量的边缘分布。
7.4.3 含有观测变量的采样
- 逻辑采样:利用祖先采样得到所有变量的取值。如果这个样本在观测变量上的取值和实际观测值一样,则接受,否则拒绝,重新采样。这种方法的缺点是效率低,观测变量越多,效率越低。
- 重要性采样-似然加权采样:只对非观测变量进行采样,但最终样本需要赋予重要性权重\[w \propto \prod \limits_{z_i \in E} p(z_i | pa(z_i)) \]
其中\(E\)是观测变量集合,\(pa(z_i)\)是\(z_i\)的祖先的概率
- MCMC采样法
- Metropolis-Hastings采样:在采样变量组成的随机向量上选择一个概率转移矩阵,按照概率转移矩阵不断进行状态转换,每个转移有一定概率的接受或拒绝,最终的样本序列会收敛到目标分布。
- 吉布斯采样:求得向量上的维度的条件概率,每次只对一个变量进行采样,交替进行即可。
7.5 不均衡样本的重采样
样本不均衡出现的本质原因是模型在训练时优化的目标函数和测试时使用的评价标准不一致。这种不一致表现在两个方面:训练数据的样本分布与测试时期望的样本分布不一致;训练阶段不同类别的权重(重要性)与测试阶段不一致。
7.5.1 基于数据的方法
一般会对数据进行重采样,使样本变得均衡。以下是多种常见的数据重采样技术。
- 随机采样:一种方式是过采样,即从少数类中有放回采样,可能造成少数类过拟合。另一种方式是欠采样,从多数类中随机舍弃一些样本,可能会损失多数类的部分有用信息。
- SMOTE算法:对少数类样本集\(S_{min}\)中的每个样本\(x\),从它在\(S_{min}\)中的K近邻中随机选取一个样本\(y\),然后在\(x,y\)连线上随机选取一点作为新样本。根据需要的过采样倍率重复上述过程若干次。SMOTE算法为每个少数类样本合成相同数量的新样本,增大类间重叠度,也生成一些不能提供有用信息的样本。改进的方法主要有三种:Borderline-SMOTE方法,只给处于分类边界上的少数类样本合成新样本;ADASYN算法,不同的少数类样本合成不同个数的新样本;数据清理方法(如Tomek Links),降低合成样本的类间重叠。
- Informed Undersampling:
- Easy Ensemble算法:从多数类\(S_{maj}\)中随机抽取一个子集\(E(|E|\approx |S_{min}|)\),使用\(E + E_{min}\)训练分类器;重复上述过程若干次,得到多个分类器,最终结果由多个分类器结果融合。
- Balance Cascade算法:采用级联结构,在每一级中从多数类\(S_{maj}\)中随机抽取子集\(E\),用\(E+S_{min}\)训练该级的分类器,将\(S_{maj}\)中能够被当前分类器正确判别的样本剔除掉,继续下一级操作,重复若干次得到级联结构,最终结果也是各级分类器结果的融合。
- NearMiss:利用K近邻信息挑选具有代表性的样本。
- One-sided Selection:采用数据清理技术
- 其它采样技术:如基于聚类的采样方法、数据扩充方法、Hard Negative Mining等。
8. 前向神经网络
8.1 激活函数
8.1.1 常用激活函数及其导数
- Sigmoid函数。该函数的形式为
导数具有非常好的性质,可以直接写成
- Tanh激活函数。该函数形式为
- ReLU激活函数。ReLU函数是最常用的激活函数之一,一般表示为
- GTU激活函数。结构上等于tanh激活单元和sigmoid激活单元的叠加:
- GLU激活函数。结构上类似于ReLU激活单元+sigmoid激活单元,不会存在梯度消失问题。
- SELU (scaled exponential linear units)激活函数,具有自归一化功能:
其中\(\alpha, \lambda\)是两个常数
7. Swish激活函数
8.1.2 梯度消失问题
Sigmoid函数在\(z\)很大或者很小时,导数趋近于0,会造成梯度消失问题。而Tanh函数相当于Sigmoid的平移,梯度消失问题也是类似的。Sigmoid和tanh函数的关系可以表示为:
8.1.3 ReLU优缺点
ReLU激活函数不需要计算指数,非常方便,而且其非饱和性有效解决梯度消失问题,提供相对宽的激活边界。另外,单侧抑制提供了网络的稀疏表达能力。但ReLU容易出现神经元死亡问题,原因是负梯度在经过该ReLU单元时被置为0,且在之后不被激活,梯度永远为0。如果学习率设置较大,会导致一定比例的神经元不可逆死亡,进而参数梯度无法更新。一般有如下几种改进方法:
- Leaky ReLU\[f(z)=\begin{cases} z, z > 0 \\ az, z < 0 \end{cases} \]一般\(a\)为小常数,既实现单侧抑制,又保留了部分负梯度,但\(a\)的选择增加了问题难度。
- PReLU:将负轴部分斜率\(a\)作为网络中的可学习参数。
- Random ReLU:训练过程中,\(a\)作为一个满足某种分布的随机采样,测试时固定住。
8.2 神经网络训练技巧
8.2.1 参数初始化
首先思考一个问题,是否可以将全部参数初始化为0。一般是不行的,因为同一层的任意神经元都是同构的,它们的输入输出都相同,因此前向反向传播的取值完全相同,训练一直是对称的,同一层参数都是相同的。具体来说,对于\(f(x)=W_N \cdots (W_1x+b) + b\)这种网络,如果我们需要求\(W_n\)的导数,通过链式法则最终的结果会包含\(W_{n-1}, W_{n-2}, \cdots, x\)的值。如果\(n=1\),要么梯度是不为0的。如果\(n > 1\),由于参数被初始化为0,算出的梯度总是0。
一般随机初始化参数,常见的初始化方式有glorot_normal、glorot_uniform、he_normal和he_uniform。
8.2.2 Dropout原理与实现
Dropout以一定概率随机地“临时丢弃”一部分神经元,相当于每次迭代都在训练不同结构的神经网络,类似于Bagging方法。轻量级的Bagging集成近似,能够实现指数级数量神经网络的训练与评测。
具体实现:包含\(N\)个神经元的网络,在Dropout作用下可看作为\(2^N\)个模型的集成,这些模型可看作原网络的子网络,共享部分权值,具有相同网络层数,整体参数数目不变。减弱全体神经元之间的联合适应性,能够减少过拟合的风险。在训练阶段,以概率\(p\)从Bernoulli分布中随机生成取值为0或1的向量,代表每个神经元是否被丢弃。在测试阶段,每个神经元参数乘以概率系数\(p\),恢复在训练中该神经元只有\(p\)的概率被用于整个网络的前向传播计算。
8.2.3 Normalization
8.2.3.1 Internal Covariate Shift
统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同,即对所有的\(x \in \mathcal{X}\),
但是,
简而言之,每个神经元的输入数据不再是“独立同分布”
- 上层参数需要不断适应新的输入数据分布,降低学习速度。
- 下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
- 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
8.2.3.2 通用框架与基本思想
以一个神经元为例,接收一组输入向量
通过某种运算后,输出一个标量值:
以BN为代表的方法进行了简化的白化操作,通用框架如下所示:
其中,\(\mu\)和\(\delta\)是平移参数和缩放参数,\(g\)和\(b\)是再缩放参数和再平移参数。之所以引入再缩放和再平移,是为了模型的表达能力不会因为规范化下降。这两个参数都是可学习的,保证每个Normalization层学到的是真正有用的分布。
8.2.3.3 Batch Normalization
结合上述通用公式,BN中均值和方差由以下公式计算
BN独立地规范化每一个输入维度\(x_i\),但规范化的参数是一个 mini-batch的一阶统计量和二阶统计量。这就要求每一个 mini-batch的统计量是整体统计量的近似估计,或者说每一个 mini-batch彼此之间,以及和整体数据,都应该是近似同分布的。分布差距较小的mini-batch可以看做是为规范化操作和模型训练引入了噪声,可以增加模型的鲁棒性;但如果每个mini-batch的原始分布差别很大,那么不同 mini-batch的数据将会进行不一样的数据变换,这就增加了模型训练的难度。
训练时,BN层利用隐藏层输出结果的均值与方差来标准化每一层特征的分布,并且维护所有mini-batch数据的均值与方差,最后利用样本的均值与方差的无偏估计量在测试时使用。
8.2.3.4 Layer Normalization
与BN不同,LN是一种横向的规范化,它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入:
LN针对单个训练样本进行,不依赖于其他数据,因此可以避免BN 中受mini-batch 数据分布影响的问题,可以用于小mini-batch场景、动态网络场景和RNN,特别是自然语言处理领域。此外,LN不需要保存mini-batch 的均值和方差,节省了额外的存储空间。
但是,BN的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么LN的处理可能会降低模型的表达能力。
8.3 卷积神经网络
卷积操作主要用于处理类网格结构的数据,对于时间序列以及图像数据的分析与识别具有显著优势。
8.3.1 特性
卷积神经网络有两个特性,分别是稀疏交互和参数共享。稀疏交互是指每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重(产生交互)。假设网络中相邻两层分别具有\(m\)个输入和\(n\)个输出,全连接网络需要\(m \times n\)个参数的权值矩阵,而卷积网络只需要\(k \times n\)个参数的权值矩阵,其中\(k\)为每个输出神经元连接的输入数。稀疏交互减少了参数个数,能够防止过拟合。通常图像、文本、语音等数据具有局部的特征结构。可以先学习局部特征,再将局部特征组合起来形成更复杂特征。参数共享是指不同模块使用相同参数。在全连接网络中,权值参数矩阵中的每个元素只作用于某个输入元素一次。在卷积网络中,卷积核中的每个元素作用于每一次局部输入的特定元素上。卷积层具有平移等变性,神经网络的输出对于平移是等变的。
8.3.2 池化操作
池化操作的本质是降采样。常用的池化操作只要针对非重叠区域,包括均值池化和最大池化。均值池化能够抑制由于邻域大小受限造成估计值方差增大的现象,对背景的保留效果好。最大池化能够抑制网络参数误差造成估计均值偏移,更好地提取纹理特征。
此外,特殊的池化方式还包括对相邻重叠区域的池化以及对空间金字塔池化。前者采用比窗口宽度更小的步长,窗口每次滑动时存在重叠区域。后者考虑多尺度信息,同时计算多个尺度池化结果并拼接。
池化操作能显著降低参数数量,还能保持对平移、伸缩、旋转操作的不变性。
8.4 深度残差网络
神经网络的层数决定了模型的容量。随着网络层数加深,模型容易陷入局部最优解,而且梯度消失问题逐渐严重。
ResNet是一个典型的深度残差网络,用户解决或缓解深层的神经网络训练中的梯度消失问题。层数更深的网络反而具有更大的训练误差,很大程度归结于梯度消失问题。误差传播涉及非常多的参数和导数的连乘,很容易导致梯度消失或者膨胀。
ResNet认为,既然离输入近的神经网络层较难训练,那么可以将它短接到更靠近输出的层。具体来说,输入\(x\)经过两层的变换得到\(F(x)\),短接后,两层的网络模块输出\(H(x)=F(x)+x\),\(F(x)\)被设计为只需要拟合\(x\)与目标输出\(H(x)\)的残差\(\tilde{H}(x)\),跳过的两层只需要拟合上层输出和目标之间的残差。ResNet中添加短跳连接的方式如下图:
8.5 循环神经网络
循环神经网络适合处理长距离依赖关系,能够处理变长的输入序列。循环神经网络展开之后是一个\(T\)层的前馈神经网络,整个网络可以通过下面公式表示:
其中\(f\)为激活函数,\(g\)为最后的分类函数(如softmax),\(U\)为输入层到隐含层之间的权重矩阵,\(W\)为隐含层从上一时刻到下一时刻状态转移的权重矩阵,\(V\)为隐含层到输出层的权重矩阵。
8.5.1 梯度消失问题
循环神经网络采用基于时间的反向传播(BPTT)算法求解,展开后和普通反向传播算法没有区别。后层的梯度以连乘方式叠加到前层,由于Sigmoid具有饱和特性,输出变化不明显。使用BPTT算法学习的循环神经网络并不能成功捕捉到长距离的依赖关系,主要因为梯度消失问题。传统循环神经网络梯度表示为连乘形式:
其中\(\frac{\partial net_t}{\partial net_{t-1}}\)是\(n\times n\)雅可比矩阵。当雅克比矩阵最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸。反之,梯度大小呈指数缩小,导致梯度消失。梯度爆炸可以通过梯度裁剪来缓解,梯度消失问题需要对模型改进,如LSTM和GRU。
8.5.2 激活函数
用ReLU做循环神经网络的激活函数时,需要对矩阵的初始值作一定限制,否则容易引发数值问题。RNN中,如果采用ReLU函数,并且假设激活函数一直处于激活区域,则有\(f(x)=x, net_t = Ux_t + W(Ux_{t-1} + Wh_{t-2})\),继续展开\(net_t\)的表达式最终会包含\(t\)个\(W\)相乘(同一个\(W\)乘多次)。如果\(W\)不是单位矩阵,最终结果将趋于0或无穷。即使采用ReLU,只要\(W\)不是单位矩阵,梯度还是会出现消失或爆炸现象。不同的是,在CNN中每一层的\(W\)是不同的,并且在初始化时是独立同分布的,可以相互抵消,因此不会出现严重数值问题。
因此,当采用ReLU激活函数式,RNN需要初始化\(W\)为单位矩阵才能取得比较好的效果。这种方式在一些应用中取得了和LSTM相似的结果,且收敛更快,算是一个小技巧。
8.6 LSTM和GRU
8.6.1 LSTM
LSTM中有几个核心概念,分别是输入门、遗忘门、输出门和记忆单元。输入门\(i_t\),用于控制当前计算的新状态以多大的程度更新到记忆单元中。遗忘门\(f_t\),用于控制前一步记忆单元中的信息有多大程度被遗忘掉。输出门\(o_t\),控制当前的输出有多大程度取决于当前的记忆单元。记忆单元\(c_t\),每个单元都有,用于对长期信息进行记忆。
LSTM的更新公式总结如下:
- 输入门:
- 遗忘门:
- 输出门:
- 记忆单元
- 记忆单元更新:
- 隐含层输出更新
遗忘门和输入门控制着长短时记忆,更容易学习到序列之间的长期依赖。如果使用ReLU作为激活函数,难以实现门控效果,因为ReLU负半轴是关的,正半轴不具有门控意义。在门控中,使用Sigmoid函数几乎是所有现代神经网络模块的共同选择。如果计算能力有限设备,也可以使用0/1门(hard gate)。
8.6.2 GRU
GRU比LSTM更加简单,主要有两个门,分别是重置门和更新门。更新门\(z_t\),用于控制前一时刻的状态信息被带入到当前状态中的程度。重置门\(r_t\),用于控制忽略前一时刻的状态信息的程度。
GRU的更新公式如下:
- 重置门:
- 更新门:
- 前一状态信息
- 隐状态
其中\([]\)表示两个向量相连接,\(*\)表示矩阵元素相乘。
与LSTM相比,GRU参数更少更简单,因此训练效率更高。但LSTM含有记忆单元,因此理论上更能记住长距离依赖。不过这不是绝对的,模型效果与数据集相关,需要通过试验进行比较。
8.7 Seq2Seq模型
8.7.1 基本原理
Seq2Seq的核心思想是将一个作为输入的序列映射为一个作为输出的序列。首先将输入进行编码,得到中间状态,然后解码得到输出。下图是Seq2Seq的基本示意图:

解码第一步是解码器进入编码器的最终状态,生成第一个输出,以后解码器读入上一步的输出,生成当前步输出。Seq2Seq的组成部件包括Encoder、Decoder以及连接两者的固定大小的State Vector。
8.7.2 解码方法
解码器是Seq2Seq最核心的部分,大部分的改进也是发生在这个部分。常见的方法包括贪心法和集束搜索(Beam Search)方法。贪心法选取一种度量标准后,在当前状态下选择最佳的一个结果,直到结束。这种方法计算代价低,但计算得到的可能是局部最优解。集束搜索(Beam Search)是一种启发式算法,它保存beam size个当前较佳选择,该参数决定了计算量,一般8~12最佳。解码时每一步根据保存的结果选择下一步扩展和排序,选择前beam size个保存。循环迭代,直到结束。选择最佳结果输出。
Seq2Seq有很多改进版本,比如堆叠RNN、引入Dropout机制、解码器与编码器之间建立残差连接、引入注意力机制和使用记忆网络等。
8.8 注意力机制
8.8.1 Seq2Seq模型中的注意力机制
在实际应用Seq2Seq模型时发现,随着输入序列增长,模型性能发生显著下降。一种小技巧是将源语言句子逆序输入,或者重复输入两遍,能够得到一定的性能提升。但这种技巧无法根本解决这个问题,本质原因是解码时当前词及对应的源语言词的上下文信息和位置信息在编解码过程中丢失了。
引入Seq2Seq引入注意力机制解决上述问题。解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态:
其中,\(y\)是输出词,\(s\)是当前隐状态,\(f,g\)是非线性变换,通常为神经网络。语境向量\(c_i\)是输入序列全部隐状态\(h_1,\cdots,h_T\)的加权和:
神经网络\(a\)将上一个输出序列隐状态\(s_{i-1}\)和输入序列隐状态\(h_j\)作为输入,计算出一个\(x_j,y_i\)对齐的值\(e_{ij}\)。考虑每个输入词与当前输出词的对齐关系,对齐越好的词,会有更大权重,对当前输出影响更大。
另一个技巧是双向循环神经网络。单方向的循环神经网络中\(h_i\)只包含了\(x_0\)到\(x_i\)的信息,\(a_{ij}\)丢失了\(x_i\)后面的信息。引入双方向后,第\(i\)个输入词对应的隐状态包括了\(\overrightarrow{h}_i\)和\(\overleftarrow{h}_i\),前者编码了\(x_0\)到\(x_i\)的信息,后者编码了\(x_i\)及之后的信息,防止信息丢失。下图是双向RNN的示意图:
8.8.2 常见Attention形式
Attention机制的本质是一个查询(query)到一系列(键key-值value)对的映射,如下图所示:
Attention的计算过程一般可以总结为以下步骤:
- 将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等。
- 使用一个softmax函数对这些权重进行归一化。
- 权重和相应的键值value进行加权求和得到最后的attention。
9. 集成学习
9.1 集成学习分类
集成学习分为Boosting和Bagging两类。
- Boosting方法采用串行的方式,各个基学习器之间有依赖。其基本思路是将基学习器层层叠加,每一层训练时,对前一层分错的样本,给予更高的权重。测试时,根据各层学习器的结果加权融合。典型的代表方法有AdaBoost。
- Bagging方法中各基学习器之间无强依赖,可以并行训练。比如基于决策树基学习器的Random Forest就是Bagging方法。Bagging方法一般将训练集分为若干子集(训练集较小时可能有交集)训练基学习器。
9.2 偏差和方差
偏差和方差能够用户定量描述模型的性能(一般表现为欠拟合和过拟合)。
- 偏差:定义为所有采样得到的大小为\(m\)的训练数据集训练出来的所有模型的输出的平均值和真实模型输出之间的偏差。通常是由于对学习算法做了错误的假设导致,如真实模型是二次函数,我们假设是一次函数。偏差带来的误差通常在训练误差上体现出来。
- 方差:定义为由所有采样得到大小为\(m\)的训练数据集训练出来的所有模型的输出的方差。通常是由于模型复杂度相对于训练样本数\(m\)过高导致的。方差带来的误差通常表现在测试误差相对于训练误差的增量上。
偏差和方差二者矛盾统一,不能完全独立。
基学习器的错误一般分两类,表现为偏差(欠拟合)和方差(过拟合)。偏差是由于分类器表达能力有限导致的系统性错误,表现为训练误差不收敛。方差是由于分类器对于样本分布过于敏感,导致在训练样本较少时,产生过拟合。Boosting方法通过逐步聚焦于基学习器分错的样本,减小集成学习器的偏差,各弱分类器之间是强相关的,缺乏独立性,所以对降低方差无作用。Bagging方法对训练样本多次采样,综合多个模型,减小集成学习器的方差。
最常用的基分类器是决策树,原因有:方便地将样本权重整合到训练过程中,而不需要使用过采样来调整样本权重;决策树的表达能力和泛化能力,可以通过调节树的层数实现;决策树节点分裂可以很好地引入“随机性”。神经网络模型也适合做基分类器,因为可以通过调整神经元数量、连接方式、网络层数、初始权值引入随机性。Bagging的基分类器最好是本身对样本分布较为敏感(即所谓不稳定的分类器),不能使用线性分类器或K-近邻,因为这两种分类器较为稳定方差不大,无法减小方差,甚至因为采样,导致训练中无法收敛,增大了集成分类器偏差。
训练好基分类器后,最后需要合并。一般有两种方法合并基分类器:voting,即采用投票方式;stacking,是一种串行方式,所有基分类器结果相加或者融合。
9.3 AdaBoost
AdaBoost是一种典型的Boosting方法,以下是AdaBoost的基本算法流程:
- 输入:数据集\(T=\{ (x_1,y_1),\cdots,(x_N,y_N) \}\),其中\(y_i \in \{-1,+1\};弱学习算法\)。
- 输出:最终分类器\(G(x)\)。
- 初始化训练数据的权值分布:
- 对于\(m=1,2,\cdots,M\):
使用具有权值分布\(D_m\)的训练数据集学习,得到基分类器:
计算\(G_m(x)\)在训练集上的分类误差率:
计算\(G_m(x)\)的系数:
更新训练集的权值分布:
其中\(Z_m\)是规范化因子,使得\(D_{m+1}\)成为一个概率分布。最终构建基分类器的线性组合:
- 得到最终的分类器:
其中,\(\alpha\)之和不并为1。
9.4 随机森林
随机森林在当前所有算法中,具有极好的准确率。它能够有效地运行在大数据集上,能够处理具有高维特征的输入样本,而且不需要降维,能够评估各个特征在分类问题上的重要性,在生成过程中,能够获取到内部生成误差的一种无偏估计,对于缺省值问题也能够获得很好得结果。
9.4.1 生成规则
- 如果训练集大小为\(N\),对于每棵树而言,随机且有放回地从训练集中的抽取\(N\)个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
- 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要。
- 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的。
- 如果每个样本的特征维度为\(M\),指定一个常数\(m << M\),随机地从\(M\)个特征中选取\(m\)个特征子集,每次树进行分裂时,从这\(m\)个特征中选择最优的。
- 每棵树都尽最大程度的生长,并且没有剪枝过程。
两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
影响最终分类效果因素有多种,比如:森林中任意两棵树的相关性,相关性越大,错误率越大;森林中每棵树的分类能力,每棵树的分类能力越强,整个森林的错误率越低;减小特征选择个数\(m\),树的相关性和分类能力也会相应的降低。增大\(m\),两者也会随之增大。所以关键问题是如何选择最优的\(m\)(或者是范围),这也是随机森林唯一的一个参数。
9.4.1 袋外错误率
选择\(m\)的主要依据是计算袋外错误率oob error(out-of-bag error)。没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。袋外错误率的计算方法如下:
- 在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第\(k\)棵树),大约有1/3的训练实例没有参与第\(k\)棵树的生成,它们称为第\(k\)棵树的oob样本。
- 对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树)。
- 然后以简单多数投票作为该样本的分类结果。
- 最后用误分个数占样本总数的比率作为随机森林的oob误分率。
9.5 提升方法与梯度提升决策树
9.5.1 提升方法与前向分步算法
9.5.1.1 提升方法
提升方法从弱学习算法出发,反复学习,得到一系列弱分类器,然后组合这些弱学习器,提升为强学习器。提升方法考虑两个问题:在每一轮如何改变训练数据的权值或概率分布;如何将弱学习器组合成一个强学习器。
9.5.1.2 前向分步算法
前向分步算法(Forward Stagewise Algorithm)是AdaBoost另一种解释,AdaBoost是一种加法模型,其损失函数为指数函数,学习算法为前向分步算法,是二类分类学习方法。
前向分步算法
考虑加法模型(additive model):
其中,\(b(x;\gamma_m)\)为基函数,\(\beta_m\)为基函数的系数,\(\gamma_m\)为基函数参数。给定训练数据及损失函数\(L(y, f(x))\)条件下,学习加法模型成为经验风险极小化即损失函数极小化问题:
前向分步算法如下:
- 输入:训练集,损失函数\(L\),基函数集\(\{b(x;\gamma)\}\)。
- 输出:加法模型\(f(x)\)。
- 初始化\(f_0(x)=0\)。
- 对\(m=1,2,\cdots,M\),极小化损失函数,得到参数:\[(\beta_m, \gamma_m)=\mathop{\arg\min}\limits_{\beta, \gamma}\sum \limits_{i=1}^N L(y_i, \ f_{m-1}(x)+\beta b(x; \gamma)) \]然后更新:\[f_m(x)=f_{m-1}(x) + \beta_m b(x;\gamma_m) \]
- 得到加法模型:\[f(x)=f_M(x)=\sum \limits_{m=1}^M \beta_m b(x; \gamma_m) \]
9.5.2 提升树原理
9.5.2.1 提升树算法
如果将输入空间\(\mathcal{X}\)划分为\(J\)个互不相交的空间\(R_j\)(回归树叶节点个数),并且在每个区域确定输出的常量\(c_j\)(\(c_j\)就是回归或者分类的值),那么树可以表示成:
回归问题提升树使用以下前向分步算法:
在第\(m\)步,需求解:
平方误差损失函数表示为:
其中\(r=y-f_{m-1}(x)\)是残差。因此只需要简单地拟合当前模型的残差。
回归问题的提升树算法总结如下:
- 输入:训练集
- 输出:提升树\(f_M(x)\)
- 初始化\(f_0(x)=0\)
- 对\(m=1,2,\cdots,M\),计算残差:\[r_{mi} = y_i-f_{m-1}(x_i) \]拟合残差\(r_{mi}\),学习一个回归树,得到\(T(x;\Theta_m)\),更新:\[f_m(x)=f_{m-1}(x) + T(x;\Theta_m) \]
- 得到回归问题提升树:\[f_M(x)=\sum \limits_{m=1}^M T(x;\Theta_m) \]
9.5.2.2 梯度提升
梯度提升算法描述如下:
- 输入:训练集;损失函数\(L(y, f(x))\)
- 输出:回归树\(\hat{f}(x)\)
- 初始化\[f_0(x)=\mathop{\arg\min}\limits_{c}\sum \limits_{i=1}^N L(y_i, c) \]其中,\(c\)是回归值,它是只有一个根节点的树。
- 对于\(m=1,2,\cdots,M\)。对\(i=1,2,\cdots,N\),计算:\[r_{mi}=-\left[ \frac{\partial L(y_i, f(x_i))}{\partial f(x_i)} \right] \]对\(r_{mi}\)拟合一个回归树,得到第\(m\)棵树的叶节点区域\(R_{mj}\)。对\(j=1,2,\cdots,J\),为每个叶节点计算最好的回归值:\[c_{mj}=\arg\min\limits_{c}\sum \limits_{x_i \in R_{mj}} L(y_i, f_{m-1}(x_i)+c) \]更新:\[f_m(x)=f_{m-1}(x)+\sum \limits_{j=1}^J c_{mj}I(x\in R_{mj}) \]
- 得到回归树\[\hat{f}(x)=f_M(x)=\sum \limits_{m=1}^M\sum \limits_{j=1}^J c_{mj}I(x\in R_{mj}) \]
GBDT与XGBoost
首先我们看看梯度提升决策树GBDT的优缺点:
- 优点:预测阶段计算速度快,树与树之间可以并行计算;分布稠密的数据集上,泛化能力和表达能力好;使用决策树的GBDT具有可解释性和鲁棒性,能自动发现特征间的高阶关系,不需要对数据做特殊预处理如归一化等。
- 缺点:高维稀疏数据集上,表现不如SVM或者神经网络;处理数值型特征效果明显,文本分类特征上不是最好;训练过程需要串行训练。
XGBoost也是常用的集成学习方法,它和GBDT的联系和区别如下:
- GBDT是机器学习算法,XGBoost是该算法的工程实现。
- 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型复杂度,有利于防止过拟合,提高泛化能力。
- GBDT训练时只用了代价函数的一阶信息,XGBoost同时使用了一阶和二阶导数。
- 传统的GBDT使用CART作为基分类器,XGBoost支持多种类型的基分类器,比如线性分类器。
- 传统的GBDT在每轮迭代时使用全部数据,XGBoost则采用了与随机森林类似的策略,支持对数据进行采样。
- 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习缺失值的处理策略。

浙公网安备 33010602011771号