神经网络变得难以驾驭大层

时间:2012-11-21 19:31:18

标签: python machine-learning neural-network

这是关于神经网络性能的更高级别的问题。我遇到的问题是,每层神经元数量越多,网络就会频繁完成愚蠢。它们不一致;当层数超过60个神经元(总是3层)时,似乎普遍成功与失败的概率约为50/50。

我通过向具有10-200的大小的输入和隐藏层的网络传授相同的功能来测试这一点。成功率为0-1%或90 +%,但两者之间没有任何关系。为了帮助想象这一点,我画了它。失败是在5k次训练迭代之后对200个数据集的不正确响应的总计数。 imgur

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

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

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

1 个答案:

答案 0 :(得分:0)

我的猜测是,你的网络在一个锯齿状的错误表面上大量振荡。尝试较低的错误率可能会有所帮助。但首先,您可以采取一些措施来更好地了解您的网络正在做什么:

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

ANN训练的一个主要问题是S形函数的饱和。对于逻辑函数和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)

如果您需要进一步澄清,请与我们联系。