变压器中的馈送解码器输入



阅读关于如何实现编码器/解码器转换器的教程时,我对培训过程有一些疑问。具体来说,正如原始论文所报道的,解码器应该迭代地使用最后一次迭代输出作为解码器的输入。然而,训练步骤是作为执行的

@tf.function(input_signature=train_step_signature)
def train_step(inp, tar):
tar_inp = tar[:, :-1]
tar_real = tar[:, 1:]
with tf.GradientTape() as tape:
predictions, _ = transformer([inp, tar_inp],
training = True)
loss = loss_function(tar_real, predictions)
gradients = tape.gradient(loss, transformer.trainable_variables)
optimizer.apply_gradients(zip(gradients, transformer.trainable_variables))

其中tar_inp只是一个没有EOS标记的标记化句子,而tar_real是偏移一个位置的同一句子。

然而,我本期望目标输入(解码器输入(通过先前的预测迭代地连接(或者在教师中通过一次增加一个基本事实标记来强制连接(。

为什么不是这样?

这个特殊的例子实际上使用了教师强制,但它不是一次馈送一个GT令牌,而是馈送整个解码器输入。然而,由于解码器仅使用自回归(即从右到左(注意力,因此在生成第i’个令牌时,它只能关注令牌0...i-1。因此,这种训练相当于老师一次强制一个令牌,但速度要快得多,因为所有这些令牌都是并行预测的。

相关内容

  • 没有找到相关文章

最新更新