【问题标题】:Non-converging Neural Network in CC语言中的非收敛神经网络
【发布时间】:2016-05-19 23:46:26
【问题描述】:

我用 C 语言编写了我的第一个前馈神经网络,使用 sigmoid 1.0 / (1.0 + exp(-x)) 作为激活函数并使用梯度下降来调整权重。我试图近似sin(x) 以确保我的网络正常工作。然而,输出层神经元的输出似乎总是在极值 0 和 1 之间振荡,并且神经元的权重增长到荒谬的大小,无论有多少隐藏层,隐藏层中有多少神经元(s),我提供了多少训练样本,甚至目标输出是什么。

1) 是否有任何标准的“经过验证的”数据集用于验证神经网络的错误?如果是,哪些结构(例如隐藏层中的神经元数量)最能收敛到所需的输出?

2) 是否存在产生相同症状的常见错误?我找到了this thread,但问题是由于数据错误,我认为这不是我的情况。

3) 有没有首选的网络训练方式?在我的实现中,我循环遍历训练集并每次调整权重,然后冲洗并重复约 1000 次。还有其他更好的顺序吗?

【问题讨论】:

  • 你最终的激活函数是什么?它也是sigmoid吗?那么你可能对罪可能是消极的事实有疑问。
  • @MarcinMożejko 为了清楚起见,我只取了 0 到 1 之间的 50 个随机实数,并使用每个实数的 sin(x) 作为输出目标。所以这些数字都是正数,介于 0 和 1 之间。我也不确定你的最终激活函数是什么意思?
  • 最终激活是最后一层的激活函数。好的 - 那么这个任务的学习率和丢失功能是多少?你用过 MSE 吗?
  • @MarcinMożejko 我还在输出层使用了 sigmoid 作为激活函数,除此之外没有补充函数——我直接将最后一层的输出与目标进行比较。我尝试了不同的学习率,从 0.7 到低至 0.01,但振荡现象仍然存在,只是慢了一点。至于成本函数,我确实使用了输出和期望目标之间的平方差。但是现在我想起来了,在调整权重之前计算整个训练集的均方差会更有意义吗?
  • 那么 - 在每个示例之后更新它之前?它称为 SGD,可能会导致一些问题。您可以计算整个集合的错误或使用批量学习代替(当您在计算错误后更新权重时,例如 20 个示例)。学习率 0.7 也可能很大。

标签: c neural-network


【解决方案1】:

所以,总结一下:

  1. 假设您的梯度传播工作正常,通常使用称为网格搜索或随机搜索。经验证明,随机搜索在这个task中表现更好。

  2. 权重发散的最常见原因是错误的学习率。它的巨大价值可能会使学习变得非常困难。但另一方面——当学习率太小时——学习过程可能需要很长时间。通常 - 你应该照看学习阶段。可能会找到指定的指令,例如here.

  3. 在您的学习阶段,您使用了一种称为 SGD 的技术。通常 - 它可能会取得良好的效果,但它容易受到数据集的变化和学习率的大值的影响。我建议您使用批量学习并将批量大小设置为在网格或随机搜索期间学习的附加学习参数。你可以在这里阅读例如here

  4. 您可能会考虑的另一件事是将激活函数更改为tanhrelusigmoid 的饱和区域存在很多问题,通常需要适当的初始化。你可以阅读它here

【讨论】:

  • 这是比我希望的更多的信息。非常感谢!
  • 哦,我之前已经试过了,但它说我首先需要 15 个“声誉”,所以你必须感谢我 ;-)
猜你喜欢
  • 2012-03-03
  • 2016-05-13
  • 2016-07-10
  • 2018-12-15
  • 2019-02-20
  • 2016-05-13
  • 2018-11-04
  • 1970-01-01
相关资源
最近更新 更多