使用Encoder-Decoder模型mvc自动生成模型对联的思路

encoder-decoder
encoder-decoder
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!使用Encoder-Decoder模型自动生成对联的思路
时间: 06:55:25
&&&& 阅读:689
&&&& 评论:
&&&& 收藏:0
标签:/*&版权声明:可以任意转载,转载时请标明文章原始出处和作者信息&.*/&&&&&&&&&& & & & & & & & & & & & & & & & & & & & & & author:&张俊林在我看到第一篇Encoder-Decoder模型的论文的时候,我就觉得用这个来作对联自动生成是再合适不过的了,做诗词应该也是比较适合的,但是相对诗词,用它来做对联肯定更合适。今天的文章就讲讲这方面的内容。这篇文章主体内容是2015年底形成的,本来我的打算是收集些训练数据,让Encoder-Decoder+Attention生成些对联把这篇文章补充些例子再发出去,不过因为精力原因,迟迟没有做这个实验,短期内可能也没时间做,所以干脆就现在分享出来,哪位有精力和兴趣可以实际做一下试试,这看上去没啥实际用处,但是还是挺好玩的一件事。不过我确信用这个模型做对联生成一定可以做好。为什么说Encoder-Decoder模型适合作对联呢?因为相对诗词等任务来说,对联要求严格的上下联对仗,老话不是说了吗,以前儿童诗词启蒙时都要学一些对仗规则,比如:天对地,雨对风,大陆对长空,王八对绿豆,八戒对悟空(后面两句是本文作者诗才大发胡诌的,请未成年儿童切勿模仿或者在有大人监督场景下模仿@^^@)。这种严格的对仗关系意味着极强的映射规律性,而这个用RNN和Encoder-Decoder来说正好是能够发挥它们长处的地方,所以说Encoder-Decoder加上RNN配置是非常适合用来做对联的。对联的严格对仗性可以给个小故事,大家直观感受下:相传解缙少时家贫,其家有片对着地主家的一片竹林,于是他作了副对联:“门对千杆竹,家藏万卷书”。地主心说:我幼儿园肄业文凭,你在我面前你这么装有文化好吗?于是不爽,命人把竹子砍短,解缙灵机一动把对联加了一个字,改成:“门对千杆竹短,家藏万卷书长”。地主气不打一处来,放出功夫熊猫把竹子全吃了,解缙又改对联:“门对千杆竹短无,家藏万卷书长有”。气得地主直跳脚骂娘。从这个故事我们可以归纳出中心思想就是:从古至今,有钱就是大爷,可以随便砍伐树木破坏生态而不被法律制裁@^^@…..不对,跑偏了,中心思想应该是:肄业的同学都容易创业成功,成为新时达的地主老财,而好好上学的大都免不了家贫的结局…..也不对,你看我这三观都歪到引力波都达不到的宇宙之外了,中心思想是:对联是有极强的对仗性的。而这种对仗性代表了什么?代表了语言单元之间极强的规律性,而这是非常适合通过机器来学习并容易做好的事情,这是为何我坚信用Encoder-Decoder做对联一定能够做好的原因。|Encoder-Decoder模型Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示:&&&&&&&&&&&&&&&&&&&&&& & & &
图1. 抽象的Encoder-Decoder框架Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对&X,Y&,我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成:Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词yi每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。|Encoder-Decoder自动生成对联机器自动生成对联这个事情,可以分成两种情况,一种情形是:假设对联的上联是已经知道的,比如人自己想的,任务是由机器来自动产生下联;第二种情况是:假设要求上下联全部都由机器自动生成。明显第一种情况要求较低,相对简单,第二种情况要求较高,相对复杂。下面我们分述两者的可能解决思路。情形一:已知上联,机器自动生成下联假设我们已经拿到了上联,例如:“风云三尺剑”(注:这是我比较喜欢的一副对联的上联,作者左光斗先生,如果是你的话会对什么下联?),如何让机器自动生成下联?很明显,这个问题直接可以由Encoder-Decoder框架来进行下联自动生成。这种场景是典型的Encoder-Decoder框架应用问题。我们所需要做的就是配置好Encoder-Decoder框架的具体模型,比如Encoder和Decoder都采用RNN模型来做,图2展示了用Encoder-Decoder框架做对联下联自动生成的架构图。
图2. Encoder-Decoder生成下联只需要找到大量的对联数据对这个模型进行训练,那么即可利用这个模型,输入上联,机器自动产生下联了。值得提的一点是,很明显,对于做对联这个事情来说,Encoder-Decoder框架加上Attention应该会显著提升产生下联的质量,原因还是因为它是要求严格对仗的,所以在生成下联某个字的时候,找到对应上联相应字作为生成的重点参考信息无疑是非常重要的。比如看到上联的“三”字,Attention模型使得下联产生对应字“一”的时候重点参考上联的“三”这个字,应该知道对应的应该是一个数字型汉字。图3是加上Attention模型的示意图。
图3. Attention模型这里再插上一句,作为对联下联生成任务来说,使用Encoder-Decoder来做这个事情,我相信汉字之间的对仗关系应该能够很好地被学会,但是如何保证生成下联语义能够一致其实并不一定能够很好地解决。这是什么意思呢?意思是可能机器看到上联“风云三尺剑”,极有可能对出下面的内容:“雨风万丈刀”,单看每个字对仗的都很工整,但是作为一个整体,语义看上去不那么协调。(注:其实如果真对出这个下联,想想其实还是挺豪情万丈的,是吧?这其实跟人在意识上会把连续出现的字通过想象组合出一种合理语境有关。)当然如果训练数据够大的话,这个问题应该不会太大,因为本质上Encoder-Decoder在解码阶段是能够学会语言模型的,而很明显语言模型的引入对于生成下联的可读性和语言一致性是很有帮助的。但是如果训练数据不是那么大,我相信通过使用大量古诗来训练一个诗词语言模型,在Decoder生成阶段,每个时间节点t生成很多可能的候选汉字,然后利用这个语言模型+Beam Search应该能够使得生成的对联保证一定的语义一致性。到此为止,作为对联生成其实还有个问题,就是上下联对应汉字的平厌问题,这个也可以类似语言模型一样作为后处理的步骤进行筛选过滤。不过我觉得Encoder-Decoder也极有可能会学会这种平厌关系,因为这个规律还是很明显的,这点不确定,得通过实验来证明这一点。情形二:对联由机器完全自动生成上面讲的是如果上联是人给出的,机器如何自动产生和顺的下联。那么如果问题难度增加一下,如果上联也不知道,机器能够完全自动生成完整的一幅对联吗?很明显,情形一是情形二的子问题,假设我们分两步来完全自动地生成对联,第一步是不论用什么方法,先生成一句上联。第二步根据上联自动生成下联。第二步明显可以使用情形一训练出的模型来做。所以情形二的关键问题转换为:如何在一无所知情况下生成一句上联?我觉得这个子问题可以通过如下方式解决:使用RNN构建一个古诗词的语言模型,然后上联通过这个RNN语言模型自动生成,这从道理上是讲得通的。也就是说,整体架构如图4所示。
图4& 完全自动生成对联此外,对于对联来说,还遗留一个小问题,就是对联的横批如何生成的问题。因为一般对联还需要配上一个横批来归纳上下联的主旨。这个其实思路也是类似的,可以把上下联看做一个整体作为Encoder的输入,Decoder用来生成横批即可,这个类似于用Encoder-Decoder+Attention做摘要的思路。关键是有没有那么多训练数据是带横批的,我觉得这个挺悬的。好了,通过以上方式,我相信能够构建一个看上去还不错的对联自动生成系统。 扫一扫关注微信号:“布洛卡区” ,深度学习在自然语言处理等智能应用的技术研讨与科普公众号标签:原文地址:http://blog.csdn.net/malefactor/article/details/
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
在这个文章中,我们提出了一个新奇的神经网络模型,叫做RNN Encoder–Decoder,它包括两个RNN。一个RNN用来把一个符号序列编码为固定长度的向量表示,另一个RNN用来把向量表示解码为另外一个符号向量;提出的模型中的编码器和解码器被连接起来用于训练,目的是最大化目标序列相对于原序列的条件概率;基于经验,如果把the RNN Encoder–Decoder作为现存的log-linearmodel的添加的特性来计算语句对间的条件概率,统计机器翻译系统的性能能够提升。定性的,我们提出的模型学习到了语言中语句的一个包含语义和语法有意义的表示
Introduce
深度神经网络已经在各种各样的应用中展现了很大的成功。例如,对象识别与语音识别;此外,许多最近的工作证明神经网络能够成功的用于许多自然语言处理过程中,这包括但不限于语言模型、解释识别和释义解释和单词嵌入提取;在统计机器翻译(statistical machine translation (SMT))中,深度神经网络有望获得期望的效果;(Schwenk,2012)总结了一个在基于短语的SMT系统框架下的负反馈神经网络的成功应用。
沿着这条路线,使用神经网络对STM进行研究,这篇文章关注于一个新奇的神经网络框架,它能够被用于传统的基于语句的SMT框架的一部分。我们称之为RNN Encoder–Decoder,有两个RNN组成,作为编码器和解码器组合。编码器把变长的源序列映射为一个固定长度的向量,解码器把向量表示映射为变长的目标序列。这两个网络连接起来被训练,目标是最大化条件概率,此外,我们提出使用一个相对复杂的隐含单元,来提高记忆能力和训练情况;
带有一个神奇隐含层的RNN Encoder–Decoder在从英语翻译为法语的项目中被基于经验主义的评价。我们训练这个模型来学习英语语句转化为相应法语语句的转换概率;这个模型之后被用于标准的基于语句的SMT系统的一部分,通过对表中的语句对进行评分;基于经验主义的评价表明这种方案能够提高翻译的质量;
我们进行定性的分析,通过把训练的RNN Encoder–Decoder和已经存在的翻译模型进行比较。定量分析表明:the RNN Encoder–Decoder能够更好地捕获语言规律,直接说明了整体的翻译表现的性能提升;更深入的分析揭示了the RNN Encoder–Decoder学习到了一个语句的连续空间向量表示,它包含了语义和语句的语法结构;
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!关于encoder的两个问题`
[问题点数:100分,结帖人gsp396]
本版专家分:9562
CSDN今日推荐
本版专家分:20778
本版专家分:808
2006年12月 专题开发/技术/项目大版内专家分月排行榜第一2006年7月 专题开发/技术/项目大版内专家分月排行榜第一2006年5月 专题开发/技术/项目大版内专家分月排行榜第一2006年4月 专题开发/技术/项目大版内专家分月排行榜第一2005年8月 专题开发/技术/项目大版内专家分月排行榜第一2005年7月 专题开发/技术/项目大版内专家分月排行榜第一2005年3月 专题开发/技术/项目大版内专家分月排行榜第一2005年2月 专题开发/技术/项目大版内专家分月排行榜第一2005年1月 专题开发/技术/项目大版内专家分月排行榜第一2004年12月 专题开发/技术/项目大版内专家分月排行榜第一2004年9月 专题开发/技术/项目大版内专家分月排行榜第一2004年8月 专题开发/技术/项目大版内专家分月排行榜第一2004年7月 专题开发/技术/项目大版内专家分月排行榜第一2004年6月 专题开发/技术/项目大版内专家分月排行榜第一
2006年8月 专题开发/技术/项目大版内专家分月排行榜第二2006年6月 专题开发/技术/项目大版内专家分月排行榜第二2004年11月 专题开发/技术/项目大版内专家分月排行榜第二2004年10月 专题开发/技术/项目大版内专家分月排行榜第二2004年5月 专题开发/技术/项目大版内专家分月排行榜第二
2005年5月 专题开发/技术/项目大版内专家分月排行榜第三2005年4月 专题开发/技术/项目大版内专家分月排行榜第三2004年4月 专题开发/技术/项目大版内专家分月排行榜第三
结帖率 100%
本版专家分:9562
本版专家分:9562
本版专家分:9562
匿名用户不能发表回复!|
CSDN今日推荐深度学习(BOT方向) 学习笔记(2) RNN Encoder-Decoder 及 LSTM
深度学习(BOT方向) 学习笔记(2) Sequence2Sequence 学习2
PS:这一个系列比较语无伦次,后期会有一个refined版的,这个系列相当于草稿
这个系列的笔记拖了很久了,一直没时间仔细详细写,一来是因为自己能力不足,学习进度也很慢,二是真的很懒,也没有什么outline,所以一直拖着没写,现在终于挤出第二篇来了。
话说之前的第一篇,我很匆忙的写了写Sequence2Sequence RNN-Encoder-Decoder的框架,写的不是很认真,这篇博客则主要想仔细写写这个框架。最主要的目的是帮助自己理解,其次是做个留底和分享。
2 再看 RNN Encoder-Decoder框架
这里复习下Sequence2Sequence任务到底是什么,所谓的Sequence2Sequence任务主要是泛指一些Sequence到Sequence的映射问题,Sequence在这里可以理解为一个字符串序列,当我们在给定一个字符串序列后,希望得到与之对应的另一个字符串序列(如 翻译后的、如语义上对应的)时,这个任务就可以称为Sequence2Sequence了。
在现在的深度学习领域当中,通常的做法是将输入的源Sequence编码到一个中间的context当中,这个context是一个特定长度的编码(可以理解为一个向量),然后再通过这个context还原成一个输出的目标Sequence。
如果用人的思维来看,就是我们先看到源Sequence,将其读一遍,然后在我们大脑当中就记住了这个源Sequence,并且存在大脑的某一个位置上,形成我们自己的记忆(对应Context),然后我们再经过思考,将这个大脑里的东西转变成输出,然后写下来。
那么我们大脑读入的过程叫做Encoder,即将输入的东西变成我们自己的记忆,放在大脑当中,而这个记忆可以叫做Context,然后我们再根据这个Context,转化成答案写下来,这个写的过程叫做Decoder。其实就是编码-存储-解码的过程。
而对应的,大脑怎么读入(Encoder怎么工作)有一个特定的方式,怎么记忆(Context)有一种特定的形式,怎么转变成答案(Decoder怎么工作)又有一种特定的工作方式。
好了,现在我们大体了解了一个工作的流程Encoder-Decoder后,我们来介绍一个深度学习当中,最经典的Encoder-Decoder实现方式,即用RNN来实现。
在RNN Encoder-Decoder的工作当中,我们用一个RNN去模拟大脑的读入动作,用一个特定长度的特征向量去模拟我们的记忆,然后再用另外一个RNN去模拟大脑思考得到答案的动作,将三者组织起来利用就成了一个可以实现Sequence2Sequence工作的“模拟大脑”了。
而我们剩下的工作也就是如何正确的利用RNN去实现,以及如何正确且合理的组织这三个部分了。
那么接下来,我们将详细介绍下这个模型当中经常说的RNN到底是什么?
RNN & LSTM
RNNs,即循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural Language Processing, NLP)中取得了巨大成功以及广泛应用。
RNNs通常用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。这种神经网络结构在很多领域取得了不俗的成绩,但是由于其网络结构的问题,使得其在面对序列问题或者和时间密切相关的问题时,表现不佳。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关。
在RNN中神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!表示成图就是这样的:
在这个典型的RNN示意图当中,RNN包含一个输入层Input Layer,一个隐含层Hidden Layer,一个输出层Output Layer。其中非常值得注意的是,在Hidden Layer部分,Hidden Layer不仅连接了Input Layer Output Layer,而且也同时连接了自己本身,所以这也是称作循环神经网络的原因所在。或许上面那张图有点不太容易懂,那么如果我们将它展开看一下,或许你就会对此有一个更加清楚的理解了:
可以看到的是,对于每一个时刻输入的数据xt,rnn的隐含层的Cell都会重复使用同一个参数W b 进行计算,并且得到当前的隐含层状态St和一个输出Ot,而这个Ot是之前所有输入(x0~xt-1)的共同作用结果,这也就解决了那些当前的输出,要求考虑到之前n个元素的问题,rnn在某一个时刻的输入,是之前所有输入的共同结果。而RNN之所以是深度学习中常用的一种网络结构,其深度之处就在于其网络时间的长度(也就是网络的深度!)
然而,RNNs虽然看起来在处理时间t的内容时,会综合考虑到之前所有时刻的内容,但是实际情况是,随时t的增大(即输入的序列很长的时候),其会面临长期依赖(Long-Term Dependencies)问题,即最开始输入到RNN的内容对当前Ot的影响会越来越小,究其原因是一开始输入RNN的内容,随着t的推进其在不停的循环传播,造成了信息的丢失。形象来说,这种丢失,就像我们人的大脑一样,短一点的句子我们看一眼还记得住,要是长一点,我们看着看着,之前看过的就忘了,只记得附近看过的几个?为了解决这个问题,发展了诸如GRU和LSTM在内的机制,用于解决这个记忆问题。简单说,GRU和LSTM并不算是一个完全独立的结构,其看起来和上图的RNN很像(其实也都是认为对RNN Cell的一种改进),GRU和LSTM主要是通过加强原RNN当中隐含层的Unit,增加了多个“门”,实现对内容的记忆、遗忘,一定程度改善了RNN的长句记忆问题。我们这里主要着重说下LSTM。
LSTM(Long Short Term Memory) ,是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。LSTM通过记住一些长期的记忆,来改善长期依赖的问题。
首先需要再次强调的是,LSTM可以看做是RNN的一种改进版,主要是替换了其Hidden Unit的Cell,但是其依然有每一个隐含层输出的状态ht,结果的输出也是基于ht,使用方式并没有任何改变,而改变之处在于其在循环时,如何使用之前的ht-1和当前输入的xt去生成ht,下面这两张图片的对比就可以很好的说明这个问题了:
(标准RNN)
(LSTM Cell结构标识在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。)
可以看到,无论是原始的RNN还是LSTM,其基本的网络结构都是一样的,都是一个循环的网络结构,而不同在于标准RNN的在处理一个元素时其Cell的结构很简单,即将上一个时间的隐含层状态h(这里是h,上面的图是s,这里的h不是上面图的o,注意区分),同当前输入的x,使用tanh函数计算得到当前时间状态的h。而在LSTM当中就复杂了许多,可以看到其由各种五花八门的“门”构成,这里我也不想详细的讲,我只介绍其大概,
首先,LSTM和核心在于如何维护每一个Cell的状态(记忆),首先这里在每一个Cell当中,我们用Ct来标识当前的一个细胞状态,你可以理解为Cell的状态是LSTM单元实现记忆的核心因素。在每一个LSTM Cell中,其基本的处理流程如下图,从Ct-1输入上一个状态,途径了两个操作(第一个是“忘记门:忘记一部分之前的知识”,第二个是“更新门:记住当前时间输入的内容”)
首先对于第一个忘记门:
通俗解释他的作用就是,因为一个Cell的记忆内容是有限的,所以在记住新的内容(Xt)之前,势必需要忘记一部分内容,才能记住新的内容。那么在LSTM中,使用上一个LSTM里原RNN部分的隐藏层状态ht,和当前的输入xt,结合sigmod函数输出一个0~1的值,确定需要忘记的幅度ft(所以你看第一个操作就是 Ct-1 * ft)
确定了如何忘记后,就来看下如何将新的内容xt添加到Cell记忆中
在这里,我们同样适用ht-1和x以及sigmod tanh函数去计算,这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量。
随后,我们确定好了需要更新的内容后,就可以添加到记忆当中(同部分忘记后的记忆内容相加),然后就可以得到新的记忆
好了,当我们得到细胞状态后,我们也可以相应的计算出当前隐藏层的状态ht了:
在今天介绍的Encoder-Decoder模型中,Encoder部分负责依次读入输入序列的每个单位,将其编码成一个模型的中间表示(一般为一个向量),在这里我们将其称为上下文向量c,Decoder部分负责在给定上下文向量c的情况下预测出输出序列。
并且在在自然语言处理应用中,Encoder和Decoder部分通常选择了RNN(LSTM)实现。
为什么我们要选择以RNN为基础的结构去实现Encoder-Decoder呢?:首先,RNN可以方便地处理可变长序列的数据。其次,由于RNN中的隐层状态随着按时序读取的输入单元而不断发生变化,因此它具有对序列顺序的建模的能力,体现在自然语言处理任务中,即为对词序的建模能力。而词序也恰恰是自然语言处理任务中需要建模的重点。最后,RNN可以作为一个语言模型来预测出给定前文的基础上下一个字符出现的概率,这个特性使得其可以应用在各种文本生成任务中预测出语法正确的输出序列,从而实现Decoder的功能。
好了,今天的内容就介绍到这里,到目前为止介绍的Encoder-Decoder模型还很初级,还有很多问题有待解决,且听下回分解。
系列目录:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 输入名字自动生成对联 的文章

 

随机推荐