提高学习率低的神经网络的训练性能?

机器算法验证 机器学习 神经网络 模型评估 平方和 效率
2022-04-08 08:22:38

我正在尝试训练人工神经网络进行分类。在输入层,我有 402 个神经元;前 400 个是二进制的,后两个是 -1 到 1 范围内的浮点数。在隐藏层中,我有 400 个神经元,在输出层中,我有一个节点,我想表示介于 -1 和1.

我尝试使用我在网上找到的反向传播的矢量化实现来训练这个网络(我尝试了不同的实现,并且我自己也实现了一个)。我的问题是,我的网络似乎没有学到很多东西。如果我的学习率高于 0.0001 左右,我就会遇到麻烦,并很快进入局部最小值,而学习率较低时,学习(显然)非常非常慢。

我可以训练尽可能多的数据,所以这不是问题,但当然时间是有限的,所以我希望能够在合适的时间内训练这个网络。

您是否对可能出了什么问题有任何直觉,或者需要多少数据来训练这个权重约为 160.000 的网络?

如果相关,我可以上传一些数据。

由于 Martin 的评论,这里是不同数量的隐藏神经元的一些学习统计数据:Google Docs Spreadsheet

我观察到的另一件事是,对于我的数据集,0.3 的恒定输出将导致 SSE 约为 160,所以我绝对希望低于这个 SSE。

2个回答

如果时间是一个限制因素,您可以尝试大幅减少隐藏单元的数量。根据我的经验,很少需要这么多隐藏单位。我将从少量(少于十个)隐藏单元开始,看看这是否能提供足够的性能。

如果您更担心局部最小值,也许值得尝试在您的算法中添加一个随机分量,基于模拟退火随机梯度下降这可能会使事情变慢一点,但会防止局部最小值成为这样的问题。

梯度下降通常是一种糟糕的优化算法。尝试以下方法之一:

  • 随机梯度下降
  • 列文伯格-马夸特
  • 共轭梯度

这些算法通常是

  1. 更快更
  2. 取得更好的成绩

例如。“双螺旋”问题可以通过大于 10,000 次迭代的梯度下降和小于 300 次迭代的 Levenberg-Marquardt 来解决。

我认为在神经网络常见问题解答中有关于训练集大小的建议,但我目前找不到。通常它应该是输入数 * n,其中 n 足够大(好吧,这可能对您没有帮助)。