SVM序列最小优化收敛性问题

时间:2010-04-01 15:25:24

标签: machine-learning smo classification svm convex-optimization

我已经在支持向量机上工作了大约2个月了。我自己编写了SVM编码,对于SVM的优化问题,我使用了John Platt博士的Sequential Minimal Optimization(SMO)。

现在我正处于我要进行网格搜索以找到我的数据集的最佳C值的阶段。 (请在此处查看我的项目申请和数据集详细信息的详细信息SVM Classification - minimum number of input sets for each class

我已经成功检查了我自定义实现的SVM对C值的精确度,范围从2 ^ 0到2 ^ 6。但是现在我遇到了关于SMO for C>收敛的一些问题。 128。 就像我试图找到C = 128的alpha值一样,它在实际收敛并成功给出alpha值之前需要很长时间。

对于C = 100,SMO收敛所需的时间约为5小时。这个巨大的我认为(因为SMO应该很快。)虽然我的准确度很高? 我被搞砸了,因为我无法测试更高C值的准确性。

我实际上是在SMO的每次传递中显示更改的alpha数,并且获得10,13,8 ... alphas连续变化。 KKT条件确保收敛,所以这里发生了什么奇怪的事情?

请注意,虽然执行时间很长,但我的实现在C< = 100时工作正常并且准确性很高。

请就此问题向我提供意见。

谢谢你和干杯。

2 个答案:

答案 0 :(得分:5)

对于大多数SVM实现,培训时间可以通过较大的C值显着增加。为了了解SMO在相当好的实现中的训练时间如何与C一起扩展,请查看libSVM的对数比例行。下图。

SVM培训时间与C - 来自Sentelle等人的A Fast Revised Simplex Method for SVM Training

alt text http://dmcer.net/StackOverflowImages/svm_scaling.png

你可能有两种简单的方法,一种不是那么简单的方法来加快速度。

让我们从简单的东西开始吧。首先,您可以尝试放宽收敛标准。像epsilon = 0.001这样的严格标准将需要更长的时间进行训练,而通常会导致模型不比像epsilon = 0.01这样的宽松标准更好。其次,您应该尝试分析您的代码以查看是否存在任何明显的瓶颈。

不那么容易解决的问题是切换到不同的优化算法(例如,上面Sentelle等人的论文中的SVM-RSQP)。但是,如果你有一个SMO的工作实现,你应该只是作为最后的手段。

答案 1 :(得分:1)

如果要完全收敛,特别是C很大的话,需要很长时间。可以考虑定义一个大的停止准则,并给出最大迭代次数,Libsvm中默认为1000000,如果迭代次数多,时间会成倍增加,但是损失不值得,但是结果可能不完全满足KKT条件,一些支持向量在带内,非支持向量在带外,但误差小且可以接受。我认为,如果精度更高,建议使用其他二次规划算法而不是SMO算法