我正在关注Tensorflow的神经机器翻译教程(链接),但还不清楚一些实现细节。如果有人能帮助我澄清或推荐我到一个来源/更好的地方问问题,那就太好了:
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不应该是所有时间步骤和整个批处理的平均损失吗?
非常感谢!
发布于 2018-11-20 16:22:08
看来损失应该越小越大。
由于pad令牌在计算损失时被蒙住了,因此损失确实变得更小了。
Batch_loss仅用于打印每批计算的损失。批处理损失是针对每一批和跨越所有时间步骤计算的。
for t in range(1, targ.shape[1])此循环对所有时间步骤在批处理上运行,并通过掩蔽填充值来计算损失。
我希望这能澄清这一点:)
https://stackoverflow.com/questions/53128780
复制相似问题