关于人工神经网络反向传播算法的问题 - 更新顺序

时间:2011-05-16 05:16:54

标签: algorithm neural-network

嘿大家,我一直试图让我编码的ANN用反向传播算法。我已经阅读了几篇论文,但我注意到了一些差异。

这似乎是算法的超级通用格式:

  1. 提供输入
  2. 获取输出
  3. 计算错误
  4. 计算权重变化
  5. 重复步骤3和4,直到达到输入水平
  6. 但问题是:显然,权重需要在某个时候更新。但是,因为我们正在反向传播,所以在计算更靠近输入层的层的误差时,我们需要使用先前层的权重(更靠近输出层的权重,我的意思)。但我们已经计算出更接近输出层的层的重量变化!那么,当我们使用这些权重来计算更接近输入的图层的误差时,我们是使用它们的旧值还是它们的“更新值”?

    换句话说,如果我们要在我的超级通用算法中更新权重的步骤,那么它会是:

    (立即更新重量)

    1. 提供输入
    2. 获取输出
    3. 计算错误
    4. 计算权重变化
    5. 更新这些权重
    6. 重复步骤3,4,5,直到达到输入水平
    7. OR

      (使用权重的“旧”值)

      1. 提供输入
      2. 获取输出
      3. 计算错误
      4. 计算权重变化
      5. 将这些更改存储在矩阵中,但不要更改这些权重
      6. 重复步骤3,4,5,直到达到输入水平
      7. 使用我们存储的值
      8. 一次更新所有权重

        this paper I read中,在两个抽象示例(基于图3.3和3.4的示例)中,他们说要使用旧值,而不是立即更新值。但是,在他们的“工作示例3.1”中,他们使用新值(即使他们说他们使用的是旧值)来计算隐藏层的错误。

        另外,在我的书“Ethem Alpaydin的机器学习简介”中,虽然有很多抽象的东西我还不了解,但他说“请注意第一层权重delta-w_hj的变化,利用第二层权重v_h。因此,我们应该计算两层中的变化并更新第一层权重,利用第二层权重的值,然后更新第二层权重。“

        说实话,看起来他们只是犯了一个错误,所有的重量都在最后同时更新,但我想确定。我的人工神经网络给了我奇怪的结果,我想要肯定这不是原因。

        有人知道吗?

        谢谢!

4 个答案:

答案 0 :(得分:2)

据我所知,你应该立即更新重量。反向传播的目的是找到最小化ANN误差的权重,并通过梯度下降来实现。我认为Wikipedia页面中的算法描述非常好。您也可以在joone引擎中仔细检查其实现。

答案 1 :(得分:2)

您通常会反向传播增量而不是错误。这些增量是根据错误计算出来的,但它们并不意味着相同的事情。一旦你有了第n层的增量(从输入到输出计数),你就可以使用这些增量和层n中的权重来计算第n-1层的增量(一个更接近输入)。增量只对网络的旧状态有意义,而不是新状态,所以你应该总是使用旧权重将增量传播回输入。

Deltas在某种意义上意味着NN 的每个部分之前有多少对此错误做出了贡献,而不是在下一步中它将导致错误的多少(因为您不知道实际的错误)错误)。

与大多数机器学习技术一样,如果你使用更新的权重,它可能仍然可以工作,但它可能会收敛得更慢。

答案 2 :(得分:1)

如果您只是在单个输入 - 输出对上训练它,我的直觉就是立即更新权重,因为渐变不是恒定的。但我不认为你的书只提到一对输入输出对。通常你想出一个ANN,因为你有许多来自你想用ANN建模的函数的输入输出样本。因此,您的循环应该从步骤1而不是从步骤3开始重复。

如果我们将您的两种方法标记为new-> online和old-> offline,那么我们有两种算法。

  • 当您不知道要看多少样本输入 - 输出关系时,在线算法很好,并且您不介意权重更新时的一些随机性。

  • 如果您希望以最佳方式拟合特定数据集,则离线算法很好。为避免过度拟合数据集中的样本,可以将其拆分为训练集和测试集。您可以使用训练集来更新权重,使用测试集来衡量您的体重。当测试集上的错误开始增加时,您就完成了。

哪种算法最好取决于使用ANN的目的。既然你谈到训练直到你“达到输入水平”,我假设你训练直到输出完全作为数据集中的目标值。在这种情况下,离线算法就是您所需要的。如果你正在构建一个步步高游戏程序,在线算法会更好,因为你有一个无限的数据集。

答案 3 :(得分:0)

this book中,作者讨论了反向传播算法的重点是它允许您一次性有效地计算所有权重。换句话说,使用“旧值”是有效的。使用新值在计算上更加昂贵,因此人们使用“旧值”来更新权重。