Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

简介

今天我们来做NLP(自然语言处理)中Sequence2Sequence的任务。其中Sequence2Sequence任务在生活中最常见的应用场景就是机器翻译。除了机器翻译之外,现在很流行的对话机器人任务,摘要生成任务都是典型的Sequence2Sequence。Sequence2Sequence的难点在于模型需要干两件比较难的事情:

  • 语义理解(NLU:Natural Language Understanding):模型必须理解输入的句子。
  • 句子生成(NLG:Natural Language Generation):模型生成的句子需符合句法,不能是人类觉得不通顺的句子。

想想看,让模型理解输入句子的语义已经很困难了,还得需要它返回一个符合人类造句句法的序列。不过还是那句话,没有什么是深度学习不能解决的,如果有,当我没说上句话。

Sequence2Sequence任务简介

Sequence2Sequence是一个给模型输入一串序列,模型输出同样是一串序列的任务和序列标注有些类似。但是序列标注的的输出是定长的,标签于输入一一对应,而且其标签类别也很少。Sequence2Sequence则不同,它不需要输入与输出等长。

Sequence2Sequence算法简介

Sequence2Sequence是2014年由Google 和 Yoshua Bengio提出的,这里分别是Google论文Yoshua Bengio论文的下载地址。从此之后seq2seq算法就开始不断演化发展出不同的版本,不过万变不离其宗,其整体架构永远是一个encode-decode模型。下面简要介绍四种seq2seq的架构。
1.basic encoder-decoder :将encode出来的编码全部丢给decode每个step。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

2.encoder-decoder with feedback :将encode出来的编码只喂给decode的初始step,在解码器端,需将每个step的输出,输入给下一个step。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

3.encoder-decoder with peek:1和2的组合,不仅将encode出来的编码全部丢给decode每个step,在解码器端,也将每个step的输出,输入给下一个step。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

4.encoder-decoder with attention:将3模型的encode端做了一个小小的改进,加入了attention机制,简单来说,就是对encode端每个step的输入做了一个重要性打分。
《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

本次实验采用的是basic encoder-decoder架构,下面开始实战部分。

对对联实战

数据加载

数据样式如下图所示是一对对联。模型的输入时一句“晚 风 摇 树 树 还 挺”,需要模型生成” 晨 露 润 花 花 更 红”。这个数据集有个特点,就是输入输出是等长的,序列标注算法在这个数据集上也是适用的。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

执行上方代码将数据变成list,其格式如下:

构造字典

通过上方代码构造一个字典,其格式如下所示,字典的作用就是将字变成计算机能处理的id。

数据预处理

执行上方代码将数据padding成等长(100维),后续方便喂给模型。其中需要注意的是需要给train_label扩充一个维度,原因是由于keras的 sparse_categorical_crossentropy loss 需要输入的3维的数据。

模型构建

模型构建,keras可以很方便的帮助我们构建seq2seq模型,这里的encode 和decode采用的都是双向GRU。其中RepeatVector(output_sequence_length) 这一步,就是执行将encode的编码输入给decode的每一个step的操作。从下图的模型可视化输出可以看到这个basic的seq2seq有39万多个参数需要学习,简直可怕。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

模型训练

模型构建好之后,就可以开始训练起来了。需要做的是将输入数据喂给模型,同时定义好batch_size和epoch。

下图是模型训练的过程,一个epoch大概需要近1小时,loss缓慢降低中。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

模型预测

训练10个epoch后,是时候考考模型的对对联实力了,运行上方代码,就可以看到模型的预测效果。
“国破山河在”对出“人来日月长”,确实很工整。看来模型学习得不错,晋升为江湖第一对穿肠啦。

《Keras版Sequence2Sequence对对联实战——自然语言处理技术(3)》

结语

Seq2Seq在解决句子生成任务确实实力雄厚,仅仅只用了最basic的ecode和decode就能对出如此工整的句子(当然不是所有的句子都能对得这么好)。如果使用更强的模型训练对对联模型,实力应该可以考个古代状元。所以,大家有没有开始对深度学习处理NLP问题产生好奇,学习起来吧。

参考

https://kexue.fm/archives/6270
https://blog.csdn.net/sinat_26917383/article/details/75050225

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 − 10 =