05.序列模型 W1.循环序列模型
文章目录
- 1. 为什么选择序列模型
- 2. 数学符号
- 3. 循环Recurrent 神经网络模型
- 4. 通过时间的反向传播
- 5. 不同类型的循环神经网络
- 6. 语言模型和序列生成
- 7. 对新序列采样
- 8. 循环神经网络的梯度消失
- 9. Gated Recurrent Unit(GRU单元)
- 10. LSTM(long short term memory)unit
- 11. 双向循环神经网络(Bidirectional RNN)
- 12. 深层循环神经网络(Deep RNNs)
- 作业
参考:
吴恩达视频课
深度学习笔记
1. 为什么选择序列模型
有些问题,输入数据 X 和 输出数据 Y 都是序列,X 和 Y 有时也会不一样长。在另一些问题里,只有 X 或 只有 Y 是序列
2. 数学符号
3. 循环Recurrent 神经网络模型
为什么不使用标准的神经网络学习上面的 X 到 Y 的映射?
a<t>=g1(Waaa<t−1>+Waxx<t>+ba)a^{<t>}=g_{1}\left(W_{a a} a^{<t-1>}+W_{a x} x^{<t>}+b_{a}\right)a<t>=g1(Waaa<t−1>+Waxx<t>+ba)
y^<t>=g2(Wyaa<t>+by)\hat{y}^{<t>}=g_{2}\left(W_{y a} a^{<t>}+b_{y}\right)y^<t>=g2(Wyaa<t>+by)
4. 通过时间的反向传播
编程框架通常会自动实现反向传播,但是还是要认识下它的运作机制
L<t>(y^<t>,y<t>)=−y<t>logy^<t>−(1−y<t>)log(1−y^<t>)L^{<t>}\left(\hat{y}^{<t>}, y^{<t>}\right)=-y^{<t>} \log \hat{y}^{<t>}-\left(1-y^{<t>}\right) \log \left(1-\hat{y}^{<t>}\right)L<t>(y^<t>,y<t>)=−y<t>logy^<t>−(1−y<t>)log(1−y^<t>)
L(y^,y)=∑t=1TxL<t>(y^<t>,y<t>)L(\hat{y}, y)=\sum_{t=1}^{T_{x}} L^{<t>}\left(\hat{y}^{<t>}, y^{<t>}\right)L(y^,y)=t=1∑TxL<t>(y^<t>,y<t>)
最小化损失,通过梯度下降来更新参数
5. 不同类型的循环神经网络
6. 语言模型和序列生成
语言模型所做的就是,它会告诉你某个特定的句子它出现的概率是多少
得到一个句子后:
- 建立一个字典,将每个单词转成
one-hot
编码 - 定义句子的结尾,增加一个额外的标记 EOS(更准确的识别结尾)
- 还有不存在的词都归为 unknow UNK
7. 对新序列采样
训练一个序列模型之后,要想了解到这个模型学到了什么,一种非正式的方法就是进行一次新序列采样
以上是基于词汇的RNN模型,还可以基于字符
基于字符
- 优点:不必担心会出现未知的标识
- 缺点:会得到太多太长的序列,大多数英语句子只有10到20个的单词,但却可能包含很多很多字符。基于字符的模型在捕捉句子中的依赖关系不如基于词汇的语言模型那样可以捕捉长范围的关系,并且基于字符的模型训练成本较高。
自然语言处理的趋势就是,绝大多数都是使用基于词汇的语言模型,但随着计算机性能越来越高,会有更多的应用。
在一些特殊情况下,会开始使用基于字符的模型。除了一些比较专门需要处理大量未知的文本或未知词汇的应用,还有一些要面对很多专有词汇的应用。
8. 循环神经网络的梯度消失
反向传播的时候,随着层数的增多,梯度不仅可能指数下降,也可能指数上升。
- 梯度爆炸,你会看到很多NaN,数值溢出。解决方法就是用梯度修剪。如果它大于某个阈值,缩放梯度向量,保证它不会太大,这是相对比较鲁棒的
- 然而梯度消失更难解决
9. Gated Recurrent Unit(GRU单元)
门控循环单元 GRU,它改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题
普通的RNN单元结构如下:
c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)\tilde{c}^{<t>}=\tanh \left(W_{c}\left[c^{<t-1>}, x^{<t>}\right]+b_{c}\right)c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)
Γu=σ(Wu[c<t−1>,x<t>]+bu)\Gamma_{u}=\sigma\left(W_{u}\left[c^{<t-1>}, x^{<t>}\right]+b_{u}\right)Γu=σ(Wu[c<t−1>,x<t>]+bu)
c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_{u} * \tilde{c}^{<t>}+\left(1-\Gamma_{u}\right) * c^{<t-1>}c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>
GRU单元的优点就是通过门决定是否更新记忆细胞
- 当你从左到右扫描一个句子的时候,这时是要更新某个记忆细胞,还是不更新,不更新(上图,中间一直为0,表示一直不更新)
- 直到你真的需要使用记忆细胞的时候,这可能在句子之前就决定了。
- 因为sigmoid的值,现在门很容易取到0值,只要这个值是一个很大的负数,再由于数值上的四舍五入,上面这些门大体上就是0,或者说非常非常非常接近0。这非常有利于维持细胞的值。因为很接近0,可能是0.000001或者更小,这就不会有梯度消失的问题了。这就是缓解梯度消失问题的关键,因此允许神经网络运行在非常庞大的依赖词上,比如说cat和was单词即使被中间的很多单词分割开
如果门是多维的向量,元素对应的乘积做的就是告诉GRU单元哪个记忆细胞的向量维度在每个时间步要做更新,所以你可以选择保存一些比特不变,而去更新其他的比特。比如说你可能需要一个比特来记忆猫是单数还是复数,其他比特来理解你正在谈论食物,你可以每个时间点只改变一些比特
FULL GRU
Γr=σ(Wr[c<t−1>,x<t>]+br)\Gamma_{r}=\sigma\left(W_{r}\left[c^{<t-1>}, x^{<t>}\right]+b_{r}\right)Γr=σ(Wr[c<t−1>,x<t>]+br)
上式告诉我们 c~<t>,c<t−1>\tilde c^{<t>}, c^{<t-1>}c~<t>,c<t−1> 有多少相关性
研究表明:去尝试让神经网络有更深层的连接,去尝试产生更大范围的影响,还有解决梯度消失的问题,GRU就是其中一个研究者们最常使用的版本,也被发现在很多不同的问题上也是非常健壮和实用的
GRU结构可以更好捕捉非常长范围的依赖,让RNN更加有效。
还有比较经典的是LSTM,即长短时记忆网络,见下节
10. LSTM(long short term memory)unit
c~<t>=tanh(Wc[a<t−1>,x<t>]+bc)\tilde{c}^{<t>}=\tanh \left(W_{c}\left[a^{<t-1>}, x^{<t>}\right]+b_{c}\right)c~<t>=tanh(Wc[a<t−1>,x<t>]+bc)
Γu=σ(Wu[a<t−1>,x<t>]+bu)\Gamma_{u}=\sigma\left(W_{u}\left[a^{<t-1>}, x^{<t>}\right]+b_{u}\right) Γu=σ(Wu[a<t−1>,x<t>]+bu)
Γf=σ(Wf[a<t−1>,x<t>]+bf)\Gamma_{f}=\sigma\left(W_{f}\left[a^{<t-1>}, x^{<t>}\right]+b_{f}\right) Γf=σ(Wf[a<t−1>,x<t>]+bf)
Γo=σ(Wo[a<t−1>,x<t>]+bo)\Gamma_{o}=\sigma\left(W_{o}\left[a^{<t-1>}, x^{<t>}\right]+b_{o}\right) Γo=σ(Wo[a<t−1>,x<t>]+bo)
c<t>=Γu∗c~<t>+Γf∗c<t−1>c^{<t>}=\Gamma_{u} * \tilde{c}^{<t>}+\Gamma_{f} * c^{<t-1>} c<t>=Γu∗c~<t>+Γf∗c<t−1>
a<t>=Γo∗tanhc<t>a^{<t>}=\Gamma_{o} * \tanh c^{<t>}a<t>=Γo∗tanhc<t>
用GRU?用LSTM?
- GRU 更加简单,更容易创建一个更大的网络,它只有两个门,在计算性上也运行得更快
- 但 LSTM 更加强大和灵活,因为它有三个门。大部分人会把 LSTM 作为默认的选择来尝试
无论是GRU还是LSTM,都可以用它们来构建捕获更加深层连接的神经网络
11. 双向循环神经网络(Bidirectional RNN)
BRNN 模型可以让你在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息
上面的基本单元不仅可以是标准RNN单元,也可以是 GRU 或 LSTM 单元。
NLP(自然语言处理)问题,常用 有LSTM单元的双向RNN模型是用的最多。
上面的双向RNN网络模型的缺点:你需要完整的数据的序列,你才能预测任意位置
- 比如构建一个语音识别系统,需要等待这个人说完,获取整个语音表达才能处理这段语音,并进一步做语音识别。实际的语音识别通常会有更加复杂的模块
12. 深层循环神经网络(Deep RNNs)
作业
05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)
本文地址:https://michael.blog.csdn.net/article/details/108815992
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
05.序列模型 W1.循环序列模型相关推荐
- 05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)
文章目录 作业1:建立你的循环神经网络 1. RNN 前向传播 1.1 RNN 单元 1.2 RNN 前向传播 2. LSTM 网络 2.1 LSTM 单元 2.2 LSTM 前向传播 3. RNN ...
- 2020-10-21 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.9 GRU门控循环单元-改善梯度消失-在序列中学习非常深的连接-简化和完整版本-记忆细胞)
1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-sta ...
- 深度学习系列 -- 序列模型之循环序列模型(Recurrent Neural Networks)
目录 1 为什么选择序列模型?(Why Sequence Models?) 2 数学符号(Notation) 3 循环神经网络(Recurrent Neural Network Model) 4 语言 ...
- 花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN
目录 0. 前言 1. RNN 计算图 2. RNN 前向传播 3. RNN 反向传播 4. 导师驱动过程(teacher forcing) 5. 不同序列长度的 RNN 如果这篇文章对你有一点小小的 ...
- 5-1 Coursera吴恩达《序列模型》 第一周课程笔记-循环序列网络(RNN)
记录吴恩达Andrew Ng深度学习专项课程笔记,方便之后回顾,共5门课.第一门课<神经网络与深度学习>(Neural Networks and Deep Learning)的4周课程笔记 ...
- 第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks)
第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...
- 吴恩达deeplearning.ai系列课程笔记+编程作业(13)序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks)
第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...
- 深度学习笔记 第五门课 序列模型 第一周 循环序列模型
本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...
- 《预训练周刊》第6期:GAN人脸预训练模型、通过深度生成模型进行蛋白序列设计
No.06 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第6期< ...
最新文章
- JSP2.0语法初步掌握(学习笔记)
- 区块链去中心化的生命之源:“DPOS(委托权益证明)共识机制”
- android banner阴影,仿照锤子科技官网的banner 3d效果
- 普宁二中高考2021成绩查询,普宁二中2019高考喜报成绩、本科重本上线人数情况...
- 云炬Android开发笔记 5-5,6Loading框架集成与完善AVLoadingIndicatorView
- WatchOS系统开发大全(8)-WKInterfaceGroup
- AngularJS开发指南14:AngularJS的服务详解
- ASP.NET2.0数据操作之创建数据访问层(3)
- mysql 经典优化案例_MySQL-SQL优化10大最经典案例详解
- 如何定位死循环或高CPU使用率(linux)
- 基于FPGA实现Aurora高速串行接口
- C#反射——模仿BeanUtil属性复制
- arcgis不闭合线转面_地理工具学习--arcgis篇(15):CAD和SHP的简单转换
- 课程设计第一次实验总结
- java反编译工具jad安装
- 聚焦四个重组,构建基于IPD的卓越研发体系(3.0版)
- 彻底格式化系统启动U盘(基于win10)
- 在终端下调用IGV进行截图
- 记——博客后台管理系统
- 比较两个字符串s1和s2的大小,如果s1s2,则输出一个正数;若s1=s2,则输出0;若s1小于s2,则输出一个负数。要求:不用strcpy函数;两个字符串用gets函数读入。
热门文章
- shell if多个条件判断_萌新关于Excel VBA中IF条件判断语句的一点心得体会
- @postconstruct注解方法没有执行_把对象的创建交给spring来管理(注解IOC)
- c3p0-config.xml文件简单说明与备忘
- 【Python基础入门系列】第04天:Python 流程控制
- python计算a的平方加b的平方_NumPy计算范数2的平方
- android 横向铺满,Android开发全程记录(八)——设置ImageView显示的图片铺满全屏(适应魅族等不常见屏幕比例)...
- c 打印 callback 函数名_Go 中的函数
- mysql 优化之 is null ,is not null 索引使用测试
- [NOI2019]回家路线
- day05-数据类型与操作