我正在关注 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
除以时间步数
我的问题:为什么要计算梯度? loss
而不是batch_loss
?不应该batch_loss
是所有时间步长和整个批处理的平均损失?
非常感谢!
最佳答案
It seems loss should get smaller the bigger t
由于在计算损失时填充代币被屏蔽,损失确实变小了。
Batch_loss 仅用于打印每个批处理计算的损失。批处理损失是针对每个批处理和所有时间步计算的。
for t in range(1, targ.shape[1])
此循环在批处理的所有时间步上运行,并通过屏蔽填充值来计算损失。
我希望这能解决问题:)
关于python - Tensorflow NMT with Attention 教程——需要帮助理解损失函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53128780/