作者: @henryWang

前言

文本生成,旨在利用NLP技術,根據給定信息產生特定目標的文本序列,應用場景眾多,並可以通過調整語料讓相似的模型框架適應不同應用場景。本文重點圍繞Encoder-Decoder結構,列舉一些以文本摘要生成或QA系統文本生成為實驗場景的技術進展。

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框架在機器翻譯,對話生成等領域中佔據重要位置。另外,前者首次提出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模塊,用於編碼輸入文本,計算狀態值作為黃色的Decoder模塊的初始狀態;藍色部分是Attention機制,結合Encoder模塊和Decoder輸入計算Context向量;最終Decoder部分結合Encoder的輸入狀態,Context向量,以及Decoder的歷史輸入,預測當前輸出對應於詞典的概率分布。

融合關鍵輸入信息

了解機器翻譯或生成任務的朋友都知道,無論Seq2seq模型多麼複雜,最後都是用類似softmax的結構輸出概率向量,然後映射到詞典中某個詞的的index,所以詞表中沒有的oov是無法被預測的。不同於機器翻譯的是,摘要生成這類任務產生的摘要中很可能需要輸入文本的信息,且通常會是某些關鍵詞句,我們當然不希望因為詞典中沒有就丟失這些關鍵信息,因此需要想辦法利用到輸入文本中的信息。

  • Pointer Networks

本文並沒有解決上面提到的OOV問題,而是試圖利用seq2seq處理特定的序列問題。我們已經提到,傳統seq2seq結構的輸出由類似辭彙表的某個元素映射表確定,這樣就無法應對辭彙表隨輸入變動的情況,例如凸包問題,給定包含一組坐標點的序列,預測構成凸包的點集,此時辭彙表的元素應該完全由輸入構成,顯然傳統seq2seq無法處理。本文作者提出了一種精巧的,比傳統attention-seq2seq更簡單的pointer-net

作者的思路很簡單,輸出完全由輸入決定,其實就是讓輸出指向某個輸入,或者說就是預測輸入的位置,這樣最後預測概率向量的維數就是輸入序列的長度,你再看attention的計算過程:

第一行結合了輸入和輸出的編碼信息,第二行計算了輸入序列的權重,這個權重不就是輸入序列的概率向量么?沒錯就這麼簡單!對於找凸包,Delaunay三角剖分,旅行商問題等這類輸出序列完全依賴輸入序列的問題,pointer-net可以給出很精巧的解決方案。

此外,可以看到,雖然pointer-net沒有直接解決OOV問題,但針對輸出依賴輸入的問題給出了一個很好的思路,下面的模型在考慮依賴輸入OOV問題時多少都受到了pointer-net的啟發。

  • Incorporating Copying Mechanism in Sequence-to-Sequence Learning

本文提出的copy-net目標非常明確,就是構造一種copy機制解決上面提到的與輸入相關的OOV問題。特別是摘要、對話生成這類問題,輸入文本中一些詞可以通過傳統方式預測,另一部分詞則可以直接複製在輸出文本中,所以copy-net最終的詞概率預測由兩部分組成,generate-mode和copy-mode,分別用於傳統的預測和copy詞的預測。

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

首先,generate-mode和copy-mode的輸出概率如下:

V就是傳統seq2seq的辭彙表,X在這裡是用於預測copy詞的詞典,可以看到無論P_c還是P_g,和傳統seq2seq的形式都是一樣的。區別在於詞典,X上針對輸入文本構造的,因此其中可能包含V中沒有的詞,所以copy-net解決上面提到的OOV問題的關鍵就是用這個詞典預測copy詞。

此外,藍框中包含了複雜的狀態更新機制。可以看到,S4的輸入不僅包含Tony的詞向量,還有一個Selective Read向量,這個是State Update機制計算得到的,這個狀態更新機制對encoder後的輸入矩陣M進行加權求和,意圖是定位M中的某個位置,即輸入序列中某個位置的元素,如下圖公式所示。

完成狀態更新後輸入給generate-mode和copy-mode分別計算兩個打分函數。

