从 Tensorflow 中的损失函数中屏蔽样本
Mask samples from loss function in Tensorflow
我有一个 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 预测服务的图表。
总结评论——如 post 中所述,对损失函数应用二进制掩码似乎是掩码损失函数的合适方法。但是,减少 C 的有效批处理大小可能会产生其他意想不到的后果,从而阻止这种方法。
我有一个 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 预测服务的图表。
总结评论——如 post 中所述,对损失函数应用二进制掩码似乎是掩码损失函数的合适方法。但是,减少 C 的有效批处理大小可能会产生其他意想不到的后果,从而阻止这种方法。