当具有 sigmoid 激活函数的具有四个隐藏层的神经网络不学习时,可能会出现什么问题?

人工智能 神经网络 深度学习 张量流 激活函数 隐藏层
2021-10-23 11:02:45

我有大量数据点描述二进制向量到实值输出的映射。我正在使用 TensorFlow,并想训练一个模型来预测这些关系。我使用了四个隐藏层,每层有 500 个神经元,每层使用 sigmoid 激活函数。

网络似乎无法学习,即使在训练数据上也有很高的损失。什么可能导致这种情况发生?我的网络设计有问题吗?

2个回答

您的代码在这里提出了一个可能的问题:看起来您正在训练一个非常深的神经网络,在每一层都具有 sigmoid 激活函数。

sigmoid的特性是,当激活函数的值接近0或接近1时,它的导数(S*(1-S))会非常小。实际上,它可以达到的最大值约为0.25。

用于训练神经网络的反向传播算法将向后传播误差信号。在每一层,误差信号将乘以激活函数的导数等。

因此,在第 4 层,您的信号最多为 0.254=1256它在网络开始时的大小。事实上,它可能比这小得多。使用较小的信号,你在下一个工作底部的学习率实际上会比顶部的学习率小得多,这将使得很难选择一个整体有效的学习率。

这个问题被称为消失梯度

要解决此问题,如果您想使用深度架构,请考虑使用不受梯度消失影响的激活函数。在所谓的“ReLU”单元中使用的Rectified Linear激活函数是一种非线性激活,没有梯度消失。如果您需要将输出限制在 0 和 1 之间,则通常将 ReLU 用于网络中的较早层,并在输出层使用 sigmoid。

在训练我们的神经网络时,您需要扩展数据集以避免减慢学习速度或妨碍有效学习。尝试标准化你的输出。教程可能会有所帮助