【问题标题】:Could tensorflow optimize the each element's loss in a batch separately, instead of optimizing the whole average loss?tensorflow 可以单独优化批次中每个元素的损失,而不是优化整个平均损失吗?
【发布时间】:2019-04-19 07:02:11
【问题描述】:

张量流如何单独优化批次的元素损失而不是优化批次损失?

在优化每个batch的loss时,常用的方法是求和或取该batch的所有element loss的平均值作为batch loss,然后优化这个batch loss。就我而言,我想单独优化每个元素的损失,而不是将它们作为批量损失一起减少。

例如,在下面的代码中。

losses = tf.nn.nce_loss(<my batch inputs here>)
loss = tf.reduce_mean(losses)
optim = tf.nn.GradientDesentOptimizor(learning_rate = 0.01).minimize(loss)

如何跳过loss = tf.reduce_mean(losses) 并直接最小化张量losses? (这样mini-batch实际上就缩小到了batch size为1的情况。)

我已经将损失直接最小化为:

optim = tf.nn.GradientDesentOptimizor(learning_rate = 0.01).minimize(losses) # instead of loss

我不确定最小化将如何工作。当我使用它在会话中运行时,损失往往会探索到 nan。

那么在tensorflow中是否可以实现上述目的呢?

【问题讨论】:

    标签: tensorflow optimization loss


    【解决方案1】:

    tf.reduce_mean(losses) 的梯度计算和losses 的梯度计算之间的区别在于,对于 losses 张量,您将获得梯度的总和(批次中每个样本的梯度总和),而对于 @987654324 @您将获得梯度的平均值(批次中样本的梯度平均值)。这就是为什么你开始得到NaN 值的原因——随着批次大小的增加,梯度的总和变得非常大。

    如果您要优化张量损失而不是减少平均损失,您可以通过将学习率除以批量大小来获得精确的等价。

    要为每个样本单独优化器,只需每批输入一个样本。

    【讨论】:

    • 非常感谢您的回答!您的回答有助于我了解损失结果。为了单独优化每个样品,我尝试每批喂一个样品。但是,速度很慢,因为我想通过 Tensorflow 训练一个 word2vec 模型,这是一个影子网络。当我增加批量大小时,我发现结果在单词相似度和类比任务上很糟糕。当我设置batch size为1的时候效果很好,但是速度很慢。
    • 您使用的嵌入大小是多少?一般来说,在深度学习中每批使用 1 个样本是很不寻常的。 “结果不好”对您来说是什么意思。你如何衡量结果?
    猜你喜欢
    • 2018-05-05
    • 2017-09-01
    • 2018-07-03
    • 2021-10-24
    • 2021-03-08
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多