Tensorflow 如何训练编码器-解码器模型?

Tensorflow 如何训练编码器-解码器模型?,tensorflow,keras,encoder-decoder,Tensorflow,Keras,Encoder Decoder,我并不真正理解培训LSTM编码器-解码器的明显(或实际上相同?)培训程序 一方面,在本教程中,他们使用for循环进行培训: 但是这里 (第一款) 只是用了一个简单的 # Run training model.compile(optimizer='rmsprop', loss='categorical_crossentropy') model.fit([encoder_input_data, decoder_input_data], decoder_target_data,

我并不真正理解培训LSTM编码器-解码器的明显(或实际上相同?)培训程序

一方面,在本教程中,他们使用for循环进行培训:

但是这里

(第一款)

只是用了一个简单的

# 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循环的情况下训练编码器-解码器,尽管我需要上一个解码步骤来训练下一个解码步骤?

在LSTM中,时间步骤的输出仅取决于状态和上一个时间步骤。在第二个链接(keras博客)中,培训期间发生的情况是最终状态未被使用。。。只有每一步向量。在推断过程中,状态从一个迭代保存到下一个迭代

下面的答案解释了LSTM中时间步长的概念

为了便于讨论,这是一幅有用的图片。

要与以下内容保持一致:

  • 当指定return_sequences=True时,keras返回上述每个时间步长h0,hN向量
  • 当指定return_state=True时,将返回最后一侧的输出(最右侧的右箭头为A块)
在该图中,步骤N的输出仅取决于[x0,xN]

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

如果使用了最终的LSTM状态(图片中最右侧的侧箭头是一个块),则此选项不成立

来自Keras LSTM API文档:

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

守则中的有关评论:

# 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的变换。如果你一步一步地计算梯度时间,你会得到完全相同的计算结果


如果您查看transformer模型,您会发现它们使用掩码来屏蔽序列,以确保步骤N仅取决于前一步N。

对不起,但由于您使用非标准单词,尤其是RNN,这些单词并不精确:隐藏向量、单元状态。我不知道你所说的每步向量是什么意思……为什么(你怎么知道)模型没有使用“最终”状态(不管你是什么意思)?为什么它只取决于h值呢。我假设你每一步的h是隐藏状态?@cltid根据答案:h0..hN输出在Keras API中被称为返回序列;“A”块最右边的箭头被Keras API称为最后或最终状态。最右边的箭头是最后一个A单元之前的箭头吗?最后一个状态意味着最后一个隐藏状态(正如返回序列意味着最后一个单元格的输出??图中的每个A单元格接受一个输入(xN),在图中产生一个输出(hX)和一个状态(右箭头)。根据Keras API,
最后一个状态
是最右边的右箭头(序列结束)一个单元格。图中未显示此箭头。