为什么LIBSVM网格搜索速度慢?

时间:2014-10-09 14:44:59

标签: performance libsvm

LIBSVM,Java,网格搜索,性能,放慢速度

我一直在使用LIBSVM的Java版本。在伪代码中,我对最佳C和伽马对进行天真网格搜索,获取这些训练模型文件,然后对寻求最佳参数的10 k倍数据集执行交叉验证。

我注意到在网格搜索过程中反复调用svm_predict似乎是轶事减速。起初我认为这只是一个侥幸,但我一直在仔细测试测试表明svm_predict的处理时间根据调用的次数呈指数级增长。

第一次调用时,svm_predict需要大约15毫秒才能在我的机器上执行预测。 通过第500次顺序调用,svm_predict需要大约541毫秒。 通过第1000次顺序调用,svm_predict显示大约~8931毫秒。 通过第1220次调用,svm_predict每次调用约为21260毫秒。

(注意:时间的增加似乎与C-gamma对本身无关。即使这些对是随机化的(即,模型本身的复杂性没有增加),处理时间也会持续增加。

我在分析器中运行软件并且看不到明显的内存泄漏或任何内存问题 - 堆和堆栈跟踪保持相当稳定或在分配的内存限制内显示振荡。即使是建议垃圾收集的测试也不会影响性能。

我的软件"包装"内部的LIBSVM。网格搜索仅在每个训练文件上调用svm_predict时测试一系列C-gamma对,以测量性能。

还有其他人看过这个问题吗?有修复吗?无论如何,Gris搜索非常密集,但每次预测的时间很快达到21秒,甚至在高端设备上进行相当基本的搜索(400 C-gamma对)也变得非常耗时。有什么建议吗?

新信息(2014年10月10日: 我继续测试并初步确认LIBSVM在网格搜索期间反复调用svm_predict时问题似乎缓慢下降

我还有一个测试工具,可以根据以前生成的MODEL和DATA文件手动测试svm_predictions。也就是说,我可以手动测试每个模型 - 数据文件预测。使用网格搜索在648次迭代后预测的经过时间是每个文件1183毫秒。手动运行svm_predict的单个实例的精确相同的模型 - 数据文件对导致34毫秒。这证实了我对svm_predict的担忧。有没有其他人看过这个或有没有人有一个可行的,建议的补救措施?

1 个答案:

答案 0 :(得分:1)

遇到的问题不在本机LIBSVM Java库中。

问题源于我的网格搜索代码中的错误。由于其他人在实施自己的代码时可能会遇到这种情况,因此我提供了一个快速的答案。

我在原生SVM库中添加了一个简单的类,它聚合了svm_predict STATIC类的输出。之前我还添加了一个简单的方法来svm_predict来重置"重置"静态svm-predict类。不幸的是,我省略了在网格搜索方法中调用svm_predict上的重置。因此,使用添加到svm_predict的简单类的其他处理在处理时间上呈指数级增长并导致明显减慢。

虽然回想起来这是一个愚蠢的错误(并且需要花费相当长的时间来确定),但实际上,测试确认svm_predict看起来相当有效。我反复测试(有成千上万的测试),并且svm_predict一直为我的目的产生了良好的结果 - 每个预测批次不到15毫秒。

对于上下文,错误的代码需要2个多小时才能完成所有网格搜索测试。在错误修复之后,对于完全相同的网格搜索测试,运行时间降至56秒。 (不,这不是错误印刷,而是对简单算法如何对处理时间产生深远影响的证明。)