深度学习笔记(六):Encoder-Decoder模型和Attention模型

      版权声明:本文为博主原创文章,未经博主允许不得转载。          https://blog.csdn.net/u014595019/article/details/52826423        </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div id="content_views" class="markdown_views prism-atom-one-dark"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p><a href="http://blog.csdn.net/u014595019/article/details/52554582" rel="nofollow" target="_blank">深度学习笔记(一):logistic分类</a> <br>

深度学习笔记(二):简单神经网络,后向传播算法及实现

深度学习笔记(三):激活函数和损失函数

深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

深度学习笔记(四):循环神经网络的概念,结构和代码注释

深度学习笔记(五):LSTM

深度学习笔记(六):Encoder-Decoder模型和Attention模型


这两天在看attention模型,看了下知乎上的几个回答,很多人都推荐了一篇文章Neural Machine Translation by Jointly Learning to Align and Translate 我看了下,感觉非常的不错,里面还大概阐述了encoder-decoder(编码)模型的概念,以及传统的RNN实现。然后还阐述了自己的attention模型。我看了一下,自己做了一些摘录,写在下面


1.Encoder-Decoder模型及RNN的实现

所谓encoder-decoder模型,又叫做编码-解码模型。这是一种应用于seq2seq问题的模型

那么seq2seq又是什么呢?简单的说,就是根据一个输入序列x,来生成另一个输出序列y。seq2seq有很多的应用,例如翻译,文档摘取,问答系统等等。在翻译中,输入序列是待翻译的文本,输出序列是翻译后的文本;在问答系统中,输入序列是提出的问题,而输出序列是答案。

为了解决seq2seq问题,有人提出了encoder-decoder模型,也就是编码-解码模型。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。


此处输入图片的描述

当然了,这个只是大概的思想,具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。

这边为了方便阐述,选取了编码和解码都是RNN的组合。在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间输入决定的,也就是

ht=f(ht1,xt)ht=f(ht−1,xt)

获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量

C=q(h1,h2,h3,,hTx)C=q(h1,h2,h3,…,hTx)

一种简单的方法是将最后的隐藏层作为语义向量C,即

C=q(h1,h2,h3,,hTx)=hTxC=q(h1,h2,h3,…,hTx)=hTx

解码阶段可以看做编码的逆过程。这个阶段,我们要根据给定的语义向量C和之前已经生成的输出序列y1,y2,yt1y1,y2,…yt−1

也可以写作

yt=g({y1,,yt1},C)yt=g({y1,…,yt−1},C)

而在RNN中,上式又可以简化成

yt=g(yt1,st,C)yt=g(yt−1,st,C)

其中ss的概率。

encoder-decoder模型虽然非常经典,但是局限性也非常大。最大的局限性就在于编码和解码之间的唯一联系就是一个固定长度的语义向量C。也就是说,编码器要将整个序列的信息压缩进一个固定长度的向量中去。但是这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,还有就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打个折扣了


2.Attention模型

为了解决这个问题,作者提出了Attention模型,或者说注意力模型。简单的说,这种模型在产生输出的时候,还会产生一个“注意力范围”表示接下来输出的时候要重点关注输入序列中的哪些部分,然后根据关注的区域来产生下一个输出,如此往复。模型的大概示意图如下所示


此处输入图片的描述

相比于之前的encoder-decoder模型,attention模型最大的区别就在于它不在要求编码器将所有输入信息都编码进一个固定长度的向量之中。相反,此时编码器需要将输入编码成一个向量的序列,而在解码的时候,每一步都会选择性的从向量序列中挑选一个子集进行进一步处理。这样,在产生每一个输出的时候,都能够做到充分利用输入序列携带的信息。而且这种方法在翻译任务中取得了非常不错的成果。

在这篇文章中,作者提出了一个用于翻译任务的结构。解码部分使用了attention模型,而在编码部分,则使用了BiRNN(bidirectional RNN,双向RNN)

2.1 解码

我们先来看看解码。解码部分使用了attention模型。类似的,我们可以将之前定义的条件概率写作

p(yi|y1,,yi1,X)=g(yi1,si,ci)p(yi|y1,…,yi−1,X)=g(yi−1,si,ci)

上式sisi

注意这里的条件概率与每个目标输出yiyi

由于编码使用了双向RNN,因此可以认为hihi

也就是说,si1si−1
上面这些公式就是解码器在第i个时间段内要做的事情。作者还给了一个示意图:

QQ截图20161015223332.jpg-20.6kB

2.2 编码

