从RNN到Attention
上次我们讲到,传统神经网络无法获取时序信息,但时序信息在自然语言处理任务中非常重要!
例如 “我吃了一个苹果”这一句话,“苹果” 的词性和意思,取决于前面词的信息,如果没有 “我吃了一个” 这些词,“苹果”也可以翻译为乔布斯的“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 应用举例:
- 假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词。
- 然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出“01” 然后,我们按照顺序,将“time”输入到RNN 网络,得到输出“02”。
- 这个过程中,输入 “time” 的时候,前面 “what”的输出也产生了影响(隐藏层中有一半是黑色的)。
- 以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。
- 当我们判断意图的时候,只需要最后一层的输出“05”。
RNN 的缺点也非常明显
通过上面的例子,我们已经发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN存在的短期记忆问题。
- RNN 有短期记忆问题,无法处理很长的输入序列
- 训练 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相关推荐
- 循环神经网络RNN 2—— attention注意力机制(附代码)
attention方法是一种注意力机制,很明显,是为了模仿人的观察和思维方式,将注意力集中到关键信息上,虽然还没有像人一样,完全忽略到不重要的信息,但是其效果毋庸置疑,本篇我们来总结注意力机制的不同方 ...
- 快速串联 RNN / LSTM / Attention / transformer / BERT / GPT
参考: 李宏毅2021/2022春机器学习课程 王树森 RNN & Transformer 教程 Transformer 详解 文章目录 0. 背景:序列数据及相关任务 1. 早期序列模型 1 ...
- 机器学习笔记: attention
1 回顾: 使用RNN的Seq2Seq encoder最后的输出,我们生成两个向量,初始的decoder状态s0和文本向量c.然后进行decoder操作 但是问题在于,如果输入的sequence很长的 ...
- 细讲 | Attention Is All You Need
细讲 | Attention Is All You Need Attention Is All You Need 自从Attention机制在提出之后,加入Attention的Seq2Seq模型在各个 ...
- 啥是Attention?
点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV粉丝sayhi对论文中常见的Attention机制的解读,已获作者授权转载,请勿二次转载: https://juejin.im/post/ ...
- TensorFlow Attention
参考: 完全解析RNN, Seq2Seq, Attention注意力机制
- TensorFlow tf.keras.layers.RNN
参数 参数 描述 cell input_shape (timestep, input_dim),timestep可以设置为None,由输入决定,input_dime根据具体情况 return_sequ ...
- Seq2Seq中的Attention
<Seq2Seq中的Attention> Sequence to Sequence的结构在整个深度学习的进程中占有重要的角色,我在2017年做OCR的时候用这个,当时语音组做语音识别的 ...
- cnn和rnn可以结合使用吗,rnn和cnn优点缺点对比
CNN和RNN在文本分类过程中的区别整理 用CNN卷积的情况,这里面有几个关键点:一个是文本跟图片不一样,图片有长宽,然后还有深度(RGB). 对应到文本上,假设文章总共N个词,每个词嵌入维度K维,那 ...
最新文章
- C#——《C#语言程序设计》实验报告——面向对象程序设计——自动出题判分小程序
- 百度贴吧前负责人:做产品16年,我有9条心得[转]
- Servlet详解之两个init方法的作用
- 开关量光端机产品特点及应用范围介绍
- C++学习笔记系列一
- instr函数 mysql_mysql数据库中查找字串出现的位置instr函数
- 喜大普奔!Django官方文档终于出中文版了
- 安装Eclipse ADT插件时遇到的一些问题,错误
- Echarts地图案例
- nec编码红外遥控原理整理
- ArcGIS GeoEvent 使用教程(一)
- Android之人脸识别
- 项目经理需要的基本技能
- 一个域名可以对应多个IP吗?如何通过DNS实现?
- 数据库唯一性约束(Unique Constraint)
- 脑电波实时数据收集——RDA—数据包定义
- css实现Table的cellpadding, cellspacing
- 英雄无敌3 Mac 百度云 下载
- Guid.NewGuid().ToString()的几种格式
- xbmc_如何在XBMC上获取Hulu和Amazon视频
热门文章
- 宇宙天机:天道原来是反过来的
- Python爬虫实习笔记 | Week4 项目数据爬取与反思
- CSS画三角形、扇形
- Fabric.js 喷雾笔刷从入门到放肆
- 微信小游戏多账号快速登录插件
- arduino的servo函数_如何使用Arduino舵机库servo.h – 八色木
- 基于apt-mirror同步kylin v4 源及构建本地源
- 2020年首届“凤来仪”创业大赛暨江苏人才创新创业项目路演智能汽车和大数据专场
- WARN No appenders could be found for logger错误
- 超人气塔防游戏:气球塔防6 for Mac(v26.2.4058中文版)