(由于平台稿件格式问题,公式格式不能正确写上;如若读写困难可后台私信我要完整电子版)
通过前面的学习我们知道,逻辑回归其实就是在平面上通过画直线进行二分类,其学习过程就是通过梯度下降法在训练数据中寻找分类线。当训练数据线性可分时,能够正确进行分类的分类线有无数条,不同的分类线对应于不同的 w 和 w_0 及不同的 Loss,如图5-1所示。
图5-1
在图5-1中,直线 L_1 和 L_2 都可以把训练数据完美地分成两类,但哪条更好呢?Loss 最小的直线一定是最好的吗?我们可以从几何的角度审视这个问题。直线 L_2 与一些数据点的距离相对较近,如果测试集中的数据点发生轻微的移动(特征轻微变化),那么测试数据将跑到直线的另一侧,如图5-2所示。
图5-2
这种直线虽然能够在训练样本中实现正确分类,但在实际应用中面对大量没有见过而与训练样本有偏差的数据时,其准确性就会打折扣(其实这就是过拟合)。相对来说,数据点离直线 L_1 较远,即使发生了轻微的移动,也不会跑到直线的另一侧(导致分类结果改变),因此,直线 L_1 的泛化能力相对较强。
综上所述,在这两条直线中 L_1 更好,因为它离边界数据点更远。
在数据线性可分的情况下,我们把以上分析细化一下。数据点可以分为两种类型,即边界点和内部点。边界点是指一个类别中距离分类线最近的点,每个类别可以有不止一个边界点。除了边界点,其他的数据点都是内部点,如图5-3所示。
图5-3
因为内部点远离直线,所以,它们即使发生了轻微移动,也不会来到直线的另一侧。但是,因为边界点靠近分类线,所以它们的随机移动很容易跨越直线,被分类器判断为另一类别。因此,分类器在边界点附近的稳定性差,即泛化能力弱。
如何提高分类线的稳定性呢?可以增大边界点到分类线的距离——距离越远,边界点随机移动至直线另一侧的概率就越小。
为了方便,我们以输入数据为2维的情况为例进行分析,所有结论均可推广至高维空间。首先看一下点到分类线的距离公式。因为分类线有无数条平行线,所以,可以把分类线放在两个类别的边界点的中间位置,即
distance_N类=distance_P类
已知分类线的方程为 w_1 x_1+w_2 x_2+w_0=0,那么P类的边界点 〖[x_1,x_2]〗^T 到直线的距离为
distance_P类=distance_N类=|w_1 x_1+w_2 x_2+w_0 |/√(w_1^2+w_2^2 )
在讲解逻辑回归时提到过,对同一条直线,可以在系数上进行放缩,即
w_1 x_1+w_2 x_2+w_0=0
α_P类 (w_1 x_1+w_2 x_2+w_0 )=0,〖 α〗_P类≠0
以上两个方程对应的是同一条直线。对直线进行系数缩放不会改变直线本身,因此,点到直线的距离也不会改变。因为我们总能找到一个合适的缩放方法,使得边界点满足 |w_1 x_1+w_2 x_2+w_0 |=1,所以,P类的边界点到分类线的距离变为
distance_P类=|w_1 x_1+w_2 x_2+w_0 |/√(w_1^2+w_2^2 )=1/√(w_1^2+w_2^2 )
P类的内部点满足 w_1 x_1+w_2 x_2+w_0>1。
同理,N类的边界点到分类线的距离为
distance_N类=1/√(w_1^2+w_2^2 )
N类的内部点满足 w_1 x_1+w_2 x_2+w_0<-1。
我们的优化目标是在保证分类正确的前提下使边界点远离分类线,从而提高泛化能力,即找到一个合适的 w 使下式的值最大。
〖distance=distance〗_P类+distance_N类=2/√(w_1^2+w_2^2 )
distance 也称作margin,是指两类边界点中间的空白部分。
现在,我们的优化目标变为最大化下式。
distance=1/√(w_1^2+w_2^2 )
也就是说,最优目标为:在保证正确分类的情况下,最小化 min√(w_1^2+w_2^2 )。
可以发现,min√(w_1^2+w_2^2 ) 和 min〖(w_1^2+w_2^2)〗 是等价的。为了求解方便,最小化目标变为
min〖〖(w〗_1^2+w_2^2)〗
那么,如何通过数学方法表示“保证分类正确”呢?不同于逻辑回归的两个类别(标签为1或0),在这里可以分别设P类和N类所对应的标签 y 为 +1 和 -1。此时,y 已不具备概率意义,仅代表一个类别(如图5-3所示)。
P类:当标签为 y=+1 时,w_1 x_1+w_2 x_2+w_0 ≥ 1。
N类:当标签为 y=-1 时,w_1 x_1+w_2 x_2+w_0 ≤ -1。
以上两式可以统一写成
y(w_1 x_1+w_2 x_2+w_0 )≥1
当 x 为边界点时,“=”成立;当 x 为内部点时,取“>”。y(w_1 x_1+w_2 x_2+w_0 )≥1 作为约束条件,保证了分类的正确性。
但是,在实际应用中,大部分情形都是线性不可分的,即肯定不能正确地进行分类(无法保证下式成立)。
y(w_1 x_1+w_2 x_2+w_0 )≥1
不满足上式的数据点称为误差点。因此,可以进一步将数据点分成三类,即内部点、边界点、误差点。误差点有两种:一种是正确误差点,它的分类正确,但位于边界点外(分类正确,但到分类线的距离小于1);另一种是错误误差点,它不仅位于边界点外,而且分类错误。
对P类来说,误差点如图5-4所示。
图5-4
需要注意的是,正确误差点比边界点更靠近分类线。
为了使误差点满足上式,我们放宽(松弛)条件,引入松弛系数 ε ≥ 0。此时,约束条件变为
y(w_1 x_1+w_2 x_2+w_0 )≥1-ε
这样,不等式就相对没有那么严格了。数据点在不同约束条件下的情况如下。
内部点:y(w_1 x_1+w_2 x_2+w_0 )>1,即 ε=0。
边界点:y(w_1 x_1+w_2 x_2+w_0 )=1,即 ε=0。
正确误差点:y(w_1 x_1+w_2 x_2+w_0 )=1-ε,且 1>ε>0。
错误误差点:y(w_1 x_1+w_2 x_2+w_0 )=1-ε,且 ε ≥ 1。
也就是说
ε={█(0, 如果 y(w_1 x_1+w_2 x_2+w_0 )≥1@1-y(w_1 x_1+w_2 x_2+w_0 ),如果 y(w_1 x_1+w_2 x_2+w_0 )<1)┤
可以看出,ε 越小,分类效果就越好。因此,最小化 ε 也成为优化目标之一。
综上所述,考虑所有训练样本,我们的优化目标是
〖min(〗〖w_1^2+w_2^2 〗+C∑_(i=1)^N▒〖ε_((i)))〗
C 为超参数,表示我们对“分类正确”的重视程度。
对于 i=1,⋯,N,x_((i))=〖[x_((i),1),x_((i),2)]〗^T 满足
y_((i)) (w_1 x_((i),1)+w_2 x_((i),2)+w_0 )≥1-ε_((i))
N 是训练样本的数量。
在求解分类线 w=〖[w_1,w_2]〗^T 和 w_0 时,一般不使用梯度下降法,而使用成熟的拉格朗日乘子法。其中的数学计算较为复杂,感兴趣的读者可自行查阅相关资料。
由于我们的优化目标始终围绕最大化边界点和分类线之间的距离,所以,可以不加推导地得到“分类线仅由边界点决定”这一结果(具体推导过程过于复杂,在此不再详述),如图5-5所示。
图5-5
由于内部点和误差点不会影响分类线(w 和 w_0),所以,我们可以不加推导地得到 w,公式如下。
SV 为P类和N类的边界点的集合。可以看出,w 是所有边界点通过 α_((i)) y_((i)) 加权求和得到的。将任意边界点代入分类线,都可以求出 w_0。例如,当边界点 x_((i))=〖[x_((i),1),x_((i),2)]〗^T 对应于类别 y_((i))=1 时,有
y_((i)) (w_1 x_((i),1)+w_2 x_((i),2)+w_0 )=1
w_0=1-w_1 x_((i),1)+w_2 x_((i),2)
在诸多边界点中,任意选择一个代入即可。
因为边界点直接决定了分类线,且每个边界点都是一个向量,所以,边界点也称为支持向量(Support Vector),这种分类方法称为支持向量机(Support Vector Machine,SVM)。在求解支持向量机时,对于训练样本,不需要特意指明内部点、误差点和边界点,这些点都由拉格朗日法求出的 ε_((i)) 的值决定。
模型训练完成后,在进行分类时,对于待预测数据 x,可以使用以下模型。
y^'={█(1, 如果 w^T x+w_0>0@-1,如果 w^T x+w_0<0)┤
其中
w=(w_1¦w_2 ),x=(x_1¦x_2 )
特别的
w^T x=∑_(i∈SV)▒α_((i)) y_((i)) x_((i))^T x=∑_(i∈SV)▒α_((i)) y_((i)) 〈x_((i))^ ,x〉
这一步相当于输入样本 x 对训练样本中的各个边界点 x_((i))^ 、i∈SV 求内积(距离)。但要注意,支持向量机的结果不具备任何概率意义,这也是它和逻辑回归的区别。
在机器学习领域,并不存在所谓能解决一切问题的“银弹”,任何模型在解决特定场景中的问题时,都会受到限制或存在不足。我们在学习时,可以通过横向对比加深对各种模型的理解。本节从不同的角度将SVM和逻辑回归进行对比,帮助读者了解二者的长处和不足。
对于模型的输出,逻辑回归的输出 y^'∈(0,1) 有概率意义,而SVM的计算结果 w^T x+w_0 没有概率意义。因此,逻辑回归的预测结果有可解释性,并能通过概率和其他决策联系起来。例如,在广告点击率预测场景中,广告的排序(位置)不仅与预测的点击率有关,也与广告主对每次点击的付费有关。因此,排序所依据的得分为
score=ctr×money
ctr 就是逻辑回归预测的结果 y^',表示预测用户点击的概率;money 为每次点击的获利;score 表示期望收益。如果将SVM作为点击率预测模型,那么,因为SVM的输出不具有概率意义,所以不太容易和 money 进行有业务意义的融合。
从另一个角度看,在进行模型训练时,逻辑回归需要使用全部数据样本来确定分类线。SVM在“看”过所有样本并从中挑出边界点后,只需要利用边界点来确定分类线,而不必关心那些对分类作用不大的内部点。因此,SVM更关注分类,其分类线不会受到大量对分类没有帮助的内部点的影响。此外,因为SVM只关注边界点,所以它非常鲁棒,当样本中存在异常点(远离其他点的数据点)时,异常点会对逻辑回归造成严重影响,但不会影响SVM。
下面我们分析一下,在训练阶段,同为线性分类模型的SVM和逻辑回归的优化目标有何不同。
SVM的优化目标为
min〖(〖||w||〗^2 〗+C∑_(i=1)^N▒ε_((i)) )
并且所有训练数据点 x_((i)) 满足
y_((i)) (w^T x_((i))+w_0)≥1-ε_((i))
不难发现,〖||w||〗^2 就是逻辑回归中的L2正则。∑_(i=1)^N▒ε_((i)) 的作用和逻辑回归中的KL距离
相同,都用于减小分类误差,但二者的具体形式不同。下面对 ε_((i)) 进行分析。
在SVM中,以训练样本 x_((i)) 为例,它所对应的类别为 y_((i))=1,它在模型中的损失函数 ε_((i)) 是一个分段函数,公式如下。
ε_((i))={█( 0,如果 (w^T x_((i))+w_0)≥1@1-(w^T x_((i) )+w_0 ),如果 (w^T x_((i))+w_0)<1)┤
看看逻辑回归的损失函数。对于同一样本 x_((i)),它所对应的类别为 y_((i))=1,样本的损失函数(KL距离)为
ε_((i) )=-y_((i) ) log(y_((i))^' )-(1-y_((i) ) ) log(1-y_((i))^' )
=-log(y_((i))^' )
=-log 1/(1+e^(-(w^T x_((i) )+w_0 ) ) )
=1+e^(-(w^T x_((i))+w_0))
略去与 w、w_0 无的关项,可得
ε_((i))=e^(-(w^T x_((i))+w_0))
逻辑回归和SVM的损失函数的对比,如图5-6所示。
图5-6
可以看出,因为逻辑函数永远不会预测出完全满意的概率(1或0),所以逻辑回归的 ε_((i)) 永远不会为0。因此,即使分类正确,逻辑回归仍然会不停地训练,以求得到更小的损失和更大的概率。然而,对SVM来说,分类正确的内部点可直接使 ε_((i))=0,不再进行对分类无益的训练,这一点和提前终止学习有异曲同工之妙,即到一定程度就不再学习了。
在机器学习中,SVM的损失函数
ε_((i))={█( 0,如果 y(w^T x_((i))+w_0)≥1@1-y(w^T x_((i) )+w_0 ),如果 y(w^T x_((i))+w_0)<1)┤
称为Hinge Loss。近年来,深度学习中的度量学习广泛使用Hinge Loss作为损失函数,并且取得了不错的效果。
从模型训练的角度看,在逻辑回归中,每个训练样本都会参与训练,因此都会对分类线产生影响,如果训练样本中出现了异常点,那么逻辑回归仍然会把分类器朝远离自己的方向推,如图5-7所示。在训练SVM时,只有边界点会对最终的分类线产生影响,从而避免了分类线被内部异常点影响。
图5-7
当数据线性不可分时,如何提高分类的准确率是一个重要的问题。在逻辑回归中,最简
单的方式就是特征组合。例如,不同维度特征的组合 x_i x_j,高阶特征 x_i^2(相同维度特征的
组合)。但是,这种方法会耗费较多的计算资源和人力。在5.2节中,我们将讨论SVM是如何解决这个问题的。
通过第3章的讨论我们已经知道,升维可以解决线性不可分问题。例如,把输入特征 x 的每个维度和其他维度(包括其自身)进行交叉,使特征从3维升至9维,公式如下。
x=[x_1,x_2,x_3 ]^T→x^'=〖[x_1 x_1,x_1 x_2,x_1 x_3,x_2 x_1,x_2 x_2,x_2 x_3,x_3 x_1,x_3 x_2,x_3 x_3]〗^T
通过交叉,逻辑回归具备了解决线性不可分问题的能力。然而,其代价是运算量过大。如果原始特征的维度为 m,那么二阶交叉的维度为 C_m^2—— 这种量级的运算在实际应用中很难实现。因此,我们需要找到能在升维的同时有效降低运算量的方法。
对以下两个向量进行相同的升维操作。
x=[x_1,x_2,x_3 ]^T→x^'=[x_1 x_1,x_1 x_2,x_1 x_3,x_2 x_1,x_2 x_2,x_2 x_3,x_3 x_1,x_3 x_2,x_3 x_3 ]^T
z=[z_1,z_2,z_3 ]^T→z^'=[z_1 z_1,z_1 z_2,z_1 z_3,z_2 z_1,z_2 z_2,z_2 z_3,z_3 z_1,z_3 z_2,z_3 z_3 ]^T
首先,计算 x 和 z 的内积,公式如下。
〈x,z〉=x_1 z_1+x_2 z_2+x_3 z_3
然后,计算升维后 x^' 和 z^' 的内积,公式如下。
〈x^',z^' 〉=x_1 x_1 z_1 z_1+x_1 x_2 z_1 z_2+x_1 x_3 z_1 z_3+x_2 x_1 z_2 z_1+x_2 x_2 z_2 z_2+x_2 x_3 z_2 z_3+
x_3 x_1 z_3 z_1+x_3 x_2 z_3 z_2+x_3 x_3 z_3 z_3
=(x_1 z_1+x_2 z_2+x_3 z_3 )^2
=〖(〈x,z〉)〗^2
可以发现,如果最终目标只是求升维后的内积 〈x^',z^' 〉,那么可以先求原始特征的内积 〈x,z〉,再进行平方运算,而不需要真正进行高运算量的升维操作。
通过对两个低维向量进行数学运算,得到它们投影至高维空间时向量的内积的方法,叫作核方法,相应的算法叫作核函数。如上面的例子所示,有
K(x,z)=〖(〈x,z〉)〗^2=〈x^',z^' 〉
除了 K(x,z)=〖(〈x,z〉)〗^2,还有一些常用的核函数。不同的核函数的区别在于把 和 z 映射到高维空间时采用的升维方法不同。不过,高维向量 x^' 和 z^' 不需要真正计算出来。例如,多项式核函数
K(x,z)=〖(α〈x,z〉+c)〗^d
α、c、d 对应于不同的核函数。可以看出,平方核函数 K(x,z)=〖(〈x,z〉)〗^2 是多项式核函数在 α=1、c=0、d=2 时的一个特例。
高斯核函数也是一个常用的核函数,其公式如下。
K(x,z)=e^((-‖x-z‖/(2σ^2 )))
高斯核函数计算向量升维至无穷维后的内积,涉及的数学运算比较多,感兴趣的读者可以自行查阅相关资料。
5.2.2 核函数在支持向量机中的应用
核方法是一个非常有用的方法,下面我们将讨论如何在SVM中应用它。
首先,了解一下SVM的优化目标(如下式所示)。
min〖‖w‖^2 〗+C∑_(i=1)^N▒ε_((i))
并且,所有训练样本 〖{x_((i) ),y_((i))}〗_(i=1)^N 满足
y_((i)) (w^T x_((i) )+w_0 )≥1-ε_((i))
我们知道,w 为边界点的加权和,公式如下。
w=∑_(i∈SV)▒α_((i)) y_((i)) x_((i))
w 也可以写成所有数据点的加权和,只不过非边界点的数据点所对应的权重 α_((i))=0,i∉SV,即
w=∑_(i=1)^N▒〖α_((i)) y_((i)) x_((i)) 〗
此时,优化参数从求 w 变为求加权系数 α_((i))。在这里,优化目标没有变化,只进行了变量的替换。
既然 w 可以由训练样本的加权和来表示,那么 ‖w‖ 可以有如下变换。
‖w‖^2=w^T w=(∑_(j=1)^N▒〖α_((j) ) y_((j) ) x_((j) ) 〗)^T (∑_(i=1)^N▒〖α_((i) ) y_((i) ) x_((i) ) 〗)
=∑_(j=1)^N▒∑_(i=1)^N▒〖α_((j) ) α_((i) ) y_((j) ) y_((i) ) x_((j))^T x_((i) ) 〗
=∑_(j=1)^N▒∑_(i=1)^N▒〖α_((j)) α_((i)) y_((j)) y_((i)) 〈x_((j)),x_((i)) 〉 〗
在SVM中,如果将 x 投影到高维空间 x^',那么 w 将变成高维空间中的 w^',即
‖w^' ‖^2=∑_(j=1)^N▒∑_(i=1)^N▒〖α_((j)) α_((i)) y_((j)) y_((i)) 〈x_((j))^',x_((i))^' 〉 〗
用核方法把 〈x_((j))^',x_((i))^' 〉 替换成 K(x_((j))^ ,x_((i)) ),无须进行真正的投影,有
‖w^' ‖^2=∑_(j=1)^N▒∑_(i=1)^N▒〖α_((j)) α_((i)) y_((j)) y_((i)) K(x_((j))^ ,x_((i)) ) 〗
同理,在高维空间中,约束条件 y_((i)) 〖w^'〗^T x_((i))^' ≥ 1-ε_((i))有如下变换。
y_((i)) 〖w^'〗^T x_((i))^'=y_((i)) (∑_(j=1)^N▒〖α_((j)) y_((j)) x_((j))^' 〗)^T x_((i))^'=y_((i)) ∑_(j=1)^N▒〖α_((j)) y_((j)) K(x_((i))^ ,x_((j)) )≥1-ε_((i)) 〗
综上所述,当我们为了解决线性不可分问题而采用核方法(升维)时,优化目标将变为
min∑_(j=1)^N▒∑_(i=1)^N▒〖α_((j)) α_((i)) y_((j)) y_((i)) K(x_((j))^ ,x_((i)) ) 〗+C∑_(i=1)^N▒ε_((i))
并且,所有训练样本 〖{x_((i) ),y_((i) )}〗_(i=1)^N 满足
y_((i)) ∑_(j=1)^N▒〖α_((j)) y_((j)) K(x_((i))^ ,x_((j)) )≥1-ε_((i)) 〗
待求参数 α_((i)) 和 ε_((j)) 可以用拉格朗日乘子法求出。
求解完成后,模型在对输入 x 进行预测时将使用如下二式。
y={█(1, 如果 d>0@-1,如果 d<0)┤
d=∑_(i∈SV)▒[α_((i)) y_((i)) K(〖x,x〗_((i))^ )] +w_0
可以发现,使用核方法的SVM在预测时仅将内积替换成了核函数,其他项没有变化。
值得注意的是,在进行高维投影后,不仅数据的分布和相对位置会发生变化,边界数据点也会发生变化。因此,支持向量在低维空间和高维空间中一般对应于不同的数据点。
SVM中的 w^T x 可以分解成 w^T x=∑_(i∈SV)▒α_((i)) y_((i)) 〈x_((i))^ ,x〉 的形式,在预测阶段只需计
算 x 和支持向量 x_((i))^ 的内积,这为核函数的使用提供了便利。通过核函数,SVM可以隐式
地将数据投影到高维空间,以增强非线性处理能力。核函数的应用提高了SVM在处理线性不可分数据方面的能力,使其在传统机器学习方法中一枝独秀。
在逻辑回归中,w 无法进行以上分解,所以在升维时不可避免地要将高维向量 x^' 和 w^' 显式地表示出来。由于这一限制的存在,逻辑回归特征升维后无法写成核函数的形式,也就无法得到核函数带来的好处。
逻辑回归、支持向量机,以及本书后面将要讲解的神经网络,其基本原理都是通过给定的输入来预测输出。但是,其中有一个隐含的要求,即输入特征 x=〖[x_1,x_2,⋯,x_m]〗^T 是完备的,也就是说,特征 x_1~x_m 是已知的。这个看似简单的要求,在实际业务应用中并非那么容易达到。
例如,在电商场景中,很多用户出于对隐私保护的考虑,不会填写自己的性别、年龄等特征信息,而在预测用户购买行为时,这些特征是非常重要的。对这些可能缺失的特征,有如下两种处理方法。
当模型使用特征时,x 不考虑可能缺失的特征,即对用户可能不填写的特征“一刀切”,全都不予考虑。这种做法比较“粗暴”。事实上,年龄等特征对预测任务来说是非常重要的,仅因为个别用户不填写而剔除特征是一种因噎废食的行为。然而,如果强制用户填写 x 涉及的特征,那么必填项是很难确定的。
针对缺失的特征,专门训练模型。例如,针对特征 x=〖[x_1,x_2,x_3]〗^T,穷举可能缺失的特征:x1=〖[x_1,x_2]〗^T,x2=〖[x_1,x_3]〗^T,x3=〖[x_2,x_3]〗^T,x4=[x_1],x5=[x_2],x6=[x_3],x7=〖[x_1,x_2,x_3]〗^T(共训练7个模型,各种特征缺失的情况都有对应的模型)。但是,这样做也是不明智的——仅3个特征就需要7个对应的模型,当特征有上百个时模型的数量将非常惊人(不具备实际应用价值)。
特征缺失带来困扰的主要原因在于模型对各个维度的特征的需求是高耦合的,特征之间必须相互作用才能给出预测结果(例如,在逻辑回归中,特征之间需要加权求和)。为了从根本上解决特征缺失问题,需要对特征的各个维度进行解耦,使各个维度的特征都可以独立地进行分类。
为了解决这个问题,我们从统计学的角度来探寻分类问题的本质。分类任务就是在已知 x 时求 P(y=1│x)。通过贝叶斯定理,可以进行如下推理。
P(y=1|x)=P(x,y=1)/P(x) =(P(x|y=1)P(y=1))/(P(x))
P(y=1) 即样本中类别 y=1 的占比,比较容易计算。P(x) 为 x 出现的自然概率,与类别无关。
下面我们了解一下如何计算 P(x|y=1)。以 x=[x_1,x_2,x_3 ]^T 为例:
P(x|y=1)=P(〖[x_1,x_2,x_3]〗^T |y=1)
我们需要预测女生对男生是否喜欢的概率,y=1 为喜欢。
假设男生有3个离散特征,x_1∈{高个子,中等个子,矮个子},x_2∈{温和,暴躁},x_3∈{胖,匀称,瘦}。我们需要估计所有的 P(〖[x_1,x_2,x_3]〗^T |y)(y=1 或 y=0),共计 2×(3×2×3)=36 种概率。本例只有3个特征,在实际应用中,特征往往有上百个,待估计的概率将成指数级增长。这个问题的难点在于特征之间的耦合,因此,必须把 x_1 、x_2 、x_3 作为一个整体进行概率估计。
特征之间的耦合在真实世界中很常见,它对工程实践来说是一个难题。为此,工程师们进行了一些简化,假设 x_1、x_2、x_3 相互独立,可以得到
P(x_1,x_2,x_3 )=P(x_1)P(x_2)P(x_3)
同理
P(x_1,x_2,x_3 |y)=P(x_1 |y)P(x_2 |y)P(x_3 |y)
在这里需要强调的是,尽管上述独立性假设在真实的场景中不容易成立,但假设其成立能带来诸多好处,例如可以使问题得到有效解决。
根据贝叶斯定理和上述独立性假设,有如下推理。
P(y=1│x)=(P(y=1)P(x|y=1))/(P(x))=(P(y=1)P(x_1 |y=1)P(x_2 |y=1)P(x_3 |y=1))/(P(x))
P(y=0│x)=(P(y=0)P(x|y=1))/(P(x))=(P(y=0)P(x_1 |y=0)P(x_2 |y=0)P(x_3 |y=0))/(P(x))
可以通过比较 P(y=1│x) 和 P(y=0│x) 的大小来确定预测的类别,如下式所示。
d=(P(y=1│x))/(P(y=0│x) )=(P(x_1 |y=1)P(x_2 |y=1)P(x_3 |y=1)P(y=1))/(P(x_1 |y=0)P(x_2 |y=0)P(x_3 |y=0)P(y=0))
当 d>1 时,P(y=1│x)>P(y=0│x),x 属于类别 y=1。
当 d<1 时,P(y=1│x)
如果 x_2 缺失,就直接忽略 P(x_2 |y=1) 和 P(x_2 |y=0),判别公式变为
d=(P(y=1│x))/(P(y=0│x) )=(P(x_1 |y=1)P(x_3 |y=1)P(y=1))/(P(x_1 |y=0)P(x_3 |y=0)P(y=0))
上述分类算法叫作朴素贝叶斯算法。“朴素”体现在假设特征的各个维度相互独立上,即对问题进行了简化(这也属于归纳偏置);“贝叶斯”则体现在对模型进行分类时使用了贝叶斯定理上。
解耦后,在前面那个预测女生对男生是否喜欢的概率的例子中,只需估计 2×(3+2+3)=16 种概率,待估计概率由指数级增长变成了线性增长,从而使估计高维特征的概率变得可行。
如果不进行独立性假设,那么:一方面,当 P(x|y) 有特征缺失时,将无法进行概率估计;另一方面,直接估计所有 P(x|y) 不具备可操作性。
在5.3.2节中,我们将讨论如何估计模型中的所有概率,并分析 P(x|y) 难以直接估计的深层原因。
5.3.2 朴素贝叶斯的参数估计
朴素贝叶斯没有显式的参数,其核心在于如何通过训练样本对 P(y=1)、P(y=0)、P(x_i |y=1)、P(x_i |y=0) 等的概率进行估计。
P(y=1) 和 P(y=0) 的概率比较容易估计。如果训练样本是自然采样的(没有刻意进行上下采样平衡),类别 y=1 的样本数量为 N_1,类别 y=0 的样本数量为 N_0,那么
P(y=1)=N_1/(N_1+N_0 )
P(y=0)=N_0/(N_1+N_0 )
P(x_i |y=1) 和 P(x_i |y=0) 的概率估计相对复杂。下面分别对特征 x_i 为离散型和连续型的概率估计进行分析。
例如,在一个预测工作匹配程度的场景中,y=1 表示录用,y=0 表示不录用。当 x_1 为离散变量,例如表示学历时,其取值分别为
1-大专以下;2-大专;3-本科;4-硕士;5-博士
以频率作为概率的估计,公式如下。
P(x_1=本科│y=1)=(count(x_1=本科,y=1))/(count(y=1))
count(y=1) 表示在训练样本中类别为 y=1 且特征 x_1 未发生缺失时的样本数量(不同于 N_1,N_1 为所有类别为 y=1 的样本数量),count(x_1=本科,y=1) 表示类别为 y=1 且对应特征为“x_1=本科”的样本数量。这是一种统计方法,不像梯度下降法那样有迭代过程。这种方法的统计速度非常快,没有复杂的运算和求导过程,只要遍历训练样本就能得到结果。
但是,通过数量比例来估计概率,需要的样本数量相对比较大,如果样本数量不足,就容易出现较大的偏差(例如,在投硬币时,只投1次,出现的是正面,于是估计出现正面的概率为100%,出现反面的概率为0,而这显然是错误的)。因此,可以对上式进行如下改进。
P(x_1=本科│y=1)=(count(x_1=本科,y=1)+n_1/c_1 )/(count(y=1)+n_1 )
n_i 由用户自行定义,c_i 为 x_i 可取值的数量。在本例中,i=1,c_1=5。在这里,相当于给统计量添加了一个先验信息,即在训练样本之外有 n_1 个类别为 y=1 的样本,在这 n_1 个样
本中有 n_1/c_1 个样本的特征为“x_1=本科”。
当 x_2 为连续变量(例如表示工资)时,应该如何估计 P(x_2│y=1) 呢?因为 x_2 是连续的,可以取的值有无数个,所以,显然无法通过上面的频率来估计。一般认为 P(x_2│y=1) 符合正态分布。正态分布只有两个参数,即均值 μ 和方差 σ。所以,可先估计 P(x_2│y=1) 的均值 μ_2 和方差 σ_2。
定义类别为 y=1 且特征 x_2 未缺失的样本索引集合为 Set_(y=1)^(x_2 ),集合中元素的数量为 |Set_(y=1)^(x_2 ) |,公式如下。
μ_2=1/|Set_(y=1)^(x_2 ) | ∑_(i∈Set_(y=1)^(x_2 ))▒〖x_((i),2) 〗
σ_2=√(1/|Set_(y=1)^(x_2 ) | ∑_(i∈Set_(y=1)^(x_2 ))▒(x_((i),2)-μ_2 )^2 )
估计均值和方差后,可以得到 P(x_2│y=1) 的表达式
P(x_2│y=1)=1/(√2π σ_2 ) e^(-〖(x_2-μ_2)〗^2/(2σ_2^2 ))
朴素贝叶斯模型是通过数学方法推导出来的,因此公式相对较多,不过理解起来并不困难。与逻辑回归相比,朴素贝叶斯模型既没有损失函数,也没有迭代学习过程。
如果没有独立性假设,直接估计 P(x|y) 会遇到一些困难,举例如下。
没有特别有效的方法将离散变量和连续变量混在一起估计。
训练样本数量有限。例如,直接估计 P(x_1=1,x_2=0,x_3=1|y=1),同时落在 x_1=1、x_2=0、x_3=1 的样本数量会非常少,而在用频率估计概率时需要较多的样本来保证准确性。
待估计概率随特征维度成指数级增长。
朴素贝叶斯模型因具有简单、有效并能克服特征缺失的优点,在垃圾邮件筛选等文本分类任务中有不凡的表现。
值得注意的是,在使用朴素贝叶斯模型时,特征之间默认是相互独立的。如果实际业务中的特征不是相互独立的,而是有非常强的相关性的,那么,勉强使用朴素贝叶斯模型会得到很差的结果。例如,x_1 为身高,x_2 为体重,x_3 为血型,x_1 和 x_2 其实发生了部分冗余(不是相互独立的),如果通过进行概率估计强行让 x_1 和 x_2 相互独立,就会导致一些因素(身高和体重)的重要性被重复计算,从而降低其他特征(x_3)对分类结果的贡献的权重。
朴素贝叶斯模型忽略了特征之间(例如,在电商场景中,“年轻女性”和“节假日”之间)的交互关系,因此,它通常比其他算法需要更少的数据,且不容易发生过拟合。不过,正因为朴素贝叶斯模型过于简单,其效果的“天花板”也很明显,所以,在一些对准确率要求较高的场景中应谨慎使用。
本书前面的章节介绍了常见的分类模型。尽管这些模型各有所长,但它们的输入都是特征向量。那么,是否特征向量维度越高(特征数越多),分类效果就越好呢?图5-8展示了维度(特征数)和分类器性能之间的关系(适用于任何分类器)。
图5-8
当特征维度较少时,随着特征维度的增加,分类效果稳步提升。但是,当特征维度增加到一定程度时,继续增加特征维度反而会使分类效果降低。这种现象称为维数灾难。
下面分析一下维数灾难产生的原因。以在二分类任务中使用逻辑回归为例:当特征维度为1维时,分类器对应于一个点;当特征维度为2维时,分类器对应于一条直线;当特征维度为3维时,分类器对应于一个平面。
当特征维度为1维时,所有样本都集中在一条直线上,如图5-9所示。可以看出,两个类别“犬牙交错”地分布在一条直线上,几乎不可能找到一个点将它们分开。此时,模型的效果必然很差。
当特征维度为2维时,数据点在平面上的分布如图5-10所示。此时,数据点是线性不可分的,即一条直线无法把两个类别完全分开,但正确率已经有所提高。
将特征维度增加至3维。此时,数据分布在一个三维坐标系中,如图5-11所示,可以通过一个平面将两个类别完全分开,正确率达到最大值。将三维空间中的平面投影至一个二维坐标系,分类器就不再是线性的了。
图5-9
图5-10
图5-11
这个分类器非常复杂,并且学到了一些特例数据点的特征。因此,尽管训练集对3维特征的效果好于2维特征,但非常容易出现过拟合(在测试集上出现错误),如图5-12所示。
图5-12
随着维度的增加,过拟合现象将会加重,分类器的性能不升反降,产生维数灾难。
下面我们换一个角度讨论维数灾难。
在机器学习中,分类器为特征空间中的一条线(在高维空间中为一个面,具体形状取决于所用分类器和维度),训练过程就是调整线(面)的位置和形状,使其在训练集上尽可能准确。训练数据越多、越密,分类线越不容易被极端特例影响,学到的是具有普遍性的规律;训练数据越少,或者说数据分布越稀疏,分类器越容易学到特例,从而产生过拟合。
用数据密度 ρ 表示训练样本中数据的紧凑程度,ρ=样本数量/数据空间大小。例如,数据取值范围为
[-1,1],数据空间为直线(数据空间大小为2),一共有10个训练样本,在一维空间中数据密度为
ρ_1=10/2=5
当特征维度增加至2维,即 [-1,1]×[-1,1] 时,取值空间变成了一个平面,数据空间大小为 2×2=4,此时数据密度为
ρ_2=10/4=2.5
依此类推,当特征维度为 f,训练样本数量为 N 时,数据密度为
ρ_f=N/2^f
通过上式可以看出,当数据量不变时,随着维度的增加,数据密度以指数级降低,单位空间中的数据点变少,极易发生过拟合,造成维数灾难。因此,在增加数据维度 f 时,为了
保证 ρ_f 不变,训练样本数量 N 应成指数级增长。
维度过高还会带来数据分布不均匀的问题。例如,在二维空间中,数据取值范围为一个矩形(各维度取值为 [-1,1])。假设数据是随机分布的,计算位于中心圆内的数据点占比,如图5-13所示。
r_2=中心圆面积/矩形面积=(π×1^2)/(2×2)=π/4
当特征维度为3维时,计算位于中心球体内的数据点占比,如图5-14所示。
r_3=中心球体体积/立方体体积=(4/3×π〖×1〗^3)/2^3 =π/6
图5-13
图5-14
依此类推,当特征维度为 f 时,超球体体积和超立方体体积分别为
超球体体积=π^(f/2)/Γ(f/2+1) 〖×1〗^f
超立方体体积=2^f
所以
r_f=超球体体积/超立方体体积=π^(f/2)/(Γ(f/2+1)2^f )
可以看出,随着 f 的增大,r_f→0。也就是说,随着维度的增加,中心区域的数据点占
比越来越少,大部分数据点集中在边角处。
维度和超球体体积(中心区域数据占比)的关系,如图5-15所示。
图5-15
例如,在8维空间中,一共有 2^8=256 个角落,约99% 的数据点分布在这些角落,而在中心区域仅有不到1% 的数据点,模型在中心区域极易发生过拟合。
维度过高还会导致一个问题,就是欧氏距离失效。假设有两个 m 维的数据点,x=[x_1,⋯,x_m ]^T,y=[y_1,⋯,y_m ]^T,那么欧氏距离为
其中,s_i=(x_i-y_i )^2。假设特征的各个维度相互独立,当 m→∞ 时,由切比雪夫大数定理,可得
可以看出,随着 m 的增大,所有距离都会收敛至同一个常数 ∑_(i=1)^m▒〖〖E(s〗_i)〗,即所有数据之间
的距离几乎一样,而这将导致欧氏距离不再具有区分能力。
奥卡姆剃刀(Occam's Razor)定律是由逻辑学家William of Occam在14世纪提出的,表述为“如无必要,勿增实体”。
奥卡姆剃刀定律阐述了一个朴素的道理:能用简单的方法完成的任务,就不要用复杂的方法,也就是说,“切勿用高射炮打蚊子”,用当下的流行语说就是“极简主义”。那么,该定律如何应用在机器学习中呢?它和正则化又有什么关系呢?
在这里,我们首先需要了解何为模型的复杂度。机器学习中的模型对应的其实是一组函数,模型的训练过程就是从这组函数中选择一个最符合训练样本数据的。模型涵盖的函数越多,模型可能做出的选择就越多,模型就越复杂,模型的拟合能力就越强,越能应对复杂的数据分布。例如,在以下四个模型中,w_0 、w_1 、w_2 均为可变参数。
y=10
y=w_0
y=w_1 x_1+w_0
y=w_2 x_2+w_1 x_1+w_0
第一个模型没有可变参数,实际上只包含一个函数,因此,它在这四个模型中是复杂度最低的,也是最简单的。如果用它去做线性回归,则不可避免地会发生欠拟合(除非数据类别刚好都为 y=10)。但是,用它做线性回归不可能发生过拟合,因为它在训练数据和测试数据上的表现一样差。
第二个模型比第一个模型复杂,它不仅包含第一个模型(当 w_0=10 时),还包含 y=1、y=2 等情况。
第三个模型比第二个模型复杂,第四个模型比前三个模型都复杂。
将上述分析类推至逻辑回归,可以发现:特征维度越高,模型的参数越多,对应的模型就越复杂。奥卡姆剃刀定律希望模型简单,也就是说,当模型已经能完成分类任务时,就不要再扩增特征维度了(这一点和5.4节所讲的维数灾难不谋而合)。
比较了不同特征维度的复杂度,那同一个维度的情况如何呢?我们依然通过逻辑回归模型来分析。采用2维特征,有如下两个模型。
模型1:y^'=1/(1+e^(-(w_2 x_2+w_1 x_1+w_0)) )。
模型2:y^'=1/(1+e^(-(w_2 x_2+w_1 x_1+w_0)) ) 且 w_1^2+w_2^2 ≤ 1。
模型1的参数可以取任意值。模型2对参数的取值范围进行了限制(在半径为1的圆内)。因此,模型1涵盖的函数要多于模型2,模型1更复杂。
使用正则项进行模型训练,其实就是在限制模型参数 w 的取值范围——虽然没有像上述模型2那样直接限制 w 的取值范围,但可以通过给损失函数增加正则项使 w 取较大值的概率显著降低,从而间接实现限制 w 取值范围的效果,使模型得到简化。因此,正则表达式是奥卡姆剃刀定律的一个典型应用。
在机器学习中,经验风险是指学习完成后模型 f 在训练样本上的平均 Loss,即
R_emp (f)=1/N ∑_(i=1)^N▒〖Loss_((i))=1/N ∑_(i=1)^N▒〖L(y_((i)),f(x_((i))))〗〗
然而,我们不仅希望模型在训练样本上表现得好,更希望它在所有样本(训练样本和尚未见过的样本)上都表现得好。于是,引入期望风险,公式如下。
R_exp (f)=∫_(X×Y)^ ▒〖L(y,f(x))ρ(x,y)dxdy〗
真正好的模型希望 R_exp (f) 足够小。
由于在实际应用中无法获得所有的样本,所以 R_exp (f) 只是一个概念,无法实际计算出来。不过,根据大数定律,当数据量 N 足够大时,经验风险近似于期望风险,即
lim┬(N→∞)〖R_emp (f)〗=R_exp (f)
这就是逻辑回归、线性回归、因子分解模型的理论基础:当训练数据量 N 足够大时,优化经验风险,即最小化 R_emp (f),可近似等价于最小化 R_exp (f)。
但是,数据量 N 多大才算“足够大”呢?并没有人给出明确的答案。而且,在实际应用中,训练样本数量不太容易达到“足够大”。因此,引入结构风险 R_srm (f) 来近似期望风险 R_exp (f),即
R_srm (f)=1/N ∑_(i=1)^N▒〖L(y_((i)),f(x_((i))))〗+λJ(f)=R_emp (f)+λJ(f)≈R_exp (f)
结构风险的第一项仍然为经验风险 R_emp (f),第二项 λJ(f) 是模型复杂度。R_emp (f)+
λJ(f)≈R_exp (f) 的意思是经验风险 R_emp (f) 和期望风险 R_exp (f) 的差异与模型的复杂度 J(f) 成正相关。也就是说,对于同样的经验风险 R_emp (f),模型越复杂,J(f) 就越大,期望风险 R_exp (f) 也就越大。这里的模型复杂度是指模型的参数个数及模型的结构,例如5.5节提到的模型复杂度。
最小化结构风险 R_srm (f) 等价于同时降低经验风险和模型复杂度。通过最小化结构风险 R_srm (f),可以在 N 有限的情况下间接达到最小化期望风险 R_exp (f) 的目的。例如,在训练逻辑回归时增加了正则项优化,即在 Loss 下降的同时使模型复杂度降低(其实就是使结构风险 R_srm (f) 最小化)。最小化结构风险和奥卡姆剃刀定律在降低模型复杂度方面的目标是一致的,它们都希望模型越简单越好。
上述三种风险的推演过程是:设理想目标最小化期望风险为 R_exp (f),但因为不可能得到所有数据,所以实际上无法实现;当数据量 N 足够大时,用经验风险 R_emp (f) 近似期望
风险 R_exp (f),即 R_emp (f) □(⇒┴N足够大 ) R_exp (f)(最小化常见损失函数);当数据量 N 有限时,用
结构风险 R_srm (f) 近似期望风险 R_exp (f),即 □(R_srm (f) ⇒┴N无法达到足够大 ) R_exp (f)(在最小化损失
函数时增加正则项)。
下面分析一下SVM模型的效果特别好的原因。
因为SVM模型的经验风险所对应的损失函数存在最小值0,所以,当数据已经是内部点且可以正确分类时,SVM不会像逻辑回归那样没有限制地降低 Loss 以提升概率。
SVM的另一个目标是最大化边界距离,从而直接优化模型结构。这一点虽然在形式上和逻辑回归使用正则表达式进行优化相同,但在配合上和经验风险不同。在逻辑回归中,“KL距离+正则表达式”会在经验风险和 ‖w‖ 上通过权重进行权衡(整体下降)。而对SVM来说,只要分类正确,降低经验风险的目的就已经达到了(不需要进一步降低),接下来就是全力降低模型复杂度 J(f) 以提高泛化能力了(所以,SVM的泛化能力很强)。通过前面的分析也可以发现,SVM的优化重心在复杂度上,不像逻辑回归那样始终两者兼顾。因此,SVM更符合奥卡姆剃刀定律。
对机器学习感兴趣的读者可以去主页关注我;本人著有《速通深度学习》以及《速通机器学习数学基础》二书,想要完整版电子档可以后台私信我;想一起学习机器学习的话也可以后台私信,本人所做机器学习0基础教程已有60余章还未公开;想了解的话也是后台私信或者评论区留言。