结合多注意力和条件变分自编码器的宋词生成模型*

2022-06-10 03:22黄文明温雅媛邓珍荣
广西科学 2022年2期
关键词:连贯性宋词编码器

梁 骁,黄文明,2,姚 俊,温雅媛,邓珍荣,2**

(1.桂林电子科技大学计算机与信息安全学院,广西桂林 541004;2.广西图形图像与智能处理重点实验室,广西桂林 541004;3.广西壮族自治区高级人民法院,广西南宁 530000;4.广西师范大学电子工程学院,广西桂林 541004)

词源于民间,兴于五代,盛于两宋。宋词是人们对文化生活强烈追求的产物,也是中国传统文化最重要的文学形式之一。宋词自动生成研究能帮助普罗大众学习和自动生成宋词,对进一步弘扬中华民族传统文化具有重要意义。近年来,神经生成模型在自然语言处理上得到广泛应用,其中的古诗词自动生成研究受到众多学者的青睐,引起了研究者们浓厚的兴趣。

将现有的古诗词自动生成研究分为传统方法和基于深度学习的方法。传统方法通过诗词领域的专家人为设计规则和约束来生成古诗词。其中基于模板的方法类似于完形填空,从诗歌中去除一些单词,再从单词库中选择合适的单词放入空白处形成新的诗歌。周昌乐等[1]提出基于遗传算法的宋词生成方法,从语料库中随机选择一句词句,用设计好的评估函数评价词句,并不断迭代直到生成整首宋词,但该方法缺乏语义连贯性。Yan等[2]将古诗生成看成给定写作意图的摘要生成问题,同时加入一些优化约束。He等[3]将诗歌生成看成统计机器翻译问题,人为加上平仄押韵等约束。Tosa等[4]和Wu等[5]采用短语搜索的方法生成日本诗。Netzer等[6]采用基于词联想的方法生成俳句。Oliveira等[7,8]提出了一种基于语义和语法模板的西班牙诗生成方法。

随着深度学习技术的发展,国内外的古诗词生成研究进入新的阶段。国外基于深度学习的机器翻译和诗歌生成方法如下:Cho等[9]提出由两个递归神经网络RNN组成的编码解码器来实现机器翻译。Gulcehre等[10]采用内存寻址方案实现动态神经机器翻译。Hopkins等[11]集成了一个循环神经网络(RNN)和一个有限状态接受者(FSA)。它生成给定任意主题的英文4行诗。Ghazvininejad等[12]使用一个经过语音编码训练的神经语言模型来学习英语诗歌的形式和隐含表达的内容,生成英文韵律诗。这种模式可以有效地学习常见的诗歌音律,如押韵、节奏等。但这些方法使用单向量不能保存上下文的全部信息,并且随着输入序列长度的增加会导致循环神经网络的性能下降。国内基于深度学习的方法如下:首先,基于循环神经网络[13]的古诗生成方法将每首古诗的诗句通过拼接的方式形成语料库,用于训练循环神经网络,最终得到一个输出单词字典大小的概率分布模型;然后,给定初始内容,不断从概率分布模型中采样出诗句中的词语,直到生成完整的古诗。基于循环神经网络模型[14]给定关键词逐行生成古诗,它由3个部分组成:用于获取句子的局部表示的卷积神经网络;获取已生成诗句的上下文向量的句子级别的循环神经网络;根据历史诗句上下文和该句已经生成的字符,输出下一个字符概率向量的字符级别循环神经网络。该模型捕获诗句的全局信息和局部信息,提高模型的特征提取能力。Wang等[15]基于注意力的编解码框架宋词生成模型(ICG),将已生成诗句拼接起来作为输入传递给编码器,由解码器输出下一个词句。该方法基于注意力机制配合长短期记忆神经网络,可以学习更长的诗歌,在一定程度上提高前后语义的连贯性。Wang等[16]先给每一句诗歌规划关键词大纲,让生成的诗句与关键词相关,提高了古诗的主题一致性。Yan17]基于编码解码框架,其中编码器是卷积神经网络,编码用户输入的意图关键词,解码器由句子级别和词级别两个循环神经网络组成。Ghazvininejad等[18]的主题诗生成模型(TPG)与规划模型相似,不同的是它先生成4个押韵的关键词,将其作为诗句的结尾,保证古诗的押韵。基于序列到序列的古诗生成模型(SPG)[19]在规划模型基础上增加了基于注意力机制的关键词扩展模型,用于匹配古诗生成模型,提高了古诗的主题一致性。Yi等[20]基于显著信息的古诗生成模型(SCG),通过注意力权重提取已生成诗句的显著语义特征,用于指导解码器生成上下文连贯的诗句。Liu等[21]通过引入条件变分自编码器(CVAE)生成具有比喻或拟人修辞手法的现代诗,首次在生成的诗歌中加入修辞元素,让诗歌变得更加生动形象。

