0

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

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

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

所以,最终的问题是,什么可能导致这种行为?为什么这件事如此不一致?

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

4

1 回答 1

0

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

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

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)

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

于 2012-12-02T21:37:05.977 回答