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

12
大家好,我一直在尝试让我编写的人工神经网络(ANN)能够使用反向传播算法。我已经阅读了几篇论文,但是发现存在一些差异。
这里似乎是算法的超级通用格式:
1. 输入 2. 获取输出 3. 计算误差 4. 计算权重变化 5. 重复步骤3和4,直到达到输入层
但是问题在于:权重需要在某个时刻进行更新。然而,因为我们正在进行反向传播,所以在计算接近输入层的层的误差时,我们需要使用前面层(靠近输出层的层)的权重。但是我们已经计算出了更靠近输出层的层的权重变化!那么,在使用这些权重计算接近输入层的层的误差时,我们使用它们的旧值还是“更新后的值”?
换句话说,如果我们将更新权重的步骤放入我的超级通用算法中,它会是:
(立即更新权重)
1. 输入 2. 获取输出 3. 计算误差 4. 计算权重变化 5. 更新这些权重 6. 重复步骤3,4,5直到达到输入层
还是
(使用权重的“旧”值)
1. 输入 2. 获取输出 3. 计算误差 4. 计算权重变化 5. 重复步骤3和4,直到达到输入层
  1. 输入数据
  2. 获取输出结果
  3. 计算误差
  4. 计算权重的变化量
  5. 将这些变化量存储在矩阵中,但不要立即更改这些权重
  6. 重复步骤3、4、5,直到达到输入层
  7. 使用我们存储的值一次性更新权重

我读的这篇论文中,在两个抽象的例子(基于图3.3和3.4)中,他们说要使用旧值,而不是立即更新值。然而,在他们的“示例3.1”中,他们使用新值(尽管他们所说的是使用旧值)来计算隐藏层的误差。

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

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

有人知道吗?

谢谢!


顺便问一下:你得到了什么“奇怪的结果”?使用神经网络需要很多经验,如果不正确使用它们,很容易得到奇怪的结果。如果您想要一个简单易懂的介绍,请查看这份手稿 - LiKao
4个回答

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

2
通常情况下,你是通过反向传播误差调整权重而不是误差本身。这些调整量是从误差中计算出来的,但它们并不意味着相同的含义。一旦你得到了第n层(从输入到输出)的调整量,你就可以使用这些调整量和第n层的权重来计算第n-1层(靠近输入)的调整量。这些调整量只有在网络的旧状态下才具有意义,而不是新状态下,因此你应该始终使用旧权重将调整量向后传播到输入。

从某种意义上讲,这些调整量意味着NN的每个部分在之前对误差的贡献程度,而不是在下一步中它将对误差产生多少贡献(因为你还不知道实际误差)。

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


1
嗨,谢谢你的回复!是的,这正是我怀疑的。使用第n层的更新权重来计算第n-1层的东西确实没有意义。至于你所说的我们“通常反向传播delta而不是错误”,你所说的“delta”是指权重的delta(即权重需要改变多少),还是符号delta?因为除非我弄错了,符号delta通常用于表示一层的误差。谢谢! - user418975

1

如果您只是在单个输入输出对上进行训练,我的直觉是立即更新权重,因为梯度不是恒定的。但我认为您的书并没有提到仅有一个输入输出对。通常,您使用ANN是因为您有许多来自您想要用ANN建模的函数的输入输出样本。因此,您的循环应该从第1步开始重复,而不是从第3步开始。

如果我们将您的两种方法标记为新->在线和旧->离线,则我们有两种算法。

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

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

最佳算法取决于使用人工神经网络的目的。由于您谈到训练直到“达到输入水平”,我假设您会训练直到输出与数据集中的目标值完全相同。在这种情况下,离线算法是您需要的。如果您正在构建一款双陆棋程序,则在线算法更好,因为您有无限的数据集。


0
这本书中,作者谈到反向传播算法的整个重点在于它允许您一次性高效地计算所有权重。换句话说,使用“旧值”是高效的。使用新值更加计算昂贵,因此人们使用“旧值”来更新权重。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接