【问题标题】:Neural Network Becomes Unruly with Large Layers神经网络因大层而变得不守规矩
【发布时间】:2012-11-21 19:31:17
【问题描述】:

这是一个关于神经网络性能的更高层次的问题。我遇到的问题是,每层神经元数量较多,网络经常出现完全愚蠢的回合。它们不一致;当层数超过 60 个神经元(总是 3 层)时,一般成功与失败的概率似乎约为 50/50。

我通过向具有 10-200 大小的输入和隐藏层的网络教授相同的功能来测试这一点。成功率是 0-1% 或 90+%,但没有介于两者之间。为了帮助可视化这一点,我将其绘制成图表。失败是 5k 次训练迭代后对 200 个数据集的错误响应的总计数。 .

我认为还需要注意的是,每次实验运行时网络成功或失败的数字都会发生变化。我想出的唯一可能的罪魁祸首是局部最小值(但不要让这影响你的答案,我是新手,最初尝试最小化局部最小值的机会似乎没有效果)。

那么,最终的问题是,什么会导致这种行为?为什么这件事如此不一致?

Python 代码位于 Github 上,生成此图的代码是 test.py 中的 testHugeNetwork 方法(第 172 行)。如果网络算法的任何特定部分有帮助,我很高兴发布相关的 sn-ps。

【问题讨论】:

  • 您“最初尝试最小化局部最小值的机会”是什么?您是否尝试过降低学习率?
  • @larsmans 我期望最大的帮助是将权重初始化为更小的量级(它们是随机的)。我认为较大的初始值会增加网络卡在错误路径上的机会。我还试验了学习率和动量常数。没有引起明显的变化。
  • 有趣。是的,小权重应该有帮助,至少如果你有 sigmoid(逻辑或 tanh)激活函数,因为它们往往在零附近是线性的。再说一次,许多小的 sigmoid 激活可能会增加一个非常大的权重进入输出层。具有线性激活的它,它的预测可能会有很大的偏差,训练它可能需要很长时间。
  • @larsmans 我可能说得太快了。我将学习率和动量都更改为比我之前尝试过的更小,并且初始测试看起来不错。现在我会说这正是问题所在。这几天我很困惑,我没有对最简单的变量给予足够的思考。如果这被证明是解决方案,是否相当确定问题是局部最小值?
  • 它可能是,或者它可能是错误表面中的高原,这取决于您检查收敛的方式。

标签: python machine-learning neural-network


【解决方案1】:

我的猜测是,您的网络在锯齿状错误表面上剧烈振荡。尝试降低错误率可能会有所帮助。但首先,您可以做一些事情来更好地了解您的网络在做什么:

  • 绘制训练时期的输出误差。这将向您显示何时在训练过程中出现问题。
  • 拥有权重矩阵和输出的图形表示(图像)。更容易发现违规行为。

ANN 训练的一个主要问题是 sigmoid 函数的饱和。对于逻辑函数和 tanh 的渐近线,导数接近于 0,在数值上它甚至可能 零。结果,网络只会学习非常缓慢或根本不学习。当 sigmoid 的输入太大时会出现此问题,您可以采取以下措施:

  • 初始化与神经元接收的输入数量成比例的权重。标准文献建议从均值 = 0 且标准差为 1/sqrt(m) 的分布中提取它们,其中 m 是输入连接数。
  • 扩展您的教师,使他们位于网络可以学习最多的地方;也就是说,激活函数是最陡峭的:一阶导数的最大值。对于 tanh,您也可以将函数缩放为 f(x) = 1.7159 * tanh(2/3 * x) 并将教师保持在 [-1, 1]。但是,不要忘记将导数调整为 f'(x) = 2/3 * 1.7159 * (1 - tanh^2 (2/3 * x)

如果您需要进一步说明,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 2016-09-02
    • 1970-01-01
    • 2012-09-22
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多