解码器变压器前馈

数据挖掘 神经网络 深度学习 变压器 注意机制 掩蔽
2022-02-15 03:21:14

我有一个关于训练期间解码器变压器前馈的问题。

让我们举个例子:"i love the sun"我想预测的输入数据翻译(意大利语翻译)"io amo il sole"

现在我向编码器输入“我爱太阳”,我得到了隐藏状态。现在我必须使用输入“BOS io amo il”在解码器上进行多次前馈,其中 BOS 是代表句子开头的标记。所以我有这个前馈我假设

  • [BOS, IO, AMO, IL] -> 解码器 -> IO
  • [BOS, IO, AMO, IL] -> 解码器 -> AMO
  • [BOS, IO, AMO, IL] -> 解码器 -> IL
  • [BOS, IO, AMO, IL] -> 解码器 -> SOLE

我认为这是正确的方法。应该应用什么来区分训练我认为是掩蔽注意力机制也许(?)假设掩蔽将是正确的

[1 0 0 0,
 0 0 0 0 ,
 0 0 0 0,
 0 0 0 0]   for the first feed forward

[1 0 0 0,
 1 1 0 0 ,
 0 0 0 0,
 0 0 0 0]   for the second feed forward

[1 0 0 0,
 1 1 0 0 ,
 1 1 1 0,
 0 0 0 0]   for the third feed forward

[1 0 0 0,
 1 1 0 0 ,
 1 1 1 0,
 1 1 1 1]   for the fourth feed forward

这是正确的方法吗?或者应该有什么不同?如果您也可以为我提供一个 python 实现可能会很有用,在此先感谢。

1个回答

你的描述有一些问题:

  • 在训练期间,解码器接收所有移动的目标标记,前置 BOS 标记。你删除了sole. 实际输入是:[ <bos>, io, amo, il, sole]。请注意, 位置处的输出sole将是序列结束标记<eos>

  • 在训练期间,有一个前向传递(不是每个令牌一个),并且所有输出令牌都被一次预测。因此,只使用最后一个注意力面具。

  • 在推理过程中,我们没有目标标记(因为这是我们试图预测的)。在这种情况下,我们每个生成的令牌都有一次通过,从<bos>. 这样,第一步中的解码器输入将只是序列 [ <bos>],我们将预测第一个标记:io然后,我们将下一个时间步的输入准备为 [ <bos>, io],然后我们将获得第二个标记的预测。等等。请注意,在每个时间步,我们都在重复过去位置的计算;在实际实现中,这些状态被缓存而不是在每个时间步重新计算。

关于一些说明 Transformer 工作原理的 Python 代码,我建议使用带注释的 Transformer,这是一个很好的指导,可以真正实现。您可能run_epoch对训练函数greedy_decode和推理函数最感兴趣。