王樂為,余 鷹,張應龍
華東交通大學 軟件學院,南昌330013
在文本生成領域,古詩生成一直是專家學者們關注與研究的熱點內容之一,其中常用的模型包括:基于給定規則的生成模型[1-2]、基于文本生成算法的生成模型[3-4]、自動摘要模型[5]和基于統計的機器翻譯模型[6-7]等。近年來,伴隨著深度學習技術的發展,基于循環神經網絡(recurrent neural network,RNN),如長短時記憶網絡(long short-term memory,LSTM)、門控循環單元(gated recurrent unit,GRU)等[8],也被廣泛應用于古詩生成,并取得了一定的效果。
在進行古詩生成時,人們往往希望能得到一段與某種意境相符的詩句,為此會提前輸入幾個表達意境的關鍵字或詞,對古詩的生成進行控制指導。當采用經典RNN 模型生成詩句時,首先預先給定一個關鍵字,然后系統會生成以該關鍵字為起始的詩句,隨機性較大,詩句所蘊含的意境一般很難達到要求。例如,要生成一句能表達在船中把酒言歡意境的詩句,若采用經典RNN 模型,則只能分別給定“船”或“酒”作為起始字來生成詩句,很難將二者同時融合在一句詩中,從而達不到一種既有“船”又有“酒”的意境效果。這是因為,經典RNN 模型雖然在訓練階段采用了N-N模式,即輸入N個文字,輸出N個文字,但在預測階段則采用了1-N模式,即輸入1 個關鍵字,生成N個文字。由于只能控制起始字符,使得生成的詩句隨機性較大,最終的生成效果無法控制。
經典RNN 模型要求輸入和輸出序列等長,但現實中大部分問題序列是不等長的,序列到序列模型(sequence to sequence,Seq2Seq)對此進行了改進。Seq2Seq 模型又稱Encoder-Decoder 模型,它突破了輸入與輸出序列必須等長的限制,在Encoder 端輸入N個文字,在經編碼后傳給Decoder 端,再解碼成M個文字。文獻[9-10]基于Seq2Seq 模型,實現了基于多個文字的古詩生成,但其缺點在于僅對第一句詩的輸出產生影響,無法將輸入的關鍵字信息體現在整首古詩中。Attention 機制將Encoder 端傳給Decoder端的編碼進行了針對性加權合成,在不同時刻賦予Decoder端不同的Encoder編碼,即它能夠在不同的時刻考慮不同的輸入信息,然后根據每個輸入文字生成包含該文字的詩句。加入Attention 機制[11]的Seq2Seq模型結構在機器翻譯上已取得非常好的效果,在機器翻譯任務上,輸入端的每個詞在輸出端往往都有其對應的翻譯詞。
因此,本文基于Seq2Seq 模型構建古詩生成模型,將關鍵字作為源語言,包含關鍵字的古詩句作為目標語言,并引入Attention 機制對其進行訓練,克服了文獻[8-10]所提算法的缺點,使得最終生成的古詩每一句內容可控。在預測階段,如果從描述性信息中提取的關鍵字不足,則通過word2vec[12]方法,尋找相似的關鍵字對輸入信息進行補充。此外,針對已有的古詩生成模型在生成五言或七言古詩時隨意性較大的問題,通過加入格式控制符,結合Attention 機制,有效地控制了古詩的體裁。
Seq2Seq 模型又稱作Encoder-Decoder 模型[13],設有一組輸入序列集合XN和輸出序列集合YN,N表示樣本總數,第i個樣本的輸入和輸出序列分別為xi1,xi2,…,xis和yi1,yi2,…,yip。s和p分別代表第i個樣本的輸入和輸出序列的字符個數。該模型可以計算出在某輸入序列樣本xi發生的情況下,輸出序列樣本yi發生的概率,其中vi表示第i個樣本的輸入序列xi1,xi2,…,xis經Encoder 端得到的隱含狀態向量。
Decoder 端在t時刻第i個樣本的概率分布為P(yit|vi,yi1,yi2,…,yi(t-1))=f(hi(t-1),yi(t-1),vi),其與Decoder端上一時刻的隱含狀態hi(t-1)以及輸出yi(t-1)還有Encoder 端的狀態向量vi相關,其中f(?)是Decoder端中的LSTM 的輸出。因此Seq2Seq 模型需使輸入訓練樣本的輸入序列能得到對應輸出序列的概率之和最 大,對 應 的對數似然條件概率函數為,使之最大化,θ是待確定的模型參數。
最基本的Seq2Seq 模型包含一個Encoder 和一個Decoder,通常的做法是將一個輸入的句子編碼成一個固定大小的狀態信息,然后作為Decoder 的初始狀態,但這個狀態對于Decoder 中所有時刻都相同。隨著序列的不斷增長,Decoder 端的解碼過程將表現越來越差。
加入Attention 機制后,Encoder 端可賦予輸入序列不同時刻的隱層特征不同的權重,在Decoder 端解碼的不同時刻,都會接受來自Encoder 端經不同加權組合的信息,從而達到在不同解碼階段有著不同的輸入信息。
假設x1,x2,…,xs為輸入序列,在Encoder 端的隱層向量為h1,h2,…,hs,另外zo為Decoder 端的初始狀態向量,計算每個隱層向量與zo的相似度a1,a2,…,as,使用softmax函數將其轉化成,傳入給Decoder 端作為輸入,根據zo和c0計算得到Decoder 端新的隱狀態向量z1,再計算Encoder 端的隱層向量與z1相似度,再得到c1,如此循環,直到解碼過程全部結束。
使用引入Attention 機制的Seq2Seq 模型進行古詩生成時,將整個過程劃分為訓練和預測兩個階段。在訓練階段,首先創建訓練數據集,每條訓練數據的Encoder 輸入部分包含四個關鍵字及一個格式控制符。格式控制符主要用來控制古詩的體裁,例如五言或七言。Decoder 輸出部分則為每句都包含對應關鍵字的一首古詩。在預測階段,用戶輸入一段描述性文字,系統從中提取出關鍵字并傳給模型的Encoder 端,若Encoder 端的輸入不足四個關鍵字,則通過word2vec方法進行關鍵字補全。
圖1 給出了t時刻古詩生成模型的結構圖,Encoder 端和Decoder 端均使用LSTM 模型,Encoder數據集中存放了關鍵字。在訓練時,輸入5 個關鍵字符,用x1、x2、x3、x4、x5表示,其中x5是格式控制符,在“A”和“B”間選擇,“A”表示生成五言古詩,“B”表示生成七言古詩。h1、h2、h3、h4、h5表示在不同時刻輸入信息在Encoder 端中經LSTM 處理輸出的對應隱狀態。

