前言
文本生成,旨在利用NLP技術,根據(jù)給定信息產(chǎn)生特定目標的文本序列,應用場景眾多,并可以通過調(diào)整語料讓相似的模型框架適應不同應用場景。本文重點圍繞Encoder-Decoder結構,列舉一些以文本摘要生成或QA系統(tǒng)文本生成為實驗場景的技術進展。
Seq2seq框架
2014年NLP界有兩份重要的成果,Learning Phrase Representations using RNN Encoder–Decoder for Statistical machine Translation和Sequence to Sequence Learning with Neural Networks。雖然在Decoder的輸入上有差別,但結構上兩者都將Encoder-Decoder結構應用在翻譯場景中,并由此開始,seq2seq框架在機器翻譯,對話生成等領域中占據(jù)重要位置。另外,前者首次提出GRU結構,后者采用Beam Search改善預測結果,這些都成為如今seq2seq框架的基礎技術元素。
隨后,Bahdanau在Neural Machine Translation by Jointly Learning to Align and Translate中提出了融合attention和seq2seq結構的NMT模型結構,至此,由Encoder-Attention-Decoder組成的seq2seq框架正式形成。

atention-seq2seq如上圖所示,紅色部分為Encoder模塊,用于編碼輸入文本,計算狀態(tài)值作為黃色的Decoder模塊的初始狀態(tài);藍色部分是Attention機制,結合Encoder模塊和Decoder輸入計算Context向量;最終Decoder部分結合Encoder的輸入狀態(tài),Context向量,以及Decoder的歷史輸入,預測當前輸出對應于詞典的概率分布。
融合關鍵輸入信息
了解機器翻譯或生成任務的朋友都知道,無論Seq2seq模型多么復雜,最后都是用類似softmax的結構輸出概率向量,然后映射到詞典中某個詞的的index,所以詞表中沒有的oov是無法被預測的。不同于機器翻譯的是,摘要生成這類任務產(chǎn)生的摘要中很可能需要輸入文本的信息,且通常會是某些關鍵詞句,我們當然不希望因為詞典中沒有就丟失這些關鍵信息,因此需要想辦法利用到輸入文本中的信息。
- Pointer Networks
本文并沒有解決上面提到的OOV問題,而是試圖利用seq2seq處理特定的序列問題。我們已經(jīng)提到,傳統(tǒng)seq2seq結構的輸出由類似詞匯表的某個元素映射表確定,這樣就無法應對詞匯表隨輸入變動的情況,例如凸包問題,給定包含一組坐標點的序列,預測構成凸包的點集,此時詞匯表的元素應該完全由輸入構成,顯然傳統(tǒng)seq2seq無法處理。本文作者提出了一種精巧的,比傳統(tǒng)attention-seq2seq更簡單的pointer-net
作者的思路很簡單,輸出完全由輸入決定,其實就是讓輸出指向某個輸入,或者說就是預測輸入的位置,這樣最后預測概率向量的維數(shù)就是輸入序列的長度,你再看attention的計算過程:

第一行結合了輸入和輸出的編碼信息,第二行計算了輸入序列的權重,這個權重不就是輸入序列的概率向量么?沒錯就這么簡單!對于找凸包,Delaunay三角剖分,旅行商問題等這類輸出序列完全依賴輸入序列的問題,pointer-net可以給出很精巧的解決方案。
此外,可以看到,雖然pointer-net沒有直接解決OOV問題,但針對輸出依賴輸入的問題給出了一個很好的思路,下面的模型在考慮依賴輸入OOV問題時多少都受到了pointer-net的啟發(fā)。
- Incorporating Copying Mechanism in Sequence-to-Sequence Learning
本文提出的copy-net目標非常明確,就是構造一種copy機制解決上面提到的與輸入相關的OOV問題。特別是摘要、對話生成這類問題,輸入文本中一些詞可以通過傳統(tǒng)方式預測,另一部分詞則可以直接復制在輸出文本中,所以copy-net最終的詞概率預測由兩部分組成,generate-mode和copy-mode,分別用于傳統(tǒng)的預測和copy詞的預測。

