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 最后输出的中间状态变量 :

应用:

……

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

二、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 模型公式推导

[转] 图解Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention的更多相关文章

  1. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

    1.主要完成的任务是能够将英文转译为法文,使用了一个encoder-decoder模型,在encoder的RNN模型中是将序列转化为一个向量.在decoder中是将向量转化为输出序列,使用encode ...

  2. 原来你是这样的BERT,i了i了! —— 超详细BERT介绍(一)BERT主模型的结构及其组件

    原来你是这样的BERT,i了i了! -- 超详细BERT介绍(一)BERT主模型的结构及其组件 BERT(Bidirectional Encoder Representations from Tran ...

  3. Coursera Deep Learning笔记 序列模型(一)循环序列模型[RNN GRU LSTM]

    参考1 参考2 参考3 1. 为什么选择序列模型 序列模型能够应用在许多领域,例如: 语音识别 音乐发生器 情感分类 DNA序列分析 机器翻译 视频动作识别 命名实体识别 这些序列模型都可以称作使用标 ...

  4. Atitit.软件开发的三层结构isv金字塔模型

    Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...

  5. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  6. 自定义Encoder/Decoder进行对象传递

    转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...

  7. 比sun.misc.Encoder()/Decoder()的base64更高效的mxBase64算法

    package com.mxgraph.online; import java.util.Arrays; /** A very fast and memory efficient class to e ...

  8. JVM内存区域的划分(内存结构或者内存模型)

    JVM内存区域的划分(内存结构或者内存模型)   运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...

  9. Netty自定义Encoder/Decoder进行对象传递

    转载:http://blog.csdn.net/top_code/article/details/50901623 在上一篇文章中,我们使用Netty4本身自带的ObjectDecoder,Objec ...

随机推荐

  1. python基础 常见用法

    1.python计时器timeit模块 1)timeit 模块定义了接收两个参数的Timer类,两个参数都是字符串. 参数1:要计时的语句或者函数 参数2:为参数1构建环境的导入语句 2)Timer对 ...

  2. google 跨域解决办法

    --args --disable-web-security --user-data-dir

  3. 【刷题】牛客网看到的鹅厂ML面筋-部分问题RecSys相关

    昨天下午六点半的电话面试,其实我已经有了一个不错的实习offer ,不是特别想去腾讯了,没有太怎么准备,接的电话. 整个面试15分钟,开始就是自我介绍,接着问项目,和上一段百度实习经历.问题大致如下: ...

  4. git常用命令值stash

    git stash(git储藏)可用于以下情形: 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交.这时就可以考虑git stash. 使用git的时候,我们 ...

  5. java基础问题巩固(1)

    你对java垃圾回收了解吗?什么时候需要使用? 答: 垃圾回收器的作用是查找和回收(清理)无用的对象,从而让jvm更 有效的使用内存.但是运行因为垃圾回收本身会有开销,过于频繁的使用会导致性能下降.比 ...

  6. WebSocket原理

    一 . WebSocket原理 1.1.背景 WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动 ...

  7. jsp学习(1)jsp请求过程和生命周期

    一.服务器处理jsp请求的过程: 以下步骤表明了 Web 服务器是如何使用JSP来创建网页的: 1.浏览器发送一个 HTTP 请求给服务器. 2.Web 服务器识别出这是一个对 JSP 网页的请求,并 ...

  8. Add AI feature to Xamarin.Forms app

    Now, AI is one of important technologies.Almost all platforms have API sets of AI. Following list is ...

  9. 《JAVA与模式》之工厂方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述工厂方法模式的: 工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymor ...

  10. Go语言中数组

    数组是一个值类型 func ArrayTest1(){ var arryA [3]int = [3]int{1,2,3} //创建一个数组B,将B中第二个元素设置为200 arryB := arryA ...