上次我们讲到,传统神经网络无法获取时序信息,但时序信息在自然语言处理任务中非常重要!

例如 “我吃了一个苹果”这一句话,“苹果” 的词性和意思,取决于前面词的信息,如果没有 “我吃了一个” 这些词,“苹果”也可以翻译为乔布斯的“Apple”。

然而,RNN 的出现,让处理时序信息变为可能。


1. 传统神经网络

传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:
输入是x,经过线性变换Wx+b激活函数f得到输出y。相信大家对这个已经非常熟悉了。


但在实际应用中,我们还会遇到很多序列形的数据:
例如:

  • 自然语言处理问题。x1可以看做是第一个单词,x2是第二个,依次类推, 与文章开头“苹果”的例子相同。
  • 语音处理。此时,x1、x2、x3……是每帧的声音信号。
  • 时间序列问题。例如每天的股票价格等等

2. RNN(循环神经网络)

2.1 RNN基本结构单元(N vs N)

RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:

将 RNN 按时序展开则如下图所示:

  • 上图左边部分称作 RNN 的一个 timestep,在这个 timestep 中可以看到,在 t 时刻,输入变量 xt,通过 RNN的一个基础模块 A,输出变量 ht,而 t 时刻的信息,将会传递到下一个时刻 t+1。
  • 上图右边部分所示,模块按照时序展开,由此可以看到 RNN 为多个基础模块 A 的互连,每一个模块都会把当前信息传递给下一个模块。

过程如下图所示:

一个箭头就表示对对应的向量做一次类似于f(Wx+b)的变换,这里的这个箭头就表示对h1进行一次变换,得到输出y1。

剩下的输出类似进行(使用和y1同样的参数V和c):

这就是最经典的RNN结构,我们像搭积木一样把它搭好了。它的输入是x1, x2, …xn,输出为y1, y2,…yn,也就是说,输入和输出序列必须要是等长的。

2.2 RNN_(N vs 1)

有的时候,我们要处理的问题输入是一个序列,输出是一个单独的值而不是序列,应该怎样建模呢?实际上,我们只在最后一个h上进行输出变换即可:

这种结构通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等。

2.3 RNN_(1 vs N)

输入不是序列而输出为序列的情况怎么处理?
我们可以只在序列开始进行输入计算:


这种1 VS N的结构可以处理的问题有:

  • 从图像生成文字(image caption),此时输入的 X 就是图像的特征,而输出的 Y 序列就是一段句子
  • 从类别生成语音或音乐等

2.4 RNN_(N vs M)

下面我们来介绍RNN最重要的一个变种:N vs M。
这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

原始的 N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。

为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量 c

得到c有多种方式,最简单的方法就是把 Encoder 的最后一个隐状态赋值给c,还可以对最后的隐状态做一个变换得到 c ,也可以对所有的隐状态做变换。

拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被Decoder。具体做法就是将c当做之前的初始状态 h0 输入到Decoder中

还有一种做法是将c当做每一步的输入:

由于这种Encoder-Decoder结构不限制输入和输出的序列长度,因此应用的范围非常广泛,比如:

  • 机器翻译:Encoder-Decoder的最经典应用,事实上这一结构就是在机器翻译领域最先提出的
  • 文本摘要:输入是一段文本序列,输出是这段文本序列的摘要序列。 阅读理解。将输入的文章和问题分别编码,再对其进行解码得到问题的答案。
  • 语音识别:输入是语音信号序列,输出是文字序列。
  • …………

总而言之,RNN 解决了时序依赖问题,但这里的时序一般指的是短距离的,首先我们先介绍下短距离依赖长距离依赖的区别:

  • 短距离依赖:对于这个填空题 “我想看一场篮球____”,我们很容易就判断出 “篮球” 后面跟的是 “比赛”,这种短距离依赖问题非常适合 RNN。
  • 长距离依赖:对于这个填空题“我出生在中国的瓷都景德镇,小学和中学离家都很近,……,我的母语是____”,对于短距离依赖,“我的母语是” 后面可以紧跟着“汉语”、“英语”、“法语”,但是如果我们想精确答案,则必须回到上文中很长距离之前的表述 “我出生在中国的瓷都景德镇”,进而判断答案为“汉语”,而 RNN 是很难学习到这些信息的。

2.5 RNN 的梯度消失问题

RNN 为什么不适合长距离依赖问题?

RNN 应用举例:

  1. 假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词。
  2. 然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出“01” 然后,我们按照顺序,将“time”输入到RNN 网络,得到输出“02”。
  3. 这个过程中,输入 “time” 的时候,前面 “what”的输出也产生了影响(隐藏层中有一半是黑色的)。
  4. 以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。
  5. 当我们判断意图的时候,只需要最后一层的输出“05”。

RNN 的缺点也非常明显

通过上面的例子,我们已经发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN存在的短期记忆问题。

  1. RNN 有短期记忆问题,无法处理很长的输入序列
  2. 训练 RNN 需要投入极大的成本

由于这些缺点,我们引出了Attention机制!

3. RNN+Attention

在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,因此, c 中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下降。

Attention机制通过在每个时间输入不同的 c 来解决这个问题,下图是带有Attention机制的Decoder:

