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

Posted

技术标签:

【中文标题】如何解释 Tensorflow DNNRegressor Estimator 模型中的损失函数?【英文标题】:How to interpret loss function in Tensorflow DNNRegressor Estimator model? 【发布时间】:2018-03-14 07:17:09 【问题描述】:

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

即我的损失函数每一步都有很大的不同。但据我所知,我的损失函数应该在没有迭代的情况下减少。另外,请找到随附的 Tensorboard Visualization for loss function 的屏幕截图:

我无法弄清楚的疑问是:

是整体损失函数值(到目前为止处理的每个步骤的组合损失)还是只是该步骤的损失值? 如果是那一步的损失值,那么如何获取整体损失函数的值并查看其趋势,我觉得应该随着迭代次数的增加而减少?据我所知,这是我们在训练数据集时应该考虑的价值。 如果这是整体损失值,那为什么波动这么大?我错过了什么吗?

【问题讨论】:

【参考方案1】:

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

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

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

如果是那一步的loss值,那么如何获取整体loss的值 功能并查看其趋势,我觉得应该减少 增加迭代次数?

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

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

神经网络不学习的一个常见原因是超参数选择不当(尽管there are many more mistakes 你可能会这样做)。例如:

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

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

【讨论】:

感谢分享。这对前进非常有帮助。我已经发现 DNNRegressor 使用 mean_squared_loss 函数,顺便说一下,我将 tf.estimator.DNNRegressor 用于我的模型。我还有一个疑问,在 input_function size 中指定 batch_size 参数是否会对实现最小精度产生任何影响。我有一种感觉,当我使用 batch_size = "input_data_set_size" 时,与使用 10 或 100 作为我的 batch_size 相比,我的算法收敛得更好。对此有何建议? 批量大小是一个重要的超参数,它会影响性能。通常研究将其设置得尽可能大,以使其适合 GPU 内存,但也有已知的情况,即较小的批次使 DNN 学习得更快。一般来说,它是您可能想要调整以获得最佳性能的众多参数之一 - ***.com/questions/41860817/… 感谢您的回复。我有另一个疑问:NN 是否需要归一化?我的意思是,如果数字输入未标准化,它会给出错误的答案或降低准确性吗?到目前为止,我所读到的是非标准化输入需要时间才能收敛,但它们永远不会给出错误的答案或降低准确性。我的想法对吗? 可能需要更长的时间才能收敛,或者根本不收敛。在网络经过训练之前,它可能会给出错误的结果,从而降低准确性。但是你有固定的时间来训练它,所以你只对网络学习相对较快的情况感兴趣。所以,是的,归一化很重要,尤其是在线性回归中。 之前我曾经在 CPU 上运行这个程序。但是运行大型计算需要更多时间。但是现在我在aws ie (p2.xlarge) 上租了一个启用GPU 的服务器。但现在我面临的问题是我的 GPU 内存正在被使用。但是 Volatile GPU-Util 仍然是 1%。无法弄清楚我的 GPU 是否被充分利用? PS:-我使用与在 CPU 上使用的 GPU 相同的估计器代码,没有任何修改,因为我读到 Estimators 自己负责 GPU。请帮忙!!【参考方案2】:

虽然之前的评论内容丰富且很好,但它并不能完全解决您的问题。当你实例化 DNNRegressor 时,添加: loss_reduction=tf.losses.Reduction.MEAN 在构造函数中,您会看到平均损失收敛。

estimator = tf.estimator.DNNRegressor(      
    feature_columns=feat_clmns, 
    hidden_units=[32, 64, 32],
    weight_column=weight_clmn,
    **loss_reduction=tf.losses.Reduction.MEAN**

【讨论】:

以上是关于如何解释 Tensorflow DNNRegressor Estimator 模型中的损失函数?的主要内容,如果未能解决你的问题,请参考以下文章

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

TensorFLow1.3文档中文翻译之1.0.0安装

TensorFlow:如何以及为啥要使用 SavedModel

教程 | 如何利用C++搭建个人专属的TensorFlow

Tensorflow gradientTape 解释

教程 | 如何从TensorFlow转入PyTorch