相比于上面解码的创新,这边的编码就比较普通了,只是传统的单向的RNN中,数据是按顺序输入的,因此第j个隐藏状态hjh→j就包含了第j个输入和前后的信息。


3.实验结果

为了检验性能,作者分别使用传统模型和attention模型在英语-法语的翻译数据集上进行了测验。

传统模型的编码器和解码器各有1000个隐藏单元。编码器中还有一个多层神经网络用于实现从隐藏状态到单词的映射。在优化方面,使用了SGD(minibatch stochastic gradient descent)以及Adadelta,前者负责采样,后者负责优化下降方向。

得到的结果如下:
QQ截图20161015224833.jpg-36.7kB

图中RNNenc表示传统的结构,而RNNsearch表示attention模型。后面的数字表示序列的长度。可以看到,不论序列长度,attention模型的性能均优于传统的编码-解码模型。而RNNsearch-50甚至在长文本上的性能也非常的优异

除了准确度之外,还有一个很值得关注的东西:注意力矩阵。之前已经提过,每个输出都有一个长为TxTx的注意力向量,那么将这些向量合起来看,就是一个矩阵。对其进行可视化,得到如下结果

QQ截图20161015225911.jpg-63.7kB

其中x轴表示待翻译的句子中的单词(英语),y轴表示翻译以后的句子中的单词(法语)。可以看到尽管从英语到法语的过程中,有些单词的顺序发生了变化,但是attention模型仍然很好的找到了合适的位置。换句话说,就是两种语言下的单词“对齐”了。因此,也有人把注意力模型叫做对齐(alignment)模型。而且像比于用语言学实现的硬对齐,这种基于概率的软对齐更加优雅,因为能够更全面的考虑到上下文的语境。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议 | 2018年全国知识图谱与语义计算大会(CCKS 2018)

2018年全国知识图谱与语义计算大会China Conference on Knowledge Graph and Semantic Computing (CCKS 2018)2018年8月14日-17日&#xff0c;天津征稿截止: 2018年5月18日全国知识图谱与语义计算大会&#xff08;CCKS: China Conference on Knowledge Graph and Semantic Comp…

C++ Primer 第11章 泛型算法 学习总结

文章目录11.2 算法11.2.1 只读算法**1.find函数****2.accumulate函数****3.find_first_of 函数**11.2.2 写容器元素算法1.fill函数2.fill_n函数3.back_inserter插入迭代器4.copy函数5.算法的 _copy 版本11.2.3 排序算法sort&#xff08;起始&#xff0c;结束&#xff09;&#…

到底什么是生成式对抗网络GAN?

时间&#xff1a;2017-05-11 男&#xff1a;哎&#xff0c;你看我给你拍的好不好&#xff1f; 女&#xff1a;这是什么鬼&#xff0c;你不能学学XXX的构图吗&#xff1f; 男&#xff1a;哦 …… 男&#xff1a;这次你看我拍的行不行&#xff1f; 女&#xff1a;你看看你的…

分布式缓存Redis+Memcached经典面试题和答案

Redis相比memcached有哪些优势&#xff1f; &#xff08;1&#xff09; memcached所有的值均是简单的字符串&#xff0c;redis作为其替代者&#xff0c;支持更为丰富的数据类型 &#xff08;2&#xff09; redis的速度比memcached快很多 &#xff08;3&#xff09; redis可以…

卖萌屋福利场:《机器阅读理解》免费送送送!

一只小狐狸带你解锁 炼丹术&NLP 秘籍在送书之前&#xff0c;先来了解一下机器阅读理解是什么&#xff5e;已经很熟悉的小伙伴可以快速下拉进入福利场~机器阅读理解是什么机器阅读理解&#xff08;Machine Reading Comprehension&#xff0c;MRC&#xff09;是一种利用算法使…

CCKS 2018 | 工业界论坛报告简介

China Conference on Knowledge Graph and Semantic Computing 天津&#xff0c;2018年8月14日-8月17日主题1&#xff1a;智能交互中的知识图谱时间&#xff1a;2018.08.17 &#xff08;14:00-15:00&#xff09;地点&#xff1a;天津滨海一号大会场报告1&#xff1a;报告题目&a…

BAT Java面试笔试33题:JavaList、Java Map等经典面试题!答案汇总!

JavaList面试题汇总 1、List集合&#xff1a;ArrayList、LinkedList、Vector等。 2、Vector是List接口下线程安全的集合。 3、List是有序的。 4、ArrayList和LinkedList数据结构不一样&#xff0c;前者用在查询较多的场合&#xff0c;后者适用于插入较多的场合。 5、ArrayL…

