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

Posted

技术标签:

【中文标题】如何训练编码器-解码器模型?【英文标题】:How to train an encoder-decoder model? 【发布时间】:2021-03-25 05:32:34 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

以下答案解释了 LSTM 中时间步长的概念 What exactly is timestep in an LSTM Model?

为了讨论,这是一张有用的图片。

与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。

【讨论】:

抱歉,但是当您使用非标准单词和 Espec 用于 RNN 时,很难理解这些单词并不准确:隐藏向量、单元状态。我不知道您所说的每步向量是什么意思... 为什么(你怎么知道)模型没有使用“最终”状态(不管你的意思是什么)?而且,为什么它只取决于 h 值。我假设你每一步都是隐藏状态? @cltid 根据答案:h0..hN 输出在 Keras API 中称为 return_sequences; “A”块最右边的箭头被 Keras API 称为最后或最终状态。 最右边的箭头是最后一个 A 单元之前的箭头吗?并且,最后一个状态意味着最后一个隐藏状态(与返回序列的意思是输出到最后一个单元格? 图中的每个单元格接受一个输入 (xN),在图中产生一个输出 (hX) 和一个状态(右箭头)。根据 Keras API,last state 是从最右边(序列结束)单元格开始的右箭头。图中未显示此箭头。

以上是关于如何训练编码器-解码器模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试使用教师强制训练的模型

从 Keras 中经过训练的自动编码器模型中获取解码器

如何使用 TensorFlow 保存编码器-解码器模型?

编码器/解码器模型如何在深度学习中学习?

seq2seq 模型中的训练和推理解码器之间共享啥?

如何在 TensorFlow 2 中保存/加载模型的一部分?