Fig.1 Model structure圖1 模型結構
首先計算在t時刻輸入Decoder 端的隱藏層狀態st-1對Encoder 每一個隱含層狀態hi的權重wt(i),如式(1)所示。

其中,score表示st-1和hi的相似度,使用余弦相似度進行度量,如式(2)所示。

接著利用權重wt(i)計算Encoder 端所有隱藏層狀態hi加權之和ct,即在t時刻整個Encoder 端最終輸出的狀態向量,計算方法如式(3)所示。

在訓練階段,需將ct和Decoder 隱藏層的t時刻狀態st-1以及t-1 時刻的真實標簽lt-1作為t時刻Decoder 的輸入,經LSTM 處理得到yt。在預測階段,則將lt-1換成t-1 時刻的實際輸出yt-1,yt的計算如式(4)所示。

為了減少計算量,在訓練階段,采用Sampled Softmax 作為輸出層,對應的全連接層矩陣為,在預測階段使用普通的Softmax 作為輸出層,全連接層矩陣用Wout表示。其中f(?) 是Decoder 端中的LSTM,Wout是Decoder 端中連接LSTM 輸出的全連接層,另外st-1和ct每次都需要更新,其中ct隨著st-1的更新而更新,st的更新方法如式(5)所示。

為了生成一首古詩,需要先輸入一段表達需求的描述性語言,然后從這段描述性語言中提取出關鍵字作為輸入信息。當提取的關鍵字數量不足時,需對關鍵字進行補充,但是所補充的關鍵字應與已提取的關鍵字具有較高的相關度。因此,首先采用word2vec 方法獲取Encoder 詞庫中每個關鍵字的詞向量kwm,然后利用余弦相似度度量詞庫中的關鍵字kwm與已提取關鍵字kwn之間的相似度sim(m,n)=。
為了簡化計算,在使用word2vec 方法時,每首古詩僅保留關鍵字部分,并將其作為word2vec方法的上下文,而不是將整首詩作為上下文。同時,將word2vec中的窗口大小設置為7,詞向量維度設置為200,選取skip-gram 模型進行處理,具體過程如圖2 所示。
此外,在進行關鍵字補充時,如果在描述內容中僅提取出一個關鍵字,則選取與該關鍵字相關度最高的三個作為補充;如果提取出兩個關鍵字,則隨機從與每個關鍵字相關度最高的前三個中分別選取一個作為另外兩個關鍵字;如果提取三個關鍵字,則分別計算與每個關鍵字相似度最高的前三個,取其交集作為第四個關鍵字,如果交集為空,則隨機選取三個關鍵字中的一個,再隨機選取與其相似度最高的前三個中的一個作為第四個關鍵字,具體過程如圖3所示,其中括號里的值表示相似度大小。

Fig.2 Use word2vec to turn keywords into vectors圖2 使用word2vec將關鍵字轉化為向量

