DeepLearning.ai学习笔记(五)序列模型 -- week1 循环序列模型
一、为什么选择序列模型
序列模型可以用于很多领域,如语音识别,撰写文章等等。总之很多优点。。。
二、数学符号
为了后面方便说明,先将会用到的数学符号进行介绍。
输入值中每个单词使用One-shot来表示。即首先会构建一个字典(Dictionary),假设该例中的字典维度是10000*1(如图示)。第一个单词"Harry"的数学表示形式即为[0,0,0,……,1 (在第4075位) ,0,……,0],其他单词同理。
但是如果某一个单词并没有被包含在字典中怎么办呢?此时我们可以添加一个新的标记,也就是一个叫做Unknown Word的伪造单词,用 <UNK> 表示。具体的细节会在后面介绍。
三、循环神经网络模型
1.为什么不用标准网络
2.RNN结构
为了将单词之间关联起来,所以将前一层的结果也作为下一层的输入数据。如下图示
3.RNN前向传播
4.简化RNN公式
下面将对如下公式进行化简:
该节PPT内容:
四、通过时间的反向传播
下面将会对反向传播进行灰常灰常详细的介绍,跟着下面一张一张的图片走起来~
1.整体感受
- 首先再回顾一下RNN的整体结构
- 要进行反向传播,首先需要前向传播,传播方向如蓝色箭头所示,其次再按照红色箭头进行反向传播。
2.前向传播
3.损失函数定义
要进行反向传播,必须得有损失函数嘛,所以我们将损失函数定义如下:
4.反向传播
计算出损失值后再通过梯度下降进行反向传播
5.整个流程图
五、不同类型的循环神经网络
本节主要介绍了其他更多类型的RNN结构,下图参考大数据文摘
六、语言模型和序列生成
1.什么是语言模型
凡事开头举个栗子,一切都好说:
假设一个语音识别系统听一句话得到了如下两种选择,作为正常人肯定会选择第二种。但是机器才如何做判断呢?
此时就需要通过语言模型来预测每句话的概率:
2.如何使用RNN构建语言模型
- 首先我们需要一个很大的语料库(Corpus)
- 将每个单词字符化(Tokenize,即使用One-shot编码)得到词典,,假设有10000个单词
- 还需要添加两个特殊的单词
- : end of sentence. 终止符,表示句子结束.
- : UNknown, 之前的笔记已介绍过.
3.构建语言模型示例
- 3.计算出损失值
下图给出了构建模型的过程以及损失值计算公式。
七、对新序列采样
下图给出了采样之后得到的效果:
左边是对训练得到新闻信息模型进行采样得到的内容;
右边是莎士比亚模型采样得到的内容。
八、带有神经网络的梯度消失
1.RNN的梯度消失、爆炸问题
梯度值在RNN中也可能因为反向传播的层次太多导致过小或者过大。
- 当梯度值过小的时候,神经网络将无法有效地调整自己的权重矩阵导致训练效果不佳,称之为“梯度消失问题”(gradient vanishing problem);
- 过大时可能直接影响到程序的运作因为程序已经无法存储那么大的值,直接返回 NaN ,称之为“梯度爆炸问题”(gradient exploding problem)。
当梯度值过大的时候有一个比较简便的解决方法,每次将返回的梯度值进行检查,如果超出了预定的范围,则手动设置为范围的边界值。
if (gradient > max) {
gradient = max
}
但梯度值过小的解决方案要稍微复杂一点,比如下面两句话:
“The cat,which already ate apple,yogurt,banana,..., was full.”
“The cats,which already ate apple,yogurt,banana,..., were full.”
重点标出的 cat(s)和be动词(was,were) 是有很重要的关联的,但是中间隔了一个which引导的定语从句,对于前面所介绍的基础的RNN网络很难学习到这个信息,尤其是当出现梯度消失时,而且这种情况很容易发生。
我们知道一旦神经网络层次很多时,反向传播很难影响前面层次的参数。所以为了解决梯度消失问题,提出了GRU单元,下面一节具体介绍。
九、GRU单元
GRU(Gated Recurrent Unit)是一种用来解决梯度值过小的方法,首先来看下在一个时刻下的RNN单元,激活函数为 tanh
1.首先回顾一下普通RNN单元的结构示意图
2.GRU结构
- 记忆细胞
- t时刻记忆细胞
有了更新门公式后,我们则可以给出t时刻记忆细胞的值的计算公式了:
注意:上面公式中的 * 表示元素之间进行乘法运算,而其他公式是矩阵运算。
- GRU结构示意图
3.完整版GRU
十、长短期记忆
虽然LSTM比GRU更复杂,但是它比GRU更早提出哦。另外一般而言LSTM的表现要更好,但是计算量更大,毕竟多了一个门嘛。而GRU实际上是对LSTM的简化,它的表现也不错,能够更好地扩展到深层网络。所以二者各有优势。
下图是LSTM的结构示意图:
十一、双向递归神经网络
前面介绍的都是单向的RNN结构,在处理某些问题上得到的效果不尽人意
如下面两句话,我们要从中标出人名:
He said, "Teddy Roosevelt was a great President".
He said, "Teddy bears are on sale".
第一句中的Teddy Roosevelt是人名,但第二句中的Teddy bears是泰迪熊,同样都是单词Teddy对应的输出在第一句中应该是1,第二句中应该是0。
像这样的例子如果想让我们的序列模型明白就需要借助不同的结构比如 - 双向递归神经网络(Bidirectional RNN)。该神经网络首先从正面理解一遍这句话,再从反方向理解一遍。
双向递归神经网络结构如下:
下图摘自大数据文摘整理
十二、深层循环神经网络
深层,顾名思义就是层次增加。如下图是深层循环神经网络的示意图
横向表示时间展开,纵向则是层次展开。
- 解决T4模板的程序集引用的五种方案
- 编写T4模板进行代码生成无法避免的两个话题:"Assembly Locking"&"Debug"
- 从yield关键字看IEnumerable和Collection的区别
- 让“链式调用(方法链)”更加自然一点
- ASP.NET应用下基于SessionState的“状态编程框架”解决方案
- 为自定义配置的编辑提供”智能感知”的支持
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
- 在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- 为.NET Core项目定义Item Template
- 晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo
- 一个关于反序列化的小问题
- 两个简单的扩展方法:TrimPrefix和TrimSuffix
- 谈谈Nullable<T>的类型转换问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MyBatis预编译机制详解
- ActiveMQ NMS使用过程中的一点经验
- asp.net core 认证及简单集群
- WebAPI问题追踪日志记录过滤器
- 使用责任链模式消除if分支实践
- sql操作知识点个人笔记(SQLServer篇)
- kettle学习笔记(二)——kettle基本使用
- Spring源码深度解析(二)
- Repository个人实践
- 摩斯码编解码器
- kettle学习笔记(三)——kettle资源库、运行方式与日志
- 使用Let's Encrypted HPPTS你的网站
- .net core web api + Autofac + EFCore 个人实践
- kettle学习笔记(六)——kettle转换步骤
- 记一次带层级结构列表数据计算性能优化