风格作为宋词的重要元素,对提高意境起着重要作用。宋词的风格主要有两类:豪放与婉约。豪放词直抒胸臆,描述了广阔的视野,恢宏的气象;婉约词词调蕴藉,婉约含蓄,侧重细节描写。现有的研究主要关注诗词的通顺性和主题一致性方面,对于宋词风格方面的研究较少,在很大程度上忽视了风格的重要性。另外,宋词属于长文本的体裁,词句较多,现有的生成方法在上下文连贯性上仍存在提升空间。

为此,本文在编码解码的文本生成框架基础上,引入多注意力组件和条件变分自编码器,提出结合多注意力和条件变分自编码器的风格宋词生成方法。在自制的语料库上进行实验,探讨本文方法对于提高上下文连贯性以及实现风格控制的效果。

1 概述

1.1 设计思想

在采用门控循环单元(GRU)的编码解码文本生成框架基础上,加入基于自注意力机制的句子表示算法的多注意力组件,用于提取词句中的显著信息,提高上下文连贯性。另外,引入条件变分自编码器,将每条宋词数据转化为隐空间中不同风格特征的高维高斯分布,从各自的分布中采样隐变量来控制宋词的风格。本文将从带有注意力机制的基础框架、多注意力组件和条件变分自编码器等方面介绍方法的具体实现。

1.2 宋词生成过程

借鉴规划模型的生成过程,用户输入n个关键词(k1,k2,k3,k4,…,kn)作为宋词的大纲,其中kn是第n行词句的关键词。输入关键词kn和第n-1行的词句,输出第n行的词句。

1.3 关键词提取

TextRank算法[22]是评估句子或段落中词语重要性的方法。可使用该算法提取出词句中最重要的词语作为关键词。首先将宋词数据集中所有词句都拼接起来,对每个词句分词。根据分词后的词句构造图,即句子中的每个词语与它自身左右一定范围内的词语连接构成一个无向图。将图中边的权重初始化为1,通过公式(1)进行迭代计算得分,直到收敛为止。最终得到所有关键词的重要性得分表。在训练阶段,根据关键词重要性得分表从现有的宋词数据集中构建出关键词数据集,即从每个词句中提取出最重要的关键词。在预测阶段,对用户输入文本进行分词,根据关键词得分表提取出关键词。

S(Vi)=(1-d)+

(1)

式中,ωji为词语Vj连接边的权值;E(Vi)为连接到词语Vj的边;d为阻尼因子,通常设置为0.8;S(Vi)为词语Vi的分数,初始分数设为1.0。

2 模型整体结构

模型的整体结构如图1所示,其中橙色部分包括分别处理关键词、源序列的两个编码器和先验网络(Prior network);绿色部分是处理目标序列的编码器和后验网络(Recognition network),它们共同组成条件变分自编码器;黄色部分是多注意力组件;粉色部分是注意力机制;紫色部分是解码器。

图1 模型整体结构Fig.1 Overall structure of the model

2.1 基础框架

