目录
- 第 7 周 12、 支持向量机(Support Vector Machines)
- 12.4 核函数 1
- 12.5 核函数 2
- 12.6 使用支持向量机
第 7 周 12、 支持向量机(Support Vector Machines)
12.4 核函数 1
回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类
问题:
为了获得上图所示的判定边界,我们的模型可能是
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
x
2
+
θ
4
x
1
2
+
θ
5
x
2
2
+
⋯
θ_0 + θ_1x_1 + θ_2x_2 + θ_3x_1x_2 + θ_4x_1^2 +θ_5x_2^2 + ⋯
θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+⋯的形式。
我们可以用一系列的新的特征 f 来替换模型中的每一项。例如令: f 1 = x 1 , f 2 = x 2 , f 3 = x 1 x 2 , f 4 = x 1 2 , f 5 = x 2 2 . . . f_1 = x_1, f_2 = x_2, f_3 =x_1x_2, f_4 = x_1^2, f_5 = x_2^2... f1=x1,f2=x2,f3=x1x2,f4=x12,f5=x22...得到ℎ𝜃(𝑥) = θ 1 f 1 + θ 2 f 2 + . . . + θ n f n θ_1f_1 + θ_2f_2+. . . +θ_nf_n θ1f1+θ2f2+...+θnfn。然而,除了对原有的特征进行组合以外,有没有更好的方法来构造𝑓1, 𝑓2, 𝑓3?我们可以利用核函数来计算出新的特征。
给定一个训练实例 𝑥 ,我们利用 𝑥 的各个特征与我们预先选定的地标(landmarks) l ( 1 ) , l ( 2 ) , l ( 3 ) l^{(1)}, l^{(2)}, l^{(3)} l(1),l(2),l(3)的近似程度来选取新的特征 f 1 , f 2 , f 3 f_1, f_2, f_3 f1,f2,f3。
上例中的𝑠𝑖𝑚𝑖𝑙𝑎𝑟𝑖𝑡𝑦(
x
,
l
(
1
)
x, l^{(1)}
x,l(1))就是核函数,具体而言,这里是一个高斯核函数(Gaussian Kernel)。注:这个函数与正态分布没什么实际上的关系,只是看上去像而已。
这些地标的作用是什么?如果一个训练实例𝑥与地标𝐿之间的距离近似于 0,则新特征 f 近似于
e
−
0
=
1
e^{−0}= 1
e−0=1,如果训练实例𝑥与地标𝐿之间距离较远,则𝑓近似于
e
−
(
一个较大的数
)
e^{−(一个较大的数) }
e−(一个较大的数)= 0。
假设我们的训练实例含有两个特征[
x
1
x
2
x_1 x_2
x1x2],给定地标
l
(
1
)
l^{(1)}
l(1)与不同的𝜎值,见下图:
图中水平面的坐标为
x
1
,
x
2
x_1,x_2
x1,x2而垂直坐标轴代表𝑓。可以看出,只有当𝑥与
l
(
1
)
l^{(1)}
l(1)重合时f才具有最大值。随着𝑥的改变𝑓值改变的速率受到
σ
2
σ^2
σ2的控制。
在下图中,当实例处于洋红色的点位置处,因为其离
l
(
1
)
l^{(1)}
l(1)更近,但是离
l
(
2
)
l^{(2)}
l(2)和
l
(
3
)
l^{(3)}
l(3)较远,因此
f
1
f_1
f1接近 1,而
f
2
,
f
3
f_2,f_3
f2,f3接近 0。因此ℎ𝜃(𝑥) = θ_0 + θ_1f_1 + θ_2f_2 +θ_3f_3 > 0,因此预测𝑦 = 1。同理可以求出,对于离l^{(2)}$较近的绿色点,也预测𝑦 = 1,但是对于蓝绿色的点,因为其离三个地标都较远,预测𝑦 = 0。
这样,图中红色的封闭曲线所表示的范围,便是我们依据一个单一的训练实例和我们选取的地标所得出的判定边界,在预测时,我们采用的特征不是训练实例本身的特征,而是通过核函数计算出的新特征 f 1 , f 2 , f 3 f_1, f_2, f_3 f1,f2,f3。
12.5 核函数 2
在上一节视频里,我们讨论了核函数这个想法,以及怎样利用它去实现支持向量机的一些新特性。在这一节视频中,我将补充一些缺失的细节,并简单的介绍一下怎么在实际中使用应用这些想法。
如何选择地标?
我们通常是根据训练集的数量选择地标的数量,即如果训练集中有𝑚个实例,则我们选取𝑚个地标,并且令:
l
(
1
)
=
x
(
1
)
,
l
(
2
)
=
x
(
2
)
,
.
.
.
.
.
,
l
(
m
)
=
x
(
m
)
l^{(1)} = x^{(1)}, l^{(2)}= x^{(2)}, . . . . . , l^{(m)} = x^{(m)}
l(1)=x(1),l(2)=x(2),.....,l(m)=x(m)。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的,即:
下面我们将核函数运用到支持向量机中,修改我们的支持向量机假设为:
• 给定𝑥,计算新特征𝑓,当
θ
T
f
θ^Tf
θTf>= 0 时,预测 y = 1,否则反之。相应地修改代价函数为:
∑
j
=
1
n
=
m
θ
j
2
=
θ
T
θ
\sum_{j=1}^{n=m}{θ_j^2=θ^Tθ}
j=1∑n=mθj2=θTθ,
m
i
n
C
∑
i
=
1
m
[
y
(
i
)
c
o
s
t
1
(
θ
T
f
(
i
)
)
+
(
1
−
y
(
i
)
)
c
o
s
t
0
(
θ
T
f
(
i
)
)
]
+
1
2
∑
j
=
1
n
=
m
θ
j
2
minC \sum_{i=1}^m{[y^{(i)}cost_1(θ^Tf ^{(i)}) + (1 − y^{(i)})cost_0(θ^Tf ^{(i)})]} + \frac{1}{2}\sum_{j=1}^{n=m}{θ_j^2}
minCi=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21j=1∑n=mθj2
在具体实施过程中我们还需要对最后的正则化项进行些微调整,在计算
∑
j
=
1
n
=
m
θ
j
2
=
θ
T
θ
\sum_{j=1}^{n=m}{θ_j^2=θ^Tθ}
∑j=1n=mθj2=θTθ时,我们用
θ
T
M
θ
θ^TMθ
θTMθ代替
θ
T
θ
θ^Tθ
θTθ,其中𝑀是根据我们选择的核函数而不同的一个矩阵。这样做的原因是为了简化计算。
理论上讲,我们也可以在逻辑回归中使用核函数,但是上面使用 𝑀来简化计算的方法不适用与逻辑回归,因此计算将非常耗费时间。
在此,我们不介绍最小化支持向量机的代价函数的方法,你可以使用现有的软件包(如liblinear,libsvm 等)。在使用这些软件包最小化我们的代价函数之前,我们通常需要编写核函数,并且如果我们使用高斯核函数,那么在使用之前进行特征缩放是非常必要的。
另外,支持向量机也可以不使用核函数,不使用核函数又称为线性核函数(linear kernel),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而实例非常少的时候,可以采用这种不带核函数的支持向量机。
下面是支持向量机的两个参数𝐶和𝜎的影响:
𝐶 = 1/𝜆
𝐶 较大时,相当于𝜆较小,可能会导致过拟合,高方差;
𝐶 较小时,相当于𝜆较大,可能会导致低拟合,高偏差;
𝜎较大时,可能会导致低方差,高偏差;
𝜎较小时,可能会导致低偏差,高方差。
如果你看了本周的编程作业,你就能亲自实现这些想法,并亲眼看到这些效果。这就是利用核函数的支持向量机算法,希望这些关于偏差和方差的讨论,能给你一些对于算法结果预期的直观印象。
12.6 使用支持向量机
目前为止,我们已经讨论了 SVM 比较抽象的层面,在这个视频中我将要讨论到为了运行或者运用 SVM。后强烈建议使用高优化软件库中的一个,而不是尝试自己落实一些数据。有许多好的软件库,我正好用得最多的两个是 liblinear 和 libsvm,但是真的有很多软件库可以用来做这件事儿。你可以连接许多你可能会用来编写学习算法的主要编程语言。
在高斯核函数之外我们还有其他一些选择,如:
多项式核函数(Polynomial Kernel)
字符串核函数(String kernel)
卡方核函数( chi-square kernel)
直方图交集核函数(histogram intersection kernel)
等等…
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足 Mercer’s 定理,才能被支持向量机的优化软件正确处理。
多类分类问题
假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有𝑘个类,则我们需要𝑘个模型,以及𝑘个参数向量𝜃。我们同样也可以训练𝑘个支持向量机来解决多类分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
尽管你不去写你自己的 SVM 的优化软件,但是你也需要做几件事:
1、是提出参数𝐶的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢?
下面是一些普遍使用的准则:
𝑛为特征数,𝑚为训练样本数。
(1)如果相较于𝑚而言,𝑛要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果𝑛较小,而且𝑚大小中等,例如𝑛在 1-1000 之间,而𝑚在 10-10000 之间,使用高斯核函数的支持向量机。
(3)如果𝑛较小,而𝑚较大,例如𝑛在 1-1000 之间,而𝑚大于 50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
当你有非常非常大的训练集,且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,然后用逻辑回归或者不带核函数的支持向量机。逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核函数的 SVM,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的SVM 另一个也很有可能很有效。
最后,神经网络使用于什么时候呢? 有一个缺点是,或者说是有时可能不会使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果你有一个非常好的 SVM 实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此之前没有展示,但是事实证明,SVM 具有的优化问题,是一种凸优化问题。因此,好的 SVM优化软件包总是会找到全局最小值,或者接近它的值。在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用 SVM的时候不需要太去担心的一个问题。通常更加重要的是:你有多少数据,你有多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是 SVM 这方面更加重要。SVM 仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含了
什么时候一个有效的方法去学习复杂的非线性函数。因此,实际上与逻辑回归、神经网络、SVM 一起使用这些方法来提高学习算法,我认为你会很好地建立很有技术的状态。