5

我已经实现了一个有 2 层的神经网络(使用 CUDA)。(每层 2 个神经元)。我试图让它使用反向传播学习 2 个简单的二次多项式函数。

但不是收敛,而是发散(输出变得无穷大)

以下是有关我尝试过的更多详细信息:

  • 我已将初始权重设置为 0,但由于它是发散的,因此我将初始权重随机化
  • 我读到如果学习率太高,神经网络可能会发散,所以我将学习率降低到 0.000001
  • 我试图让它添加的两个功能是:3 * i + 7 * j+9j*j + i*i + 24(我给图层ij作为输入)
  • 我之前已经将它实现为单层,这样可以更好地逼近多项式函数
  • 我正在考虑在这个网络中实施动力,但我不确定它是否有助于它学习
  • 我正在使用线性(没有)激活函数
  • 一开始有振荡,但是当任何权重大于 1 时输出开始发散

我已经检查并重新检查了我的代码,但似乎没有任何问题。

所以这是我的问题:这里出了什么问题?

任何指针将不胜感激。

4

2 回答 2

5
  1. 如果您要解决的问题属于分类类型,请尝试 3 层网络(对于 Kolmogorov,3 层就足够了) 从输入 A 和 B 到隐藏节点 C 的连接(C = A*wa + B*wb)表示AB 空间。那条线将正确和不正确的半空格分开。从隐藏层到输出的连接,将隐藏层值相互关联,为您提供所需的输出。

  2. 根据您的数据,错误函数可能看起来像梳子,因此实施动量应该会有所帮助。将学习率保持在 1 对我来说是最佳的。

  3. 您的培训课程会不时陷入局部最小值,因此网络培训将包括几个后续课程。如果会话超过最大迭代次数或幅度太高,或者错误明显很高 - 会话已失败,请启动另一个。

  4. 在每个开始时,使用随机 (-0.5 - +0.5) 值重新初始化您的权重。

  5. 它确实有助于绘制错误下降图。你会得到那个“啊哈!” 因素。

于 2013-08-02T05:04:00.327 回答
3

神经网络代码发散的最常见原因是编码器忘记在权重表达式的变化中加上负号。

另一个原因可能是用于计算梯度的误差表达式存在问题。

如果这些不成立,那么我们需要查看代码和答案。

于 2013-10-04T17:17:58.290 回答