[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生成文本 ...
随机推荐
- 如何开发一个 PyCharm 插件
PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心.如果你想自己给PyCharm添加一些功能怎么办呢?有两个办法: 通过提需求实现,到 JetB ...
- Spark Streaming的使用——转载
转载自 Spark Streaming 使用
- java不用任何已有方法完全自写的去重法
package aa; class InsertSort{ private long[] a; private int nElems; //构造方法 public InsertSort(int max ...
- 4个数的和为0 51nod 1267
给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 < ...
- lintcode-418-整数转罗马数字
418-整数转罗马数字 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 说明 什么是 罗马数字? https://en.wikipedia.org/wiki/Roman_n ...
- lintcode-208-赋值运算符重载
208-赋值运算符重载 实现赋值运算符重载函数,确保: 新的数据可准确地被复制 旧的数据可准确地删除/释放 可进行 A = B = C 赋值 说明 本题只适用于C++,因为 Java 和 Python ...
- Sql server 中关闭ID自增字段(SQL取消ID自动增长)
sql server在导入数据的时候,有时候要考虑id不变,就要先取消自动增长再导入数据,导完后恢复自增. 比如网站改版从旧数据库导入新数据库,数据库结构不相同,可能会使用insert into xx ...
- linux 虚拟网络模型介绍
第一种隔离模型 每一个虚拟机实例的网卡都有两个接口,一端接在虚拟机内部,一端接在宿主机内部,如上图所示eth0就是接在虚拟机内部的,而vnet0就是接在宿主机内部的,只要再创建一个虚 ...
- 【APS.NET Core】- launchSettings.json
launchSettings.json文件为一个ASP.NET Core应用保存特有的配置标准,用于应用的启动准备工作,包括环境变量,开发端口等.在launchSettings.json文件中进行配置 ...
- Maven 项目依赖 pom 文件模板
下面是网上down的 pom 文件模板: <!-- 属性 --> <properties> <spring.version>4.2.4.RELEASE</sp ...