上圖展示了copy-net,左邊是傳統(tǒng)的attention-seq2seq結構,右邊包含了copy-net全部改進思路。紅框中展示了結合generate-mode和copy-mode的輸出詞預測,下面的藍框包含了針對Decoder編碼狀態(tài)值的改進。
首先,generate-mode和copy-mode的輸出概率如下:

V就是傳統(tǒng)seq2seq的詞匯表,X在這里是用于預測copy詞的詞典,可以看到無論P_c還是P_g,和傳統(tǒng)seq2seq的形式都是一樣的。區(qū)別在于詞典,X上針對輸入文本構造的,因此其中可能包含V中沒有的詞,所以copy-net解決上面提到的OOV問題的關鍵就是用這個詞典預測copy詞。
此外,藍框中包含了復雜的狀態(tài)更新機制??梢钥吹?,S4的輸入不僅包含Tony的詞向量,還有一個Selective Read向量,這個是State Update機制計算得到的,這個狀態(tài)更新機制對encoder后的輸入矩陣M進行加權求和,意圖是定位M中的某個位置,即輸入序列中某個位置的元素,如下圖公式所示。

完成狀態(tài)更新后輸入給generate-mode和copy-mode分別計算兩個打分函數(shù)。

簡單來說,copy-net的核心思路就是根據(jù)輸入語料擴展原有詞匯表,這樣也就擴展了輸出的概率向量的維數(shù)。不過要特別注意結合預測mode的實現(xiàn),本質(zhì)上最后仍然是預測一個維數(shù)更高的概率向量,所以最后需要合并兩個維數(shù)不同的概率向量,即針對詞典重合的部分的對齊處理,還是有點麻煩的,相比之下,下面介紹的pointer-generator模型就要簡明許多。
- Get To The Point-Summarization with Pointer-Generator Networks
本文與copy-net的思路有諸多重合,但設計上比copy-net簡單許多。核心同樣是想辦法讓最終預測的概率向量涵蓋輸入文本中出現(xiàn)的OOV。

上圖簡單明了,以傳統(tǒng)生成的綠色概率分布占P_gen的權重,與輸入有關的藍色概率分布占(1-P_gen)。與copy-net不同,這里直接用了pointer-net的思路,與輸入有關的概率分布由attention直接生成。實現(xiàn)上,由于這個概率分布與輸入序列直接相關,需要對每次feed的batch都擴展詞匯表,其實就是在原有詞匯表之后追加OOV對應的index,追加的部分,用于在最終合并概率分布時提供index,具體可參照作者提供的源碼。
此外,本文還提出了一個特殊的coverage機制,用來處理生成詞重復問題。

基本思路是,用之前attention矩陣的疊加作為覆蓋向量c_t,參與當前attention的計算,從而讓當前的attention盡量避免出現(xiàn)重復的位置。此外可以在計算損失函數(shù)時也加入覆蓋向量c_t緩解重復問題。

融合知識特征
關于融合輸入元素的嘗試進一步啟發(fā)了NLPer,對于這類學習文本向量表示的模型,利用實體特征和外部知識圖譜直覺上就有點靠譜,既然輸入序列中的詞可以利用,那么充分利用實體信息知識圖譜等,為文本添加額外的知識特征自然也是可能的。
- Generating Natural Answers by Incorporating Copying and Retrieving Mechanisms in Sequence-to-Sequence Learning
本文來自阿里團隊,以問答系統(tǒng)為實驗場景,在copynet的基礎上加入知識檢索模塊共同配合回復生成。模型結構圖如下:

其實無論模型結構還是文章結構,本文和那篇copynet都非常相近,相當于增加了預測知識的copy-mode機制,因此這里不再介紹本文的細節(jié)。不過從文中與copynet對比的實驗結果來看,引入知識檢索帶來的提升非??捎^,雖然實驗僅用在對話生成領域,不過在其他文本生成領域引入知識特征也同樣值得嘗試,下一篇同樣來自阿里團隊的工作,將融合了知識特征的seq2seq結構用于網(wǎng)購商品的摘要生成。
- Multi-Source Pointer Network for Product Title Summarization
網(wǎng)購商品的摘要生成需要更大程度保留關鍵信息,同時避免無關內(nèi)容。本文的結構很像引入知識特征的pointer-generator,利用pointer的思想從輸入文本中提取關鍵詞,這里的輸入文本是商品的標題,確保信息相關;引入知識特征則是為了更大程度的產(chǎn)生關鍵信息。

