为什么感知器学习算法不会收敛?

时间:2013-10-03 01:20:33

标签: python numpy machine-learning perceptron

我已经在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次迭代后它也没有收敛?

2 个答案:

答案 0 :(得分:13)

Minsky和Papert(in)于1969年着名地证明了感知器学习算法不能保证收敛到不可线性分离的数据集。

如果您确定数据集是线性可分的,则可以尝试为每个数据向量添加偏差,如问题所述: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 年对感知器收敛的证明包括这个零维项。