如何在Tensorflow DNNRegressor Estimator模型中解释损失函数?

use*_*384 5 python machine-learning neural-network tensorflow tensorboard

我正在使用Tensorflow DNNRegressor Estimator模型来制作神经网络。但是调用estimator.train()函数给出的输出如下:

在此处输入图片说明

即我的损失函数在每个步骤中都变化很大。但是据我所知,我的损失函数应该减少而无需迭代。另外,找到随附的Tensorboard Visualization屏幕截图以了解损失功能:

在此处输入图片说明

我无法弄清的疑问是:

  • 是整体损失函数值(到目前为止处理的每个步骤的综合损失)还是该步骤的损失值?
  • 如果是那一步的损失值,那么如何获得整体损失函数的值并查看其趋势,我认为应该随着迭代次数的增加而降低?据我所知,这是我们在训练数据集时应注意的价值。
  • 如果这是总损失值,那么为什么波动那么大?我想念什么吗?

Max*_*xim 2

首先,让我指出tf.contrib.learn.DNNRegressor使用带有 的线性回归头mean_squared_loss,即简单的 L2 损失。

是整体损失函数值(到目前为止处理的每个步骤的组合损失)还是只是该步骤的损失值?

图表上的每个点都是学习到目前为止最后一步的损失函数的值。

如果是该步骤的损失值,那么如何获得整体损失函数的值并查看其趋势,我认为该值应该随着迭代次数的增加而减小?

没有整体损失函数,您可能指的是每一步后损失如何变化的图表。这正是 Tensorboard 向您展示的内容。你是对的,它的趋势并没有像它应该的那样下降。这表明你的神经网络没有学习。

如果这是整体损失值,那为什么波动这么大呢?我错过了什么吗?

神经网络不学习的一个常见原因是超参数选择不当(尽管您可能会犯更多错误)。例如:

  • 学习率太大
  • 也有可能是学习率太小,这意味着神经网络正在学习,但是非常非常慢,以至于你看不到它
  • 权重初始化可能太大,尝试减小它
  • 批量大小也可能太大
  • 您为输入传递了错误的标签
  • 训练数据包含缺失值或未标准化
  • ...

为了检查神经网络是否至少以某种方式工作,我通常所做的就是将训练集减少到很少的示例,并尝试过度拟合网络。这个实验非常快,所以我可以尝试各种学习率、初始化方差和其他参数来找到最佳点。一旦我有了稳定下降的损失图,我就会继续做更大的一组。