黨宏社,陶亞凡,張選德
陜西科技大學(xué) 電氣與控制工程學(xué)院,西安710021
文本摘要生成是自然語言處理的一個(gè)重要的方向,要求機(jī)器閱讀一篇文章后自動(dòng)生成一段具有概括性質(zhì)的內(nèi)容[1],比如生成摘要[2]或標(biāo)題[3]。與一些其他的應(yīng)用不同,如機(jī)器對(duì)話[4]、機(jī)器翻譯[5]等輸入和輸出文本的長度較為接近,文本摘要的輸入的文本長度往往遠(yuǎn)大于輸出的文本長度,輸入與輸出的不對(duì)稱也使得其較為特殊,因此誕生了一種抽取式的方式[6]——在原文中尋找重要的部分,將其復(fù)制并拼接成生成的摘要[7],但是抽取的單詞往往因?yàn)槿鄙龠B接詞而不連續(xù),而且無法產(chǎn)生原文中不存在但是需要的新單詞。因此人們需要一種類似人類書寫摘要的方法,先閱讀文章并理解,再自己組織語言編寫摘要,摘要與原文意思接近且主旨明確。隨著序列到序列(Sequence-to-Sequence,Seq2Seq)模型的成功[8],使用遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Networks,RNN)來閱讀文章和生成題目成為可能[9]。
但是常規(guī)的Seq2Seq模型[10]存在一些問題,首先,進(jìn)行摘要生成任務(wù)之前,需要先建立固定大小的詞匯表,在處理文本時(shí)將文本的每個(gè)單詞用其在詞匯表中的索引代替。但是幾乎所有的文章都會(huì)出現(xiàn)詞匯表中沒有的(Out-of-Vocabulary,OOV)單詞,如人名、地名、比分等,當(dāng)常規(guī)Seq2Seq 模型遇到這些單詞后,只能將其統(tǒng)一視作不認(rèn)識(shí)的單詞(Unknown Word,UNK),因此輸出也經(jīng)常會(huì)出現(xiàn)UNK[11]。目前該問題已經(jīng)有較好的解決方案,如指針網(wǎng)絡(luò)[12]。
然而有很多其他的問題目前并沒有統(tǒng)一的解決方案。在生成多句話的摘要時(shí),常常會(huì)生成重復(fù)的單詞或句子[13]。See 等人[13]利用修改損失函數(shù),加入coverage項(xiàng),強(qiáng)制要求每個(gè)時(shí)間步的輸出注意力分散,此方法在一定程度上改善了重復(fù)問題,但是由于修改了損失函數(shù),使得優(yōu)化目標(biāo)與真實(shí)目標(biāo)存在了一定偏差。Liu等人[14]增加判別網(wǎng)絡(luò)來評(píng)估生成的摘要,可以達(dá)到識(shí)別重復(fù)句子的效果,但是增加了一倍的計(jì)算量,且生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò)在訓(xùn)練時(shí)需要達(dá)到動(dòng)態(tài)平衡,非常難以訓(xùn)練。
此外,在序列生成的任務(wù)中還有一個(gè)較為常見的問題,稱為曝光偏差(exposure bias)[15],即在訓(xùn)練過程中,解碼器的每一個(gè)輸入單詞使用訓(xùn)練樣本中正確輸出的上一個(gè)單詞,而在測(cè)試階段,解碼器每一個(gè)輸入單詞為自己的上一個(gè)輸出單詞,因此造成的測(cè)試與訓(xùn)練時(shí)結(jié)果的偏差。經(jīng)過較長時(shí)間的訓(xùn)練后,模型在訓(xùn)練集上的ROUGE 得分常常出現(xiàn)50 以上,而測(cè)試集卻只有30 多。這種現(xiàn)象說明產(chǎn)生了較為嚴(yán)重的過擬合,對(duì)最終的效果帶來一定的負(fù)面影響。
針對(duì)以上問題,本文研究思路如下:(1)對(duì)于重復(fù)問題,對(duì)歷史生成的單詞增加注意力,使得模型在生成當(dāng)前單詞時(shí)考慮到歷史生成的單詞,防止生成已經(jīng)生成過的單詞,稱之為解碼自注意力,同時(shí)考慮歷史的注意力,防止與之前的注意力過于相似,鼓勵(lì)模型注意其他部分,稱之為存儲(chǔ)注意力。(2)現(xiàn)有的注意力大多采用向量點(diǎn)積來衡量相似度,但是實(shí)現(xiàn)更復(fù)雜的關(guān)系則無法實(shí)現(xiàn),因此我們對(duì)注意力計(jì)算方式改進(jìn)為單層神經(jīng)網(wǎng)絡(luò),使其具備避免重復(fù)的能力。(3)對(duì)于曝光偏差問題,根本的解決方法是在訓(xùn)練時(shí)輸入上一個(gè)時(shí)刻的輸出,但是這樣會(huì)造成訓(xùn)練極不穩(wěn)定通常不收斂,而借助強(qiáng)化學(xué)習(xí)(Reinforcement Learning,RL)[16],把整個(gè)模型當(dāng)作一個(gè)智能體(agent),將生成的摘要作為與參考摘要的ROUGE得分[17]作為獎(jiǎng)賞(reward),以生成的整個(gè)句子作為優(yōu)化目標(biāo)來增加訓(xùn)練時(shí)的穩(wěn)定性,最后通過策略梯度[18](policy gradient)來訓(xùn)練。
將使用到的符號(hào)做如下定義:ne表示編碼器(encoder)長度,nd表示解碼器(decoder)長度,x={x1,x2,…,xne}表示編碼器輸入單詞序列,h={h1,h2,…,hne}表示編碼器的輸出序列,s={s1,s2,…,snd}表示解碼器的輸出序列,y={y1,y2,…,ynd}表示最終輸出的單詞序列而表示訓(xùn)練樣本參考摘要中的單詞序列,[a,b]表示將向量a 和向量b 合并為一個(gè)向量。
在強(qiáng)化學(xué)習(xí)領(lǐng)域,一般的模型結(jié)構(gòu)如圖1(a)所示,智能體首先從環(huán)境獲取當(dāng)前的狀態(tài),然后進(jìn)行運(yùn)算得到動(dòng)作輸出至環(huán)境,環(huán)境再根據(jù)智能體的動(dòng)作計(jì)算獎(jiǎng)賞同時(shí)得到下一個(gè)時(shí)刻的狀態(tài),由此循環(huán)一直到終止?fàn)顟B(tài)停止,將此過程稱為一次完整交互。智能體根據(jù)一次完整交互中獲得的獎(jiǎng)賞通過強(qiáng)化學(xué)習(xí)算法來更新智能體的輸出規(guī)則。
圖1 模型整體結(jié)構(gòu)
將強(qiáng)化學(xué)習(xí)應(yīng)用在文本摘要生成任務(wù)中,結(jié)構(gòu)如圖1(b)所示,將評(píng)價(jià)指標(biāo)和訓(xùn)練樣本組合抽象為一個(gè)整體作為環(huán)境,摘要生成模型抽象為一個(gè)智能體,一次完整的交互和訓(xùn)練過程為:
(1)環(huán)境中由訓(xùn)練樣本提供文本x,作為狀態(tài)送入摘要生成模型。
(2)摘要生成模型根據(jù)文本x 生成摘要y,并送入環(huán)境。
(3)環(huán)境中的評(píng)價(jià)指標(biāo)結(jié)合生成的摘要y 與訓(xùn)練樣本中的參考摘要y*計(jì)算得分,將得分作為獎(jiǎng)賞再返回給摘要生成模型,同到達(dá)終止?fàn)顟B(tài),一次完整的交互結(jié)束。
(4)摘要生成模型根據(jù)此次交互得到的獎(jiǎng)賞通過強(qiáng)化學(xué)習(xí)算法訓(xùn)練生成模型。
摘要生成模型包括編碼和解碼兩個(gè)步驟,編碼時(shí)每個(gè)時(shí)刻輸入文本中的一個(gè)單詞,其目的為讓模型理解每個(gè)單詞的意思和整體的意思;在解碼時(shí),第一個(gè)時(shí)刻輸入表示開始信號(hào)的特殊字符,其余時(shí)刻輸入上一個(gè)生成的單詞,第i 個(gè)時(shí)刻的輸出為生成的第i 個(gè)單詞yi。解碼時(shí)的第三個(gè)時(shí)刻的摘要生成模型示意圖如圖2所示,此時(shí)輸入為y2輸出為y3。生成模型以輸出表示結(jié)束的特殊字符結(jié)束。本文主要改進(jìn)了其中的注意力機(jī)制和上下文向量,模型的訓(xùn)練過程如下所示:
(1)輸入單詞序列經(jīng)過嵌入層得到同樣長度的向量,再送入編碼器中。
(2)對(duì)所有輸入文本編碼后,將編碼信息送入解碼器。
(3)將上一個(gè)時(shí)刻的輸出經(jīng)過嵌入層送入解碼器,得到當(dāng)前時(shí)刻的輸入。
(4)計(jì)算存儲(chǔ)注意力和解碼自注意力,得到編碼器與解碼器的上下文向量。
(5)將上下文向量和解碼器輸出送入生成與指針網(wǎng)絡(luò),得到輸出的單詞。
(6)重復(fù)(3)到(5)直到輸出單詞為表示結(jié)束的特殊字符或超過設(shè)定最大長度,至此完成整個(gè)摘要的輸出。
(7)將生成的摘要與訓(xùn)練樣本中的參考摘要通過評(píng)價(jià)指標(biāo)計(jì)算獎(jiǎng)賞,并由此訓(xùn)練生成模型。
下面分別對(duì)文本預(yù)處理、基本結(jié)構(gòu)、存儲(chǔ)注意力、解碼自注意力、生成與指針網(wǎng)絡(luò)、損失函數(shù)和強(qiáng)化學(xué)習(xí)進(jìn)行詳細(xì)介紹。
在將文章送入模型前,首先需要進(jìn)行文本預(yù)處理,處理的過程如下:
(1)首先對(duì)所有的文章按照單詞進(jìn)行分割,截取固定長度的單詞(如前400),長度不夠的文章將在后面添加表示填充意義的特殊字符。
(2)根據(jù)單詞的出現(xiàn)頻率對(duì)單詞進(jìn)行編號(hào),取一定長度的個(gè)數(shù)建立編號(hào)與單詞一一對(duì)應(yīng)的全局單詞表(如選取出現(xiàn)頻率最高的5萬個(gè)單詞)。
(3)在編碼時(shí)將每個(gè)單詞的編號(hào)輸入模型,每個(gè)時(shí)刻輸入一個(gè)。每個(gè)批次中未在全局單詞表中的單詞會(huì)建立一個(gè)臨時(shí)單詞表(僅在這個(gè)批次訓(xùn)練中使用)。
模型最終輸出為每個(gè)單詞的編號(hào),再根據(jù)全局單詞表和臨時(shí)單詞表還原出單詞。
模型的基本結(jié)構(gòu)包括嵌入層、編碼器和解碼器,我們的基本結(jié)構(gòu)參考文獻(xiàn)[10],嵌入層為一個(gè)全連接層,輸入單詞的編號(hào),輸出固定長度的詞向量,詞向量再輸入編碼器或解碼器。編碼器采用單層的雙向LSTM,由前向LSTM(LSTMf)和后向LSTM(LSTMb)組成,編碼器的的輸出由前后向LSTM 的輸出合并而成,即第i個(gè)時(shí)間步的輸出
為了防止生成重復(fù)的單詞,引入存儲(chǔ)注意力,即在每個(gè)解碼時(shí)間步將注意力進(jìn)行保存,在新的時(shí)間步得到的注意力除以歷史注意力之和,削弱之前注意力高的部分,增強(qiáng)之前較少關(guān)注的部分。解碼器的第t 個(gè)時(shí)間步的輸出對(duì)編碼器每個(gè)時(shí)間步的注意力計(jì)算公式如下:
在傳統(tǒng)的注意力機(jī)制中,沒有對(duì)歷史的注意力進(jìn)行保存,因此傳統(tǒng)的注意力機(jī)制的的計(jì)算公式為
根據(jù)第t 個(gè)時(shí)間步對(duì)編碼器每個(gè)輸出的注意力,可以得到編碼器的上下文向量(context vector),其計(jì)算公式如下:
圖2 摘要生成模型在解碼的第三個(gè)時(shí)刻的示意圖
除了臨時(shí)存儲(chǔ)注意力機(jī)制,還引入解碼自注意力,為了在生成新單詞時(shí)可以對(duì)之前生成過的單詞進(jìn)行關(guān)注,防止重復(fù)。在第t >1 個(gè)時(shí)間步時(shí),解碼器輸出對(duì)于第0 <j <t 個(gè)時(shí)間步的輸出的注意力的計(jì)算公式如下:
其中,vd、、和都是需要學(xué)習(xí)的參數(shù)。
在第t=1 個(gè)時(shí)間步時(shí),解碼器上下文向量cdt 為0向量,當(dāng)t >1 時(shí),cdt 的計(jì)算公式如下:
第t 個(gè)時(shí)間步最終輸出單詞的分布為Pv,表示單詞表中輸出每個(gè)單詞的概率,Pv與編碼器的上下文向量、解碼器的上下文向量和解碼器當(dāng)前輸出st均有關(guān),使用線性函數(shù)加softmax 來計(jì)算:
其中Wout和bout是需要學(xué)習(xí)的參數(shù)。
綜合Ptv和指針網(wǎng)絡(luò),得到最終輸出單詞yt的概率為:
當(dāng)然,若單詞表中不存在單詞yt,則
在訓(xùn)練RNN 做序列生成任務(wù)時(shí),最常用的方法為“teacher forcing”[19],在解碼的每個(gè)時(shí)間步以最大化似然估計(jì)作為目標(biāo)進(jìn)行網(wǎng)絡(luò)的訓(xùn)練。用表示正確的摘要中第t 個(gè)單詞,最大化似然估計(jì)等價(jià)于最小化下面的損失函數(shù):
首先,使用這樣的損失函數(shù),訓(xùn)練時(shí)解碼器輸入為真實(shí)輸出,然后測(cè)試時(shí)為自身的輸出,會(huì)造成“exposure bias”;其次,似然估計(jì)的目標(biāo)與評(píng)價(jià)指標(biāo)如ROUGE 存在一定偏差,會(huì)出現(xiàn)損失函數(shù)的值降低,ROUGE反而升高,或相反。
為解決這兩個(gè)問題,構(gòu)建了強(qiáng)化學(xué)習(xí)模型。將輸入的文本作為狀態(tài),網(wǎng)絡(luò)模型作為Actor,輸出的整個(gè)摘要作為動(dòng)作,輸出摘要的ROUGE得分作為獎(jiǎng)賞。構(gòu)建的網(wǎng)絡(luò)模型中,無論在訓(xùn)練還是在測(cè)試中解碼器的輸入均為自己上一個(gè)時(shí)刻的輸出,因此可以避免曝光偏差的產(chǎn)生。而由于獎(jiǎng)賞的計(jì)算直接使用了最終的評(píng)價(jià)指標(biāo),因此也不存在優(yōu)化目標(biāo)的偏差。
設(shè)θ 為網(wǎng)絡(luò)模型中所有可訓(xùn)練的參數(shù),則訓(xùn)練的目標(biāo)為計(jì)算最優(yōu)的θ 使生成效果最好。在訓(xùn)練時(shí),網(wǎng)絡(luò)先生成摘要,然后計(jì)算獎(jiǎng)賞,再計(jì)算損失函數(shù)關(guān)于θ 的梯度,使用梯度下降的方法更新所有θ。
將輸出摘要y 的獎(jiǎng)賞記做R(y),最大值為1最小值為0,訓(xùn)練的目標(biāo)為最大化生成摘要的期望獎(jiǎng)賞,即損失函數(shù)LRL(θ)為負(fù)的期望獎(jiǎng)賞:
根據(jù)策略梯度算法可以得到損失函數(shù)關(guān)于θ 的梯度:為了減小梯度的方差,向公式中增加基線b(baseline):
為了計(jì)算R(y)和b,定義了兩種產(chǎn)生輸出的規(guī)則,用ys表示根據(jù)分布采樣得到的輸出,用yg表示根據(jù)分布貪婪得到的輸出。
將R(yg)作為優(yōu)化目標(biāo),而R(ys)作為基線,得到式(14)所對(duì)應(yīng)的損失函數(shù)為如下形式:
該公式也可以直觀的解釋,當(dāng)R(yg)大于R(ys)時(shí),需要增大輸出使用貪婪方法得到摘要中每一個(gè)單詞的概率,即最大化,其等價(jià)于最小化LRL。
在更新參數(shù)時(shí),首先根據(jù)損失函數(shù)計(jì)算關(guān)于最外層參數(shù)的梯度,再根據(jù)鏈?zhǔn)角髮?dǎo)法則逐層向前計(jì)算梯度,然后選擇優(yōu)化方法(如Adagrad[21])迭代更新參數(shù)。由于如今的深度學(xué)習(xí)框架只需要構(gòu)建前向計(jì)算圖,然后根據(jù)損失函數(shù)自動(dòng)反向計(jì)算梯度,且計(jì)算梯度并不是本文的重點(diǎn),因此省略損失函數(shù)關(guān)于模型中每個(gè)參數(shù)的梯度的計(jì)算。
選擇在數(shù)據(jù)集CNN/Daily Mail 上進(jìn)行訓(xùn)練并驗(yàn)證,該數(shù)據(jù)集由網(wǎng)絡(luò)新聞組成,平均一篇文章781 個(gè)單詞(tokens),每篇文章匹配一個(gè)平均3.75句話的摘要,平均56個(gè)單詞。通過文獻(xiàn)[13]提供的方法,獲得了與其相同的287 226 個(gè)訓(xùn)練樣本,13 368 個(gè)驗(yàn)證樣本,11 490 個(gè)測(cè)試樣本,并在使用過程中未對(duì)樣本進(jìn)行預(yù)處理。
對(duì)于所有的實(shí)驗(yàn),詞向量的維度為128,未使用預(yù)訓(xùn)練的詞向量如word2vec[20]等,LSTM 的內(nèi)部狀態(tài)為256維,單詞表使用5 萬個(gè)單詞。優(yōu)化方法使用Adagrad[21],學(xué)習(xí)速率為0.15。使用文獻(xiàn)[13]提供的預(yù)訓(xùn)練的模型,增加存儲(chǔ)注意力、解碼自注意力和強(qiáng)化學(xué)習(xí)。批大?。╞atch size)使用20,解碼時(shí)使用beam 為5 的集束搜索(beam search)。
使用單臺(tái)計(jì)算機(jī),顯卡為NVIDIA GeForce GTX 1080Ti,CPU 為Intel Core i7-7700K,4.2 GHz,內(nèi)存為32 GB。使用ubuntu16.04 操作系統(tǒng),編程語言使用Python,版本為3.5,深度學(xué)習(xí)框架使用tensorflow[22]。
首先,在測(cè)試集上對(duì)比了基礎(chǔ)結(jié)構(gòu)、存儲(chǔ)注意力、混合注意力以及混合注意力加強(qiáng)化的模型生成的摘要中的重復(fù)情況。統(tǒng)計(jì)了生成結(jié)果中含有重復(fù)的2單詞組、3單詞組和句子的樣本占總測(cè)試集大小的百分比,統(tǒng)計(jì)結(jié)果如表1所示。
表1 生成摘要中的重復(fù)率
由統(tǒng)計(jì)結(jié)果得知,參考摘要中單詞組重復(fù)率非常低,且不存在句子重復(fù),而基礎(chǔ)結(jié)構(gòu)存在大量的重復(fù)單詞組和句子,增加存儲(chǔ)注意力后無論是單詞組還是句子的重復(fù)率大大下降;而增加混合注意力后單詞組的重復(fù)率又大幅下降,且句子已經(jīng)沒有重復(fù);但增加強(qiáng)化學(xué)習(xí)對(duì)于重復(fù)問題的幫助并不是特別明顯。
對(duì)于生成的摘要,使用ROUGE-1(RG-1)、ROUGH-2(RG-2)和ROUGE-L(RG-L)為評(píng)價(jià)指標(biāo),來衡量生成的摘要與參考摘要的相似程度,值越大表明相似程度越高,在使用強(qiáng)化學(xué)習(xí)的模型中的優(yōu)化目標(biāo)為ROUGE-L。測(cè)試結(jié)果如表2所示。
在基本結(jié)構(gòu)上增加存儲(chǔ)注意力、混合注意力和混合注意力加強(qiáng)化的效果依次增加,說明混合注意力與強(qiáng)化學(xué)習(xí)在一定程度上對(duì)現(xiàn)有問題起到較好的效果,且對(duì)比了Nallapati 等人提出的抽取式的方法[10]、See 等人提出的Pointer-Generator Coverage(PGC)方法[13]以及Liu 等人提出的Generative Adversarial Network(GAN)方法[14],在三個(gè)指標(biāo)中均有超越。
表2 模型在測(cè)試集的ROUGE得分
其中,抽取式的方法同樣采用了序列到序列的架構(gòu),但沒有用來閱讀文章和生成標(biāo)題,而是在原文中選擇重要的單詞抽取出來組合為摘要。PGC 與本文架構(gòu)部分重合,不同的地方在于其采用傳統(tǒng)的注意力機(jī)制,訓(xùn)練方法也使用的傳統(tǒng)的“teacher forcing”的方法,但使用一種coverage 方法強(qiáng)制解碼時(shí)不同時(shí)刻注意力的分布要不同。采用GAN 的方法包括兩個(gè)網(wǎng)絡(luò)架構(gòu)、一個(gè)生成器、一個(gè)判別器,而生成器同樣使用傳統(tǒng)注意力的序列到序列架構(gòu),使用判別器來區(qū)分生成的摘要和參考的摘要,而生成器的目標(biāo)為生成高質(zhì)量的摘要來騙過判別器,兩個(gè)網(wǎng)絡(luò)周期性交替訓(xùn)練。
同時(shí),統(tǒng)計(jì)了PGC 與加入混合注意力和混合注意力加強(qiáng)化的模型在訓(xùn)練集訓(xùn)練時(shí)的ROUGE得分,如表3所示。
表3 模型訓(xùn)練收斂時(shí)的ROUGE得分
結(jié)合訓(xùn)練和測(cè)試時(shí)的ROUGE得分,不難發(fā)現(xiàn)PGC和混合注意力模型在訓(xùn)練集的得分遠(yuǎn)高于測(cè)試集的得分,這就說明產(chǎn)生了曝光偏差,也就產(chǎn)生了較嚴(yán)重的過擬合,主要原因是在訓(xùn)練時(shí)每個(gè)時(shí)間步輸入為參考摘要的上一個(gè)單詞,因此模型是在已知上一個(gè)單詞的情況下去預(yù)測(cè)下一個(gè)單詞的。這種過擬合所帶來的最直接的影響就是惡化了測(cè)試集的結(jié)果。而使用強(qiáng)化學(xué)習(xí)這種方法使得模型在訓(xùn)練集和測(cè)試集的結(jié)果基本接近,也就消除了曝光偏差,最終在測(cè)試集的效果帶來一定的提高。
本文針對(duì)文本摘要生成的任務(wù),采用Seq2Seq 架構(gòu),引入存儲(chǔ)注意力和解碼自注意力來解決重復(fù)問題,使用指針網(wǎng)絡(luò)來解決OOV 單詞的輸出,引入強(qiáng)化學(xué)習(xí)來針對(duì)評(píng)價(jià)指標(biāo)做定向優(yōu)化并解決“exposure bias”問題。使用數(shù)據(jù)集CNN/Daily Mail 對(duì)本文模型進(jìn)行驗(yàn)證,實(shí)驗(yàn)結(jié)果表明混合注意力機(jī)制和強(qiáng)化學(xué)習(xí)可分別帶來一定程度的優(yōu)化,最終效果超越了世界先進(jìn)的模型。
對(duì)于文本摘要生成,有很多還可以探討的地方,如:
(1)詞嵌入可以使用最先進(jìn)的預(yù)訓(xùn)練模型(如BERT[23]或XLNet[24])。
(2)網(wǎng)絡(luò)架構(gòu)除了Seq2Seq,也可選用ConvS2S(Convolutional Sequence to Sequence[25])、全注意力模型[5]或神經(jīng)微分方程[26]等。
(3)解碼部分可以引入逆強(qiáng)化學(xué)習(xí)(Inverse Reinforcement Learning)[27]來對(duì)網(wǎng)絡(luò)的生成結(jié)果進(jìn)行評(píng)估,并使用蒙特卡洛樹搜索(Monte Carlo Tree Search)[28]來尋找最優(yōu)的生成結(jié)果。