基于Transformer模型的写诗机器人

2018-02-21 02:30张正旺
科技视界 2018年33期
关键词:子层写诗古诗

张正旺

【摘 要】古诗是中华民族的文化瑰宝。基于Transformer模型,利用开源的深度学习库Tensor2Tensor,仅需编写几十行代码即可创建出一个写诗机器人。结果表明,该写诗机器人能够写出格式规范,颇具意境的七言古诗。

【关键词】Transformer模型;深度学习;Tensor2Tensor;写诗机器人

中图分類号:TP183 文献标识码: A 文章编号: 2095-2457(2018)33-0004-003

DOI:10.19694/j.cnki.issn2095-2457.2018.33.002

【Abstract】Ancient poetry is a cultural treasure of the Chinese nation. Based on the Transformer model and using the open source deep learning library Tensor2Tensor, a poetry writing robot can be created with only dozens of lines of code. The result shows that the poem writing robot can write seven-character ancient poetry with standard format and artistic conception.

【Key words】Transformer model; Deep learning; Tensor2Tensor; Writing robot

0 引言

古诗是中华民族的文化瑰宝,其结构精练,韵律优美,意境高雅,具有穿越历史时空的创造力、影响力和吸引力,众多古诗流传至今并仍让我们深深为之着迷。人工智能(Artificial Intelligence),简称AI,其研究始于1956年的达特茅斯会议,与历史悠久的古诗相比,人工智能是一项非常年轻的技术。随着大数据的积累和计算机软硬件性能的提升,人工智能在各领域展现出极为广阔的发展和应用空间。深度学习是机器学习的一个分支,是现阶段实现人工智能的一种主要技术手段。深度学习的应用场景主要有:图像识别与处理、目标检测、语音识别、自动驾驶、自然语言处理等。基于深度学习,利用自然语言处理相关技术,可以将计算机训练成一个写诗机器机器人,让计算机自动生成格式规范的古诗。

1 研究现状

近年来,随着深度学习的快速发展,利用基于深度学习的自然语言处理技术自动生成古诗的研究得到了学术界的广泛关注。桂林电子科技大学的黄文明等[1]采用一种基于注意力机制的序列到序列模型得到作诗大纲,然后利用具有双编码器和注意力机制的序列到序列模型顺序地生成诗的每一行。北京邮电大学的李争[2]基于递归神经网络的古诗自动生成模型能够在给定关键词的情况下自动生成与其语义相关的古诗内容。中国科学技术大学的蒋亮[3]设计了一种基于记忆的深度神经网络模型自动基于图片生成中国古诗,该模型可以很有效地挖掘图片中的视觉信息及语义信息。清华大学的Yi Xiaoyuan等[4]将古诗句的生成看作一个序列到序列的学习问题,基于递归神经网络(Recurrent Neural Network,RNN)的Encoder-Decoder模型,构建了一个以关键词为输入四行诗自动生成系统,该系统能学习诗中单行的语义、行与行之间的语义相关性及结构、平仄模式的使用。爱丁堡大学的Zhang Xingxing等[5]提出了一种基于递归神经网络(RNN)的诗歌生成模型,该模型非常善于捕捉和学习诗歌的内容和形式。

这些研究多数基于传统的RNN模型,均可自动生成格式规范的古诗,但他们都需要研究者自己编写大量代码来完成系统的开发。GOOGLE大脑的研究人员[6]于2017年提出了一个摒弃了RNN结构,完全基于注意力机制的Transformer模型,随后他们开源了一个基于Tensorflow框架的深度学习库Tensor2Tensor,该库提供了用于自然语言处理的Transformer模型。利用这个深度学习库,基于Transformer模型,仅需编写少量代码,即可简单快捷地训练出一个会写诗的人工智能机器人。

2 Transformer模型简介

古诗自动生成是一个序列到序列问题,目前处理这类问题较为有效的框架为Encoder-Decoder模型,该模型的结构如图1所示。模型中的Encoder部分采用GRU(Gated Recurrent Unit)、LSTM(Long Short-Term Memory)等递归神经网络,卷积神经网络(Convolutional Neural Network, CNN),以及RNN或CNN与注意力机制(Attention)相结合等机制学习源序列,得到一个固定长度的向量表达式;模型中的Decoder部分以该向量表达式为输入,采用类似与Encoder的机制学习,得到目标序列。如图1中的“羌笛何需怨杨柳”经过Encoder后转变为类似于(0.5,0.2,0.1,-0.6,-0.4,1.0,1.2,0.8)的向量,Decoder以这个向量作为输入,最终可习得下一句诗“春风不渡玉门关”。