從上圖的結構中可以看到,文中提出的MS-Pointer結構有兩個輸入,商品標題作為傳統(tǒng)Encoder輸入,背景知識作為額外的輸入文本,兩種輸入的處理方式相同,encoding后與Decoder的輸入分別計算出兩個attention,然后按照pointer-generator的思路結合兩種分布,只不過這里結合的是傳統(tǒng)詞表的概率分布與背景知識特征的概率分布。
- Learning to Select Knowledge for Response Generation in Dialog Systems
上面兩篇文章分別對copy-net和pointer-generator做知識特征融合,結構上沒有很大的改變,基于前者實現(xiàn)也是相對方便的。本文則更側重于知識特征,強調(diào)利用后驗知識分布優(yōu)化對話生成。

乍一看比上面的結構都復雜,但其實每個部分都有明確的目標,最上面sourceX到decode的部分就是傳統(tǒng)的attention-seq2seq,這里重點介紹下面關于知識特征的融合利用。
首先,用單獨的Encoder模塊編碼知識和目標輸出(訓練時),然后通過X,Y計算知識K的先驗和后驗概率分布,并通過KL散度度量兩個概率分布的距離,這里不難理解,先驗分布和后驗分布相差極小就意味著可以用先驗分布采樣知識(預測時后驗分布未知),并用于生成目標回復Y。第二部分中,通過后驗(預測時先驗代替)分布采樣出與對話相關的知識作為額外的知識特征,與Decoder模塊的輸入一起編碼,再和被encoding的sourceX一起預測下一個詞。此外,訓練的損失函數(shù)包含KL散度,NLL損失和BOW損失,第三部分就是用BOW損失考量被采樣出的知識(圖中的k2)與目標輸出文本相關的概率。
總結一下,本文仍然是seq2seq框架,關鍵就是用兩個計算損失優(yōu)化模型采樣知識的能力,然后將知識作為額外特征參與Encoder-Decoder編碼。相比于模型結構,筆者更關注數(shù)據(jù)中的知識形式,本文的源碼和數(shù)據(jù)會在發(fā)表后開放,項目地址就在文中,各位感興趣可以持續(xù)關注。
卷積結構上的新嘗試
2017年有兩篇基于機器翻譯任務的工作擺脫了RNN結構,采用了CNN和Transformer,一定程度上證明了非RNN結構在NLP任務上的可行性。Facebook的這篇Convolutional Sequence to Sequence Learning提出了基于Attention-Seq2seq框架的Convs2s結構,用CNN做編解碼單元,通過學習位置向量彌補CNN不具備的序列特征捕捉特性,并借助殘差結構,GLU等技巧讓網(wǎng)絡可以堆疊的足夠深,從而讓CNN也能捕捉長距離文本特征,另外CNN的并行能力遠超RNN,因此該結構理論上似乎可以更節(jié)省時間,本節(jié)將介紹兩篇基于Convs2s結構的工作,第一篇融合了主題模型作為額外的特征,第二篇結合了強化學習的方式,兩者雖基于Convs2s結構,但對其他結構同樣有啟發(fā)性。
- Don’t Give Me the Details, Just the Summary! Topic-Aware Convolutional Neural Networks for Extreme Summarization
本文的結構和Convs2s幾乎完全一致,其創(chuàng)新點就在于網(wǎng)絡輸入融合了傳統(tǒng)的文本embedding和主題向量,如下圖所示:

個人認為,融合主題模型的思路很適合文本摘要類任務,筆者用pointer-generator實驗時就發(fā)現(xiàn),即便模型可以輸出貼近自然語言的結果,也可以包含一些特殊詞,但丟失原文關鍵信息的現(xiàn)象仍然非常明顯,特別是訓練語料不充分的情況下。結合知識特征自然是一種合理的思路,但構建知識圖譜或類似的結構化知識數(shù)據(jù)并不是一件簡單的事,相比之下主題模型就更為容易應用了。此外本文融合主題的方式非常直接,并不依賴網(wǎng)絡結構,很容易應用于其他模型結構。
- A Reinforced Topic-Aware Convolutional Sequence-to-Sequence Model for Abstractive Text Summarization
本文結構與上文相近,不過在融合主題信息的方式上有很大變化,此外引入RL方式來解決傳統(tǒng)損失函數(shù)帶來的問題,思路也非常值得借鑒。

