今天应上篇文章里面说的来写seq2seq和attention。但是这周琢磨了一下,现在写的这些东西只是在总结原理,好像除了回顾理论知识之外,并没其他技术上的提升。所以现在改变策略,尽量在总结技术的同时,做一个小demo。(等原理总结完了,之后想写一个深度学习从零单排系列,敬请期待。)
RNN的变种形式
seq2seq是2014年是Google Brain团队和Yoshua Bengio巨神带领的团队提出来的,主要用于机器翻译领域,也正是seq2seq,将机器翻译提高到了一个新的高度,而attention机制,让机器翻译完成了进化。
seq2seq是什么呢,其实就是一个RNN的变种,如下图:

上图表达的意思是rnn的几种模式(n个输入对应个输出):
- one to one:应用到的有图像分类,输入一个图像输出一个类别;
- one to many:图像理解(看图说话),输入一句描述图像的句子;
- many to one:文本分类;
- 5都是many to many,但是输入和输出结构是不一样的。5主要是用在文本标注,实体识别,而4就是今天的主角,主要应该在机器翻译,文本生成等领域
seq2seq
seq2seq可以理解为是一个翻译模型,把一个语言序列翻译成另一种语言序列。这里从而引入Encoder-Decoder的概念(seq2seq就是Encoder-Decoder的一种)。

上图就是一个最简单的Encoder-Decoder模型。
举个例子,我们需要将“我想打篮球”翻译成英文(I want to play basketball),这个在模型里是怎么运行的呢。
Encoder其实是一个RNN,输入x1(我),然后rnn中的h1(隐藏层状态)输入到x2(想)的状态,最后xT(篮球)的输出是最后时刻的隐藏层状态,输入到Decoder中。
Decoder也是一个RNN,只是它把Encoder中最后一个时刻的输入hT输入到这个RNN中(也还有不输入的形式),注意这里的第一个输入一个空字符<Nr>,表示句子的开头,第一个输出是I,第二个输入是I,输出是want,依此往后。
seq2seq存在的问题
其实对于这种encoder和decoder的模型,有一个问题是:起始的时间序列被编码转化成语义向量c,之后再被解码,那么一开始的信息经过长时间的从左往右传播已经丢失了很多,而最后编码的信息也是在最后解码,因此seq2seq的一个trick是,对输入的序列编码时,使用倒序输入,也就是原始的输入顺序为”A B C”的,那么新的方式编码的输入方式为 “C B A” ,这样A编码成c之后,就会马上进行解码,这样丢失的信息就没有之前那么多,经过这样的处理之后,取得了很大的提升,而且这样处理使得模型能够很好的处理长句子。
上面的方法虽然有一定的改善,但是对于输入词C来讲,信息丢失的依旧很厉害,因此未来解决这一缺点,attention机制应运而生(文章是《attention is all you need》)。在上面的模型结构中,每次预测都是从语义向量c中进行信息提取,在含有注意力机制的模型结构中,除了对最后的语义向量进行提取信息,还会对每一时刻的ht输出的结果进行信息的提取,这样Encoder过程中的隐藏状态都被利用上了。
attention机制以后再讲,我们来看点有意思的。
seq2seq的应用
除了机器翻译,seq2seq有一些有意思的落地。比如说,我们现在打电话到海底捞预定,一般情况下接电话的女声,其实是一个机器人来帮你预定,听起来还是比较智能的。这里就用到了seq2seq,但是涉及到语音处理。

还有一个应用,今天的重头戏,基于语料生成文本。
本来打算自己写,结构都很简单,语聊也有,但是处理起来很麻烦,所以直接down了github上一群中科院的小哥写的文章Chinese Poetry Generation with Planning based Neural Network,这篇文章用了attention。实现的地址是https://github.com/DevinZ1993/Chinese-Poetry-Generation。
语料有唐诗宋词元曲,总共28000首,输入4个关键词,生成与关键词最相关的4个句子。这里我是随机输入的关键词,看下效果:
Keywords: 不觉 一曲 伤 诏
Poem generated:
豆千门年相归水
城日天城画新为
不尘时家与雨庭
犹问到使饿杨烟
Keywords: 静 行人 江上 夕阳
Poem generated:
垂遥杀王百旧连
花风若转哭亭翁
欲百洞微主雏桐
弹香异知泪樊鼎
虽然不知道在讲什么,但是平仄有些还是可以压上的。
好了,这次就到这里,下次attention。
网友评论