首页 > 解决方案 > Tensorflow NMT with Attention 教程——需要帮助理解损失函数

问题描述

我正在关注 Tensorflow 的注意力神经机器翻译教程(链接),但我不清楚一些实现细节。如果有人可以帮助澄清或将我推荐给来源/更好的地方来询问,那就太好了:

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

我的问题:看起来损失应该越大越小t(因为更多的例子是<pad>我们得到的最大长度)。那么为什么损失是整个批次的平均损失,而不仅仅是有效(非<pad>)样本的数量?(这类似于使用tf.losses.Reduction.SUM_BY_NONZERO_WEIGHTS而不是tf.losses.Reduction.SUM_OVER_BATCH_SIZE

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

我的问题:为什么梯度计算 wrtloss而不是batch_loss?不应该batch_loss是所有时间步长和整个批次的平均损失吗?

非常感谢!

标签: pythontensorflow

解决方案


t越大,损失似乎越小

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

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

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

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

我希望这可以清除它:)


推荐阅读