0

我不太了解用于训练 LSTM 编码器-解码器的明显(或实际上相同?)训练程序。

一方面,在教程中,他们使用 for 循环进行训练: https ://www.tensorflow.org/tutorials/text/nmt_with_attention#training

但在这里 https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html

(第一个模型)

只使用一个简单的

# Run training
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit([encoder_input_data, decoder_input_data], decoder_target_data,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2)

在这里,两个程序都说,他们正在通过教师强制方法进行培训。

但我不明白为什么两种方式都是一样的?

为什么我可以在没有 for 循环的情况下像普通模型训练一样训练编码器解码器,尽管我需要上一个解码步骤来训练下一个解码步骤?

4

1 回答 1

1

在 LSTM 中,时间步的输出仅取决于状态和之前的时间步。在第二个链接(keras 博客)中,训练期间发生的事情是没有使用最终状态……只有每步向量。在推理期间,状态从一次迭代保存到下一次迭代。

以下答案解释了 LSTM 中时间步长的概念 LSTM 模型中的时间步长到底是什么?

为了讨论,这是一张有用的图片。 在此处输入图像描述

LSTM Keras API协调:

  • 当一个指定return_sequences=True时,keras返回上面的每个时间步长h0,hN向量;
  • 当指定return_state=True 时,返回最后一侧的输出(最右边A 块的右箭头)。

在此图像中,步骤 N 的输出仅取决于 [x0, xN]。

当您的链接中定义的模型仅取决于上图中的 h 值时,它们在计算损失/梯度时,无论您是一次性完成还是循环完成,数学都是相同的。

如果使用最终的 LSTM 状态(图片中最右侧的 A 块的侧箭头),这将不成立。

来自 Keras LSTM API 文档:

return_state:布尔值。是否返回除了输出之外的最后一个状态。默认值:假。

代码中的相关注释:

# We set up our decoder to return full output sequences,
# and to return internal states as well. We don't use the 
# return states in the training model, but we will use them in inference.

您可以尝试查看长度为2的序列。如果您一次性计算时间步长0和1的预测梯度,就LSTM而言,h0的梯度(时间步长0的输出) 只依赖于相应的输入;h1 的梯度(时间步 1 的输出)取决于 x0 和 x1 以及通过 LSTM 的变换。如果您按时间步长计算梯度时间,则最终得到完全相同的计算。

如果您查看转换器模型,您会看到它们使用掩码来屏蔽序列,以确保步骤 N 仅依赖于前一步 N。

于 2020-12-14T19:52:15.937 回答