我已经在Python中实现了Perceptron学习算法,如下所示。即使有500,000次迭代,它仍然不会收敛。
我有一个带有目标矢量Y的训练数据矩阵X,以及一个要优化的权重矢量w。
我的更新规则是:
while(exist_mistakes):
# dot product to check for mistakes
output = [np.sign(np.dot(X[i], w)) == Y[i] for i in range(0, len(X))]
# find index of mistake. (choose randomly in order to avoid repeating same index.)
n = random.randint(0, len(X)-1)
while(output[n]): # if output is true here, choose again
n = random.randint(0, len(X)-1)
# once we have found a mistake, update
w = w + Y[n]*X[n]
这是错的吗?或者为什么即使在500,000次迭代后它也没有收敛?
答案 0 :(得分:13)
如果您确定数据集是线性可分的,则可以尝试为每个数据向量添加偏差,如问题所述:Perceptrons - 添加偏见有助于模型决策不通过原点的边界。
或者,如果您想使用感知器学习算法的变体保证收敛到指定宽度的边距,即使对于不可线性分离的数据集,也要查看{{3 }}。平均感知器是投票感知器的近似值,据Freund和Schapire Perceptron learning algorithm not converging to 0在一篇好文章中介绍(据我所知)。
使用平均感知器,您可以在训练期间每次呈现训练样本后复制参数向量。最终的分类器使用所有参数向量的均值。
答案 1 :(得分:0)
基本问题是随机选择的点不一定是线性可分类的。
然而,算法中有一个更糟糕的问题:
即使您参考了 Vapnik 的“统计学习理论”等很好的参考资料,您也不会发现 OP 算法中的最大问题。问题也不是学习率参数。证明学习率参数对算法是否收敛没有实际影响是微不足道的 - 这是因为学习率参数只是一个标量。
想象一组四个点进行分类。这四个点是长度为 sqrt(2) 的正交向量。 “在课堂上”的点是 (-1,1)。 “课外”点是 (-1,-1)、(1,1) 和 (1,-1)。无论学习率如何,OP的原始算法永远不会收敛。
原始发布者的算法未能收敛的原因是因为缺少偏差项(实际上是第 0 维项的系数),它必须增加其他维度项。没有偏置项,感知器就没有完全定义。在 1D 或 2D 空间中手动建模感知器很容易证明这一点。
偏置项在文献中经常被用作“移动”超平面的一种方式,但这似乎主要是因为许多人倾向于在 2D 空间中教授/学习感知器以进行教学。术语“移位”并没有充分解释为什么在高维空间中需要偏置项(“移位”100 维超平面是什么意思?)
人们可能会注意到证明感知器平均收敛时间的文献排除了偏差项。这是因为如果您假设感知器会收敛,则可以简化感知器方程(参见 Vapnik,1998,Wiley,第 377 页)。这是证明的一个重要(但必要)的假设,但不能通过假设不完整的实现来充分实现感知器。
Alex B. J. Novikoff 1962/1963 年对感知器收敛的证明包括这个零维项。