深度学习TF—9.循环神经网络RNN及其变体GRU、LSTM
文章目录
- 引言
- 一、RNN神经元结构(1)
- 二、RNN神经元结构(2)
- 三、循环神经网络的类型
- 四、单向循环神经网络的局限
- 五、长短时记忆网络LSTM
- 六、Gated Recurrent Unit—GRU
引言
虽然全连接神经网络理论上只要训练数据足够,给定特定的x,就能得到希望的y,但是全连接神经网络只能处理独立的输入,前一个输入和后一个输入是完全没有关系的。针对某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的情况,此时,就需要用到循环神经网络RNN,该神经网络能够很好的处理序列信息。
标准的全连接神经网络(fully connected neural network)处理序列数据会有两个问题:
1)全连接神经网络输入层和输出层长度固定,而不同序列的输入、输出可能有不同的长度,选择最大长度并对短序列进行填充(pad)不是一种很好的方式;
2)全连接神经网络同一层的节点之间是无连接的,当需要用到序列之前时刻的信息时,全连接神经网络无法做到,一个序列的不同位置之间无法共享特征。
一、RNN神经元结构(1)
参考于一文搞懂RNN(循环神经网络)基础篇
一个简单的循环神经网络,它由输入层、隐藏层(单个)、输出层构成。
x是输入层的值
U是输入层到隐藏层的权重矩阵
s是隐藏层的值
权重矩阵 W就是上一个时刻隐藏层的值作为这一时刻的输入的权重。循环神经网络的隐藏层的值s不仅仅取决于当前时刻的输入x,还取决于前一时刻隐藏层的值s。
V是隐藏层到输出层的权重矩阵
下图展示了上一时刻的隐藏层是如何影响当前时刻的隐藏层的。
循环神经网络时间线展开图为:
这个网络在t时刻接收到输入xt 之后,隐藏层的值是st ,输出值是 ot 。st的值不仅仅取决于 xt,还取决于 st-1。
循环神经网络计算方法用公式表示为:
二、RNN神经元结构(2)
对于 RNN,一个非常重要的概念就是时刻。RNN 会对每一个时刻的输入结合当前模型的状态给出一个输出。t 时刻 RNN 的主体结构 A 的输入除了来自输入层 Xt,还有一个循环的边来提供从 t−1 时刻传递来的隐藏状态。
将RNN 的主体结构 A 按时间复制可得:
如何设计循环体 A 的网络结构是 RNN 解决实际问题的关键。和卷积神经网络(CNN)过滤器中参数共享类似,在 RNN 中,循环体 A 中的参数在不同时刻也是共享的。
循环体A的结构为:
下图展示了一个最简单的使用单个全连接层作为循环体 A 的 RNN。图中黄色的 tanh 小方框表示一个使用 tanh 作为激活函数的全连接层。
t 时刻循环体 A 的输入包括 Xt和从 t−1 时刻传递来的隐藏状态 ht-1。循环体 A 的两部分输入如何处理呢?将 Xt和 ht-1直接拼接起来,成为一个更大的矩阵/向量 [Xt,ht-1]。假设 Xt 和 ht-1 的形状分别为 [1, 3] 和 [1, 4],则最后循环体 A 中全连接层输入向量的形状为 [1, 7]。拼接完后按照全连接层的方式进行处理即可。
RNN前向传播如图所示:
三、循环神经网络的类型
- one to one:其实和全连接神经网络并没有什么区别,这一类别算不得是 RNN。
- one to many:输入不是序列,输出是序列。
- many to one:输入是序列,输出不是序列。
- many to many:输入和输出都是序列,但两者长度可以不一样。
- many to many:输出和输出都是序列,两者长度一样。
四、单向循环神经网络的局限
单向 RNN 的缺点是在 t 时刻,无法使用 t+1 及之后时刻的序列信息,所以就有了双向循环神经网络。理论上循环神经网络可以支持任意长度的序列,然而在实际中,如果序列过长会导致优化时出现梯度消散的问题(the vanishing gradient problem),所以实际中一般会规定一个最大长度,当序列长度超过规定长度之后会对序列进行截断。RNN 面临的一个技术挑战是长期依赖(long-term dependencies)问题,即当前时刻无法从序列中间隔较大的那个时刻获得需要的信息。在理论上,RNN 完全可以处理长期依赖问题,但实际处理过程中,RNN 表现得并不好。但是 GRU 和 LSTM 可以处理梯度消散问题和长期依赖问题。
针对于RNN的梯度爆炸问题,
可抽象为WR的k次方,当WR较小时,梯度弥散。当WR较大时,梯度爆炸。针对梯度爆炸问题,解决方案是引入Gradient Clipping(梯度裁剪)。通过Gradient Clipping,将梯度约束在一个范围内,这样不会使得梯度过大。
在tensorflow 文档中,可以看到Gradient Clipping板块有五个函数。这里,我们仅仅介绍其中两个:
tf.clip_by_norm(t,clip_norm,name=None)
tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)tf.clip_by_norm(t,clip_norm,name=None)
参数说明: t: a tensor ; clip_norm: 阈值,即maximum L2-norm。
如果 tensor的L2-norm大于clip_norm,则 t = t * clip_norm / l2norm(t)
否则t = ttf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)
参数说明: t_list: multiple tensors; clip_norm: a clipping ratio; use_norm: 如果你
已经计算出global_norm,你可以在use_norm进行指定。tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)更慢一些,因为它需要
等所有的梯度都求出来才可以进行梯度截断。
算法步骤如下:
- 首先设置一个梯度阈值:clip_gradient
- 在后向传播中求出各参数的梯度,这里我们不直接使用梯度进去参数更新,我们求这些梯度的l2范数
- 然后比较梯度的l2范数||g||与clip_gradient的大小
如果前者大,求缩放因子clip_gradient/||g||, 由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围 - 最后将梯度乘上缩放因子便得到最后所需的梯度
lr = 0.01
max_grad_norm = 5tvars = tf.trainable_variables()
grads, _ = tf.clip_by_global_norm(tf.gradients(loss, tvars), max_grad_norm)
opt = tf.train.GradientDescentOptimizer(lr)
# opt = tf.train.AdamOptimizer(lr)
optimizer = opt.apply_gradients(zip(grads, tvars))
五、长短时记忆网络LSTM
在实际建模中,RNN 经常出现梯度爆炸或梯度消失等问题,因此我们一般使用长短期记忆单元或门控循环单元代替基本的 RNN 循环体。它们引入了门控机制以遗忘或保留特定的信息而加强模型对长期依赖关系的捕捉,它们同时也大大缓解了梯度爆炸或梯度消失的问题。循环网络的每一个隐藏层都有多个循环单元,隐藏层 ht-1 的向量储存了所有该层神经元在 t-1 步的激活值。一般标准的循环网络会将该向量通过一个仿射变换并添加到下一层的输入中,即 W* ht-1+U* Xt。而这个简单的计算过程由于重复使用 W 和 U 而会造成梯度爆炸或梯度消失。因此我们可以使用门控机制控制前一时间步隐藏层保留的信息和当前时间步输入的信息,并选择性地输出一些值而作为该单元的激活值。 之所以叫“门”结构,是因为使用 sigmoid 作为激活函数的全连接神经网络层会输出一个 0 到 1 之间的数值,描述当前输入有多少信息量可以通过这个结构。于是这个结构的功能就类似于一扇门,当门打开时(sigmoid 全连接层输出为 1 时),全部信息可以通过;当门关上时(sigmoid 神经网络层输出为 0 时),任何信息都无法通过。
LSTM 有三个门,分别是“遗忘门”(forget gate)、“输入门”(input gate)和“输出门”(output gate)。
“遗忘门”的作用是让循环神经网络“忘记”之前没有用的信息,控制以前记忆的信息到底需要保留多少
“输入门”决定哪些信息进入当前时刻的状态,分为以前保留的信息加上当前输入有意义的信息
通过“遗忘门”和“输入门”,LSTM 结构可以很有效地决定哪些信息应该被遗忘,哪些信息应该得到保留。且更新当前时刻状态Ct,输入与输入门对应元素相乘表示当前时刻需要添加到Ct的记忆,前一时间步的记忆 Ct-1 与遗忘门 ft 对应元素相乘就表示了需要保留或遗忘的历史信息是多少,最后将这两部分的信息相加在一起就更新了记忆Ct的信息。
LSTM 在得到当前时刻状态 Ct 之后,需要产生当前时刻的输出,该过程通过“输出门”完成。
LSTM 的内部状态向量
深度学习TF—9.循环神经网络RNN及其变体GRU、LSTM相关推荐
- 「NLP」 深度学习NLP开篇-循环神经网络(RNN)
https://www.toutiao.com/a6714260714988503564/ 从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环 ...
- 【NLP】 深度学习NLP开篇-循环神经网络(RNN)
从这篇文章开始,有三AI-NLP专栏就要进入深度学习了.本文会介绍自然语言处理早期标志性的特征提取工具-循环神经网络(RNN).首先,会介绍RNN提出的由来:然后,详细介绍RNN的模型结构,前向传播和 ...
- [人工智能-深度学习-48]:循环神经网络 - RNN是循环神经网络还是递归神经网络?
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [人工智能-深度学习-52]:循环神经网络 - RNN的缺陷与LSTM的解决之道
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 自然语言菜鸟学习笔记(七):RNN(循环神经网络)及变体(LSTM、GRU)理解与实现(TensorFlow)
目录 前言 RNN(循环神经网络) 为什么要用循环神经网络(RNN)? 循环神经网络(RNN)可以处理什么类型的任务? 多对一问题 一对多问题 多对多问题 循环神经网络结构 单层网络情况 正向传播 反 ...
- 深度学习 实验七 循环神经网络
文章目录 深度学习 实验七 循环神经网络 一.问题描述 二.设计简要描述 三.程序清单 深度学习 实验七 循环神经网络 一.问题描述 之前见过的所以神经网络(比如全连接网络和卷积神经网络)都有一个主要 ...
- 《深度学习》之 循环神经网络 原理 超详解
循环神经网络 一.研究背景 1933年,西班牙神经生物学家Rafael Lorente de Nó发现大脑皮层(cerebral cortex)的解剖结构允许刺激在神经回路中循环传递,并由此提出反响回 ...
- 深度学习中的循环神经网络LSTM详解
(一).什么是循环神经网络LSTM? LSTM指的是长短期记忆网络(Long Short Term Memory),它是循环神经网络中最知名和成功的扩展.由于循环神经网络有梯度消失和梯度爆炸的问题,学 ...
- 深度学习TensorFlow2,循环神经网络(RNN,LSTM)系列知识
一:概述 二:时间序列 三:RNN 四:LSTM 一:概述 1.什么叫循环? 循环神经网络是一种不同于ResNet,VGG的网络结构,个人理解最大的特点就是:它通过权值共享,极大的减少了权值的参数量. ...
- 《动手学深度学习》task3_3 循环神经网络进阶
目录 GRU GRU 重置门和更新门 候选隐藏状态 隐藏状态 GRU的实现 载入数据集 初始化参数 GRU模型 训练模型 简洁实现 LSTM 长短期记忆 输入门.遗忘门和输出门 候选记忆细胞 记忆细胞 ...
最新文章
- Scala入门到精通——第十五节 Case Class与模式匹配(二)
- 图片大_2020跨年图片 元旦快乐祝福图片 2019再见2020你好图片大全 新年图片
- host 端口_如何让多端口网站用一个nginx进行反向代理实际场景分析
- 帆软《商业智能》书籍首发,国产BI行业独家,福利发售!
- 使用visual studio 2013读取.mat文件
- 小程序开发的流程简介
- 计算机的优势和劣势_计算机专业毕业生考研还是就业应该怎么选?
- python分位数回归模型_分位数回归森林
- 毕设过程中使用WPS的自定义生成目录中混入图片等非相关元素
- 估算CarSim中车辆轮胎的纵向刚度与侧向刚度
- 编写程序,提示用户输入一个数并显示该数,使用字符模拟7段显示器的效果:Enter a number:491-9014
- 【论文阅读】 Reinforced Video Captioning with Entailment Rewards
- 电脑控制手机教你实现多个手机同时自动安装卸载软件
- android 设置路由器,安卓手机怎么设置路由器?
- 微信小程序超长页面生成截图的一种解决方案
- linux架构师面试题,怎么判断web前端架构师能力高低,前端架构师面试题目
- jTessBoxEditor2.3.1训练字库
- Oracle怎么获取json类型字符串值,sql解析json格式字段 如何获取json中某个字段的值?...
- 码农晋升为技术管理者后,痛并快乐着的纠结内心
- 新浪微博Sdk使用——air/移动应用