12.6 使用支持向量机
参考视频: 12 - 6 - Using An SVM (21 min).mkv
目前为止,我们已经讨论了 SVM 比较抽象的层面,在这个视频中我将要讨论到为了运 行或者运用 SVM。你实际上所需要的一些东西:支持向量机算法,提出了一个特别优化的 问题。但是就如在之前的视频中我简单提到的,我真的不建议你自己写软件来求解参数 θ, 因此由于今天我们中的很少人,或者其实没有人考虑过自己写代码来转换矩阵,或求一个数
的平方根等我们只是知道如何去调用库函数来实现这些功能。同样的,用以解决 SVM 最优 化问题的软件很复杂,且已经有研究者做了很多年数值优化了。因此你提出好的软件库和好 的软件包来做这样一些事儿。然后强烈建议使用高优化软件库中的一个,而不是尝试自己落
实一些数据。有许多好的软件库,我正好用得最多的两个是 liblinear 和 libsvm,但是真的有 很多软件库可以用来做这件事儿。你可以连接许多你可能会用来编写学习算法的主要编程语 言。
在高斯核函数之外我们还有其他一些选择,如: 多项式核函数(Polynomial Kernel) 字符串核函数(String kernel)
卡方核函数( chi-square kernel) 直方图交集核函数(histogram intersection kernel) 等等...
这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要 满足 Mercer's 定理,才能被支持向量机的优化软件正确处理。
多类分类问题 假设我们利用之前介绍的一对多方法来解决一个多类分类问题。如果一共有 k 个类,则
我们需要 k 个模型,以及 k 个参数向量 θ。我们同样也可以训练 k 个支持向量机来解决多类 分类问题。但是大多数支持向量机软件包都有内置的多类分类功能,我们只要直接使用即可。
尽管你不去写你自己的 SVM(支持向量机)的优化软件,但是你也需要做几件事: 1、是提出参数 C 的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。
2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需 要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性
核的 SVM(支持向量机),这就意味这他使用了不带有核函数的 SVM(支持向量机)。
从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢? 下面是一些普遍使用的准则:
n 为特征数,m 为训练样本数。
(1)如果相较于 m 而言,n 要大许多,即训练集数据量不够支持我们训练一个复杂的非 线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
(2)如果 n 较小,而且 m 大小中等,例如 n 在 1-1000 之间,而 m 在 10-10000 之间, 使用高斯核函数的支持向量机。
(3)如果 n 较小,而 m 较大,例如 n 在 1-1000 之间,而 m 大于 50000,则使用支持向量 机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向 量机。
值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络 可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。
今天的 SVM 包会工作得很好,但是它们仍然会有一些慢。当你有非常非常大的训练集, 且用高斯核函数是在这种情况下,我经常会做的是尝试手动地创建,拥有更多的特征变量,
然后用逻辑回归或者不带核函数的支持向量机。如果你看到这个幻灯片,看到了逻辑回归, 或者不带核函数的支持向量机。在这个两个地方,我把它们放在一起是有原因的。原因是: 逻辑回归和不带核函数的支持向量机它们都是非常相似的算法,不管是逻辑回归还是不带核 函数的 SVM,通常都会做相似的事情,并给出相似的结果。但是根据你实现的情况,其中
一个可能会比另一个更加有效。但是在其中一个算法应用的地方,逻辑回归或不带核函数的 SVM 另一个也很有可能很有效。但是随着 SVM 的复杂度增加,当你使用不同的内核函数来 学习复杂的非线性函数时,这个体系,你知道的,当你有多达 1 万(10,000)的样本时,也
可能是 5 万(50,000),你的特征变量的数量这是相当大的。那是一个非常常见的体系,也 许在这个体系里,不带核函数的支持向量机就会表现得相当突出。你可以做比这困难得多需 要逻辑回归的事情。
最后,神经网络使用于什么时候呢? 对于所有的这些问题,对于所有的这些不同体系 一个设计得很好的神经网络也很有可能会非常有效。有一个缺点是,或者说是有时可能不会 使用神经网络的原因是:对于许多这样的问题,神经网络训练起来可能会特别慢,但是如果 你有一个非常好的 SVM 实现包,它可能会运行得比较快比神经网络快很多,尽管我们在此
之前没有展示,但是事实证明,SVM 具有的优化问题,是一种凸优化问题。因此,好的 SVM
优化软件包总是会找到全局最小值,或者接近它的值。对于 SVM 你不需要担心局部最优。
在实际应用中,局部最优不是神经网络所需要解决的一个重大问题,所以这是你在使用 SVM 的时候不需要太去担心的一个问题。根据你的问题,神经网络可能会比 SVM 慢,尤其是在 这样一个体系中,至于这里给出的参考,看上去有些模糊,如果你在考虑一些问题,这些参 考会有一些模糊,但是我仍然不能完全确定,我是该用这个算法还是改用那个算法,这个没 有太大关系,当我遇到机器学习问题的时候,有时它确实不清楚这是否是最好的算法,但是 就如在之前的视频中看到的算法确实很重要。但是通常更加重要的是:你有多少数据,你有
多熟练是否擅长做误差分析和排除学习算法,指出如何设定新的特征变量和找出其他能决定 你学习算法的变量等方面,通常这些方面会比你使用逻辑回归还是 SVM 这方面更加重要。 但是,已经说过了,SVM 仍然被广泛认为是一种最强大的学习算法,这是一个体系,包含 了什么时候一个有效的方法去学习复杂的非线性函数。因此,实际上与逻辑回归神经网络 SVM 一起使用这些方法来提高学习算法,我认为你会很好地建立很有技术的状态。
机器学习系统对于一个宽泛的应用领域来说,这是另一个在你军械库里非常强大的工具, 你可以把它应用到很多地方,如硅谷、在工业、学术等领域建立许多高性能的机器学习系统。