from : https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/

一、Seq2Seq 模型

1. 简介

Sequence-to-sequence (seq2seq) 模型,顾名思义,其输入是一个序列,输出也是一个序列,例如输入是英文句子,输出则是翻译的中文。seq2seq 可以用在很多方面:机器翻译、QA 系统、文档摘要生成、Image Captioning (图片描述生成器)。

2. 基本框架

第一种结构

[参考1]论文中提出的 seq2seq 模型可简单理解为由三部分组成:Encoder、Decoder 和连接两者的 State Vector (中间状态向量) C 。

上图中 Encoder 和 Decoder 可以是一个 RNN ,但通常是其变种 LSTM 或者 GRU 。Encoder 和 Decoder 具体介绍请见第三部分。

第二种结构

该结构是最简单的结构,和第一种结构相似,只是 Decoder 的第一个时刻只用到了 Encoder 最后输出的中间状态变量 :

应用:

  • 在英文翻译中,将英文输入到 Encoder 中,Decoder 输出中文。

    参考1:-原创翻译- 基于RNNEncoder–Decoder的机器翻译L(earning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation)

  • 在图像标注中,将图像特征输入到 Encoder 中,Decoder 输出一段文字对图像的描述。

    参考2:-原创翻译- 图像标注生成器 (Show and Tell: A Neural Image Caption Generator)

  • 在 QA 系统中,将提出的问题输入 Encoder 中,Decoder 输出对于问题的回答。

……

注:确保你对所有模型都有所了解后再阅读应用后面的参考链接。

二、RNN 结构

1. 为什么在这里提及 RNN 及 RNN 变种?

接下来要介绍的 Encoder-Decoder 模型中,Encoder 和 Decoder 两部分的输入输出可以是文字、图像、语音等等,所以 Encoder 和 Decoder 一般采用 CNN 、RNN 、LSTM 、GRU 等等。这里,我们只介绍经典 RNN 的结构。

如果对 LSTM 感兴趣的话,请参考 -原创翻译- 详解 LSTM(Understanding LSTM Networks)

2. 图解 RNN 结构

RNN 大都用来处理像一串句子、一段语音这种的序列化数据。展开的 RNN 结构图如下:

由图可见,其当前时间 t 的输出依赖两部分:前一时刻的隐层 $h_{t-1}$ 和当前的输入 $x_{t}$ 。

下面主要介绍经典的三种 RNN 结构:

(1) n VS 1

注:圆圈代表给定的输入,箭头代表运算,矩形代表隐层,也就是箭头运算后的结果。其中参数 $W、U、V$ 都是一样的。在自然语言处理问题。$x_{1}$ 可以看做是第一个单词,$x_{2}$ 可以看做是第二个单词…

这种结构可应用于情感分析、文本分类等等。

(2) 1 VS n

下图是把输入当作每个时刻的输入:

这种结构可应用于应用于 Image Caption ,输入是图像的特征矩阵,输出是一段对图像的描述。

(3) n VS n

这种结构可应用于机器翻译等。如果感兴趣,可以参考下面的 文章。作者使用 RNN 实现了根据一个字母推测下一个字母的概率。

参考3:-原创翻译- RNNs的“神奇功效”(The Unreasonable Effectiveness of Recurrent Neural Networks)

(4) n VS m

在机器翻译中,源语言和目标语言的句子序列都是不等长的,而原始的 n VS n 结构都是要求序列等长的。为此,我们有了 n VS m 结构,这种结构又被称为 Encoder-Decoder模型 。具体请见下一部分。

三、Encoder-Decoder 模型

1. 简介

在第二节的第四部分,我们提出了 RNN 的 n VS m 结构:Encoder-Decoder 模型,Encoder-Decoder 模型是深度学习中常见的一种模型。在本文中,我们只简单介绍其在文本-文本的应用,比如将英语翻译成汉语,所以该模型也可以称为 Seq2Seq 模型 。下图为 Encoder-Decoder 模型的抽象图:

2. 分析

1) Encoder

给定句子对 <X,Y> ,我们的目标是给定输入句子 X ,通过Encoder-Decoder 模型来翻译成目标句子 Y 。而 X 和 Y 分别由各自的单词序列构成:

首先,Encoder 对输入语句 X 进行编码,经过函数变换为中间语义向量 C (可以通过多种方式得到) :

2) Decoder

得到中间语义向量 C 后,使用 Decoder 进行解码。Decoder根据中间状态向量 C 和已经生成的历史信息 y1,y2…yi-1 去生成 t 时刻的单词 yi :

