Encoder decoder,encoder-decoder
后台回复“20180717”
下载数据和代码
编程环境:
张量流
Python 3.6
(实现了一个基于seq2seq的自动对联代码,有兴趣的朋友可以下载学习)
另外,点击阅读原文试试微软的自动对联系统(http://duilian.msra.cn/app/couplet.aspx)
为什么编解码模型适合对联?对联与诗词等任务相比,要求上下对仗严格。古语不是说了吗?以前儿童诗歌启蒙,要学习一些对仗规则,比如:天对地,雨对风,大陆对天,乌龟对青豆,光明景观对ajdcg(后两句是本文作者瞎编的。请勿模仿未成年人或在成年人监督下模仿@这种严格的对仗关系意味着很强的映射规律性,而这正是RNN和编解码可以发挥所长的地方,所以编解码加RNN配置非常适合对联。
对联的严格对仗可以给你一个小故事,你可以直观的感受到:
传说帅酸奶年轻时家境贫寒,家里有一片竹林正对着地主家,于是做了一副对联:“门朝千竹,家藏万卷书”。楼主说:“我有幼儿园的毕业证。你在我面前这么有教养?”于是,不高兴了,命人把竹子剪短,帅酸奶灵机一动,在对联上加了一个字,改成:“门短千竹,屋长万卷书”。楼主生气了,功夫熊猫把竹子全吃了,帅气的酸奶改成了对联:“门下缺一千根竹子,家宝万卷书长”。我非常生房东的气,跳起来大骂我妈。
从这个故事中,我们可以得出这样的结论:从古至今,富人都是大叔,他们可以随意砍伐树木,破坏生态,而不会受到法律的惩罚.不,这是错误的。中心思想应该是:离开学校的学生很容易创业成功,成为新地主和旧财富,而努力学习的人必然会陷入贫困.不,你看我三观都歪了。这种对立代表了什么?它代表了语言单位之间很强的规律性,而这是非常适合机器学习,也容易做好的东西。这就是为什么我坚信用编解码做对联是可以做好的。
Encoder-Decoder模型
编解码框架可以视为文本处理领域的一种研究模式,其应用场景极其广泛。下图是文本处理领域常用的编码器-解码器框架的最抽象表示:
图一。抽象编码器-解码器框架
编码器-解码器框架可以直观地理解:它可以被看作是一个通用的处理模型,适用于处理一个句子(或章节)以生成另一个句子(或章节)。对于句子对X,Y,我们的目标是给出输入句子X,我们期望通过编解码框架生成目标句子Y。x和y可以是同一种语言,也可以是两种不同的语言。x和y分别由它们各自的单词序列组成:
编码器,顾名思义,对输入的句子X进行编码,通过非线性变换将输入的句子转换成中间语义表示C:
对于解码器来说,它的任务是根据句子X的中间语义表示C和之前生成的历史信息Y1,Y2,易-1。
每一个yi都是这样依次生成的,所以看起来整个系统是根据输入的句子X生成目标句子y的.
Encoder-Decoder自动生成对联
机器自动生成对联可以分为两种情况。一种情况是:假设对联的上联是已知的,比如人自己想到的,任务是机器自动生成下联;在第二种情况下,假设所有上行链路和下行链路都是由机器自动生成的。显然,第一种情况要求较低,相对简单,而第二种情况要求较高,相对复杂。下面我们来讨论一下这两者可能的解决方案。
情形一:已知上联,机器自动生成下联
假设我们拿到了第一副对联,比如:《风云剑》(注:这是我比较喜欢的一副对联中的第一副对联。作者整洁的平面老师,如果是你,会是什么?),如何让机器自动生成下线?
显然,这个问题可以由编码器-解码器框架直接产生。这个场景是一个典型的编码器-解码器框架应用问题。我们需要做的是配置编解码框架的具体模型。例如,编码器和解码器都是由RNN模型制成的。图2显示了使用编码器-解码器框架来自动生成对和下行链路的架构图。
图二。编码器-解码器生成下行链路
只需要找到大量的对联数据来训练这个模型,然后就可以使用这个模型,输入上面的对联,机器就会自动生成下面的对联。
值得一提的是,显然,对于对联来说,编码器-解码器框架加上注意应该显著提高生成的对联的质量。原因是它要求严格的对仗,所以在生成对联的某个字时,找到对应对联的对应字作为关键的参考信息,无疑是非常重要的。比如你看到上联的“三”字,注意模型让下联对应的“一”字指代上联的“三”字,你就应该知道对应的字应该是数字汉字。图3是具有注意力模型的示意图。
图3。注意力模型
这里还有一句话。作为生成对联的任务,用编解码器来做这个,我相信汉字之间的对仗应该是很好学的,但是如何保证生成对联的语义是一致的,可能没有很好的解决。这是什么意思?意思是机器可能看到对联中的“风云三尺剑”,很有可能会想出以下内容:“风雨三尺剑”。单看每个字都很工整,但整体来看,语义看起来不那么和谐。(注:其实如果这个底线是真的,想想也挺豪迈的不是吗?其实,这与人们有意识地通过想象将连续的词语组合成合理的语境有关。)
当然,如果训练数据足够大,这个问题应该不会太大,因为本质上编解码在解码阶段就可以学习语言模型,很明显语言模型的引入对生成下行的可读性和语言一致性很有帮助。但如果训练数据没有那么大,我相信通过使用大量的古诗来训练一个诗词语言模型,在解码器生成阶段,每一个时间节点T都会生成很多可能的候选汉字,然后使用这个语言模型束搜索,应该可以保证生成的对联有一定的语义一致性。
到目前为止,对联的生成其实存在一个问题,就是不喜欢上下对联对应的汉字的问题。这也可以作为后期处理步骤,像语言模型一样进行筛选过滤。不过我觉得编码器-解码器也很有可能学习到这种胀气和厌恶的关系,因为这个规律还是显而易见的,这是不确定的,还得用实验来证明。
情形二:对联由机器完全自动生成
以上是关于如果顶部链接是人给的,机器如何自动生成平滑的底部链接。那么,如果增加问题的难度,在对联未知的情况下,机器能否自动生成完整的对联?
显然,第一种情况是第二种情况的子问题。假设我们分两步自动生成对联。第一步,不管用什么方法,老师都形成对联。第二步,根据上联自动生成下联。第二步显然可以通过使用案例1中训练的模型来完成。所以,第二种情况的关键问题是:在什么都不知道的情况下,如何生成一个上行句子?
我觉得这个子问题可以用RNN构建一个古诗词的语言模型来解决,然后通过这个RNN语言模型自动生成对联,理论上是有道理的。也就是说,整体架构如图4所示。
图4全自动对联生成
另外,对于对联,还有一个小问题,就是如何生成横批对联。因为一般的对联也需要配以横批来概括上下对联的主旨。其实这种想法也差不多。你可以把上下链接看成一个整体作为编码器的输入,解码器可以用来生成水平批。这类似于将编码器-解码器注意力作为抽象概念的想法。关键是有没有那么多横向认可的训练数据。我认为这有点悬。
好了,通过以上方法,我相信我可以搭建一个看似不错的对联自动生成系统。
以上内容来自《布洛卡区》。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。