专栏名称: 机器之心
专业的人工智能媒体和产业服务平台
目录
相关文章推荐
51好读  ›  专栏  ›  机器之心

百度NLP | 自动写诗 PK 古代诗人:百度「为你写诗」技术深度揭秘

机器之心  · 公众号  · AI  · 2017-03-14 12:41

正文

百度NLP专栏

作者:百度NLP


「百度NLP」专栏是机器之心联合百度推出的专栏文章,探讨百度在自然语言处理领域的研究成果、实践经验与心得。该系列专栏以机器之心专访百度副总裁王海峰开篇(参阅: 独家对话百度副总裁王海峰:NLP 的路还很长 )。这篇文章为「百度NLP」专栏的第二篇,解读了百度在自动作诗方面的研究。


引子


「两个黄鹂鸣翠柳,一行白鹭上青天。」像这样优美的古诗,几乎每个人都在语文课堂上学习甚至背诵过。好的诗歌千古流传,深受广大人民的喜爱,然而诗歌创作却有很高的门槛。对于普通人来说,最多写几首打油诗,想写出意境优美而且朗朗上口的诗歌,几乎是不可能完成的任务。


创作诗歌对于人来说都很难,对于机器来说就更是难上加难了。虽然机器与人相比,在一些方面有着先天的优势,例如,机器有无穷无尽的词汇库可供选择,机器可以很容易的解决对仗、平仄和押韵等问题。但是,真正的诗歌是有灵魂的,诗歌本质上是在传达诗人的思想。机器自动创作在主题控制方面很弱,很难让整首诗都围绕一个统一的主题来生成。


百度在自动作诗领域的探索


百度在自动作诗方向做了很多探索。13 年手机百度 APP 推出了「为你写诗」功能,用户拍摄或上传一张图片,系统可以根据图片内容自动生成一首四句的古诗。这个功能受到了广大网民的好评,网友纷纷利用各种渠道晒出配诗的照片。2013 版「为你写诗」的核心算法是统计机器翻译技术(Statistical Machine Translation,简称 SMT),是为写诗 1.0 版本。写诗 1.0 版本可以生成通顺、押韵的古诗,在对仗方面做的也比较好,但是在主题相关性方面较差,其技术层面的原因稍后会进行详细分析。


2016 年,百度在手机百度 APP 和度秘 APP 上先后推出了新版「为你写诗」功能,可以让用户任意输入题目生成古诗,这个版本可以称为写诗 2.0 版本。该版本使用了一种基于主题规划的序列生成框架,很好地解决了上一版中主题相关性差的问题。


基于 PBMT 的写诗 1.0 版本


通过观察古诗可以看到,古诗的每两句诗之间存在很强的对应关系。以开篇那首杜甫的《绝句》为例,第一句「两个黄鹂鸣翠柳」和第二句「一行白鹭上青天」中,「两个」与「一行」相对,「黄鹂」与「白鹭」相对,「鸣翠柳」和「上青天」相对。这样的对应关系,通过基于短语的机器翻译模型(Phrase Based Machine Translation,PBMT)可以很好地学习出来。如果把一首古诗转换成前后相邻两句的句对形式,就得到一个平行语料库。这个语料库可以用于训练翻译模型。于是,诗歌生成问题就转换成相邻两句诗的翻译问题(从前一句翻译生成下一句)。对于第一句诗,由于没有前一句可以利用,需要单独生成。写诗 1.0 版本的解决方法是建立倒排索引,通过检索的方法得到第一句诗。整个框架如图一所示。


图一:写诗 1.0 版本框架图


从图一可以看到,用户输入的图片首先通过图片识别模块转换为文本 query,然后根据文本 query 检索得到第一句诗。也就是说,第一句诗实际上是从诗库里检索得到的,由人写出来的诗歌。得到首句诗之后,后面的第二、三、四句诗基于 PBMT 系统依次生成得到。