$$y_{i} = g (C, y_{1}, y_{2}, y_{i-1})$$

如果直接将 c 输入到 Decoder 中,则是 Seq2Seq 模型的第二种模型:

如果将 c 当作 Decoder 的每一时刻输入,则是 Seq2Seq 模型的第一种模型:

  • 中英翻译中, <X,Y> 是不同语言的句子,X 是英文句子,Y 是中文句子。
  • QA 系统中,X 是问题,Y 是回答。
  • ……

    Encoder-Decoder 模型是使用非常广泛的深度学习模型框架,与其说 Encoder-Decoder 是一种模型,不如称其为一种通用框架。因为 Encoder 和 Decoder 具体使用什么模型是根据任务而定义的。在自然语言处理研究中通常使用 LSTM 或者是 GRU 。

四、Attention 模型

1. Encoder-Decoder 模型的局限性

(1) 从第三节的第一部分的 Encoder-Decoder 模型的抽象图中可以看出 Encoder 和 Decoder 的唯一联系只有语义编码  ,即将整个输入序列的信息编码成一个固定大小的状态向量再解码,相当于将信息”有损压缩”。很明显这样做有两个缺点:

  • 中间语义向量无法完全表达整个输入序列的信息。
  • 随着输入信息长度的增加,由于向量长度固定,先前编码好的信息会被后来的信息覆盖,丢失很多信息。

(2)大家看第三节的第二部分的第二个 Decoder 过程,其输出的产生如下:

$y_{1}=g(C, h’_{0})$

$y_{2}=g(C, y_{1})$

$y_{3}=g(C, y_{1}, y_{2})$

明显可以发现在生成 $y_{1}、y_{2}、y_{3}$ 时,语义编码  对它们所产生的贡献都是一样的。例如翻译:Cat chase mouse ,Encoder-Decoder 模型逐字生成:“猫”、“捉”、“老鼠”。在翻译 mouse 单词时,每一个英语单词对“老鼠”的贡献都是相同的。如果引入了Attention 模型,那么 mouse 对于它的影响应该是最大的。

2. 图解 Attention

为了解决上面两个问题,于是引入了 Attention 模型。Attention 模型的特点是 Decoder 不再将整个输入序列编码为固定长度的中间语义向量  ,而是根据当前生成的新单词计算新的 $C_{i}$ ,使得每个时刻输入不同的 ,这样就解决了单词信息丢失的问题。引入了 Attention 的 Encoder-Decoder 模型如下图:

对于刚才提到的那个“猫捉老鼠”的翻译过程变成了如下:

$y_{1}=g(C_{1}, h’_{0})$

$y_{2}=g(C_{2}, y_{1})$

$y_{3}=g(C_{3}, y_{1}, y_{2})$

整个翻译流程如下:

图中输入是 Cat chase mouse ,Encoder 中隐层 h1、h2、h3 可看作经过计算 Cat、chase、mouse 这些词的信息。

使用 $a_{ij}$ 表示 Encoder 中第 j 阶段的 $h_{j}$ 和解码时第 i 阶段的相关性,计算出解码需要的中间语义向量 $C_{i}$ 。$C_{1}$ 和 “猫” 关系最近,相对应的 $a_{11}$ 要比 $a_{12}$ 、$a_{13}$ 大;而 $C_{2}$ 和 “捉” 关系最近,相对应的 $a_{22}$ 要比 $a_{21}$ 、$a_{23}$ 大;同理 $C_{3}$ 和 “老鼠” 关系最近,相对应的 $a_{33}$ 要比 $a_{31}$ 、$a_{32}$ 大。

那么参数 $a_{ij}$ 是如何得到呢?

Encoder 中第 j 个隐层单元 $h_{j}$ 和 Decoder 第 i-1 个隐层单元 $h’{i-1}$ 经过运算得到 $a{ij}$ 。

例如 $a_{1j}$ 的计算过程:

$a_{2j}$ 的计算过程:

参考 :引入Attention 并基于 RNN 的 Encoder-Decoder 模型公式推导

转载于:https://www.cnblogs.com/Arborday/p/10758884.html

