閱讀有關如何實作編碼器/解碼器轉換器的教程時,我對訓練程序產生了一些疑問。具體如原始論文所報告的那樣,解碼器應該迭代地使用最后一次迭代的輸出作為解碼器的輸入。然而,訓練步驟實作為
@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))
Wheretar_inp只是一個沒有 EOS 令牌的標記化句子,并且tar_real是同一個句子移動了一個位置。
然而,我希望目標輸入(解碼器輸入)被先前的預測迭代連接(或在教師強制中通過一次增加一個真實標記)。
為什么不是這樣?
uj5u.com熱心網友回復:
這個特定的例子實際上使用了教師強制,但不是一次提供一個 GT 令牌,而是提供整個解碼器輸入。然而,因為解碼器只使用自回歸(即從右到左)注意,它0...i-1在生成第i'th 個標記時只能注意標記。因此,這種訓練相當于教師一次強迫一個 token,但速度要快得多,因為所有這些 token 都是并行預測的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/369653.html