簡單來說,copy-net的核心思路就是根據輸入語料擴展原有辭彙表,這樣也就擴展了輸出的概率向量的維數。不過要特別注意結合預測mode的實現,本質上最後仍然是預測一個維數更高的概率向量,所以最後需要合併兩個維數不同的概率向量,即針對詞典重合的部分的對齊處理,還是有點麻煩的,相比之下,下面介紹的pointer-generator模型就要簡明許多。

  • Get To The Point-Summarization with Pointer-Generator Networks

本文與copy-net的思路有諸多重合,但設計上比copy-net簡單許多。核心同樣是想辦法讓最終預測的概率向量涵蓋輸入文本中出現的OOV。

上圖簡單明了,以傳統生成的綠色概率分布佔P_gen的權重,與輸入有關的藍色概率分布占(1-P_gen)。與copy-net不同,這裡直接用了pointer-net的思路,與輸入有關的概率分布由attention直接生成。實現上,由於這個概率分布與輸入序列直接相關,需要對每次feed的batch都擴展辭彙表,其實就是在原有辭彙表之後追加OOV對應的index,追加的部分,用於在最終合併概率分布時提供index,具體可參照作者提供的源碼。

此外,本文還提出了一個特殊的coverage機制,用來處理生成詞重複問題。

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

融合知識特徵

關於融合輸入元素的嘗試進一步啟發了NLPer,對於這類學習文本向量表示的模型,利用實體特徵和外部知識圖譜直覺上就有點靠譜,既然輸入序列中的詞可以利用,那麼充分利用實體信息知識圖譜等,為文本添加額外的知識特徵自然也是可能的。

  • Generating Natural Answers by Incorporating Copying and Retrieving Mechanisms in Sequence-to-Sequence Learning

本文來自阿里團隊,以問答系統為實驗場景,在copynet的基礎上加入知識檢索模塊共同配合回復生成。模型結構圖如下:

其實無論模型結構還是文章結構,本文和那篇copynet都非常相近,相當於增加了預測知識的copy-mode機制,因此這裡不再介紹本文的細節。不過從文中與copynet對比的實驗結果來看,引入知識檢索帶來的提升非常可觀,雖然實驗僅用在對話生成領域,不過在其他文本生成領域引入知識特徵也同樣值得嘗試,下一篇同樣來自阿里團隊的工作,將融合了知識特徵的seq2seq結構用於網購商品的摘要生成。

  • Multi-Source Pointer Network for Product Title Summarization

網購商品的摘要生成需要更大程度保留關鍵信息,同時避免無關內容。本文的結構很像引入知識特徵的pointer-generator,利用pointer的思想從輸入文本中提取關鍵詞,這裡的輸入文本是商品的標題,確保信息相關;引入知識特徵則是為了更大程度的產生關鍵信息。

從上圖的結構中可以看到,文中提出的MS-Pointer結構有兩個輸入,商品標題作為傳統Encoder輸入,背景知識作為額外的輸入文本,兩種輸入的處理方式相同,encoding後與Decoder的輸入分別計算出兩個attention,然後按照pointer-generator的思路結合兩種分布,只不過這裡結合的是傳統詞表的概率分布與背景知識特徵的概率分布。

  • Learning to Select Knowledge for Response Generation in Dialog Systems

上面兩篇文章分別對copy-net和pointer-generator做知識特徵融合,結構上沒有很大的改變,基於前者實現也是相對方便的。本文則更側重於知識特徵,強調利用後驗知識分布優化對話生成。

乍一看比上面的結構都複雜,但其實每個部分都有明確的目標,最上面sourceX到decode的部分就是傳統的attention-seq2seq,這裡重點介紹下面關於知識特徵的融合利用。