[转] 图解Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention相关推荐

  1. encoder decoder 模型理解

    encoder decoder 模型是比较难理解的,理解这个模型需要清楚lstm 的整个源码细节,坦率的说这个模型我看了近十天,不敢说完全明白. 我把细胞的有丝分裂的图片放在开头,我的直觉细胞的有丝分 ...

  2. 【中级软考】软件成本估算方法(专家估算、Wolverton、COCOMO、COCOMOⅡ【应用组合模型、早期开发模型、结构化后期模型】)

    文章目录 四种软件成本估算方法 软件成本估算的背景知识 试题题解 四种软件成本估算方法 当下行业内在进行软件成本估算时,常用的有4种估算方法.这4种软件成本估算方法分别是: 以"估" ...

  3. encoder decoder模型_机器学习11 -- 无监督学习之Auto-Encoder

    1 什么是Auto-Encoder 自编码器Auto-Encoder是无监督学习的一种方式,可以用来做降维.特征提取等.它包括两部分 Encoder:对原始样本进行编码 Decoder:对经过编码后的 ...

  4. encoder decoder模型_3分钟|聊一聊 Decoder 模块

    微信公众号:NLP从入门到放弃 本文大概需要阅读 4.1 分钟 聊一下对 Decoder 的个人总结和理解,我保证里面大部分内容你没在别人那看过,绝对原创. 我先说一个很小的细节点,当时花了点时间才琢 ...

  5. encoder decoder模型_如何突破Decoder性能瓶颈?揭秘FasterTransformer的原理与应用

    位来 发自 凹非寺 量子位 报道 | 公众号 QbitAI 4月9日,英伟达x量子位分享了一期nlp线上课程,来自NVIDIA的GPU计算专家.FasterTransformer 2.0开发者之一的薛 ...

  6. 模型机设计(VERILOG)-模型机结构与Verilog语言

    前言 模型机是本学期电子电路课程的综合设计实验作业,主要利用数字电路逻辑部分的知识完成一个能实现多个指令的模型机,使用Verilog语言实现各个部件并完成最终的部件连接及验证.         在实现 ...

  7. 【AIGC】2、扩散模型 | 到底什么是扩散模型?

    文章目录 一.什么是扩散模型 1.1 现有生成模型简介 1.2 扩散模型的理论来源 1.3 扩散模型的使用场景 1.4 扩散模型的基本结构 1.5 马尔可夫过程 二.扩散模型相关定义 2.1 符号和定 ...

  8. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation之每日一篇

    真正提出 Seq2Seq 的文章是<Sequence to Sequence Learning with Neural Networks>,但本篇<Learning Phrase R ...

  9. 基于Seq2Seq的中文聊天机器人编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

最新文章

  1. atCoder Ants on a Circle(又是蚂蚁问题。。。)
  2. 项目受源代码管理。向源代码管理注册此项目时出错。建议不要对此项目进行任何更改...
  3. Object类Objects类总结
  4. 第十三天-迭代器、三元表达、字典生成式、生成器、递归
  5. Centos 7和 Centos 6开放查看端口 防火墙关闭打开
  6. python可以开多少线程_python多线程详解
  7. Android ViewPropertyAnimator 属性动画概述
  8. python安装在d盘环境变量配置_python安装与环境变量配置
  9. (31)System Verilog验证计划及策略
  10. 如何在SQL Server 2016中比较查询执行计划
  11. WindowsXP如何设置共享权限
  12. spss无法连接到本地计算机,通过远程连接打开SPSS产品时,收到许可证错误信息。从本地打开同一产品时没有错误。...
  13. 俄罗斯方块菜单c语言,飞机游戏、俄罗斯方块、贪吃蛇C语言代码
  14. python 批量改文件后缀_python如何批量修改文件后缀名?批量修改文件后缀名的方法...
  15. Java基础面试题(持续更新)
  16. LWN:Fedora 关于无驱动打印的讨论!
  17. java判断日期是否为工作日(排除节假日和调整周末上班)
  18. win10系统进不了服务器失败,快速解决Win10安装失败重启进不了系统的方法
  19. 64位处理器_64位系统真的比32位系统快吗?
  20. JAVA范例 - Applet小应用程序

热门文章

  1. linux网络编程-----非阻塞connect
  2. el表达式动态取值中括号内两点_中考热点:旧瓶新酒,解题新策略分析之玩转动态型热点题型...
  3. 解决ImportError: cannot import name ‘imread‘ from ‘scipy.misc‘
  4. python 继承的规则
  5. java 如何检测死锁_Java如何查看死锁
  6. 党在心中(turtle画图)
  7. [BUUCTF-pwn]——ciscn_2019_ne_5
  8. 进程间通信(IPC机制)——管道
  9. 51单片机的轮胎气压监测系统_SHT11传感器的温度、湿度采集系统,51单片机,Proteus仿真,C代码等...
  10. 通过LDAP验证Active Directory服务