然而,这个框架有一个问题:用户 Query(诗歌题目)只能影响第一句诗的检索,无法对后面的诗句产生直接作用。这导致诗歌主题比较发散,甚至有可能出现诗句和主题矛盾的情况。举例来说,假设诗歌题目是「春天」,经过检索得到的首句诗是描写春天景色的,但是经过第一到第二,第二到第三,以及第三到第四句的传导之后,第四句有可能会出现描写下雪的与主题矛盾的诗句。


基于 NMT 的写诗 2.0 版本


2014 年 Sutskever 和 Bahdanau 分别在自己的论文中提出了一种基于循环神经网络的序列生成技术。Bahdanau 还进一步提出了一个带关注度(attention)机制的编码器-解码器框架。其基本思想是,把输入序列编码成一种稠密的向量表示形式,然后再通过解码器对向量表示进行解码,最终得到目标输出序列。而关注度机制的引入,使得模型可以在解码的时候动态计算对输入序列关注的位置。这个框架在机器翻译领域取得了巨大的成功,被称为神经网络机器翻译技术(Neural Machine Translation,简称 NMT)。


结合 NMT 技术,百度工程师提出了一套基于主题规划的诗歌生成框架,有效地提升了主题相关性,大幅提高了自动生成的诗歌质量。相关技术形成一篇论文,在 COLING 2016 会议上发表。(Zhe Wang, Wei He, Hua Wu, Haiyang Wu, Wei Li, Haifeng Wang, Enhong Chen. Chinese Poetry Generation with Planning based Neural Network. COLING 2016.)


主题规划技术首先根据用户 Query(诗歌题目)对要生成诗歌的内容进行规划,预测得到每一句诗的子主题,每一个子主题用一个单词来表示。这个过程和人类创作诗歌比较相似,诗人在创作之前往往会列出提纲,规划出每一句诗要描写的核心内容,然后再进行每句诗的创作。主题规划模型在生成每一句诗的时候,同时把上文生成的诗句和主题词一起输入来生成下一句诗。在这里,主题词的引入可以让生成的诗句不偏离主题,从而使整首诗都做到主题明确,逻辑顺畅。基于主题规划的诗歌生成框架(写诗 2.0 版本)如图二所示。


图二:写诗 2.0 框架(来源于论文 Wang et al. 2016)


图二中用户 Query 是「春天的桃花开了」。在主题规划阶段,经过主题词抽取和主题词扩展两个步骤,得到了要生成诗歌的四个主题词「春天」、「桃花」、「燕」和「柳」,这里限定每个词对应一句诗。和写诗 1.0 不同的是,利用 NMT 技术可以根据第一个主题词「春天」直接生成首句诗,在本例中得到「春天丽日照晴川」。在依次生成第二、三、四句诗歌的过程中,会考虑所有已生成的历史上文以及指定的主题词。具体地,用第一句诗句加主题词「桃花」生成得到第二句诗「十里桃花映满山」;用第一、二句诗加上主题词「燕」生成得到第三句诗「燕子呢喃寻旧梦」;用第一、二、三句诗加上主题词「柳」生成得到第四句诗「清风拂面柳如烟」。


写诗 2.0 的架构涉及到几个问题:(1)主题词如何抽取;(2)主题词如何扩展;(3)在基于 NMT 的生成过程中如何同时考虑上文和主题词。在这三个问题中,(1) 和 (2) 相对比较容易解决:主题词抽取主要考虑单词的重要程度,可以用 TextRank 等算法求解;主题词扩展可以看作一个根据已有单词预测后续单词词序列的问题,用语言模型或其他统计方法都可以求解。出于篇幅的考虑,这两个问题本文不展开进行详细的介绍,如果对细节感兴趣可以阅读论文(Wang et al. 2016)。


写诗 2.0 框架使用了两个编码器分别对历史上文和主题词进行编码。然后将得到的两个隐层向量序列进行拼接,最后再进行解码器的解码,整个过程如图三所示。


图三:基于主题规划的诗歌生成模型,同时考虑主题词「桃花」和历史上文「春天丽日照晴川」,经过基于关注度的 NMT 生成得到下一句诗「十里桃花映满山」。(来源 Wang et al. 2016)







请到「今天看啥」查看全文