首先,用單獨的Encoder模塊編碼知識和目標輸出(訓練時),然後通過X,Y計算知識K的先驗和後驗概率分布,並通過KL散度度量兩個概率分布的距離,這裡不難理解,先驗分布和後驗分布相差極小就意味著可以用先驗分布採樣知識(預測時後驗分布未知),並用於生成目標回復Y。第二部分中,通過後驗(預測時先驗代替)分布採樣出與對話相關的知識作為額外的知識特徵,與Decoder模塊的輸入一起編碼,再和被encoding的sourceX一起預測下一個詞。此外,訓練的損失函數包含KL散度,NLL損失和BOW損失,第三部分就是用BOW損失考量被採樣出的知識(圖中的k2)與目標輸出文本相關的概率。

總結一下,本文仍然是seq2seq框架,關鍵就是用兩個計算損失優化模型採樣知識的能力,然後將知識作為額外特徵參與Encoder-Decoder編碼。相比於模型結構,筆者更關注數據中的知識形式,本文的源碼和數據會在發表後開放,項目地址就在文中,各位感興趣可以持續關注。

卷積結構上的新嘗試

2017年有兩篇基於機器翻譯任務的工作擺脫了RNN結構,採用了CNN和Transformer,一定程度上證明了非RNN結構在NLP任務上的可行性。Facebook的這篇Convolutional Sequence to Sequence Learning提出了基於Attention-Seq2seq框架的Convs2s結構,用CNN做編解碼單元,通過學習位置向量彌補CNN不具備的序列特徵捕捉特性,並藉助殘差結構,GLU等技巧讓網路可以堆疊的足夠深,從而讓CNN也能捕捉長距離文本特徵,另外CNN的並行能力遠超RNN,因此該結構理論上似乎可以更節省時間,本節將介紹兩篇基於Convs2s結構的工作,第一篇融合了主題模型作為額外的特徵,第二篇結合了強化學習的方式,兩者雖基於Convs2s結構,但對其他結構同樣有啟發性。

  • Don』t Give Me the Details, Just the Summary! Topic-Aware Convolutional Neural Networks for Extreme Summarization

本文的結構和Convs2s幾乎完全一致,其創新點就在於網路輸入融合了傳統的文本embedding和主題向量,如下圖所示:

個人認為,融合主題模型的思路很適合文本摘要類任務,筆者用pointer-generator實驗時就發現,即便模型可以輸出貼近自然語言的結果,也可以包含一些特殊詞,但丟失原文關鍵信息的現象仍然非常明顯,特別是訓練語料不充分的情況下。結合知識特徵自然是一種合理的思路,但構建知識圖譜或類似的結構化知識數據並不是一件簡單的事,相比之下主題模型就更為容易應用了。此外本文融合主題的方式非常直接,並不依賴網路結構,很容易應用於其他模型結構。

  • A Reinforced Topic-Aware Convolutional Sequence-to-Sequence Model for Abstractive Text Summarization

本文結構與上文相近,不過在融合主題信息的方式上有很大變化,此外引入RL方式來解決傳統損失函數帶來的問題,思路也非常值得借鑒。

由上圖可以看出,本文的主題信息不再和輸入文本的embedding求和,而是先單獨通過卷積編碼,再和decoder的輸入部分共同參與attention計算,通過兩邊的attention相加來融合文本embedding和主題信息;此外,還有一個概率生成模塊(biased probability generation)負責進一步控制融合。

損失函數部分用到了強化學習中的SCST(self-critical sequence training)。作者提到,傳統teacher forcing演算法目標是最小化每一步的極大似然損失,然而考慮到ROUGE這樣衡量句子級準確度的驗證演算法,由於exposure bias的問題,該目標往往會得到次優解(訓練時每次都通過ground-true預測當前步,預測時沒有ground-true);此外,摘要具有靈活性,而最小化極大似然損失的優化目標會迫使模型僅把參考的摘要作為正確答案,其他語意上相似的答案會被認為是錯誤答案。為了解決原有優化目標帶來的問題,作者提出用SCST直接最大化不可微的ROUGE,訓練時根據輸入產生兩個輸出,一個用傳統概率最大化生成,另一個從分布中採樣得到,計算兩個輸出序列的rouge分數作為reward,這樣在訓練階段,SCST會讓模型參考實際的分布,並迫使模型生成rouge分數更高的序列。

Transformer時代

