[DeeplearningAI笔记]序列模型1.7-1.9RNN对新序列采样/GRU门控循环神经网络
5.1循环序列模型
觉得有用的话,欢迎一起讨论相互学习~Follow Me
1.7对新序列采样
基于词汇进行采样模型
- 在训练完一个模型之后你想要知道模型学到了什么,一种非正式的方法就是进行一次新序列采样。
- 一个序列模型模拟了任意特定单词序列的概率,对新序列采样即是对概率分布进行采样来生成一个新的单词序列。
- 假设你的RNN训练模型为:

- 对于新序列进行采样第一步即是对想要模型生成的第一个词进行采样
- 设置\(a^{<0>}=0,x^{<1>}=0\)从而得到所有可能的输出结果\(\hat{y}^{<1>}\), \(\hat{y}^{<1>}\)是经过softmax层后得到的概率,然后根据经过softmax层后得到的分布进行随机采样。
- 然后继续下一个时间步,但是和训练RNN不同的是,在第二个时间步中输入的不是正确的\(y^{<1>}\),而是把刚刚采样得到的\(\hat{y}^{<1>}\)作为下一个时间步的输入。
- 然后对第二个时间步的预测得到的输出\(\hat{y}^{<2>}\)进行采样并作为第三个时间步的输入...直到达到最后一个时间步。

- 对于采样完成有两种判定方法:
- 一直在字典集中进行采样,直到得到标识,这表明可以停止采样了。
如果在时间步的结尾,字典中没有这个词,你可以从20个或100个或其他单词中进行采样,然后一直抽样下去,直到达到设定的时间步。但是如果在此过程中又出现了 unknown word,则可以进行重采样,直到得到一个不是一个未知标识的词。如果不介意UNK的话,也可以忽略这些未知的单词。
基于字符进行采样模型
- 根据实际问题,还可以建立基于字符的RNN结构,你的字典仅包含从a到z的字母,可能还会有空格符,数字0-9,还有大写的A-Z字母,还有数据集中出现的特殊字符。最终使用这些字符组成你的字典。
- 这样每次RNN推断的输出都是字母而不是单独的词汇。
- 优点与缺点
- 优点
- 优点是不会出现未知的标识
- 缺点
- 缺点是使用字符进行采样的模型会得到很多很长的序列
- 因为一句话中的英文单词仅有几十个,但是字符的长度却有很多个,这样使得RNN的长度过大,使得其不可以捕捉长范围的关系,而且训练起来计算成本比较高昂。
所以现有的RNN都是使用基于单词的采样,但是随着计算机性能越来越高,使用基于字符进行采样也是一种趋势。
序列生成
- 优点
- 使用新闻的语料库作为训练集,则生成的序列带有明显的新闻语感。
- 使用莎士比亚的语料库作为训练集,则生成的序列带有明显的莎士比亚风格。