每一个 c 会自动去选取与当前所要输出的 y 最合适的上下文信息。具体来说,我们用 aij 衡量Encoder中第 j 阶段的 hj 和解码时第i阶段的相关性,最终Decoder中第 i 阶段的输入的上下文信息Ci 就来自于所有 hj 对 aij 的加权和。

以机器翻译为例(将中文翻译成英文):

输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文 c1 应该和 “我” 这个字最相关,因此对应的 a11 就比较大,而相应的 a12,a13,a14就比较小。c2应该和“爱”最相关,因此对应的 a22 就比较大。最后的c3和h3、h4最相关,因此a33,a34的值就比较大。

至此,关于Attention模型,我们就只剩最后一个问题了,那就是:
这些权重是怎么来的?

事实上, aij 同样是从模型中学出的,它实际和Decoder的第 i-1阶段的隐状态、Encoder第 j 个阶段的隐状态有关。

a1j 的计算:

a2j 的计算:

a3j 的计算:

以上就是带有Attention的Encoder-Decoder模型计算的全过程。


从RNN到Attention相关推荐

  1. 循环神经网络RNN 2—— attention注意力机制(附代码)

    attention方法是一种注意力机制,很明显,是为了模仿人的观察和思维方式,将注意力集中到关键信息上,虽然还没有像人一样,完全忽略到不重要的信息,但是其效果毋庸置疑,本篇我们来总结注意力机制的不同方 ...

  2. 快速串联 RNN / LSTM / Attention / transformer / BERT / GPT

    参考: 李宏毅2021/2022春机器学习课程 王树森 RNN & Transformer 教程 Transformer 详解 文章目录 0. 背景:序列数据及相关任务 1. 早期序列模型 1 ...

  3. 机器学习笔记: attention

    1 回顾: 使用RNN的Seq2Seq encoder最后的输出,我们生成两个向量,初始的decoder状态s0和文本向量c.然后进行decoder操作 但是问题在于,如果输入的sequence很长的 ...

  4. 细讲 | Attention Is All You Need

    细讲 | Attention Is All You Need Attention Is All You Need 自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个 ...

  5. 啥是Attention?

    点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV粉丝sayhi对论文中常见的Attention机制的解读,已获作者授权转载,请勿二次转载: https://juejin.im/post/ ...

  6. TensorFlow Attention

    参考: 完全解析RNN, Seq2Seq, Attention注意力机制

  7. TensorFlow tf.keras.layers.RNN

    参数 参数 描述 cell input_shape (timestep, input_dim),timestep可以设置为None,由输入决定,input_dime根据具体情况 return_sequ ...

  8. Seq2Seq中的Attention

    <Seq2Seq中的Attention>   Sequence to Sequence的结构在整个深度学习的进程中占有重要的角色,我在2017年做OCR的时候用这个,当时语音组做语音识别的 ...

  9. cnn和rnn可以结合使用吗,rnn和cnn优点缺点对比

    CNN和RNN在文本分类过程中的区别整理 用CNN卷积的情况,这里面有几个关键点:一个是文本跟图片不一样,图片有长宽,然后还有深度(RGB). 对应到文本上,假设文章总共N个词,每个词嵌入维度K维,那 ...

最新文章

  1. C#——《C#语言程序设计》实验报告——面向对象程序设计——自动出题判分小程序
  2. 百度贴吧前负责人:做产品16年,我有9条心得[转]
  3. Servlet详解之两个init方法的作用
  4. 开关量光端机产品特点及应用范围介绍
  5. C++学习笔记系列一
  6. instr函数 mysql_mysql数据库中查找字串出现的位置instr函数
  7. 喜大普奔!Django官方文档终于出中文版了
  8. 安装Eclipse ADT插件时遇到的一些问题,错误
  9. Echarts地图案例
  10. nec编码红外遥控原理整理
  11. ArcGIS GeoEvent 使用教程(一)
  12. Android之人脸识别
  13. 项目经理需要的基本技能
  14. 一个域名可以对应多个IP吗?如何通过DNS实现?
  15. 数据库唯一性约束(Unique Constraint)
  16. 脑电波实时数据收集——RDA—数据包定义
  17. css实现Table的cellpadding, cellspacing
  18. 英雄无敌3 Mac 百度云 下载
  19. Guid.NewGuid().ToString()的几种格式
  20. xbmc_如何在XBMC上获取Hulu和Amazon视频

热门文章

  1. 宇宙天机:天道原来是反过来的
  2. Python爬虫实习笔记 | Week4 项目数据爬取与反思
  3. CSS画三角形、扇形
  4. Fabric.js 喷雾笔刷从入门到放肆
  5. 微信小游戏多账号快速登录插件
  6. arduino的servo函数_如何使用Arduino舵机库servo.h – 八色木
  7. 基于apt-mirror同步kylin v4 源及构建本地源
  8. 2020年首届“凤来仪”创业大赛暨江苏人才创新创业项目路演智能汽车和大数据专场
  9. WARN No appenders could be found for logger错误
  10. 超人气塔防游戏:气球塔防6 for Mac(v26.2.4058中文版)