python - Tensorflow NMT with Attention 教程——需要帮助理解损失函数
问题描述
我正在关注 Tensorflow 的注意力神经机器翻译教程(链接),但我不清楚一些实现细节。如果有人可以帮助澄清或将我推荐给来源/更好的地方来询问,那就太好了:
1) def loss_function(real, pred)
:此函数计算特定时间步长(例如t
)的损失,对整个批次进行平均。标签为t
is <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
除以时间步数
我的问题:为什么梯度计算 wrtloss
而不是batch_loss
?不应该batch_loss
是所有时间步长和整个批次的平均损失吗?
非常感谢!
解决方案
t越大,损失似乎越小
损失确实变小了,因为在计算损失时填充令牌被掩盖了。
Batch_loss 仅用于打印每批计算的损失。为每个批次和所有时间步计算批次损失。
for t in range(1, targ.shape[1])
此循环在所有时间步上运行批处理,并通过屏蔽填充值来计算损失。
我希望这可以清除它:)
推荐阅读
- r - MSBVAR 包安装错误
- node.js - 在mongodb中查找具有最高顺序的计数和限制的不同嵌套数据
- android - 新安装的 Android studio 3.1.3 Gradle 项目同步失败
- python - 如何部署 GCP App Engine 工作人员?
- python - pyodbc 调用存储过程错误
- html - 块内类的第一个实例的 CSS 选择器
- python - python 使用 subprocess.Popen 时如何结束子进程?
- javascript - 在 React.js 中渲染 SVG
- angular - Angular 6 + jsQR - 如何在第一次成功时捕获 QR 码?
- python - NLTK 和 Stanford Dependency Parser - 如何获取单词位置?