由上圖可以看出,本文的主題信息不再和輸入文本的embedding求和,而是先單獨通過卷積編碼,再和decoder的輸入部分共同參與attention計算,通過兩邊的attention相加來融合文本embedding和主題信息;此外,還有一個概率生成模塊(biased probability generation)負責進一步控制融合。
損失函數(shù)部分用到了強化學習中的SCST(self-critical sequence training)。作者提到,傳統(tǒng)teacher forcing算法目標是最小化每一步的極大似然損失,然而考慮到ROUGE這樣衡量句子級準確度的驗證算法,由于exposure bias的問題,該目標往往會得到次優(yōu)解(訓練時每次都通過ground-true預測當前步,預測時沒有ground-true);此外,摘要具有靈活性,而最小化極大似然損失的優(yōu)化目標會迫使模型僅把參考的摘要作為正確答案,其他語意上相似的答案會被認為是錯誤答案。為了解決原有優(yōu)化目標帶來的問題,作者提出用SCST直接最大化不可微的ROUGE,訓練時根據(jù)輸入產(chǎn)生兩個輸出,一個用傳統(tǒng)概率最大化生成,另一個從分布中采樣得到,計算兩個輸出序列的rouge分數(shù)作為reward,這樣在訓練階段,SCST會讓模型參考實際的分布,并迫使模型生成rouge分數(shù)更高的序列。
Transformer時代
承接上一節(jié),Transformer完全拋棄了CNN與RNN,設計了并行能力同樣強的self-attention,與FFN,殘差結構等共同組成一個Transformer模塊,類似CNN可以堆疊多層且較RNN更節(jié)省時間。不過,Transformer和Convs2s在機器翻譯任務上的表現(xiàn)差異并不大,加之Attention is all you need這樣的文章標題,不少人在當時一度認為這又是一個拼模型刷分的水文,直到2018年GPT和BERT的誕生,深層Transformer堆疊+海量無監(jiān)督語料預訓練的模式受到幾乎所有從業(yè)者的關注。本節(jié)介紹的是MSRA近期發(fā)表的MASS,作者通過修改BERT的mask方式實現(xiàn)Seq2seq框架下BERT預訓練的文本生成模型。
- MASS: Masked Sequence to Sequence Pre-training for Language Generation

BERT本身是以學習表示為目標,或者說是NLU方面的探索,隨機MASK作為預訓練任務被證明效果突出,然而會存在pretraining和fine-tuning數(shù)據(jù)不一致的問題,如果你想把BERT拼在Encoder端和Decoder端,就要考慮改變BERT的預訓練方式。MASS略微修改了BERT的mask方式,在Encoder端連續(xù)mask一個子序列,讓Decoder用前i-1個詞預測第i個,就這樣把BERT套進Seq2seq框架,一起pretraining即可。
總結
本文重點介紹了基于Seq2seq框架的文本生成類模型,對于機器翻譯任務,傳統(tǒng)的attention-seq2seq結構就能獲得不錯的效果,相比于不同的模型結構,充分的訓練數(shù)據(jù)似乎更為關鍵。而對于文本摘要,對話生成這類任務,序列中更需要包含主題,關鍵實體等特殊信息元,因而融合主題、輸入文本、知識特征的策略很可能會帶來更多收益。不過,文本生成類任務仍處于初級階段,復雜花哨的結構也許很難達到可觀的效果。因此筆者建議,即便是文本摘要這類任務,仍不妨先試試受眾廣泛的開源實現(xiàn),諸如gnmt、fairseq、tensor2tensor等。
關于本文提到的一些trick,copy機制的實現(xiàn)有些復雜,并且不少開源項目的copy實現(xiàn)是存在問題的,pointer-generator的效果更好,且實現(xiàn)上更容易,當然,主題和知識特征的融合也是值得嘗試的技巧。最后,本文沒有過多涉及的強化學習和對抗網(wǎng)絡,在文本生成方向上有不少值得借鑒的工作,也可以作為文本生成任務的一個方向考慮。