1.8RNN的梯度消失vanishing gradient
基本的RNN有一个很大的问题,就是梯度消失问题
梯度消失vanishing gradient
- 示例
- THe cat, which already ate a bunch of food that was delicious ....was full.
- THe cats, which already ate a bunch of food that was delicious ....were full.
- 注意句式中的单复数问题,cat作为主语,则使用was,cats作为主语,则使用were.
- 主语和谓语的单复数关系,因为有从句(即主语和谓语之间的距离可以足够长)的关系,在时间上往往具有 很长时间的依赖效应(long-term dependencies)
但是普通的RNN并不擅长捕捉这种长期依赖效应(因为具有梯度消失的问题)。
梯度爆炸exploding gradients
- 梯度不仅仅会指数级别的下降,也会指数级别的上升--即梯度爆炸(exploding gradients),导致参数的数量级及其巨大会看见许多NaN或者不是数字的情况--这意味着网络的计算出现了数值溢出。
如果出现了梯度爆炸的问题,一个解决方法就是使用梯度修剪(gradient clipping).即--设置一个梯度的天花板,梯度不能超过这个阈值,并对梯度进行缩放。
1.9GRU Gate Recurrent Unit门控循环神经网络
GRU网络改变了RNN的隐层结构,可以捕捉深层连接,并改善了梯度消失问题。
\(a^{<t>}=g(W_{a}[a^{<t-1>},x^{<t>}]+b_{a})\)
[1] Cho K, Van Merrienboer B, Bahdanau D, et al. On the Properties of Neural Machine Translation: Encoder-Decoder Approaches[J]. Computer Science, 2014.
[2] Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
门控循环神经网络单元GRU
- The cat , which already ate ..., was full
- 为了记住话语中cat是单数还是复数,在时间T上需要使用记忆细胞memory cell 记住cat这个单词,并且 \(c^{<t>}=a^{<t>}\)
- 在每一个时间步t,都将用一个候选值\(\breve{c}^{<t>}\)重写记忆细胞的值
- 其中: \[\breve{c}^{<t>}=Tanh(W_{c}[c^{<t-1>},x^{<t>}]+b_{c})[1]\]
- GRU中真正重要的思想是,GRU中有一个门Gate(\(\gamma_u\)) 这是一个0到1之间的值
- \[\gamma_u=\sigma(W_{u}[c^{<t-1>},x^{<t>}]+b_{u})[2]\]
- [1]式是\(\breve{c}^{<t>}\)的更新公式,[2]式计算的值用以控制是否采用[1]式进行更新
- 在此例中如果cat变为cats \(\breve{c}^{<t>}\)用以控制was和were的值,而\(\gamma_u\)用以控制 在何时将was变为were
- \[C^{<t>}=\gamma_u * \breve{C}^{<t>}+(1-\gamma_u) * C^{<t-1>}\]
如果\(\gamma_u=1\)则\(C^{<t>}=\breve{C}^{<t>}\),\(\gamma_u=0\)则\(C^{<t>}=C^{<t-1>}\),即时间步没有扫到was时,\(\gamma_u一直=0,此时C^{<t>}=c^{<t-1>}\),则C一直等于旧的值。而当时间步扫到"was"时,\(\gamma_u=1\),此时\(C^{<t>}=\breve{C}^{<t>}\)

- \[C^{<t>}=\gamma_u * \breve{C}^{<t>}+(1-\gamma_u) * C^{<t-1>}\]
GRU计算过程
- GRU单元输入\(C^{<t-1>}\)对应于上一个时间步,先假设其正好等于\(a^{<t-1>}\), 然后\(x^{<t>}\)也作为输入,然后把这两个用合适的权重结合在一起再用Tanh计算,算出\(\breve{c}^{<t>}\)即\(c^{<t>}\)的替代值
- 再用一个不同的参数集,通过\(\sigma\)函数计算出\(\gamma_u\),即更新门。
最后所有的值通过另一个运算符结合: \[C^{<t>}=\gamma_u * \breve{C}^{<t>}+(1-\gamma_u) * C^{<t-1>}\],其输入一个门值,新的候选值和旧的记忆细胞值,得到记忆细胞的新值\(c^{<t>}=a^{<t>}\),也可以把这个值传入Softmax单元中,并计算出预测序列\(\hat{y}^{<t>}\)

GRU优点/font>
- 当你从左往右扫描一整个句子时,控制记忆细胞"不更新不更新不更新... 更新 "
- 因为门的值很容易取到0,只要激活函数的输入是一个很大的负数,则激活函数的输出值就是一个很接近与0的值。所以 \(C^{<t>}=\gamma_u * \breve{C}^{<t>}+(1-\gamma_u) * C^{<t-1>}\) 中\(C^{<t>}=C^{<t-1>}\)则即是经过很多的时间步,记忆神经细胞的值都会很好的维持了下来--这样就避免了梯度消失的问题。这样可以保证RNN运行在十分庞大的依赖词上。
Note/font>
\(C^{<t>},\breve{C}^{<t>},\gamma_u\)是具有一样的维度的向量,其中维度和隐藏层的激活值的个数相等。
完整GRU