Transformer是一种处理序列到序列问题的新模型,其仍然沿用了经典的Encoder-Decoder结构,但不再使用RNN或CNN进行序列建模,而是完全使用自我注意力(self-attention)制。GOOGLE研究的结果表明,与RNN或CNN等结构相比,Transformer模型可以在减少计算量和提高并行效率的同时获得更好的学习效果,其结构如图2所示[6]。

Transformer模型的Encoder部分由Nx个(Nx=6)相同的层堆叠而成,每一层有两个子层,第一个子层是多头自我注意力层(Multi-head Attention),第二个子层是密集型全连接前馈网络层(Feed Forward Network),每个子层中均使用一次残差连接。Decoder部分的结构与Encoder相似,也是由6个完全相同的层堆叠组成,每一层除了包括Multi-Head Attention子层和Feed Forward Network子层外,还有一个遮挡式多头自我注意力层(Masked Multi-Head Attention),每个子层中也使用一次残差连接。

3 利用Transformer模型创建写诗机器人

Tensor2Tensor深度学习库封装了大量常见数据集和一些典型深度学习问题,并提供了相应模型用于解决各类问题,目前可直接解决的问题有:图像分类,语言模型、情感分析、语音识别、文本摘要,机器翻译等,利用库中所提供的模型还可以处理自行创建的各类新问题。寫诗机器人需要用到Tensor2Tensor提供的Transformer模型。

3.1 数据准备

七言古诗简称七古,是古诗中形式最活泼、体裁最多样、句法和韵脚处理最自由,抒情叙事最富有表现力的一种形式,诗体全篇每句七字或以七字句为主[7]。真正意义的七古成熟于唐朝,盛行于唐宋代。为方便训练,训练采用的数据集为唐宋两代的七言绝句。数据来源于Github上由Werner[8]收集的中国古诗词数据库,该数据库共收录了从先秦到现代的共计85万余首古诗词。利用Python语句从与唐宋诗词有关的五个CSV文件中提取出共79292首七言绝句作为训练数据集。

3.2 定义问题与数据处理

在Tensor2Tensor中利用Transformer模型处理古诗自动生成问题,需要先编写一个定义新问题的名为chinese_poetry.py的Python文件,代码如下:

# coding=utf-8

from tensor2tensor.utils import registry

from tensor2tensor.data_generators import problem,text_problems

import re

@registry.register_problem

class ChinesePoetry(text_problems.Text2TextProblem):

@property

def approx_vocab_size(self):

return 2**15

@property

def is_generate_per_split(self):

return False

@property

def dataset_splits(self):

return[{"split": problem.DatasetSplit.TRAIN, "shards": 9,},

{"split": problem.DatasetSplit.EVAL, "shards": 1, }]

def generate_samples(self, data_dir, tmp_dir, dataset_split):

with open('./ml/data/tang7.txt') as opf:

for line in opf:

line = re.sub('。', ',', line, count=1)

line = re.sub('?', ',', line, count=1)

newline = line.split(',')

for i in range(3):

prev_line = newline[i]

curr_line = newline[i+1]

yield{"inputs": prev_line, "targets": curr_line}

将chinese_poetry.py保存在chinese_poetry目录下,并在该目录下再创建一个名为__init__.py的Python文件,该文件只包含一句代码:from . import chinese_poetry。

古诗自动生成问题类似于机器翻译,是一个监督学习问题,计算机在学习大量的诗句对后,能够根据一句诗自动生成下一句。每首七言绝句可生成三个数据样本:(1)以诗的第一行作为输入序列,第二行作为目标序列;(2)以诗的第二行作为输入序列,第三行作为目标序列;(3)以诗的第三行作为输入序列,第四行作为目标序列。安装好Tensor2Tensor深度学习库后,利用下列Tensor2Tensor命令根据原始数据(79292首七言绝句)生成237876对TFRecord格式的数据样本:

t2t-datagen --t2t_usr_dir=chinese_poetry \

--problem=chinese_poetry \

--data_dir=chinese_poetry/data

3.3 训练

训练所使用机器配置如下:32G内存,8G显存的GTX 1070显卡。训练所使用的命令如下:

t2t-trainer --t2t_usr_dir=chinese_poetry --problem=chinese_poetry \

--data_dir=chinese_poetry/data --output_dir=chinese_

