【问题标题】:Mask samples from loss function in Tensorflow从 Tensorflow 中的损失函数中屏蔽样本
【发布时间】:2017-10-26 23:37:20
【问题描述】:

我有一个 GCMLE 实验,它在一个 model_fn() 中包含三个学习目标(考虑这些任务 A、任务 B 和任务 C)。所有 3 个目标的输入都是相同的(阅读正文),我想产生三个单独的预测。但是,对于任务 C,我想适当地掩盖一些 批次中的示例(每批次约 20%)。通过简单地将我想要屏蔽的样本加权为零来做到这一点是正确的方法吗?考虑这个损失函数..

lossA = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsA, logits=logitsA))

lossB = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsB, logits=logitsB))

mask_weights = tf.to_float(tf.equal(x, y)) # returns 1 if x equals y, returns 0 if x != y
lossC = tf.reduce_mean(tf.losses.sparse_softmax_cross_entropy(
            labels=labelsC, logits=logitsC, weights=mask_weights))

loss = lossA + lossB + lossC

基本上我想要做的是屏蔽批处理中 x != y 的任何样本,这样就不会基于这些示例对模型进行梯度更新,因为它们与 taskC 相关。这是否接近预期效果?有没有更好的方法来实现所需的行为?

我意识到我可以将这些分成单独的实验,但我希望能够拥有一个共享嵌入和一个可以上传到 GCMLE 预测服务中的单个图表。

【问题讨论】:

  • 我认为将这三个任务结合起来并不是一个好主意。我认为您假设所有任务都将同时优化。但是,lossc 的功能更像是损失 a 的正则化项。所以你会得到最好的损失 a 有一个合理的损失 c.
  • @LakLakshmanan 感谢您的回复!我实际上认为这种正则化是我希望尝试的预期行为。受到这篇博文的启发:ruder.io/multi-task-learning-nlp 所以我想介绍辅助任务并共同训练它们。鉴于这种情况,是否还有其他方式可以推荐在 TF 中实现?我知道 Keras 内置了多任务学习:keras.io/getting-started/functional-api-guide/…,我已经看到了我想用 TF 复制的好结果。
  • @LakLakshmanan 无论我以何种方式组合损失,都会为 lossC 传递零权重有效地屏蔽这些样本,以免导致任何梯度更新,或者您会建议一种单独的方法来屏蔽自定义损失函数?
  • 多任务学习的有趣概述!感谢分享。您遇到的问题是,在您的情况下,损失 c 的有效批量大小现在较低。梯度更新始终适用于所有权重,但它们将重点关注损失 a 和损失 b。
  • 是的,应用二进制掩码是最好的方法。例如,这就是 tf.layers.dropout 的实现方式。

标签: machine-learning tensorflow google-cloud-ml-engine


【解决方案1】:

总结 cmets -- 如帖子中所述,将二进制掩码应用于损失函数似乎是掩盖损失函数的适当方法。但是,减少 C 的有效批量大小可能会导致其他意想不到的后果,从而阻碍这种方法。

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 2021-11-21
    • 1970-01-01
    • 2018-03-01
    • 2019-01-20
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多