machine-learning - 如何计算空白 token 预测的变压器损耗?

标签 machine-learning nlp transformer-model language-model

我目前正在尝试实现一个变压器,但无法理解其损耗计算。

我的编码器输入查找batch_size=1和max_sentence_length=8,如下所示:

[[Das, Wetter, ist, gut, <blank>, <blank>, <blank>, <blank>]]

我的解码器输入看起来像(德语到英语):

[[<start>, The, weather, is, good, <end>, <blank>, <blank>]]

假设我的转换器预测了这些类别概率(仅显示类别概率最高的类别的单词):

[[The, good, is, weather, <end>, <blank>, <blank>, <blank>]]

现在我使用以下方法计算损失:

loss = categorical_crossentropy(
   [[The, good, is, weather, <end>, <blank>, <blank>, <blank>]],
   [[The, weather, is, good, <end>, <blank>, <blank>, <blank>]]
)

这是计算损失的正确方法吗?我的变压器总是预测下一个单词的空白标记,我认为这是因为我在损失计算中出现了错误,并且必须在计算损失之前对空白标记进行一些处理。

最佳答案

您需要遮盖填充。 (您所说的 <blank> 通常称为 <pad> 。)

  • 创建一个掩码,说明有效 token 的位置(伪代码:mask = target != '<pad>')

  • 计算分类交叉熵时,不要自动减少损失并保留该值。

  • 将损失值与掩码相乘,即对应于 <blank> 的位置代币归零,并将有效头寸的损失相加。 (伪代码:loss_sum = (loss * mask).sum())

  • loss_sum通过有效位置的数量,即掩码之和(伪代码: loss = loss_sum / mask.sum() )

关于machine-learning - 如何计算空白 token 预测的变压器损耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66518375/

相关文章:

bert-language-model - Transformer/BERT token 预测词汇表(从可能的 token 集中过滤出特殊 token )

python - Lambda 层中的自定义函数失败,无法将张量转换为 numpy

machine-learning - 如何记录 Tensorflow 中 sess.run 期间每次迭代的准确性?

用于识别文章主题的 python 库

python - 在不计算整个句子的情况下估计给定句子的标记概率/logits

java - 防止 java 变压器被替换

python - 使用 pickle 保存模型

Python TLearn - 损失太高

deep-learning - 无法从 'open' 导入名称 'smart_open'

Java XML Transformer 将 "\n"替换为空格