poetry/train \

--model=transformer --hparams_set=transformer_base_

single_gpu \

--schedule=train --train_steps=500000

上述指令表示训练数据所采用的模型为Transformer模型,所采用的超参数集为 transformer_base_single_gpu,训练步数50万步。在训练了两天又七个多小时后,一共训练了361800步,结果已基本收敛,因此停止继续训练。

3.4 测试

训练好的模型就是一台写诗机器人,只需要给训练好的模型提供一行诗句,模型即可自动生成下一句。Tensor2Tensor提供了t2t-decoder这个命令来完成此类动作。完整指令如下:

t2t-decoder --t2t_usr_dir=chinese_poetry --problem=chinese_poetry \

--data_dir=Chinese_poetry/data --output_dir=Chin-

ese_poetry/train \

--model=transformer --hparams_set=transformer_

base_single_gpu \

--decode_hparams="beam_size=4,alpha=0.6" \

--decode_from_file=Chinese_poetry/poetry.txt

以杜甫《闻官军收河南河北》(这首诗不在训练集中)这首七律的首句“剑外忽传收蓟北”作为诗的第一句,让训练出来的写诗机器人相继生成后续诗句,结果如图3所示。

输入“剑外忽传收蓟北”后,计算机生成的下一句为“又烦前送相公归”;输入变为“又烦前送相公归”,计算机生成“人间父子无穷胜”;以“人间父子无穷胜”为输入序列,输出结果为“笔下明明开辟初”。从生成结果来看,生成的古诗非常规范,亦颇有意境,描述了一幅战后亲人即将团聚的景象。

4 讨论与结语

通过与训练数据对比可以发现,上面生成的最后一行诗“笔下明明开辟初”完完全全来自于训练数据,其原因可能是因为数据量不够,训练时出现过拟合现象。为了防止训练数据里诗句被写诗机器人原样照抄,减少过拟合,除了增大训练数据量外,还可调整模型中的一些正则化超参的值,如Dropout值等,后期也应该增加一些防剽窃处理措施。此外,此写诗机器人僅仅依据诗的上一句来生成下一句,训练后容易导致写出来的诗主题不明确,内容不清晰。因此,对于七言绝句而言,可以通过如下两种方式增加训练样本:(1)以诗的第一行加第二行作为输入序列,第三行作为目标序列;(2)以诗的一二三行作为输入序列,第四行作为目标序列。

在技术进步的引导下,在国内外众多大公司的鼎力支持下,深度学习系统的开发逐渐趋于平民化,即不需要具备很强的人工智能专业背景,也可利用现成的框架开发出具有实用价值的深度学习系统,深度学习模型的使用门槛越来越低,深度学习技术的使用变得越来越简单。如前所示,寥寥几十行代码,即可借助Tensor2Tensor深度学习库开发出一个人工智能写诗机器人,但要想获得比较好的学习结果,让系统能真正写出比较完美的古诗,还有大量的工作可做。

【参考文献】

[1]黄文明, 卫万成与邓珍荣, 基于序列到序列神经网络模型的古诗自动生成方法. 计算机应用研究: 第1-7页.

[2]李争, 基于神经网络的古诗词自动生成研究, 2018, 北京邮电大学. 第 1-66页.

[3]蒋亮, 深度神经网络在基于图片生成中国古诗问题中的研究与应用, 2018, 中国科学技术大学. 第1-67页.

[4]Yi Xiaoyuan, Li Ruoyu, Sun Maosong. Generating Chinese classical poems with RNN encoder-decoder. (2016-04-06). https://arxiv.org/abs/1604.01537.

[5]Zhang Xingxing, Mirella L. Chinese poetry generation with recurrent neural networks. Proc of Conference on Empirical Methods in Natural Language Processing. October 25-29, 2014, Doha, Qatar.

[6]Ashish Vaswani, Noam Shazeer, Niki Parmar, et.al. Attention Is All You Need. 31st Conference on Neural Information Processing Systems (NIPS 2017), Long Beach, CA, USA.

[7]百度百科. https://baike.baidu.com/item/七言古诗.

[8]https://github.com/werner-wiki/Poetry.

猜你喜欢
子层写诗古诗
学写诗
品读古诗
品读古诗
品读古诗
复合材料厚层合板力学性能等效方法研究
小鸟写诗
用岁月在莲上写诗
这个暑假,写诗吧!
分离载荷近距协议的数据链路层仿真研究
以太网协议模型的演进分析