本文将带有注意力机制的编码解码框架[14]作为基础。编码部分包括3个编码器,其中一个编码器将关键词转化成隐藏状态K={k1,k2,…,kn}。另一个编码器将目标序列文本Y={y1,y2,y3,…,yn}转化成隐藏状态序列T={t1,t2,t3,…,tn},计算公式如下:

tj=GRU(e(yj),tj-1),

(2)

式中,e(yj)表示目标序列文本Y中第j个词的词嵌入。

编码器将源序列文本X={x1,x2,x3,…,xn}转换成隐藏状态序列H={h1,h2,h3,…,hn},计算公式如下:

hj=GRU(e(xj),hj-1),

(3)

式中,e(xj)表示源序列文本X中第j个词语的词嵌入。

解码器将目标序列文本Yin={ys,y1,y2,y3,…,yn}转化为隐藏状态序列S={s1,s2,s3,…,sn},其中ys表示词牌指示向量[15]。计算公式如下:

st=GRU(e(yt-1),vi-1,ct,st-1),

(4)

式中,将隐藏状态hn、条件变分自编码器(2.3小节)提取到的隐变量z和风格标签r的拼接作为解码器的初始隐藏状态。vi-1是多注意力组件(2.2小节)提取的语义向量;ct是通过注意力机制计算的上下文向量,用于提供源序列和关键词的全局信息,计算公式如下:

(5)

式中,将关键词编码器的最后一个隐藏状态kn作为式中h0;hj为H第j个隐藏状态;atj为该隐藏状态的注意力权重,计算公式如下:

(6)

式中,etj的计算公式如下:

(7)

式中,Va,Wa,Ua都是需要训练的参数。

2.2 多注意力组件

常见的上下文处理方法是将词句通过编码器转换成单个向量,并通过后续生成的词句来更新该向量。单个向量不能存储宋词长文本的全部特征。无意义的词也会混入该向量中,如虚词、停用词等。为此,引入多注意力组件提取词句的多种语义特征,过滤非显著特征,从而提高上下文的连贯性。

多注意力组件基于自注意力机制的句子表示算法[23,24],计算词句的多注意力权重矩阵,提取词句的3种重要语义特征并保存在指定的语义向量v中。多注意力权重矩阵的计算公式如下:

A=Ws2tanh(Ws1HT),

(8)

式中,Ws1是参数矩阵,维度为[da,2u];da是超参数,2u表示隐藏状态的维度;Ws2是参数矩阵,维度为[r,da];r是超参数,设置为3;A=[a1,a2,a3],是多注意力权重矩阵,每行表示词句某种语义的权重向量。为避免A的每行权重向量相似度高,导致每个注意力权重向量提取同一语义特征的问题,在损失函数中引入一个惩罚项[20],迫使每个注意力权重向量都具有明显的差异。惩罚项公式如下:

(9)

将多注意力权重矩阵A按行加和并归一化得到向量a:

(10)

在得到a后,通过式(11)计算存储多种语义的句子表示:

M=aH,

(11)

M是包含多种语义的句子表示,根据新生成的M更新语义向量vi:

vi=∂(vi-1,M),v0=0。

(12)

多注意力权重矩阵A在词句“花色烘晴草色浮”上的表现如图2所示。

图2 多注意力权重Fig.2 Multi-attention weight

图2的3个注意力权重主要用于提取“晴草花”的语义特征。a在词句上的表现如图3所示。

图3 加和并归一化的注意力权重Fig.3 Attention weight added and normalized

2.3 条件变分自编码器

受Zhao等[25]和Sohn等[26]的多样性文本生成模型的启发,为了控制生成的文本风格,在基础框架上引入条件变分自编码器,将每条宋词数据转化成隐空间的风格特征分布。在训练阶段,输入源序列、关键词、目标序列和风格标签。通过误差反向传播,降低KL散度(KL divergence)损失,让先验分布接近后验分布,从后验分布中采样隐变量z。在预测阶段,输入源序列、关键词和风格标签,从先验分布中采样隐变量z。

2.3.1 先验网络和后验网络

