||
abstractive是学术界研究的热点,大部分工作试着套用Machine Translation中的encoder-decoder框架和attention mechanism,将abstractive问题转换为sequence-2-sequence问题,得到state-of-the-art结果。
Encoder-Decoder不是一种模型,而是一种框架,一种处理问题的思路,最早应用于机器翻译领域,输入一个序列,输出另外一个序列。机器翻译问题就是将一种语言序列转换成另外一种语言序列,将该技术扩展到其他领域,比如输入序列可以是文字,语音,图像,视频,输出序列可以是文字,图像,可以解决很多别的类型的问题。
encoder部分是将输入序列表示成一个带有语义的向量,使用最广泛的表示技术是Recurrent Neural Network,RNN是一个基本模型,在训练的时候会遇到gradient explode或者gradient vanishing的问题,导致无法训练,所以在实际中经常使用的是经过改良的LSTM RNN或者GRU RNN对输入序列进行表示,更加复杂一点可以用BiRNN、BiRNN with LSTM、BiRNN with GRU、多层RNN等模型来表示,输入序列最终表示为最后一个word的hidden state vector。
decoder部分是以encoder生成的hidden state vector作为输入“解码”出目标文本序列,本质上是一个语言模型,最常见的是用Recurrent Neural Network Language Model(RNNLM),只要涉及到RNN就会有训练的问题,也就需要用LSTM、GRU和一些高级的model来代替。目标序列的生成和LM做句子生成的过程类似,只是说计算条件概率时需要考虑encoder向量。
注意力机制在NLP中的使用是在2015年,也是从机器翻译领域开始。在decoder中生成目标文本序列这部分,第一个word的生成完全依赖于encoder的last hidden state vector,而这个vector更多的是表示输入序列的最后一个word的意思,也就是说rnn一般来说都是一个有偏的模型。
举例rnn可以理解为一个人看完了一段话,他可能只记得最后几个词说明的意思,但是如果你问他前面的信息,他就不能准确地回答,attention可以理解为,提问的信息只与之前看完的那段话中一部分关系密切,而其他部分关系不大,这个人就会将自己的注意力锁定在这部分信息中。这个就是所谓attention mechanism的原理,每个hidden state vector对于decoder生成每个单词都有影响,但影响分布并不相同,如图中行文本代表输出,列文本代表输入,颜色越深表示两个词相关性越强,即生成该词时需要多注意对应的输入词。不同的paper在使用attention上会有不同的技巧。
使用deep learning技术来做abstractive summarization的大体思路如下:
Step1:首先将自动文摘的问题构造成一个seq2seq问题,通常的做法是将某段文本的first sentence作为输入,headlines作为输出,本质上变成了一个headlines generative问题。
Step2:选择一个big corpus作为训练、测试集。自动文摘的技术没有太成熟的一个重要原因在于没有一个成熟的大规模语料。一般来说都选择Gigawords作为训练、测试集,然后用DUC的数据集进行验证和对比。
Step3:选择一个合适的encoder,这里可以选simple rnn,lstm rnn,gru rnn,simple birnn,lstm birnn,gru birnn,deep rnn,cnn,以及各种各样的cnn。不同model之间的组合都是一种创新,只不过创新意义不太大。用encoder将输入文本表示成一个向量。
Step4:选择一个合适的decoder,decoder的作用是一个language model,用来生成summary words。
Step5:设计一个合适的attention model。不仅仅基于encoder last hidden state vector和上文来预测输出文本序列,更要基于输入中“注意力”更高的词来预测相应的词。
Step6:设计一个copy net。只要是语言模型都会存在相同的问题,比如out-of-vocabulary词的处理,尤其是做新闻类摘要的生成时,很多词都是人名、机构名等专有名词,所以这里需要用copy net 将输入中的词copy过来生成输出。在生成中文摘要问题上,将words降维到characters可以避免oov的问题,并且取得不错的结果。
UNK是Unknown Words的简称,在用seq2seq解决问题时经常出现,比如机器翻译任务和文本摘要任务。在decoder中生成某个单词的时候就会出现UNK问题。decoder本质上是一个语言模型,而语言模型本质上是一个多分类器,通过计算词汇表中的每个单词在当前条件下出现的概率,来生成该条件下的单词。为了提高计算效率,往往只选择出现频次最高的Top N个单词作为词汇表,其他的单词都用UNK来替换,这样导致decoder的时候会出现UNK。其中,很多UNK可能都是一些不常出现的但有意义的词,比如机构名、地名。
1、Char-based
英文字符的种类远远少于词的种类,用char来代替word可以将decoder输出层的维度降低很多,而且覆盖了所有的可能,从根本上避免了UNK的问题。在文本摘要任务中,数据中往往包括很多的人名、地名,基于word来做词汇表的话,经常会在摘要中看到大量的UNK,用基于char的模型来做,会得到不错的效果。
char方法虽然缓解了output部分的计算压力,却将大量计算耗在了input部分,尤其是在处理英文问题时,会将input放大很多倍。而且处理中文问题也不太有优势,常用汉字也有3000左右的规模。
2、Vocabulary expansion
词汇表扩展的方法,在高频词词汇表中添加一定数量的UNK,并且编号。通过word embedding计算出带编号UNK的第一层最邻近words,如果匹配的这些词在原来词汇表中,则为有效词。有效词越多,本质上词汇表虽然规模没有增加,但表达能力会越强,在decoder生成词时遇到UNK就可以用词汇表中的高频词来替换。这个方法是一个辅助技巧,可以提升效果,但不会解决根本问题。
3、Output layer boost
思路是想办法提升输出层的效率,原始的方法是softmax,这是消耗计算资源的根源。
4、Pointing/Copy
观察人工参考摘要时会发现,摘要中有很多词都是来自于输入部分,比如机构名、地名、人名。这些词出现很少有的甚至只出现一次,如果靠语言模型来生成是不可能的。基于这个现象,有几篇paper提出用Pointing/Copy机制来生成摘要,两种模型意思上差太不多,在decoder中存在两种模型来生成单词,一种是常规的生成方式,另一种就是拷贝方式。拷贝模型在很大程度上解决了UNK的问题,rare words都直接用原文中的词放在摘要的相应位置上。本方法从正面解决了UNK问题,而且计算效率上可能比char-based的方法更好一些,因为并没有引入太大规模的input数据,output部分规模也不大。
参考:
[1]https://www.cnblogs.com/Determined22/p/6650373.html
[2]http://rsarxiv.github.io/tags/%E8%87%AA%E5%8A%A8%E6%96%87%E6%91%98/
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-22 11:06
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社