Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 关于人工神经网络反向传播算法的问题——更新顺序_Algorithm_Neural Network - Fatal编程技术网

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

Algorithm 关于人工神经网络反向传播算法的问题——更新顺序,algorithm,neural-network,Algorithm,Neural Network,嘿,大家好,我一直在试着得到一个我编码的人工神经网络来使用反向传播算法。我读过几篇关于它们的论文,但我注意到一些不一致之处 这里似乎是算法的超级通用格式: 输入 获得输出 计算误差 计算重量的变化 重复步骤3和4,直到达到输入级别 但问题是:显然,权重需要在某个时候更新。但是,因为我们是反向传播,所以在计算更接近输入层的层的误差时,我们需要使用前面层(我的意思是更接近输出层的层)的权重。但是我们已经计算了更接近输出层的层的权重变化!因此,当我们使用这些权重来计算更接近输入的层的误差时,我们是使用

嘿,大家好,我一直在试着得到一个我编码的人工神经网络来使用反向传播算法。我读过几篇关于它们的论文,但我注意到一些不一致之处

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

  • 输入
  • 获得输出
  • 计算误差
  • 计算重量的变化
  • 重复步骤3和4,直到达到输入级别
  • 但问题是:显然,权重需要在某个时候更新。但是,因为我们是反向传播,所以在计算更接近输入层的层的误差时,我们需要使用前面层(我的意思是更接近输出层的层)的权重。但是我们已经计算了更接近输出层的层的权重变化!因此,当我们使用这些权重来计算更接近输入的层的误差时,我们是使用它们的旧值,还是使用它们的“更新值”

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

    (立即更新权重)

  • 输入
  • 获得输出
  • 计算误差
  • 计算重量的变化
  • 更新这些权重
  • 重复步骤3、4、5,直到达到输入级别
  • (使用权重的“旧”值)

  • 输入
  • 获得输出
  • 计算误差
  • 计算重量的变化
  • 将这些更改存储在矩阵中,但不要更改这些权重
  • 重复步骤3、4、5,直到达到输入级别
  • 使用存储的值一次更新所有权重
  • 在这两个抽象示例(基于图3.3和3.4的示例)中,他们都说使用旧值,而不是立即更新值。然而,在他们的“工作示例3.1”中,他们使用新值(即使他们说使用的是旧值)来计算隐藏层的错误

    还有,在我的书《埃瑟姆·阿尔帕丁的机器学习导论》中,虽然有很多抽象的东西我还不明白,他说“注意,第一层重量delta-w_-hj的变化利用了第二层重量v_-h。因此,我们应该计算两层中的变化并更新第一层权重,利用第二层权重的旧值,然后更新第二层权重。”

    老实说,看起来他们真的犯了一个错误,所有的权重都在最后同时更新,但我想确定。我的ANN给了我奇怪的结果,我想肯定这不是原因

    有人知道吗


    谢谢!

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

    您通常反向传播增量不是错误。这些增量是根据错误计算的,但它们的含义不同。一旦有了n层的增量(从输入到输出),就可以使用这些增量和n层的权重来计算n-1层的增量(离输入更近的一个)。增量仅对网络的旧状态有意义,而对新状态没有意义,因此您应始终使用旧权重将增量传播回输入

    Delta在某种意义上是指NN的每个部分之前对错误的贡献程度,而不是下一步对错误的贡献程度(因为您还不知道实际错误)


    与大多数机器学习技术一样,如果你使用更新的权重,它可能仍然有效,但收敛速度可能较慢。

    如果你只是在单个输入-输出对上训练它,我的直觉是立即更新权重,因为梯度不是恒定的。但我认为你的书只提到了单个输入-输出配对。通常你们会提出一个ANN,因为你们有很多输入输出样本来自一个你们想用ANN建模的函数。所以你们的循环应该从第1步开始重复,而不是从第3步开始

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

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

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

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

    在中,作者讨论了反向传播算法的全部要点是,它允许您一次有效地计算所有权重。换句话说,使用“旧价值观”是有效的。使用新值的计算成本更高,这就是为什么人们使用“旧值”来更新权重

    另一个问题:你得到了什么“奇怪的结果”?使用神经网络需要很多经验,如果你不正确地使用它们,很容易得到奇怪的结果。简单易懂的介绍哈