基于在线百科知识库的多义词词义消歧项目

WordMultiSenseDisambiguation WordMultiSenseDisambiguation, chinese multi-wordsense disambiguation based on online bake knowledge base and semantic embedding similarity compute,基于百科知识库的中文词语多义项获取与特定句子词语语义消歧. 项目地址:https://gith…

文本查询TextQuery类文件编写

读取用户指定的任意文本文件&#xff0c;然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数&#xff0c;并列出每次出现所在的行。如果某单词在同一行中多次出现&#xff0c;程序将只显示该行一次。行号按升序显示&#xff0c;即第 7 行应该在第 9 行之前输出&…

什么是小样本学习?这篇综述文章用166篇参考文献告诉你答案

一只小狐狸带你解锁 炼丹术&NLP 秘籍来源&#xff1a;机器之心什么是小样本学习&#xff1f;它与弱监督学习等问题有何差异&#xff1f;其核心问题是什么&#xff1f;来自港科大和第四范式的这篇综述论文提供了解答。数据是机器学习领域的重要资源&#xff0c;在数据缺少的…

CCKS 2018 | 前沿技术讲习班

时间&#xff1a;8月14日-15日地点&#xff1a;南开大学泰达学院大报告厅日程安排时间主题特邀讲者8月14日上午&#xff08;8:30 – 10:00&#xff09;Deep Knowledge Graph Reasoning&#xff08;10:30-12:00&#xff09;Exploiting and Reasoning With Open Knowledge GraphW…

Java必考题目之JVM面试题目和答案

JVM内存模型 首先我们来了解一下JVM的内存模型的怎么样的&#xff1a; 1.堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 堆得内存由-Xms指定&#xff0c;默认是物理内存的1/64&#xff1b;最大的内存由-Xmx指定&#xff0c;默认是物理内存的1/4…

听说读论文也有trick?这篇文章告诉你深度学习论文阅读最佳姿势

2020年的今天&#xff0c;我们的专业是deep learning&#xff0c;但是我们要keep learning&#xff0c;每天早上一睁眼&#xff0c;arxiv每天更新上百篇的论文&#xff0c;著名微博博主爱可可-爱生活保持也在推送最新的deep learning资讯和论文。我们不缺少计算机视觉论文&…

屏幕Screen类文件编写

注意&#xff1a; inline 定义的函数必须放在 .h 文件中&#xff0c;否则编译器报错&#xff01; 其次&#xff0c;注意写全称在 .h 里&#xff0c;如 std:: screen.h 头文件 #ifndef SCREEN_H #define SCREEN_H #include<string> #include<iostream>class Scre…

机器翻译自动评估-BLEU算法详解

机器翻译自动评估-BLEU算法详解 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_31584157/article/details/77709454 </div><link rel"stylesheet" href"https://csdnimg.cn/re…

论文浅尝 | 利用Lattice LSTM的最优中文命名实体识别方法

本文转载自公众号&#xff1a;机器之心。选自arXiv作者&#xff1a;Yue Zhang、Jie Yang机器之心编译参与&#xff1a;路、王淑婷近日&#xff0c;来自新加坡科技设计大学的研究者在 arXiv 上发布了一篇论文&#xff0c;介绍了一种新型中文命名实体识别方法&#xff0c;该方法利…

最全MySQL面试60题和答案

Mysql中有哪几种锁&#xff1f; 1.表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。 2.行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会出现死锁&#xff1b;…

中文幽默语料库构建与计算项目(幽默等级识别,幽默类型识别,隐喻类型识别,隐喻情绪识别)

ChineseHumorSentiment chinese Humor Detection or Computation based on corpus and nlp methods, 基于语料库与NLP方法的中文幽默计算与检测项目 项目地址:https://github.com/liuhuanyong/ChineseHumorSentiment 项目介绍 幽默多指令人发笑的品质或者具有发笑的能力&…

账户Account类文件编写(static成员使用)

static类成员是该类所有成员共享一份的数据&#xff0c;一处修改了&#xff0c;全部变更&#xff1b; static成员函数只能调用static成员数据&#xff1b; static const整形int&#xff0c;char&#xff0c;可以在类内声明和初始化&#xff0c;类外不必再声明&#xff08;跟编译…

百度机器阅读理解比赛赛后总结

百度机器阅读理解比赛赛后总结 <!-- 文章内容 --><div data-note-content"" class"show-content"><div class"show-content-free"><p>2018年4-5月间&#xff0c;笔者参加了百度举办的<a href"https://links.jia…