[DeeplearningAI笔记]序列模型1.7-1.9RNN对新序列采样/GRU门控循环神经网络的更多相关文章
- 序列模型(4)----门控循环单元(GRU)
一.GRU 其中, rt表示重置门,zt表示更新门. 重置门决定是否将之前的状态忘记.(作用相当于合并了 LSTM 中的遗忘门和传入门) 当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏 ...
- [DeeplearningAI笔记]序列模型1.10-1.12LSTM/BRNN/DeepRNN
5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.10长短期记忆网络(Long short term memory)LSTM Hochreiter S, Schmidhu ...
- DLNg序列模型第一周
1.为何选择序列模型? 给出上面一些序列数据的例子,真的很神奇,语音识别.音乐生成.情感分类.DNS序列分析.机器翻译.视频活动检测.命名实体识别. 2.数字符号 对于输入序列x,进行人名识别,输出中 ...
- 吴恩达《深度学习》第五门课(1)循环序列模型(RNN)
1.1为什么选择序列模型 (1)序列模型广泛应用于语音识别,音乐生成,情感分析,DNA序列分析,机器翻译,视频行为识别,命名实体识别等众多领域. (2)上面那些问题可以看成使用(x,y)作为训练集的监 ...
- 序列模型(5)-----双向神经网络(BRNN)和深层循环神经网络(Deep RNN)
一.双向循环神经网络BRNN 采用BRNN原因: 双向RNN,即可以从过去的时间点获取记忆,又可以从未来的时间点获取信息.为什么要获取未来的信息呢? 判断下面句子中Teddy是否是人名,如果只从前面两 ...
- 【学习笔记】循环神经网络(RNN)
前言 多方寻找视频于博客.学习笔记,依然不能完全熟悉RNN,因此决定还是回到书本(<神经网络与深度学习>第六章),一点点把啃下来,因为这一章对于整个NLP学习十分重要,我想打好基础. 当然 ...
- 吴恩达deepLearning.ai循环神经网络RNN学习笔记_看图就懂了!!!(理论篇)
前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RNN模型怎么解决这个问题 - RNN模型适用的数据特征 - RNN几种类型 RNN模型结构 - RNN block - ...
- 吴恩达deepLearning.ai循环神经网络RNN学习笔记_没有复杂数学公式,看图就懂了!!!(理论篇)
本篇文章被Google中国社区组织人转发,评价: 条理清晰,写的很详细! 被阿里算法工程师点在看! 所以很值得一看! 前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RN ...
- [DeeplearningAI笔记]序列模型3.9-3.10语音辨识/CTC损失函数/触发字检测
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.9语音辨识 Speech recognition 问题描述 对于音频片段(audio clip)x ,y生成文本 ...
随机推荐
- redis利用key计时与计数
计时 Setex 命令为指定的 key 设置值及其过期时间.如果 key 已经存在, SETEX 命令将会替换旧的值 基本命令: redis 127.0.0.1:6379> SETEX KEY_ ...
- Scrum立会报告+燃尽图(十一月二十七日总第三十五次):β阶段最后完善
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2415 项目地址:https://git.coding.net/zhang ...
- 贪吃蛇GUI Prototype
- 软件工程-东北师大站-第六次作业PSP
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- 阅读笔记《我是一只IT小小鸟》
我是一只IT小小鸟 我们在尝试新的事物的时候,总是会遇到各种各样的困难,不同的人会在碰壁不同的次数之后退出.用程序员喜欢的话来说就是,我们都在for循环,区别在于你是什么情况下break;的.有的人退 ...
- Alpha-end
前言 失心疯病源10 团队代码管理github 个人感悟 肝不动了,肝不动了.明天如果见不到我,不要太想我. 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 熬夜肝代码 代码签入git ...
- MySQL 事务 转自菜鸟教程 讲的清晰
MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...
- java学习 猜数字
package study; import java.util.Scanner; /** * 猜数字小游戏 * * @author carry * */ public class GuessNumbe ...
- xheditor在线编辑器在.netMVC4中的使用
在线编辑器xheditor,测试感觉不错,特把使用方法记录如下 : 先看看基本使用方法,然后用实例来操作 1.xheditor 地址 http://xheditor.com/ 2.下载最新编辑器源码 ...
- 【.Net】输出的字符靠右对齐
先看下面的这组字符,如果输出来,它是无法靠右对齐: " }; foreach (string s in s1) { string s2 = s; Console.WriteLine(s2); ...