具有注意教程的Tensorflow NMT-需要帮助来了解损失功能

时间:2018-11-03 05:50:43

标签: python tensorflow

我正在关注Tensorflow的“具有注意力的神经机器翻译”教程(link),但不清楚一些实现细节。有人可以帮助您澄清或推荐我去一个消息源/更好的地方问:

1)def loss_function(real, pred):此函数计算特定时间步(例如t)的损失,该损失在整个批次中平均。标记在t处的标签为<pad>的示例(即没有真实数据,仅填充以使所有示例序列具有相同的长度)都被屏蔽,以免计入损失。

我的问题:似乎t越大,损失就应该越小(因为<pad>的例子越多,我们越能达到最大长度)。那么,为什么要对整个批次的损失进行平均,而不仅仅是对有效(非<pad>)示例的数目进行平均? (这类似于使用tf.losses.Reduction.SUM_BY_NONZERO_WEIGHTS而不是tf.losses.Reduction.SUM_OVER_BATCH_SIZE

2)for epoch in range(EPOCHS)->在训练循环中定义了两个损失变量:

  • loss =所有时间步长的loss_function()输出之和
  • batch_loss = loss除以时间步长数

我的问题:为什么要用w.r.t.计算梯度loss而不是batch_lossbatch_loss不应该是所有时间步长和整个批次的平均损失吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

  

t越大,损失似乎应该越小

由于填充令牌在计算损失时被掩盖了,因此损失确实变小了。

批次损失仅用于打印每个批次计算出的损失。为每个批次以及所有时间步长计算批次损失。

for t in range(1, targ.shape[1])

此循环在所有时间步上运行批次,并通过掩盖填充值来计算损失。

我希望这可以解决它:)