Fig.3 Keyword completion operation圖3 關鍵字補全操作
為了完成實驗,人工收集整理了四萬多首唐詩,用于構建實驗數據集。首先將原唐詩中的八句詩轉換成兩首四句詩,并統計所有字的字頻,取出頻率最高的前200 個字作為Encoder 的詞庫,然后遍歷每首唐詩中存在于該詞庫中的字,用排列組合的方式分別對關鍵字進行匹配,先對前兩句和后兩句進行部分排列組合,再進行整體排列組合,所有關鍵字的組合作為Encoder數據集部分,對應詩句則作為Decoder數據集部分。此外,如果是五言詩,則在Encoder 數據集中的每一個關鍵字組合后加上格式控制符“A”,如果是七言詩,則加上“B”。經過處理,最終得到27萬對信息,將其中的23 萬對作為訓練集,另外4 萬對作為測試集。數據集的構建過程如圖4 所示,具體數據集樣本展示如圖5 所示。
本文Encoder 和Decoder 都使用了LSTM 模型,隱層數量都為三層,每層神經元個數為256 個。每個字的Embedding Size 大小為256,為了使模型更快地收斂,在訓練階段,Decoder 端每個時刻的輸入沒有采用上個時刻的輸出,而是使用真實樣本作為輸入,且使用了Sampled SoftMax[14],采樣個數為512。batch size 設置為64,優化過程選擇隨機梯度下降算法,初始學習率(learning rate)設置為0.5,學習率衰減(learning rate decay)設置為0.9。

Fig.4 Data set construction process圖4 數據集構建過程
由于古詩的評價涉及到多個方面,就目前而言還沒有具體的古詩生成評價指標,雖然有不少學者借助機器翻譯中的BLEU(bilingual evaluation understudy)評價指標[15],但并不能真實反映古詩的生成效果,其主要問題在于古詩中的韻律、意義等方面無法用具體的指標表達,但古詩的流暢度是可以通過語言模型的方法進行一定的評價,故本文首先選擇了困惑度指標Perplexity,該指標表示在逐字生成語句時,每個字生成的可選擇性大小。該指標越小,說明在每個字生成時的可選擇性越少越具體,最終的句子出現的概率越大,句子質量也越高,模型生成效果越好,Perplexity 的計算如式(6)所示。

Fig.5 Data set samples display圖5 數據集樣本展示

此外,由于僅使用Perplexity 評價指標并不能充分體現出所生成詩句的好壞,因此額外選擇了主觀的人工評價指標,即選取了30 位碩士學歷以上的文學專業的學者從流暢度、韻律、意義三方面對本文的方法和一些基準方法進行了打分和比較。

Fig.6 Perplexity values圖6 Perplexity 指標
本文每間隔300 步在訓練集和測試集上分別使用困惑度指標Perplexity 對五言古詩和七言古詩進行評價,如圖6 所示。實驗結果表明在訓練集上,不論五言還是七言古詩困惑度都會隨著訓練步數的增加而降低,模型具有較好的收斂效果。而在測試集上,當訓練到20 000 步左右時,五言和七言古詩的困惑度指標都開始上升,模型出現了過擬合現象。另外一點是,相比七言古詩而言,五言古詩有著更低的Perplexity值。
分別選取五言和七言Perplexity最低時的模型用來生成古詩,采用人工評價的方法,本文對比了三種基準方法:SMT(statistical machine translation models)、RNNPG(recurrent neural networks for poetry generation)、ANMT(attention-based neural machine translation)。其中SMT 模型使用了統計機器翻譯的方法,RNNPG模型整合了CNN(convolutional neural network)、句子級別的RNN、字符級別的RNN,ANMT 使用了基于神經網絡的機器翻譯模型,結果如表1 所示。
相比基準模型,本文模型在流暢度、韻律、意義上都取得較好效果,其中五言詩的效果在三方面都取得一定提升,而七言詩在流暢度及韻律上較ANMT模型略顯不足,但在意義上不論五言還是七言詩的生成效果都得到提升,這源于本文使用了基于注意力機制的編碼方法,在不同時刻生成詩句時考慮到不同的關鍵字信息,從而生成更有意義的詩句。本文的模型較SMT 和RNNPG 都顯得有很大提升,這在一定程度上也說明了Seq2Seq 模型相比于傳統的基于語言模型的生成方法有著更好的效果。
為了展示本文模型的生成效果,表2 分別給出了一首五言和七言古詩的示例展示。在五言詩的生成中,先從描述內容中提取出“月”“風”“葉”“孤”這四個關鍵字,最后生成的詩句中也都體現了這四個關鍵字的信息,且整體上表現出了“一個人寂寞和孤獨”的意境效果。在七言詩的生成中,同樣也從描述中提取出了“夜”“酒”“雨”“愁”四個關鍵字,最后所生成的詩句不僅體現出關鍵字信息,還創造出一種“在船上送別友人,充滿了離愁之情”的畫面效果。

Table 1 Manual evaluation表1 人工評價結果

Table 2 Poetry generation examples表2 古詩生成示例
本文基于Seq2Seq 模型構建了古詩生成模型,將編碼、解碼和Attention 機制運用到了古詩生成上。設計和構建了相應的古詩生成數據集,并加入了關鍵字控制符的概念,在關鍵字不足時,可進行關鍵字補全,與傳統的古詩生成任務相比,顯得更加靈活可控,能夠生成與大致意境相符的詩句。在接下來的工作中,將加入生成對抗和強化學習的思想,讓古詩的生成更加豐富,更加符合人們的審美。