如何测试我的反向传播神经网络的实现是否正确

人工智能 神经网络 反向传播
2021-10-30 08:54:08

我正在研究反向传播算法的实现。到目前为止我已经实现的似乎有效,但我不能确定算法是否得到很好的实现,这是我在网络训练测试期间注意到的:

实施规范:

  • 一个包含几乎 100000 个原始数据的数据集(3 个变量作为输入,这三个变量之和的正弦作为预期输出)。
  • 网络确实有 7 层,所有层都使用 sigmoid 激活函数

当我运行反向传播训练过程时:

  • 在第四次迭代中找到了错误的最小成本(错误的最小成本是 140,这正常吗?我期望的远低于那个
  • 在第四次迭代之后,错误的成本开始增加(我不知道它是否正常?
3个回答

实际上执行是正确的,

导致大错误和真正缓慢学习的问题的根源在于其自身的神经网络架构,人工神经网络有 7 个隐藏层,这会导致梯度消失问题。

当我将 ANN 层减少到 3 层时,除了学习过程更快之外,错误成本也大大降低。

另一种常见的解决方案是在神经网络的隐藏层中使用 RELU 或 ELU 或 SELU 代替 sigmoid 函数

我相信最好的方法是使用数值梯度要理解这个概念,我们需要使用极限来查看导数的定义:

在此处输入图像描述

这意味着,当您不知道如何推导某些公式(或者您只是不想)时,您可以通过计算输入的微小变化的输出来近似它,从原始结果中减去(没有变化) ,并通过这种变化进行归一化。

示例:我们知道 f(x) = x^2 的导数是 f'(x) = 2x。但是,假设我们不这样做并且我们使用 x = 3 和 h = 0.001(实际上它趋于零):

f(3 + 0.001) = (3 + 0.001)^2 = 9,006 (大约)
f(3) = 3^2 = 9

因此,

(9,006 - 9) / 0.001 = 6

这正是 f'(3) = 2*3 = 6。

在实践中,如果你想知道你的反向传播是否正确,

  1. 通过您的网络传递一个示例 (x1) 并计算输出 (o1)。计算关于 x1 (d1) 的梯度。
  2. 然后,向输入 (h) 添加一个小值,再次通过网络,并计算新的输出 (o2)。
  3. 减去 o2 - o1 并除以 h。它必须足够接近 d1。

而已。这称为梯度检查我希望它有所帮助。

您应该知道的一件事是 sigmoid 函数将输出限制在 0 到 1 之间的值,这意味着使用大量隐藏层将很快导致消失梯度。

尝试使用 relu 激活函数,它具有输出从上一层获得的所有信息的属性。