出品:贪心科技(公众号:贪心科技)
作者:Jason Brownlee
前言
文本摘要是自然语言处理中的一个问题,即要为源文档创建一篇简短、准确、流畅的摘要。当针对机器翻译开发的Encoder-Decoder循环神经网络结构应用于文本摘要问题时,它也已经被证明是有效的。在Keras深度学习库中应用这种体系结构可能有些困难,因为Keras为了让库变得干净、简单、易于使用而牺牲了一定的灵活性。
在本教程中,您将了解如果在Keras中实现用于文本摘要的Encoder-Decoder架构。完成本教程后,您将知道:1. Encoder-Decoder循环神经网络结构是如何解决文本摘要问题的;2. 针对这个问题,如何实现不同的编码器和解码器;3. 在Keras中实现用于文本摘要的架构时可用的三种模型。
让我们开始吧!
图 1:在Keras中实现用于文本摘要的Encoder-Decoder模型。照片作者Diogo Freire,保留部分权利。
Encoder-Decoder架构
Encoder-Decoder架构是针对序列预测问题组织循环神经网络的一种方式,它具有可变数目的输入、输出,或是输入和输出。该架构涉及两个组件:一个编码器和一个解码器:
编码器:编码器读取整个输入序列,并将其编码为一种中间表示,通常是一个被称为上下文向量的定长向量。
解码器:解码器从编码器读取编码输入序列,并生成输出序列。
编码器和解码器子模型都是共同训练的,即同时进行。这是一个壮举,因为传统的,具有挑战性自然语言问题需要独立模型的发展,它们之后会串成一条流水线,这也就允许误差在序列生成过程中积累。
整个编码输入被用作生成每步输出的上下文信息。虽然这可行,但输入的定长编码限制了可生成输出序列的长度。Encoder-Decoder体系结构的扩展是提供一个更具表现形式的编码输入序列,并当生成输出序列的每个步骤时,让解码器学习何处注意编码输入。这种架构的扩展被称为Attention。
带Attention的Encoder-Decoder体系结构在自然语言处理问题中是十分受欢迎的,它生成可变长度的输出序列,例如文本摘要。该架构在文本摘要中的应用如下:
编码器:编码器负责读取源文档,并将其编码为中间表示。
解码器:解码器是一种语言模型,负责使用源文档的编码表示生成输出摘要中的每个单词。
文本摘要编码器
编码器是模型的复杂性所在,因为它负责捕获源文档的含义。不同类型的编码器都可以使用,尽管更常用的是双向循环神经网络,例如LSTM。在编码器中使用循环神经网络的情况下,词嵌入被用来提供单词的分布式表示。Alexander Rush等使用一个简单的词袋编码器来丢弃字词顺序,并用卷积编码器来显式尝试捕获n-gram信息。
“我们最基本的模型只是简单地使用嵌入到H维输入语句的词袋,而忽略原始顺序或相邻单词之间的关系。[...]为了解决一些词袋建模问题,我们还考虑在输入语句中使用深度卷积编码器。” —— A Neural AttentionModel for Abstractive Sentence Summarization,2015
Konstantin Lopyrev使用包含了4个LSTM神经神经网络的深度堆栈作为编码器。“编码器把一篇新闻文本作为输入,一次输入一个词。每个单词首先通过一个嵌入层,将单词转换为分布式表示。该分布式表示接着用多层神经网络组合组合在一起。”—— Generating NewsHeadlines with Recurrent Neural Networks,2015
Abigail See等使用单层双向LSTM作为编码器。“将文章w(i)一个接一个地送入编码器(一个单层双向LSTM),生成编码器隐藏状态h(i)序列。”—— Get To The Point:Summarization with Pointer-Generator Networks,2017
Ramesh Nallapati等人在其编码器中使用双向GRU循环神经网络,并在输入序列的每个词中附加额外信息。“编码器由一个双向GRU-RNN组成......”—— Abstractive Text Summarization UsingSequence-to-Sequence RNNs and Beyond,2016
文本摘要解码器
给定两个信息源,解码器必须生成输出序列的每一个字:
1. 上下文向量:由编码器提供的源文档的编码表示。
2. 生成序列:已经作为摘要生成的单词或序列。
上下文向量可以是简单Encoder-Decoder体系结构中的固定长度编码,或者也可以是通过Attention机制过滤的更具表现力的形式。为生成的序列提供少量准备,例如通过词嵌入为每个生成单词形成分布式表示。
“在每个步骤t时,解码器(一个单层单向LSTM)接收前一个词的词嵌入(训练时,这是参考摘要的前一个词;在测试时,它是解码器发出的前一个词)。”—— Get To The Point: Summarization with Pointer-Generator Networks,2017
Alexander Rush等在图中清楚地展示了这一点,x是源文档,enc是提供源文档的中间表示的编码器,yc是之前生成词的序列。
图 2:用于文本摘要的解码器输入示例。摘自“A Neural Attention Model for Abstractive Sentence Summarization”,2015.
一次生成一个单词需要模型一直运行,直到生成最大数量的摘要单词,或获得特定的序列结束标记。该过程必须通过为模型提供一个特殊的序列起始标记来生成第一个单词,并以此开始。
“解码器将在输入文本的最后一个字中输入后,将生成的隐藏层作为输入。首先,将一个序列结束符号作为输入,这时再次使用嵌入层将符号转换为分布式表示。[...]生成下一个单词时,生成将相同单词输入的每个单词作为输入。”—— Generating News Headlines with Recurrent Neural Networks,2015
Ramesh Nallapati等人在其编码器中使用双向GRU循环神经网络,并在输入序列的每个词中附加额外信息。“编码器由一个双向GRU-RNN组成......”—— AbstractiveText Summarization Using Sequence-to-Sequence RNNs and Beyond,2016
源文本读入
这种体系结构的应用具有灵活性,其取决于正在解决的特定文本摘要问题。大多数研究集中在编码器中的一条或几条源句子,但这不一定非是如此。例如,编码器可以配置为以不同大小的块读取和编码源文档:
句子
段落
页面
文档
同样,解码器可以配置为每个块进行摘要,或集合编码块并输出更广泛的摘要。
这条路上已经完成了一些工作,Alexander Rush等人在单词和句子层面都使用Attention的层级编码器模型。
“该模型旨在使用双向RNN的两个源端来捕获这两个重要级别的概念,一个在单词级别,另一个在句子级别。Attention机制同时在两个层面上运行。”—— A Neural Attention Model for Abstractive Sentence Summarization,2015
模型实现
在本节中,我们将介绍如何在Keras深度学习库中实现用于文本摘要的Encoder-Decoder架构。
一般模型
该模型的简单实现涉及带有嵌入输入的编码器,和生成源文档定长表示的LSTM隐藏层。解码器读取最后一个生成词的表示和嵌入,并使用这些输入生成输出摘要的每个词。
图 3:Keras中的一般文本生成模型
这就有一个问题。Keras不允许递归循环,即模型的输出自动作为该模型的输入。这意味着上述模型不能直接在Keras中实现(但也许可以在类似TensorFlow这样更灵活的平台上实现)。相反地,我们将看看可以在Keras中实现的模型的三种变体。
变体1:One-Shot模型
第一种替代模型是以one-shot方式生成整个输出序列。
也就是说,解码器仅使用上下文向量来生成输出序列。
图 4:变体1-One-Shot文本摘要模型
以下是Keras中使用功能性API实现此方法的一些示例代码。
变体2:递归模型A
第二种替代模型是开发一个模型,它生成一个单词预测并递归调用它。也就是说,解码器使用上下文向量以及目前所有生成单词的分布式表示,以便生成下一个单词。语言模型可被用于解释目前产生的单词序列,以提供第二个上下文向量并与源文档的表示相结合,以便生成序列中的下一个单词。
通过递归地调用之前生成词扩展的模型(或者更具体地说,在训练过程中预期的前一个词)来建立摘要。上下文向量可以被拼接或加在一起,以为解码器提供更广泛的上下文,来解释并输出下一个单词。
图5:变体2-递归文本摘要模型A
以下是Keras中使用功能性API实现此方法的一些示例代码。
这相比之下要更好,因为解码器有机会使用之前生成的单词和源文档,来作为下一个单词的上下文。它确实给合并操作和解码器带来了负担,以解释它在生成输出序列中的位置。
变体3:递归模型B
在第三个替代方案中,编码器生成源文档的上下文向量表示。该文件在生成输出序列的每一步都被送到解码器。这允许解码器建立与用于生成输出序列中单词相同的中间状态,以便它被引导生成序列中的下一个单词。然后通过一次又一次地为输出序列中的每个单词调用模型来重复此过程,直到达到最大长度或生成序列结束标记。
图6:变体3-递归文本摘要模型B
以下是Keras中使用功能性API实现此方法的一些示例代码。
总结
在本教程中,您了解了如何在Keras深度学习库中实现用于文本摘要的Encoder-Decoder架构。具体来说,你了解到:1. 如何使用Encoder-Decoder循环神经网络架构来解决文本摘要问题;2. 针对此问题,如何实现不同的编码器和解码器;3. 您可以使用三种模型在Keras中实现文本摘要的体系结构。
如果对本文有自己的见解,欢迎在评论区留言, 或者扫码关注公众号交流。
此为贪心科技编译,转载请联系本公众号获得授权。
加入贪心科技、广告&商务合作:[email protected]