我正在使用Tensorflow的DNNRegressor Estimator模型来构建神经网络。但是调用estimator.train()
函数时,输出如下:
也就是说,我的损失函数在每一步都有很大的波动。但据我所知,我的损失函数应该随着迭代次数的增加而减少。另外,请查看附件中的Tensorboard可视化损失函数的截图:
我无法解决的疑惑包括:
- 这是总体损失函数值(到目前为止处理过的每一步的综合损失)还是仅是该步骤的损失值?
- 如果这是该步骤的损失值,那么如何获取总体损失函数的值并查看其趋势?我认为该趋势应随着迭代次数的增加而下降。我认为这是我们在训练数据集时应该关注的值。
- 如果这是总体损失值,那么为什么它波动如此大?我是否遗漏了什么?
回答:
首先,让我指出tf.contrib.learn.DNNRegressor
使用带有mean_squared_loss
的线性回归头,即简单的L2损失。
这是总体损失函数值(到目前为止处理过的每一步的综合损失)还是仅是该步骤的损失值?
图表上的每个点都是到目前为止学习后的最后一步的损失函数值。
如果这是该步骤的损失值,那么如何获取总体损失函数的值并查看其趋势?我认为该趋势应随着迭代次数的增加而下降。
没有总体损失函数,你可能指的是显示每一步后损失如何变化的图表。这正是tensorboard向你展示的内容。你是对的,其趋势并不是向下的,正如它应该的那样。这表明你的神经网络没有在学习。
如果这是总体损失值,那么为什么它波动如此大?我是否遗漏了什么?
神经网络未能学习的一个常见原因是超参数选择不当(尽管还有许多其他可能的错误)。例如:
- 学习率太大
- 学习率也可能太小,这意味着神经网络在学习,但速度非常非常慢,以至于你看不到
- 权重初始化可能太大,尝试减小它
- 批量大小也可能太大
- 你传递给输入的标签错误
- 训练数据包含缺失值或未标准化
- …
我通常用来检查神经网络是否至少在某种程度上工作的方法是将训练集减少到几个例子,并尝试让网络过拟合。这个实验非常快,所以我可以尝试各种学习率、初始化方差和其他参数来找到一个最佳点。一旦我有了一个稳定的下降损失图表,我就会继续使用更大的数据集。