构建先验网络和后验网络,分别计算先验分布和后验分布的均值和方差,如式(13)和(14)所示:

[μ,σ2]=MLP(tn,hn),

(13)

[μ′,σ′2]=MLP(hn),

(14)

式中,μ,σ2分别是后验分布的均值和方差;μ′,σ′2分别是先验分布的均值和方差。最后通过KL散度估计两个高维高斯分布的信息损失。

为解决采样过程不可导的问题,采用了重参数技巧[27],从均值u和偏差σ2的高纬高斯分布中采样隐变量z等价于从标准正态分布中采样一个β,再对其进行线性变换,如式(15)所示:

z=μ+β*σ,

(15)

式中,从β到z只涉及线性变换,β是固定的。

2.3.2 变分下界

通过KL散度公式衡量先验分布和后验分布的相似度来判断生成质量。但这两个分布的KL散度的计算涉及数据的真实分布,难以直接计算。为此,通过最大化变分下界(ELBO),替代直接计算两个分布的KL散度。变分下界如下式所示:

ELBO=Eqφ(z|y,hn)[logpθ(y|z,hn,r)]-

KL(qφ(z|y,hn)‖pθ(z|hn))],

(16)

式中,φ是后验网络的参数,θ是先验网络的参数。z是隐变量,y是目标序列,r是风格标签的词嵌入。qφ(z|y,hn)是后验分布,pθ(z|hn)是先验分布。公式右边的第一项是重构的似然估计,目的是让生成的词句和真实的词句尽可能地接近。第二项是后验分布和先验分布的KL散度,用于衡量后验分布相比先验分布的信息损失。

2.3.3 弱化解码器

GRU解码器因解码能力强容易忽略隐变量z,无法控制文本风格。为此,在训练阶段,用未知词语(UNK)替换解码器的部分输入单词,迫使解码器无法仅通过先前生成的单词来预测下一个单词,需要更多地依赖隐变量z。

2.4 目标函数和损失函数

2.4.1 目标函数

解码器生成目标序列Yout={y1,y2,y3,…,yn,ye},其中ye表示结束字符。目标函数如下式所示:

yt=argmaxyP(y|st),

(17)

式中,st为在t时刻的隐藏状态,yt-1为上一时刻的输出,最终生成t时刻最可能的字符yt。

2.4.2 损失函数

损失函数在重构损失的基础上,加入多注意力的惩罚项和KL散度损失。损失函数如下式所示:

loss=ldecoder-lkl+lp,

(18)

式中,ldecoder是重构损失,采用交叉熵损失函数,保证了数据压损的质量;lkl是KL散度损失正则项;lp是多注意力的惩罚项。

3 验证实验

3.1 数据处理

采用Request库和BeautifulSoup库,从古诗文网和Github上公开的中文诗歌库中爬取20 000首宋词,对其进行数据清洗,剔除存在乱码的词句,最终形成包含15 200首宋词的语料库。将其中的1 000首作为验证集,1 000首作为测试集,剩余的作为训练集。由于语料库的宋词数量较少,首先使用60 000首古诗作为预训练模型。

语料库仅存在少部分具有风格标签的宋词,其中婉约词452首,豪放词105首。从中随机选择50首婉约诗词和50首豪放诗词作为测试集,剩余的宋词作为训练集微调中文BERT模型,在测试集上的准确率为0.81。通过微调后的BERT模型对所有宋词数据做风格标注。

3.2 实验设计

本实验的目的是验证本文方法能否生成婉约或豪放的宋词,以及是否在上下文连贯性上有所提高。实验环境如下:硬件环境采用Intel®Xeon®Bronze 3104 CPU 1.7 GHz处理器;内存32 GB;NvidiaQuadro P2000显卡,显存8 GB。软件环境主要采用python,cuda,tensorlfow深度学习框架和jieba分词。

鉴于宋词数据较小,模型参数设置过大会导致过拟合,所以模型设置的词嵌入、隐藏状态、隐变量、语义向量、上下文向量的维度分别为300,256,256,128,128。优化器采用小批量(64)随机梯度下降算法,并采用Adadelta算法[28]调整学习速率。预测阶段采用集束搜索算法,集束宽度为10。

