【问题标题】:Tensorflow NMT with Attention Tutorial -- need help understanding loss functionTensorflow NMT with Attention 教程——需要帮助理解损失函数
【发布时间】:2018-11-22 05:51:18
【问题描述】:

我正在关注 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 不应该是所有时间步长和整个批次的平均损失吗?

非常感谢!

【问题讨论】:

  • 在我看来你是对的,按照你建议的方式计算损失更合适。

标签: python tensorflow


【解决方案1】:

t越大,损失似乎越小

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

Batch_loss 仅用于打印每批计算的损失。 为每批和所有时间步计算批损失。

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

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

我希望这能解决问题:)

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多