文本生成魔改方案汇总!
文 | 三和廠妹
編 | zenRRan
文本生成是NLP中較難的點,應用場景多且廣泛。本篇筆記錄一下文本生成的應用場景和主流方案,主要是基礎的學習匯總和解決方案的梳理,相關學習資料在文中有鏈接或者文末有參考文獻(我人工篩選的)都是相對經典的。
文本生成的應用領域
信息抽取:生成式閱讀理解
一篇長篇新聞中根據抽取的事件,生成簡短概述
對話系統:閑聊回復|知識型問答回復
用戶:我今天失戀了 chatbot:?抱抱,不哭用戶:章子怡現在的老公是誰呀? chatbot:?汪峰現在和她和幸福呢!創作:寫詩詞對聯新聞小數|根據屬性生成商品描述|生成吸睛標題
廣告文案生成,小說改寫等
美團賣家定義好商品詳情,自動生成吸睛標題推送給用戶
如《騰訊機器人日均寫稿過千篇 你讀的新聞可能是AI寫的[1]》
本文主要從規則和模型兩個角度介紹方案,相關基礎和資料穿插其中,感興趣就接著往下看吧。
模板驅動(規則大法)
這種形式的NLG使用模板驅動模式來顯示輸出,如比賽得分,天氣等場景常用,在現在客服系統對話中澄清需求、引導用戶、詢問、確認、對話結束語等大部分也是模板驅動。早先有很多研究復雜模板的方法,如根據語法樹模板生成等,一般包括下面幾個步驟:
模板化的NLG內容確定 :NLG 系統需要決定哪些信息應該包含在正在構建的文本中,哪些不應該包含。通常數據中包含的信息比最終傳達的信息要多
文本結構 :確定需要傳達哪些信息后,NLG 系統需要合理的組織文本的順序。例如在報道一場籃球比賽時,會優先表達「什么時間」「什么地點」「哪2支球隊」,然后再表達「比賽的概況」,最后表達「比賽的結局」
句子聚合 :不是每一條信息都需要一個獨立的句子來表達,將多個信息合并到一個句子里表達可能會更加流暢,也更易于閱讀。
語法化 :當每一句的內容確定下來后,就可以將這些信息組織成自然語言了。這個步驟會在各種信息之間加一些連接詞,看起來更像是一個完整的句子
參考表達式生成:這個步驟跟語法化很相似,都是選擇一些單詞和短語來構成一個完整的句子。不過他跟語法化的本質區別在于“REG需要識別出內容的領域,然后使用該領域(而不是其他領域)的詞匯”。
語言實現 :最后,當所有相關的單詞和短語都已經確定時,需要將它們組合起來形成一個結構良好的完整句子。
模型方面主要是VAE和seq2seq兩個思路
VAE的各種魔改
VAE是隱變量自編碼器,所謂自編碼器系列是研究把數據壓縮后,再盡量還原的模型。VAE在文本生成界應用已經開始有點邊緣了,不過對于seq2seq的系列文本生成,似然求解偏置問題導致的生成文本單一問題,VAE有天然優勢。VAE做文本生成最大的賣點是存在一個隱變量分布,在inference的時候會從分布中采樣,而seq2seq在給定輸入的時候輸出是確定的,無法做到VAE的給定輸入,輸出仍然會不同的效果。
先了解一下幾個概念:
【KL散度】
考慮某個未知的分布 ,用一個近似的分布 對它進行建模。如果我們使用 來建立一個編碼體系,用來把 的值傳給模型,那么由于我們使用了而不是真實分布,平均編碼長度比用真實分布進行編碼增加的信息量(單位是 nat )為:
KL 散度看做兩個分布 和 之間不相似程度的度量
KL散度也叫相對熵,看上面式子就是信息熵的相減
KL>=0, 和相等時,等號成立
最小化KL散度等價于最大化似然函數
【VAE原理】
筆者這里幾句話簡單描述一下VAE的原理:
VAE是隱變量自編碼器,自編碼器系列是研究把數據壓縮后,再盡量還原的模型
VAE在自編碼器的基礎上,中間加了隱變量,即壓縮成隱變量,然后由隱變量生成還原數據,且假設了隱變量的先驗分布為標準高斯分布,隱變量的每一個樣本后驗分布都服從一個高斯分布
loss由兩部分組成,由于隱變量的積分和后驗分布無法求解,因此用另外一個分布來來逼近原來的隱變量的分布,作為原來loss的下界,這個下界叫做ELBO變分下界。
loss中用來描述模擬分布與原來隱變量分布的差異項為KL散度
loss中另外一項為擬合的loss
編碼中,編碼器學習隱變量后驗分布的近似分布的均值和方差,得到了隱變量后驗分布的近似分布的表達式,從而可以計算KL散度。本質上,VAE訓練編碼器是希望KL散度值達到最小,即令后驗近似分布趨近于標準正態分布
解碼時基于經驗知識使用了一次采樣的近似操作,并依靠編碼器學習隱變量下樣本概率的參數,最后計算了條件概率下樣本的似然。VAE希望loss最大,本質上是希望樣本的重構誤差最小
詳細推導推薦大家可以看這篇:生成模型之VAE(https://zhuanlan.zhihu.com/p/106583041),或者蘇大神的變分自編碼器(一):原來是這么一回事(https://spaces.ac.cn/archives/5253)。
【VAE中KL散度消失問題】
從上面原理得知VAE?loss由兩部分組成,VAE?loss= reconstruction loss - KL loss, 那么最小化loss等價于最小化KL loss并最大化reconstruction loss:
最小化KL: 如果簡單的將 x認為和隱變量 z無關并讓,即后驗分布退化為和先驗分布一樣的高斯,KL就可以取得最小值0
最大化reconstruction: 當扮演角色的decoder足夠強大,僅憑自己就可以 分布,那么也沒有必要去依賴z
在現有encoder-decoder基礎上,很多時候decoder足夠強大到直接從生成文本,VAE退化為無條件語言模型,雖然依然很強,KL散度為0說明編碼器輸出的是常數向量,而解碼器則是一個普通的語言模型。而我們使用VAE通常來說是看中了它無監督構建編碼向量的能力,這是VAE的固病,有不少魔改VAE就是致力于解決這個問題,acl2020[2]有一篇直接加BN層的解法,常用幾種解法如下:
讓KL loss變強:
如動態調整KL loss的系數[3],
Free Bits[4](KL大于一個閾值時采取調整)
Normalizing flow[5] 不斷轉換得到一個更好的分布
Auxiliary Autoencoder[6] 多任務,將 VAE 和AE 兩部分分開訓練,加強編碼器信息抽取部分
讓decoder 變弱
word drop-out[7] 在訓練階段,將decoder 的部分輸入詞替換為UNK,也就是說 RNN 無法僅依靠前面的生成的詞來預測下一個詞了,因此需要去多依賴 z
Dilated CNN decoder[8], 不用RNN解碼而采用CNN,通過調整 CNN 的寬度,從最弱的 Bag-of-words model 到最強的LSTM ,Dilated CNN decoder 都可以無限逼近,做到控制解碼的強度
Additional Loss[9],引入額外的 loss,例如讓 z 額外去預測哪些單詞會出現,因此也被稱為 bag-of-words loss,他可以看做是增大了 reconstruction 的權重,讓 model 更多去關注優化reconstruction 項而不是KL
【CVAE】
我們在自編碼模型中引入隱變量的原因有兩點:
重構的恢復的過程是希望沒噪聲的,而KL loss則希望有高斯噪聲的,兩者是對立的,因此VAE跟GAN一樣,內部其實是包含了一個對抗的過程,只不過它們兩者是混合起來,共同進化的
隱變量便于我們控制生成,如隱變量不同的采樣有助于我們控制不同的生成內容
因此除了控制采樣,可以加入一些其他條件,更進一步的控制生成,那這就是 CVAE (conditional VAE?), 如下圖,在普通的VAE中我們是無監督的從中生成,而在cave中則引入了標簽作為條件從中生成,當然了,condition 可以是多種多樣的,這里舉個了個是y的例子。
CAVE在非常適用一對多的問題,你可以通過控制條件來控制生成的多樣性。如對話中
A:"你有什么興趣愛好?" B0:"我喜歡運動" B1:"先告訴我你的" B2:"hmm,我想想"【一些魔改方案】
VAE-seq2seq[10]
在VAE中直接引入attention時,attention會繞過隱變量空間而使得隱變量無效(如下圖中b,c), 因此作者提出了將attention也改造成 variational attention, 即也用隱變量來描述attention,并且應用在VED(variational encoder-decoder)框架中。
筆者在某廠的ppt中看到這種應用的效果不錯
多級隱變量VAE[11]
該篇主要針對長文本生成中語義不夠連貫,和VAE固有的KL散度易消失的問題,作者提出了一種多級隱變量的VAE, 對于VAE中經常解碼器太強大而導致KL無效的原因,作者認為應該加強隱變量的學習而不是去減弱解碼器的功能,同時作者認為多層特征抽取能捕捉到更細節的語義方便長文本的生成。如下圖,作者在編碼和解碼部分設計了兩級的編碼-解碼結構,作者任務高層的隱變量是來自于底層的推斷而不是直接高斯分布,有一定的語義信息,可以看成是一種高斯混合分布,且高層的特征捕捉容易捕捉到長文本里的細節信息 。
phvm[12](Planning-based Hierarchical Variational Model)
這是一篇CVAE應用的方案,應用在data to text 如,給出商品屬性,生成描述文本,給出風格事件,生成小說等。條件是給定商品的data,即若干個<屬性,值>,最后能生成廣告文案,模型框架類似與去先想好要說什么重點內容,然后組織語言去說;
輸入模塊:從給定的屬性值經過Bi-GRU編碼后壓縮成隱變量,以及個屬性編碼后的特征
計劃模塊:從隱變量和屬性以及特征中解碼出每句話要描述哪些屬性
生成模塊:生成模塊與上偏論文類似采用多級解碼結構
看起來生成效果不錯
seq2seq各種魔改
seq2seq在文本生成應用中更加主流,因此各種應用場景和改造也比較多,當然也有其固有的問題, 針對具體場景和問題也有很多解決方案,下面簡單介紹原理然后總結幾種思路方案
【seq2seq原理簡述】
通過深度神經?網絡將一個輸入的序列列映射為一個作為輸出的序列。這 個過程由encoder和decoder節組成。先將輸?映射到一個序列,然后通過序列解碼,解碼的時候當前值依賴與隱藏節點和解碼出來的上一個節點
Seq2Seq優點在于可以處理變長序列, 傳統的seq2seq會將輸?映射成?個中間固定序列,并且encoder隱藏節點對decoder貢獻一致的問題,可以通過加attention來解決,在 encoder和decoder之間,生成輸出詞時,會考慮每一個輸入詞和當前輸出詞的對齊關系(????重要程度),引用知乎大佬的一張圖如下:
【seq2seq+attention存在的問題】
受模型限制,文本生成質量會受到訓練數據集質量和多樣性的巨大影響。由于seq2seq的loss采用最大似然求解,必然容易導致偏置問題,生成的內容重復且單一, 如果想要模型生成出更多有趣多樣的內容,就需要復雜的數據過濾,采樣技術等
【seq2seq魔改方案】
針對生成單一問題的一般解是:
從數據角度入手,收集更多的高質量語料,或者做一些數據增強技術,如ACL2020一篇通過回譯做增強等,可以參考之前寫過的一篇筆記;
給語料添加一些如結構化的情感,知識之類的表達,在任務型QA中常見,非常的費人工;
在從模型的角度入手,改造seq2seq模型的學習目標促使他多樣化表達,或在seq2seq解碼時加一些特定調價增以便生成更多樣的內容;
修改loss:采用了最大互信息(MMI)[13]作為目標損失函數,MMI損失函數可以看成是在極大似然估計的基礎上,添加了一項對輸出句子概率的懲罰項, 把輸出句子的頻率考慮進loss中, 或者采用ITF-loss[14]等;
Seq2BF[15]:先預測關鍵詞,然后根據生成的關鍵詞去補全整個句子;
修改Beam Search算法,對每個時間步的條件概率施加多樣性懲罰,比如MMI-antiLM、diverseRL[16]、DBS[17]等;
針對生成的流暢性,以及不同場景下的生成要求,介紹一些方案如下:
【seq2seq copy機制[18]】
copy機制最初是為了解決OOV問題,如當有一些專有名詞不在你訓練時的詞表中時,那在生成時普通的seq2seq是無論如何也無法生成出該詞,copyNet的encoder端與普通seq2seq一致,在decode端生成時,copy機制的原理是,讓它以一定的概率為生成詞,一定的概率為復制該詞, 作者將encoder端生成的隱狀態向量序列定義為copyNet的短期memory,用M表示, 在解碼時M將被多次使用。
decode端的隱藏狀態更新時,會拼接進和在輸入序列中對應的隱狀態向量(這也是copy的體現
解碼端更新當前時刻的隱狀態時,每次動態地將encoder端生成的所有隱狀態向量序列(M)表示成(attention機制加權求和,attentive read)該時刻對應的context向量外,還會檢查解碼器上一時刻的輸出在輸入序列X中的位置(同一個詞可能會出現多次),然后在M中取出(selective read)相應位置對應的隱狀態向量ζ,如果不在的話M中的話,對應隱狀態為零向量。
M的兩種讀取方式(attentive read與selective read,本質上都是基于注意力進行相關運算的)使得copyNet可以在Generate-Mode與Copy-Mode間進行切換,甚至決定何時開始或者結束copy。Attentive Read就是在編碼器端的attention mechanism,Selective Read就是ζ的計算過程。如果在輸入序列X中,那么copyNet接下去的輸出就很可能偏向Copy-Mode。
這論文的圖太迷惑了我就不放了。
【seq2seq Pointer-generator network[19]】
與copyNet類似,Pointer-generator network在解碼端預測某個詞w的概率時,也綜合考慮從詞表生成(詞表分布PvocabPvocab)和從源輸入復制(attention分布)兩種情況。 不過其表現形式不同,具體如下:
類似它直接用詞w的attention的權值來代表了copy這個詞的可能性。
在生成多句文本序列時,很容易出現內容重復現象,為了消除這種現象,作者們提出了一種coverage機制。具體地,在每一時刻會維持一個coverage向量,其是解碼端在之前的各個時刻的attention分布之和,即
考慮Coverage機制后,在計算解碼器端t?1時刻的隱狀態向量與編碼器端第i個隱狀態向量的相關性得分(編碼和解碼之間的attention)時,需要同時考慮上述coverage向量。
其表示到目前t時刻為止,源文本輸入序列在attention機制下覆蓋密度的分布(未歸一化)情況.
這保證了當前的相關性得分參考了之前的權重累積和,從而有效抑制重復內容的出現。同時作者們又定義了一個額外的coverage損失來進一步懲罰在copy時相同位置copy多次的情況。具體損失函數為covloss,并加入最終loss:
【seq2seq 控制主題】
這種有條件的生成特別像VAE中通過控制隱變量來控制生成,控制生成主題一般通過關鍵字來約束,兩個思路
seq2BF直接用關鍵詞硬約束:
(a) 給定用戶的query,利用PMI(Pointwise Mutual Information)預測一個keyword作為reply的topic;
(b) 將query輸入encoder,爾后將上一步中預測的keyword作為decoder端的第一個詞輸入,然后依次預測得到一個序列backward sequence, 得到keyword和后面的句子;
(c) 將query輸入encoder,然后將backward sequence進行reverse后,連同keyword一起依次輸入decoder端,并開始預測得到剩下的序列forward sequence,得到keyword前面的部分。
拼接行程reply
關鍵詞融合在狀態更新中的軟約束[20]
關鍵詞不一定直接出現在生成的文本中,可能出現近義詞喝著近似意思的表達
設計cue word gru單元,將關鍵詞信息,加入到每一步的狀態更新
利用設計的fusion unit結構融合普通gru與 cue word gru 單元
【seq2seq屬性控制生成】
先預測屬性信息[21],然后直接當監督模型將屬性信息融合進解碼的過程中,每次解碼由context信息與屬性信息共同決定;
Seq 與VAE?的結合控制屬性[22],這與上文VAE類似也是一種CVAE, ?解碼步驟分別對功能相關的詞(function-related),主題詞,普通詞分別建模,最終形成一個混合模型
【Mem2Seq[23]】
現在有不少用知識庫來做任務增強的方案,本篇中作者利用MemNet從知識庫中動態獲得額外知識記錄更新并利用了copy機制來決策是生成還是copy知識庫中的內容;Mem2Seq是第一個使用帶有指針網絡思想的多跳注意力機制的模型,這種方法有效的結合了KB的信息且Mem2Seq學習如何生成動態的查詢來控制memory的訪問。前序知識需要了解MemNet大家可以參考這篇[24], copy和pointer Net前面介紹過。
上圖中a部分是encoder的核心,記憶,query要經過K-hop的更新,類似從歷史對話中找到這是真正的query是什么;
b部分描述解碼,每一個時刻,將產生兩個分布:詞表分布和記憶部分分布$P_{ptr}。記憶部分分布是指對話歷史以及KB的信息。
=
計算如下:
上式表明,當生成的詞與記憶存儲器中的詞相等時,使用記憶存儲器的詞,即完成復制功能,當生成的詞不在記憶存儲器中時,指向一個特殊字符,模型將使用詞表分布來生成輸出。
總結
從發展來看大家越來越希望文本生成是可控的,而不是單純的黑盒模型,同時希望生成的質量,多樣性,長度上能有所突破,因此也是主要針對生成的多樣性,語義連貫性和一致性,句式和情感表達控制這幾個方向研究。
三和廠妹三和,一個城市邊緣貧瘠人群的棲息地。廠妹,在社會勞動中尋找價值的初心青年。目前在平安科技AI研究院做算法,主要感興趣方向包括對話系統,知識圖譜,文本搜索,推薦系統。三和什么都沒有,廠妹也無知,所以每一個任務都是全新的開始。知乎ID:三和廠妹
由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點在看。星標具體步驟為:
點擊頁面最上方深度學習自然語言處理,進入公眾號主頁。
點擊右上角的小點點,在彈出頁面點擊設為星標,就可以啦。
參考資料
[1]
騰訊機器人日均寫稿過千篇 你讀的新聞可能是AI寫的: http://gd.sina.com.cn/sztech-news/hlw/2019-01-07/detail-ihqfskcn4716822.shtml
[2]A Batch Normalized Inference Network Keeps the KL Vanishing Away: https://arxiv.org/abs/2004.12585
[3]Generating sentences from a continuous space: https://arxiv.org/abs/1511.06349
[4]Improving Variational Inference With Inverse Autoregressive Flow: https://arxiv.org/abs/1606.04934
[5]Variational Lossy Autoencoder: https://arxiv.org/abs/1611.02731
[6]Improving Variational Encoder-Decoders in Dialogue Generation: https://arxiv.org/abs/1802.02032
[7]Generating Sentences from a Continuous Space: https://arxiv.org/abs/1511.06349
[8]Improved Variational Autoencoders for Text Modeling using Dilated Convolutions: https://arxiv.org/abs/1702.08139
[9]Learning discourse-level diversity for neural dialog models using conditional variational autoencoders: https://www.aclweb.org/anthology/P17-1061
[10]Variational Attention for Sequence-to-Sequence Models: https://arxiv.org/abs/1712.08207
[11]Towards Generating Long and Coherent Text with Multi-Level Latent Variable Models: https://www.aclweb.org/anthology/P19-1200
[12]Long and Diverse Text Generation with Planning-based Hierarchical Variational Model: https://arxiv.org/abs/1908.06605
[13]A Diversity-Promoting Objective Function for Neural Conversation Models: https://arxiv.org/abs/1510.03055
[14]Another Diversity-Promoting Objective Function for Neural Dialogue Generation: https://arxiv.org/abs/1811.08100
[15]Sequence to Backward and Forward Sequences: A Content-Introducing Approach to Generative Short-Text Conversation: https://arxiv.org/abs/1607.00970
[16]A Simple, Fast Diverse Decoding Algorithm for Neural Generation: https://arxiv.org/abs/1611.08562
[17]Diverse Beam Search: Decoding Diverse Solutions from Neural Sequence Models: https://arxiv.org/abs/1610.02424
[18]Incorporating Copying Mechanism in Sequence-to-Sequence Learning: https://www.aclweb.org/anthology/P16-1154.pdf
[19]Get To The Point: Summarization with Pointer-Generator Networks: https://arxiv.org/abs/1704.04368
[20]Towards Implicit Content-Introducing for Generative Short-Text Conversation Systems: https://www.aclweb.org/anthology/D17-1233/
[21]Towards implicit content-introducing for generative short-text conversation systems: https://www.aclweb.org/anthology/D17-1233/
[22]Generating Informative Responses with Controlled Sentence Function: https://www.aclweb.org/anthology/P18-1139
[23]Mem2Seq: Effectively Incorporating Knowledge Bases into End-to-End Task-Oriented Dialog Systems: https://www.aclweb.org/anthology/P18-1136
[24]MemNN記憶網絡的特征和芯片架構的實現: https://cloud.tencent.com/developer/news/557918
總結
以上是生活随笔為你收集整理的文本生成魔改方案汇总!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Data Grip
- 下一篇: ios沙箱软件_iOS沙盒管理工具FHH