我正在关注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_loss
? batch_loss
不应该是所有时间步长和整个批次的平均损失吗?
非常感谢!
答案 0 :(得分:0)
t越大,损失似乎应该越小
由于填充令牌在计算损失时被掩盖了,因此损失确实变小了。
批次损失仅用于打印每个批次计算出的损失。为每个批次以及所有时间步长计算批次损失。
for t in range(1, targ.shape[1])
此循环在所有时间步上运行批次,并通过掩盖填充值来计算损失。
我希望这可以解决它:)