PGNet模型训练注意事项:
随着互联网飞速发展,产生了越来越多的文本数据,文本信息过载问题日益严重,对各类文本进行一个“降 维”处理显得非常必要,文本摘要便是其中一个重要的手段。
文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要。
按照输出类型可分为抽取式摘要和生成式摘要。
“文本摘要”模型 { 纯抽取式文本摘要: Pointer Network 只使用“输入文本”中的词汇来生成摘要 纯生成式文本摘要: Seq2Seq+Attention 只使用“词典库”中的词汇来生成摘要 综合式文本摘要: Pointer Network+Seq2Seq+Attention 使用“输入文本+词典库”中的词汇 \begin{aligned} “文本摘要”模型 \begin{cases} 纯抽取式文本摘要:\text{Pointer Network\quad 只使用“输入文本”中的词汇来生成摘要}\\[2ex] 纯生成式文本摘要:\text{Seq2Seq+Attention\quad 只使用“词典库”中的词汇来生成摘要}\\[2ex] 综合式文本摘要:\text{Pointer Network+Seq2Seq+Attention \quad 使用“输入文本+词典库”中的词汇} \end{cases} \end{aligned} “文本摘要”模型⎩ ⎨ ⎧纯抽取式文本摘要:Pointer Network只使用“输入文本”中的词汇来生成摘要纯生成式文本摘要:Seq2Seq+Attention只使用“词典库”中的词汇来生成摘要综合式文本摘要:Pointer Network+Seq2Seq+Attention 使用“输入文本+词典库”中的词汇
仅用传统的 Seq2Seq+Attention 模型可以实现生成式摘要,但存在两个问题:
传统的 Seq2Seq+Attention 模型中 Decoder 输出的目标数量是固定的,例如翻译时 Decoder 预测的目标数量等于字典的大小。这导致 Seq2Seq 不能用于一些组合优化的问题,例如凸包问题,三角剖分,旅行商问题 (TSP) 等。
作者想要研究的问题是什么?一一虽然Seq2Seq模型已经在生成任务上取得了一定的效果,但是还是存在几个问题。
针对上述问题,提出了两种方式进行解决。
后续的许多生成任务都是在此基础上,通过在输出层使用PG-Net来增加模型的性能。
Sequence-to-Sequence (Seq2Seq)模型旨在构建一个联合的神经网络,以端到端的方式将 一个序列化数据映射成另一个序列化数据。Seq2Seq模型通常基于Encoder-Decoder 框架实现, 可用于各种序列生成任务,如机器翻译、自动文摘、对话生成、语音识别等。
Seq2Seq+Attention模型可以关注原文本中的相关单词以生成新单词进行概括。比如:模型可能注意到原文中的"victorious"和" win"这个两个单词,在摘要"Germany beat Argentina 2-0"中生成了新的单词beat 。Seq2Seq是经典的Encoder-Decoder模型,即先用Encoder将原文本编码成一个中间层的隐藏状态,然后用Decoder来将该隐藏状态解码成为另一个文本。
比如:Seq2Seq在Encoder端是一个双向的LSTM,这个双向的LSTM可以捕捉原文本的长距离依赖关系以及位置信息,编码时单词 w i w^i wi 嵌入经过双向LSTM后得到编码状态 h i h_i hi 。在Decoder端,解码器是一个单向的LSTM,训练阶段时输入参考摘要单词 w j w^j wj (测试阶段时是上一步的生成词), w j w^j wj在时间步 t t t 得到解码状态 z t z^t zt 。使用 h i h_i hi 和 z t z_t zt 的match函数,进一步softmax操作得到该时间步原文第 i i i 个词注意力权重。
传统的 Attention 会根据 Attention 值融合 Encoder 的每一个时刻的输出,然后和 Decoder 当前时刻的输出混在一起再预测输出。如下面的公式所示,e表示 Encoder 的输出,d 表示 Decoder 的输出,W 和 v 都是可以学习的参数。
Pointer Network(指针网络)属于纯抽取式摘要模型。
Pointer Network(指针网络) 可以解决传统“Seq2Seq+Attention”模型输出字典大小不可变的问题。
Pointer Network(指针网络)的输出字典大小等于 Encoder 输入序列的长度(即:Decoder部分生成摘要时能使用的单词库就是输入文本本身所包含的所有单词)。
在传统的NLP问题中,采用“Seq2Seq+Attention”模型的方式去解决翻译问题,其输出向量的长度往往是字典的长度,而字典长度是事先已经订好了的(比如英语单词字典就定n=8000个单词)。而在组合优化类问题中,比如TSP问题,输入是城市的坐标序列,输出也是城市的坐标序列,而每次求解的TSP问题城市规模n是不固定的。每次decoder的输出实际上是每个城市这次可能被选择的概率向量,其维度为n,和encoder输入的序列向量长度一致。如何解决输出字典维度可变的问题?
Pointer Network 和 Seq2Seq 的区别如下图所示,图中展示了凸包问题。
Pointer network 主要用在解决组合优化类问题(TSP, Convex Hull等等),实际上是Sequence to Sequence learning中encoder RNN和decoder RNN的扩展,主要解决的问题是输出的字典长度不固定问题(输出字典的长度等于输入序列的长度)。
Pointer Network 计算输入序列 P P P 的 Attention 值之后不会把 Encoder 的输出融合(即 c = ∑ a ^ 0 h i c=\sum \hat{a}_0h^i c=∑a^0hi),而是将 Attention 作为输入序列 P P P 中每一个位置输出的概率。从这些概率里面取出概率最大值作为Encoder output。Decoder模块的输入完全来自于Encoder模块的输出(Copy)
Decoder模块的输出 = Encoder模块的输出 = Decoder模块的输入
Pointer-Generator Networks 是在Baseline sequence-to-sequence模型的基础上构建的。并从两个方面进行了改进:
Pointer-Generator Network的Decoder的输出自于“Encoder的输入” 与 “字典库” 的结合:混合 Baseline Seq2Seq(Seq2Seq + “Attention”)和 Pointer Network 的网络,它具有Seq2Seq + “Attention”的生成能力和 PointerNetwork的Copy能力。该网络的结构如下:
Pointer-Generator Network(Seq2Seq+Attention+Coverage+Pointer)与 BaseLine的 Seq2Seq+Attention 模型的区别在于:
如何权衡一个词应该是从字典库生成的还是从Encoder的输入复制的:引入了一个权重 p g e n p_{gen} pgen 。从Baseline Seq2Seq(Seq2Seq + “Attention”)的模型结构中得到了 s t s_t st 和 h t ∗ h_t^∗ ht∗,和解码器输入 x t x_t xt 一起来计算 p g e n p_{gen} pgen :
p g e n = σ ( w h ∗ T h t ∗ + w s T s t + w x T x t + b p t r ) p _ { \mathrm { gen } } = \sigma \left( w _ { h ^ { * } } ^ { T } h _ { t } ^ { * } + w _ { s } ^ { T } s _ { t } + w _ { x } ^ { T } x _ { t } + b _ { \mathrm { ptr } } \right) p