【问题标题】:Neural Network Diverging instead of converging神经网络发散而不是收敛
【发布时间】:2013-08-01 20:38:55
【问题描述】:

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

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

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

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

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

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

任何指针将不胜感激。

【问题讨论】:

  • 只是为了我理解正确,您想知道为什么您没有显示的代码本身实现了您没有描述的算法,不收敛?让自己站在我的立场上,问问自己你是否认为这是一个可以回答的问题。我投票结束这个,对不起...
  • 我确信代码没有问题。而且我相信对于任何熟悉神经网络的人来说,算法(反向传播)已经得到了充分的描述。我想知道还有什么可能出了问题.. 我正在删除 cuda 标签以防止误导任何人认为这是一个 CUDA 问题
  • 根据我的经验,当您的参数溢出或某些函数返回无穷大时(例如,如果您使用逻辑损失函数,则为对数)可能会发生这种情况。我会先检查数值问题,例如带有梯度检查器。但这太宽泛了,所以我想我们无法帮助您。
  • 输出不是突然变为无穷大,而是在一些初始振荡之后逐渐变为无穷大。只有在任何权重大于 1 之后,它才会开始发散。所以这不是由于任何一个函数返回无穷大。我添加了更多信息。希望对您有所帮助。

标签: machine-learning artificial-intelligence neural-network


【解决方案1】:

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

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

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

【讨论】:

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

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

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

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

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

    【讨论】:

    • 你有关于层数的科尔莫哥洛夫规则的参考吗?
    • @Luis 我的印象是,考虑到深度学习的出现,3 层的东西已经过时了。
    • @ChrisAnderson 3 层“东西”不是“东西”。是对您想要做什么、为什么以及使用哪些方法的数学反思和分析。当然,您可能会放置越来越多的层(或很多节点,就此而言),但这并不能保证您相应地解决了您的问题。关于层数的问题仍然很有趣,尤其是对于原始问题:我已经实现了一个有 2 层的神经网络(使用 CUDA)。 (每层 2 个神经元)。我试图让它使用反向传播学习 2 个简单的二次多项式函数。
    • 哦,对不起。我想我见过有人推荐类似的东西一般,这让我很沮丧。你说的有道理(我没有注意实际的问题文字)。
    猜你喜欢
    • 2017-05-21
    • 2012-03-03
    • 2016-05-13
    • 2019-02-20
    • 2016-05-13
    • 1970-01-01
    • 2016-07-10
    • 2018-12-15
    • 2018-02-20
    相关资源
    最近更新 更多