简短回答:在小型数据集上,SVM 可能是首选。
长答案:
从历史上看,神经网络比 SVM 更古老,而 SVM 最初是作为一种有效训练神经网络的方法而开发的。因此,当 SVM 在 1990 年代成熟时,人们从神经网络转向 SVM 是有原因的。后来,随着数据集变得越来越大、越来越复杂,特征选择变成了一个(甚至更大的)问题,而与此同时,计算能力提高了,人们又转回来了。
这种发展已经表明,两者各有优缺点,正如海涛所说,没有免费的午餐。
本质上,这两种方法都会进行某种数据转换,以将它们“发送”到更高维空间。核函数对 SVM 的作用,隐藏层对神经网络的作用。网络中的最后一个输出层也对如此转换的数据执行线性分离。所以这不是核心区别。
为了证明这一点,我可以随意使用海涛的例子。正如你在下面看到的,一个两层的神经网络,在隐藏层有 5 个神经元,可以完美地分离这两个类。蓝色类可以完全封闭在一个五边形(淡蓝色)区域中。隐藏层中的每个神经元确定一个线性边界——五边形的一侧,当它的输入是直线“蓝色”一侧的一个点时产生 +1,否则产生 -1(它也可能产生 0 ,这并不重要)。
我使用不同的颜色来突出显示哪个神经元负责哪个边界。输出神经元(黑色)简单地检查(执行逻辑与,这又是一个线性可分函数)是否所有隐藏神经元都给出相同的“肯定”答案。观察到最后一个神经元有五个输入。即它的输入是一个5维向量。所以隐藏层已经将 2D 数据转换为 5D 数据。
但是请注意,神经网络绘制的边界有些随意。您可以稍微移动和旋转它们而不会真正影响结果。网络如何绘制边界有些随机;它取决于权重的初始化以及您向其展示训练集的顺序。这就是 SVM 的不同之处:它们保证在两个类的最近点之间绘制边界!可以(已经)证明这个边界是最优的。寻找边界是一个凸(二次)优化问题,存在快速算法。此外,内核技巧具有计算优势,即计算单个非线性函数通常比通过许多隐藏层传递向量要快得多。
然而,由于支持向量机从不明确计算边界,而是通过输入数据对上的核函数的加权和,计算工作量与数据集大小成二次方。对于大型数据集,这很快变得不切实际。
此外,当数据是高维的(想想具有数百万像素的图像)时,SVM 可能会被维数诅咒所淹没:在训练集上画一个好的边界变得太容易了,但泛化特性很差. 另一方面,卷积神经网络能够从数据中学习相关特征。
这里还有一个计算能力问题:今天的网络喜欢使用分段线性的激活函数,比如 ReLU,这是有原因的。应用它们是简单的线性代数,这是 GPU 擅长的(因为 3D 图形还涉及大量矩阵乘法)。所以今天的神经网络在某种程度上是游戏行业的副产品。
总之,我的建议是对低维、小数据集使用 SVM,对高维大数据集使用神经网络。