神经网络反向传播问题

数据挖掘 神经网络 反向传播
2022-02-25 18:59:07

我正在研究神经网络的实现,所以我可以真正掌握这些魔法盒的工作原理。但是,我为其编写代码的神经网络不起作用,我认为这是由于我实现了反向传播

[伪代码]

'last layer only
for each node (i) in last layer
error(i) = outputError(i)
end for

'all hidden/inner layers
for each layer (i) in layers (not including layer 0 or last)
 for each neuron (j) in layer i
  for each neuron (k) in layer i+1
   error(i)(j) +=error(i+1)(k) * weight(i)(j,k)
  end for

  errors(i)(j) = errors(i)(j) * activation(i)(j) * (1-activation(i)(j))

  for each neuron in layer i+1
   deltaWeight(i)(j,k) = -error(i)(k)*activation(i)(k)*learningRate/NumExamples
   deltaBias(i)(k) = -error(i)(k) * bias(i)(k)*learningRate/NumExample
  end for
 end for
end for

然后我用这个更新所有的权重:

weight(i)(j,k) = weight(i)(j,k) + deltaWeight(i)(j,k)

现在我遇到的问题是输出似乎没有变得更好。它肯定会改变,但似乎根本没有最小化成本函数,有人知道为什么吗?

3个回答

网络可能没有变得更好的一些原因:

  • 学习率太高(永远来回跳跃)
  • 学习率太低(除以训练集大小时,归零)
  • 您正在用权重梯度信号替换误差信号。错误的重用(基于缩进)似乎与内部循环在同一行。我不确定这是否正确。首先,反向传播你的错误,然后根据隐藏神经元的激活和 delta sigmoid(error) 计算梯度。

这是一篇非常好的博客文章,介绍了如何R从头开始:ParallelR NNs按照这篇文章中建议的一些链接进行操作;他们很有启发性。此外,其他帖子还讨论了如何通过在 CPU 和 GPU 上使用并行计算来改进计算时间。

看看 Simon Haykin 的“神经网络和学习机器”。对于 sigmoid 和径向基函数网络,反向传播都有很好的处理。