乐读窝

深度学习

乐读窝 > 文学理论 > 深度学习

10.4 基于编码-解码的序列到序列架构

书籍名:《深度学习》    作者:伊恩.古德费洛



我们已经在图10.5看到RNN如何将输入序列映射成固定大小的向量,在图10.9中看到RNN如何将固定大小的向量映射成一个序列,在图10.3、图10.4、图10.10和图10.11中看到RNN如何将一个输入序列映射到等长的输出序列。

本节我们讨论如何训练RNN,使其将输入序列映射到不一定等长的输出序列。这在许多场景中都有应用,如语音识别、机器翻译或问答,其中训练集的输入和输出序列的长度通常不相同(虽然它们的长度可能相关)。

我们经常将RNN的输入称为“上下文”。我们希望产生此上下文的表示C。这个上下文C可能是一个概括输入序列X=(x(1),…,)的向量或者向量序列。

用于映射可变长度序列到另一可变长度序列最简单的RNN架构最初由Cho  et  al.(2014a)提出,之后不久由Sutskever  et  al.(2014)独立开发,并且第一个使用这种方法获得翻译的最好结果。前一系统是对另一个机器翻译系统产生的建议进行评分,而后者使用独立的循环网络生成翻译。这些作者分别将该架构称为编码-解码或序列到序列架构,如图10.12所示。这个想法非常简单:(1)编码器(encoder)或读取器(reader)或输入(input)RNN处理输入序列。编码器输出上下文C(通常是最终隐藏状态的简单函数)。(2)解码器(decoder)或写入器(writer)或输出(output)RNN则以固定长度的向量(见图10.9)为条件产生输出序列。这种架构对比本章前几节提出的架构的创新之处在于长度nx和ny可以彼此不同,而之前的架构约束nx=ny=τ。在序列到序列的架构中,两个RNN共同训练以最大化(关于训练集中所有x和y对的平均)。编码器RNN的最后一个状态通常被当作输入的表示C并作为解码器RNN的输入。

图10.12 在给定输入序列的情况下学习生成输出序列的编码器-解码器或序列到序列的RNN架构的示例。它由读取输入序列的编码器RNN以及生成输出序列(或计算给定输出序列的概率)的解码器RNN组成。编码器RNN的最终隐藏状态用于计算一般为固定大小的上下文变量C,C表示输入序列的语义概要并且作为解码器RNN的输入

如果上下文C是一个向量,则解码器RNN只是在第10.2.4节描述的向量到序列RNN。正如我们所见,向量到序列RNN至少有两种接受输入的方法。输入可以被提供为RNN的初始状态,或连接到每个时间步中的隐藏单元。这两种方式也可以结合。

这里并不强制要求编码器与解码器的隐藏层具有相同的大小。

此架构的一个明显不足是,编码器RNN输出的上下文C的维度太小而难以适当地概括一个长序列。这种现象由Bahdanau  et  al.(2015)在机器翻译中观察到。他们提出让C成为可变长度的序列,而不是一个固定大小的向量。此外,他们还引入了将序列C的元素和输出序列的元素相关联的注意力机制(attention  mechanism)。读者可在第12.4.5.1节了解更多细节。