NN 中的更多层会产生更差的结果

数据挖掘 机器学习 神经网络 深度学习 毫升
2022-02-22 16:59:02

所以我在神经网络的帮助下进行分类任务。数据集是标准化的,权重在 之间是随机的0-1,并且所有的激活都是 sigmoid 函数。

现在,当我使用 2 个隐藏层模型时,准确度为 50%,而当我使用 1 个隐藏层模型时,准确度为 99%。这不是与对NN的直观理解相反吗?我知道更多的层意味着更好的拟合甚至过度拟合,但显然在这种情况下发生了一些不同的事情(可能第二个隐藏层输出的值太小,输出层无法辨别)。那么我到底错过了什么?

3个回答

也许你犯了一个错误,把你的代码放在这里。但是没有看到你的代码,这些是可能的点:

  • 消失的问题,由于网络非常浅,我不认为你有这个问题。您可以将激活函数更改relu为以避免这种情况。
  • Covariat shift,这意味着类似于必须归一化的输入特征,必须对更深层的输入进行归一化。归一化过程的方式是,每一层的输入应该有一个不会改变的特殊分布。您可以使用批量标准化来避免该问题。
  • 编码中的错误,您可能以错误的方式将每一层的激活馈送到下一层,或者如果您没有使用矢量化,您可能没有同时更新权重。还有许多不同的原因可能会导致代码中的错误。

  • 每层的神经元数量可能不够,请尝试增加它们。要了解增加层数和每层神经元数量的含义,您可以查看此处

运行“梯度检查”来定位错误发生的位置,因为它看起来是一个常见的典型错误。您不应该在如此浅的网络上体验到任何数值精度

但是,在实际的梯度检查过程中可能会出现数值精度。看看这个被警告:链接

此外,您的权重可能太大 - 阅读有关 Xavier init 的信息

训练 nn 并不总是那么容易。如果你的训练准确率只有 50%,这意味着你的网络并没有真正在学习。可能会出现很多问题,但是对于这样一个简单的问题,我敢打赌你遇到了梯度消失的问题。如果您尝试使用 relu 激活隐藏层,您可能会解决消失梯度问题。我认为值得一试。

如果你使用 Tensorflow 运行你的 nn,一种检查梯度是否为 0 的方法是使用 Tensorboard。