宋词包含多种格式的词牌。为此,需要定义指示矩阵,矩阵的每一行向量分别表示不同的词牌指示向量,作为解码器的初始输入,告知解码器正在生成何种词牌的宋词。

3.3 实验结果评估和对比

由于诗歌生成任务与机器翻译任务相似,因此使用BLEU算法[29]自动评估生成的宋词。计算基准方法和本文方法的BLEU-1,BLEU-2,BLEU-3,BLEU-4的分数,然后取平均值作为最终的BLEU分数。

借鉴文献[1-3]的人工评估方法,从意境、语句流畅性、上下文连贯性和意义等方面判断古诗的质量。每方面满分5分,分数越高表示宋词在该评估方面的质量越高。让系统生成50首宋词,邀请10位硕士及以上的学者为生成的宋词打分,最后取平均值作为最终得分。

本文方法(MACVAE)与4个基准方法ICG[15],TPG[18],SPG[19],SCG[20]的自动评估和人工评估结果见表1。3个基准方法TPG,SPG,SCG都在规划模型基础上改进。首先规划在语义上相互关联的关键词作为主题大纲,依据大纲生成宋词ICG未加入主题大纲,通过一个词句生成整首宋词。从表1可观察到,这3个方法比ICG方法的上下文连贯性高,表明加入关键词主题大纲的生成方法对一致性具有重要影响。

表1 BLEU评估和人工评估结果Table 1 BLEU evaluation and artificial evaluation results

TPG先根据用户输入的关键词得到每句话的最后一个词语,这些词语都押韵且与用户输入相关,旨在提高押韵性。SPG在规划模型的基础上,另外训练了基于注意力机制的关键词扩展模型来匹配生成模型。SPG在上下文连贯性上较TPG有了进一步提高,表明增加的关键词扩展模型对提高上下文连贯性有一定帮助。

SCG通过注意力机制的权重提取输入序列的显著信息,用于指导生成的下文与上文连贯。SCG相比于SPG在连贯性上的评分有所提升,表明提取上文词句中的重要词语用于指导下文的生成,对提高上下文连贯性具有重要帮助。

相较于基准方法,本文方法在序列到序列模型的基础上,引入多注意力组件提取词句中的重要语义,在上下文连贯性上有一定的提升;引入CVAE控制文本风格,基本实现了婉约类和豪放类宋词的生成,提高了宋词的意境。

3.4 生成样例

生成的婉约词示例如图4所示。整首宋词侧重于细节描写且上下文连贯。但第4句“留我青山作暮眠”和最后一句“海岸江海与苏烟”描绘广阔的场景,属于豪放词句,原因是风格标注的不完全准确性。

图4 生成示例1Fig.4 Generated example 1

生成的豪放词示例如图5所示。整首宋词描绘了广阔的场景,整体上下文连贯,符合豪放风格的宋词。

图5 生成示例2Fig.5 Generated example 2

4 结束语

为提高宋词的上下文连贯性及实现风格控制,引入多注意力组件提取词句的多种重要语义,突出词句中的重要词语。另外,引入CVAE控制生成宋词风格。在自制的语料库上进行基准方法和本文方法的对比实验,本文的方法在上下文连贯性上有一定提升。实现了宋词风格的控制,在意境上有所提升。通过分类器标注的风格分类标签并非完全准确,后续期望通过大量的语料库和人工标注方式,进一步提高风格宋词的生成质量。

猜你喜欢
连贯性宋词编码器
融合CNN和Transformer编码器的变声语音鉴别与还原
慢性宫颈炎患者采用连贯性护理健康教育的临床价值
半小时漫画宋词
转炉系统常用编码器选型及调试
半小时漫画宋词
Why do we celebrate the New Year?
品读宋词
舞台机械技术与设备系列谈(二)
——编码器
宋词
基于数字信号处理的脉冲编码器