承接上一節,Transformer完全拋棄了CNN與RNN,設計了並行能力同樣強的self-attention,與FFN,殘差結構等共同組成一個Transformer模塊,類似CNN可以堆疊多層且較RNN更節省時間。不過,Transformer和Convs2s在機器翻譯任務上的表現差異並不大,加之Attention is all you need這樣的文章標題,不少人在當時一度認為這又是一個拼模型刷分的水文,直到2018年GPT和BERT的誕生,深層Transformer堆疊+海量無監督語料預訓練的模式受到幾乎所有從業者的關注。本節介紹的是MSRA近期發表的MASS,作者通過修改BERT的mask方式實現Seq2seq框架下BERT預訓練的文本生成模型。

  • MASS: Masked Sequence to Sequence Pre-training for Language Generation

BERT本身是以學習表示為目標,或者說是NLU方面的探索,隨機MASK作為預訓練任務被證明效果突出,然而會存在pretraining和fine-tuning數據不一致的問題,如果你想把BERT拼在Encoder端和Decoder端,就要考慮改變BERT的預訓練方式。MASS略微修改了BERT的mask方式,在Encoder端連續mask一個子序列,讓Decoder用前i-1個詞預測第i個,就這樣把BERT套進Seq2seq框架,一起pretraining即可。

總結

本文重點介紹了基於Seq2seq框架的文本生成類模型,對於機器翻譯任務,傳統的attention-seq2seq結構就能獲得不錯的效果,相比於不同的模型結構,充分的訓練數據似乎更為關鍵。而對於文本摘要,對話生成這類任務,序列中更需要包含主題,關鍵實體等特殊信息元,因而融合主題、輸入文本、知識特徵的策略很可能會帶來更多收益。不過,文本生成類任務仍處於初級階段,複雜花哨的結構也許很難達到可觀的效果。因此筆者建議,即便是文本摘要這類任務,仍不妨先試試受眾廣泛的開源實現,諸如gnmt、fairseq、tensor2tensor等。

關於本文提到的一些trick,copy機制的實現有些複雜,並且不少開源項目的copy實現是存在問題的,pointer-generator的效果更好,且實現上更容易,當然,主題和知識特徵的融合也是值得嘗試的技巧。最後,本文沒有過多涉及的強化學習和對抗網路,在文本生成方向上有不少值得借鑒的工作,也可以作為文本生成任務的一個方向考慮。


參考文獻

[1]. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

[2]. Sequence to Sequence Learning with Neural Networks

[3]. Neural Machine Translation by Jointly Learning to Align and Translate

[4]. Pointer Networks

[5]. Incorporating Copying Mechanism in Sequence-to-Sequence Learning

[6]. Get To The Point- Summarization with Pointer-Generator Networks

[7]. Generating Natural Answers by Incorporating Copying and Retrieving Mechanisms in Sequence-to-Sequence Learning

[8]. Multi-Source Pointer Network for Product Title Summarization

[9]. Learning to Select Knowledge for Response Generation in Dialog Systems

[10]. Don』t Give Me the Details, Just the Summary! Topic-Aware Convolutional Neural Networks for Extreme Summarization

[11]. A Reinforced Topic-Aware Convolutional Sequence-to-Sequence Model for Abstractive Text Summarization

[12]. MASS: Masked Sequence to Sequence Pre-training for Language Generation


招聘信息

丁香園大數據NLP團隊招聘各類演算法人才,Base杭州。NLP團隊的使命是利用NLP(自然語言處理)、Knowledge Graph(知識圖譜)、Deep Learning(深度學習)等技術,處理丁香園海量醫學文本數據,打通電商、在線問診、健康知識、社區討論等各個場景數據,構建醫學知識圖譜,搭建通用NLP服務。團隊關注NLP前沿技術,也注重落地實現,包括但不僅限於知識圖譜、短文本理解、語義搜索、可解釋推薦、智能問答等。加入我們,讓健康更多,讓疾病更少!

歡迎各位朋友推薦或自薦至 [email protected]

推薦閱讀:

相关文章