摘要
神经编码器-解码器模型在许多序列生成任务中已显示出巨大的成功。但是,以前的工作并未研究我们想要控制编码器-解码器输出长度的情况。此功能对于诸如文本摘要之类的应用至关重要,在该应用中,我们必须生成所需长度的简洁摘要。在本文中,我们提出了用于控制神经编码器-解码器模型的输出序列长度的方法:两种基于解码的方法和两种基于学习的方法。结果表明,基于学习的方法具有控制长度的能力,而不会降低文本摘要任务中的质量。(https://github.com/kiyukuta/lencon)
1.介绍
自从编码器-解码器方法首次用于机器翻译以来,其已在包括图像字幕生成,解析,对话响应生成和句子摘要在内的许多其他序列生成任务中取得了巨大的成功。在本文中,我们着重于句子摘要,顾名思义,句子摘要包括为文档摘要或标题生成之类的生成较短句子的应用。最近,Rush et al. (2015)自动构建用于句子摘要的大型训练数据,这导致神经句子摘要(NSS)或神经标题生成(NHG)模型的快速发展。已经有许多研究解决了这一任务。
文本摘要系统应具有的基本属性之一就是能够生成具有所需长度的摘要。所需的摘要长度在很大程度上取决于使用场景,例如用户想要了解的信息的粒度或用户拥有的设备的监视器大小。长度还取决于给定源文档中包含的信息量。因此,在传统的文本摘要设置中,源文档和摘要的所需长度都将作为摘要系统的输入。然而,尽管控制编码器-解码器模型的输出序列长度的方法在这些设置中很重要,但尚未进行研究。
在本文中,我们提出并研究了用于控制神经编码器-解码器模型的输出序列长度的四种方法。前两种方法是基于解码的:它们在解码过程中收到所需的长度,并且训练过程与标准的编码器-解码器模型相同。后两种方法是基于学习的:我们修改网络结构以接收所需的长度作为输入。
在实验中,我们表明,对于较长的摘要(例如50或75字节),基于学习的方法要优于基于解码的方法。我们还发现,尽管具有附加的长度控制功能,但在DUC2004共享任务1的标准设置下,所提出的方法仍与现有方法相比具有竞争力。
2.背景
2.1 相关工作
文本摘要是自然语言处理中最古老的研究领域之一,许多摘要方法专门针对句子压缩或标题生成。传统的方法是基于规则的单词删除或统计数据删除方法。也有一些使用句法转导或采用基于短语的统计机器翻译方法的句子摘要的研究。
最近的工作采用了机器翻译领域中诸如编码器-解码器和注意力神经网络模型等技术,并针对句子摘要任务对其进行了修改。Rush et al. (2015)是第一篇将句子摘要作为神经序列到序列学习的新目标任务的论文。多项研究已将该任务用作其神经序列生成方法的基准之一。一些研究针对手写摘要中经常发生的其他重要现象,例如从原始文档中进行复制,研究了一种解决许多重要问题的方法,这些问题包括捕获关键字或输入多个句子。
神经编码器-解码器也可以看作是以目标句子上下文为条件的统计语言模型。Rosenfeld et al. (2001)提出了可以考虑诸如句子长度等特征的全句子语言模型。但是,如引言中所述,据我们所知,尚未有在神经语言模型或编码器-解码器中明确控制输出序列的长度的研究。
最后,有一些研究根据对话行为,用户个性或语气等元信息来修改输出序列。但是,这些研究并未关注输出序列的长度,即本文的主题。
2.2 控制输出长度的重要性
正如我们在第1节中已经提到的,文本摘要中最标准的设置是将源文档和所需的摘要长度输入到摘要系统中。因此,摘要系统必须能够生成各种长度的摘要。显然,此属性对于基于神经编码器-解码器模型的摘要方法也至关重要。
由于编码器-解码器模型是完全由数据驱动的方法,因此输出序列的长度取决于对模型进行训练的训练数据。例如,我们使用从带注释的英语Gigaword语料库中提取的【句子-摘要】对作为训练数据,其中人工撰写摘要的平均长度为51.38字节。图1显示了语料库的统计数据。当我们训练标准的编码器-解码器模型并在语料库上执行标准的集束搜索解码时,其输出序列的平均长度为38.02字节。
但是,在其他情况下,我们需要具有其他长度的摘要。例如,DUC2004是一项共享任务,其中摘要的最大长度设置为75个字节,摘要系统将受益于生成不超过此长度限制的语句。
虽然最近的NSS模型本身无法控制其输出长度,但Rush et al. (2015)之后采用了ad-hoc方法,该方法是通过为EOS分配?∞-∞?∞分数来禁止系统生成句子结尾标签并生成固定数量的单词,以及最后,输出摘要被截断为75个字节。
理想情况下,模型应能够根据给定的输出长度来更改输出顺序,并能够以更自然的方式在适当的时间点输出EOS标签。
3.网络结构:具有注意力机制的编解码器
在本节中,我们将描述用于实验的模型结构:由双向RNN和注意力机制组成的编码器-解码器。图2显示了该模型的网络结构。
假设源句子被表示为单词的序列x=(x1,x2,x3,...,xN)\textbf x=(x_1,x_2,x_3,...,x_N)x=(x1?,x2?,x3?,...,xN?)。对于给定的源句子,摘要器生成输入的缩写形式(即N>MN>MN>M),即摘要句子y=(y1,y2,y3,...,yM)\textbf y=(y_1,y_2,y_3,...,y_M)y=(y1?,y2?,y3?,...,yM?)。该模型使用在由【句子-摘要】对组成的大型训练数据上训练的参数来估计条件概率p(y∣x)p(y|x)p(y∣x)。通常,将此条件概率分解为输出序列中下一个单词的条件概率的乘积:
p(y∣x)=∏t=1Mp(yt∣y<t,x),p(\textbf y| \textbf x)=\prod^M_{t=1}p(y_t|\textbf y_{\lt t},\textbf x),p(y∣x)=t=1∏M?p(yt?∣y<t?,x),
其中y<t=(y1,y2,y3,...,yt?1)\textbf y_{<t}=(y_1,y_2,y_3,...,y_{t-1})y<t?=(y1?,y2?,y3?,...,yt?1?)。在下面,我们描述如何计算p(yt∣y<t,x)p(y_t|y_{<t},x)p(yt?∣y<t?,x)。
3.1 编码器
我们使用双向RNN(Bi-RNN)作为编码器,该编码器已被证明在神经机器翻译和语音识别中有效。
Bi-RNN使用两个单独的RNN处理正向和反向的源句子。在编码过程中,Bi-RNN计算前向隐藏状态(h→1,h→2,...,h→N)(\overrightarrow{\textbf h}_1,\overrightarrow{\textbf h}_2,...,\overrightarrow{\textbf h}_N)(h1?,h2?,...,hN?)和后向隐藏状态(h←1,h←2,...,h←N)(\overleftarrow{\textbf h}_1,\overleftarrow{\textbf h}_2,...,\overleftarrow{\textbf h}_N)(h1?,h2?,...,hN?)的方式如下:
h→t=g(h→t?1,xt),h←t=g(h←t?1,xt).\overrightarrow{\textbf h}_t=g(\overrightarrow{\textbf h}_{t-1},x_t),\\ \overleftarrow{\textbf h}_t=g(\overleftarrow{\textbf h}_{t-1},x_t).ht?=g(ht?1?,xt?),ht?=g(ht?1?,xt?).
尽管ggg可以是任何一种循环单元,但我们使用长短期记忆(LSTM)网络,该网络具有两个方向(ct→\overrightarrow{\textbf c_t}ct??和ct←\overleftarrow{\textbf c_t}ct??)的记忆单元。
编码后,我们将解码器的初始隐藏状态s0\textbf s_0s0?和记忆单元m0\textbf m_0m0?设置如下:
s0=h←1,m0=c←1.\textbf s_0=\overleftarrow{\textbf h}_1,\\ \textbf m_0=\overleftarrow{\textbf c}_1.s0?=h1?,m0?=c1?.
3.2 解码器和注意力机制
我们的解码器基于具有LSTM ggg的RNN:
st=g(st?1,xt).\textbf s_t=g(\textbf s_{t-1},x_t).st?=g(st?1?,xt?).
我们还使用Luong et al. (2015)提出的注意力机制,它使用sts_tst?来计算时刻ttt的上下文信息dt\textbf d_tdt?。我们首先通过将前向和后向编码器状态求和,将它们的和设为hˉi=h→i+h←i\bar{\textbf h}_i=\overrightarrow{\textbf h}_i+\overleftarrow{\textbf h}_ihˉi?=hi?+hi?,然后将上下文向量dt\textbf d_tdt?计算为这些摘要向量的加权和:
dt=∑iαtihˉi,\textbf d_t=\sum_i \alpha_{ti}\bar{\textbf h}_i,dt?=i∑?αti?hˉi?,
其中αt\pmb{α}_tαααt?是通过softmax计算的在第ttt步的权重:
αti=exp(st?hˉi)∑hˉ′exp(st?hˉ′).\alpha_{ti}=\frac{exp(\textbf s_t\cdot \bar{\textbf h}_i)}{\sum_{\bar{\textbf h}'}exp(\textbf s_t\cdot \bar{\textbf h}')}.αti?=∑hˉ′?exp(st??hˉ′)exp(st??hˉi?)?.
计算上下文向量dt\textbf d_tdt?之后,该模型将更新下一个单词的分布,如下所示:
s~t=tanh(Whs[st;dt]+bhs),p(yt∣y<t,x)=softmax(Wsos~t+bso).\tilde{\textbf s}_t=tanh(W_{hs}[\textbf s_t;\textbf d_t]+\textbf b_{hs}),\\ p(y_t|\textbf y_{\lt t}, \textbf x)=softmax(W_{so}\tilde{\textbf s}_t+\textbf b_{so}).s~t?=tanh(Whs?[st?;dt?]+bhs?),p(yt?∣y<t?,x)=softmax(Wso?s~t?+bso?).
3.3 训练和解码
我们模型的训练目标是在给定的训练集合DDD中最大化【句子-摘要】对的对数似然:
Lt(θ)=∑(x,y)∈Dlogp(y∣x;θ),p(y∣x;θ)=∏tp(yt∣y<t,x).L_t(\theta)=\sum_{(\textbf x,\textbf y)\in D}log~p(\textbf y|\textbf x;\theta),\\ p(\textbf y|\textbf x;\theta)=\prod_t p(y_t|\textbf y_{\lt t},\textbf x).Lt?(θ)=(x,y)∈D∑?log p(y∣x;θ),p(y∣x;θ)=t∏?p(yt?∣y<t?,x).
训练完模型后,我们将使用集束搜索来找到使条件概率最大化的输出。
4.控制编解码器的长度
在本节中,我们提出了四种方法,它们可以控制编码器-解码器框架中输出的长度。在前两种方法中,解码过程用于控制输出长度,而无需更改模型本身。在其他两种方法中,模型本身已更改并经过重新训练以获得控制长度的能力。遵循实验中使用的评估数据集,我们使用字节作为长度单位,尽管我们的模型可以根据需要使用字或字节。
4.1 fixlenfixlenfixlen:没有EOS标签的集束搜索
我们研究的第一种方法是一种解码方法,它与许多最近的NSS方法所采用的解码方法类似,但其与ad-hoc稍有不同。在这种方法中,我们通过给解码器EOS分配分数?∞-∞?∞来禁止解码器生成EOS标签。由于模型本身无法停止解码过程,因此,当输出序列的长度达到所需长度时,我们仅停止解码过程。更具体地,在集束搜索期间,当到目前为止生成的序列的长度超过所需长度时,最后一个单词被EOS标签替换,并且最后一个单词的分数也被EOS标签的分数替换(EOS替换 )。
4.2 fixRngfixRngfixRng:丢弃超出范围的序列
我们的第二种解码方法基于丢弃超出范围的序列,并且不禁止生成EOS标签,从而允许其决定何时停止生成。相反,我们通过设置最小和最大长度来定义序列的合法范围。具体来说,除了正常的集束搜索过程外,我们还设置了两个规则:
(1)如果模型在输出序列短于最小长度时生成EOS标签,则我们将从集束中丢弃该序列。
(2)如果生成的序列超过最大长度,我们也会从集束中丢弃该序列。然后,我们将其最后一个单词替换为EOS标签,并将此序列添加到集束中(第4.1节中的EOS替换)。
换句话说,我们仅保留包含EOS标签并且在定义的长度范围内的序列。这种方法是一种折衷,它允许模型具有一定的灵活性来计划生成的序列,但只能在一定的可接受长度范围内。
应当注意,如果所需长度与训练数据中的平均摘要长度有很大差异,则此方法需要较大的集束大小,因为它将需要保留具有所需长度的假设。
4.3 LenEmbLenEmbLenEmb:长度词嵌入作为LSTM的额外输入
我们的第三种方法是基于学习的方法,模型经过重新训练以控制输出序列的长度。受到先前工作的启发,该工作表明解码器模型的额外输入可以有效地控制输出的特征,该模型以附加形式提供有关长度的信息输入到网络。具体而言,该模型对每个潜在的所需长度使用嵌入e2(lt)∈RDe_2(l_t)∈\mathbb R^De2?(lt?)∈RD,其由长度嵌入矩阵Wle∈RD×LW_{le}∈\mathbb R^{D×L}Wle?∈RD×L进行参数化,其中LLL是长度类型的数量。在解码过程中,我们将剩余长度ltl_tlt?的嵌入输入作为LSTM的附加输入(图3)。ltl_tlt?在编码过程之后初始化,并在解码过程中进行如下更新:
l1=length,lt+1={0(lt?byte(yt)≤0)lt?byte(yt)(otherwise),l_1=length,\\ l_{t+1}=\begin{cases} 0 & (l_t-byte(y_t)\le 0)\\ l_t-byte(y_t) & (otherwise), \end{cases}l1?=length,lt+1?={
0lt??byte(yt?)?(lt??byte(yt?)≤0)(otherwise),?
其中byte(yt)byte(y_t)byte(yt?)是输出单词yty_tyt?的长度,而lengthlengthlength是所需的长度。我们在训练期间学习长度嵌入矩阵WleW_{le}Wle?的值。此方法提供了有关输出序列中剩余长度量的其他信息,从而使解码器可以根据其可以生成的剩余字数来“计划”其输出。
4.4 LenInitLenInitLenInit:基于长度的记忆单元初始化
与LenEmbLenEmbLenEmb方法在解码过程的每个步骤中将剩余长度ltl_tlt?输入到解码器不同,LenInitLenInitLenInit方法在解码器的初始状态一次输入所需的长度。图4显示了LenInitLenInitLenInit的网络结构。具体来说,该模型通过初始化解码器的状态(隐藏状态s0\textbf s_0s0?和记忆单元m0\textbf m_0m0?)使用记忆单元mt\textbf m_tmt?来控制输出长度,如下所示:
s0=h←1,m0=bc?length,(1)\textbf s_0=\overleftarrow{\textbf h}_1,\\ \textbf m_0=\textbf b_c * length,\tag{1}s0?=h1?,m0?=bc??length,(1)
其中bc∈RH\textbf b_c∈\mathbb R^Hbc?∈RH是可训练的参数,而lengthlengthlength是所需的长度。
与通过在每一步输入剩余长度,将LenEmbLenEmbLenEmb模型引导到适当的输出长度不同,此LenInitLenInitLenInit尝试使模型具有使用其内部状态自行管理输出长度的能力。特别地,LSTM网络的记忆单元适用于此工作,因为LSTM可以学习例如每次输出单词时从特定记忆单元中减去固定量的功能。尽管也可以使用其他方法来管理长度,但我们发现这种方法既简单又有效。