【问题标题】:SMO algorithm running into infinite loop?SMO算法陷入无限循环?
【发布时间】:2015-10-03 21:26:06
【问题描述】:
我对构建 SVM 多类分类器很感兴趣,因此我目前正在实施
顺序最小优化 SMO。
我的实现是基于
John C. Platt 的“使用序列最小优化的支持向量机的快速训练”
我在某些训练示例中观察到了这一点。 Smo 可能会发散并陷入无限循环
主程序中的以下循环
numChanged = 0;
检查所有 = 1;
while (numChanged > 0 || 检查所有 >0) {…}
可能会陷入无限循环。
是否有防止smo算法例程陷入死循环的线索或标准?
感谢您的回答。
问候
【问题讨论】:
标签:
optimization
machine-learning
svm
【解决方案1】:
您可以根据需要添加最大迭代条件:
while ((numChanged > 0 || examineAll) && iter < MaxIter)
但在大多数情况下,它不应陷入无限循环,这是完整的 Platt 伪代码:
while (numChanged > 0 || examineAll)
{
numChanged = 0;
// Adding curly brackets for better readability
if (examineAll)
{
loop I over all training examples
numChanged += examineExample(I);
}
else
{
loop I over examples where alpha is not 0 & not C
numChanged += examineExample(I);
}
if (examineAll == 1)
{
examineAll = 0;
}
else
{
examineAll = 1;
}
}
请注意,它正在执行迭代以检查示例,并且下一个仅对 alpha 不为 0 或 C 的示例执行相同操作。如果在“检查所有”迭代后没有任何变化,则 while 循环条件为假,因此停止循环。
因此,要使其处于无限循环中,必须存在一个极端情况(可能是数值错误),该情况会引入振荡,使示例在检查所有阶段期间发生变化,但在“仅检查 alpha == 0 和C”。
通常如果数据在 [-1,1] 或 [0,1] 中归一化并且算法的参数具有合理的值,那么这些极端情况将很少见。在任何情况下,如果您想格外小心,您可以放置 max-iter 安全网。