我有大量数据点描述二进制向量到实值输出的映射。我正在使用 TensorFlow,并想训练一个模型来预测这些关系。我使用了四个隐藏层,每层有 500 个神经元,每层使用 sigmoid 激活函数。
网络似乎无法学习,即使在训练数据上也有很高的损失。什么可能导致这种情况发生?我的网络设计有问题吗?
我有大量数据点描述二进制向量到实值输出的映射。我正在使用 TensorFlow,并想训练一个模型来预测这些关系。我使用了四个隐藏层,每层有 500 个神经元,每层使用 sigmoid 激活函数。
网络似乎无法学习,即使在训练数据上也有很高的损失。什么可能导致这种情况发生?我的网络设计有问题吗?
您的代码在这里提出了一个可能的问题:看起来您正在训练一个非常深的神经网络,在每一层都具有 sigmoid 激活函数。
sigmoid的特性是,当激活函数的值接近0或接近1时,它的导数(S*(1-S))会非常小。实际上,它可以达到的最大值约为0.25。
用于训练神经网络的反向传播算法将向后传播误差信号。在每一层,误差信号将乘以激活函数的导数等。
因此,在第 4 层,您的信号最多为 它在网络开始时的大小。事实上,它可能比这小得多。使用较小的信号,你在下一个工作底部的学习率实际上会比顶部的学习率小得多,这将使得很难选择一个整体有效的学习率。
这个问题被称为消失梯度。
要解决此问题,如果您想使用深度架构,请考虑使用不受梯度消失影响的激活函数。在所谓的“ReLU”单元中使用的Rectified Linear激活函数是一种非线性激活,没有梯度消失。如果您需要将输出限制在 0 和 1 之间,则通常将 ReLU 用于网络中的较早层,并在输出层使用 sigmoid。
在训练我们的神经网络时,您需要扩展数据集以避免减慢学习速度或妨碍有效学习。尝试标准化你的输出。本教程可能会有所帮助