RNN————循环神经网络
1|0RNN————循环神经网络(Recurrent Neural Network)
在零时刻通常使用零向量来初始化a<0>a<0>
Teddy Roosevelt was a great President.
Teddy bears are on sale!
如果只给定前三个单词,是不可能确切地知道Teddy是否是人名的一部分,所以在某一时刻的预测需要该时刻之后的输入信息,因此需要双向循环神经网络
。
2|0RNN的计算:
3|0RNN前向传播示意图:
4|0损失函数:
计算每个时间步的损失函数,再将所有的损失函数都加起来
5|0RNN 反向传播示意图:
6|0RNN的不同结构:
多对一:情感分类(对一句话进行1~5的类别分类)
一对多:音乐生成
多对多:
输入与输出长度相等:上面的例子
输入与输出的长度不等:机器翻译(英语与法语一句话的长度不同,但是表达的意思是一样的)
7|0使用RNN生成语言模型
例子:Cats average 15 hours of sleep a day.
1.首先在句子的结尾加上<EOS>标志表示句子的结尾。
2.其次将句子中的单词使用one—hot向量
进行表示,并与自己的语料数据库进行比对,如果句子中存在单词是语料库中没有的,那么将这个词使用UNK
进行替换。
3.开始建立RNN模型。
开始的第一个输入x<1>为零向量,而按照之前介绍的普通的初始化方法,a<0>也为一个零向量,于是a<1>要做的就是它会通过 softmax 进行一些预测来 计算出第一个词可能会是什么
,其结果就是ˆy<1>,这一步其实就是通过一个 softmax 层来预测字典中的任意单词会是第一个词的概率,比如说第一个词是𝑎的概率 有多少,第一个词是 Aaron 的概率有多少,第一个词是 cats 的概率又有多少,就这样一直到 Zulu 是第一个词的概率是多少,还有第一个词是 UNK(未知词)的概率有多少,还有第一个词是句子结尾标志的概率有多少,表示不必阅读.
之后RNN进入下个时间步,在下一时间步中,仍然使用激活项a<1>,在这步要做的是 计算出第二个词会是什么。现在我们依然传给它正确的第一个词,我们会告诉它第一个词就是Cats,也就是ˆy<1>,这也是y<1>=x<2>的原因。然后在第二个时间步中,输出结果同样经过 softmax 层进行预测,RNN 的职责就是 预测这些词的概率(下图编号 3 所示),而不会去管结果是什么,可能是 b 或者 arron,可能是 Cats 或者 Zulu 或者 UNK(未知词)或者 EOS 或者其他词,它只会考虑之前得到的词。
以此类推,RNN中的每一步都会考虑前面得到的单词,接下来为了训练这个网络,我们要定义代价函数
。如果在某个时间步t真正的词是y<t>,而softmax函数预测的结果是ˆy<t>,那么softmax的损失函数就是L(ˆy<t>,y<t>),也就是把所有单个预测的损失函数都相加起来。
最后该句子的概率就是句子中所有预测的单词出现的机率的乘积。
8|0对新序列采样
在你训练一个序列模型之后,要想了解到这个模型学到了什么
,一种非正式的方法就是进行一次新序列采样
,来看看到底应该怎么做。
同样还是在x<1>使用零向量,将第一个预测值输入x<2>,直到出现<EOS>标志或者达到你固定的步数。每次预测出的单词进行随机的选取。
这就是你如何从你的 RNN 语言模型中生成一个随机选择的句子。
9|0循环神经网络的梯度消失
例如
The cat, which already ate ……, was full.
The cats, which ate ……, were full.
单数后面要用was,复数后面要用were,也就是说前面的词语对后面的词语有影响,而且后面的词语对前面的词语也有一定的影响
。但是当模型很深的时候,在进行后向传播的时候,后面的输出误差很难影响到前面层的计算,也就是说很难让一个神经网络能够意识到它要记住看到的是单数名词还是复数名词,然后在序列后面生成依赖单复数形式的 was 或者 were。
于是我们知道RNN不擅长处理长期依赖
的问题。
10|0GRU门控循环单元(Gated Recurrent Unit(GRU))
原来的RNN隐藏层单元的可视化呈现:
10|1记忆细胞
在GRU单元当中,会有个新的变量称为𝑐,代表细胞(cell),即记忆细胞,在时间t的时候,有记忆细胞c<t>。而GRU实际上输出了激活值a<t>,即c<t>=a<t>
10|2候选值重写记忆细胞
在GRU单元中,每个时间步,我们将用一个候选值重写记忆细胞
,即˜c<t>的值,它成为一个候选值来替代c<t>的值。之后使用tanh激活函数来计算:
10|3更新门思想
在GRU中的重点是一个门的思想,这么门暂且称为ϝu,这个ϝu的值在0到1之间:
其中σ表示为sigmoid激活函数,当值为很大负数的时候,结果为0.
门ϝu的作用就是用来决定你什么时候来更新记忆细胞
c<t>。假设当ϝu为1的时候表示进行更新,而为0的时候表示不更新,那么记忆细胞的计算公式就变为:
当门ϝu为0的时候,c<t>的值一直为c<t−1>,仍然是旧值没有发生改变;当门ϝu为1的时候,c<t>的值变为˜c<t>,表示进行值的更新。
10|4具体步骤
1.首先GRU输入c<t−1>并假设它等于a<t−1>。
2.输入x<t>,将c<t−1>与x<t>用合适的权值进行结合,来计算˜c<t>:
3.再用一个不同的参数集,通过sigmoid激活函数算出更新门ϝu:
4.对记忆细胞进行值的更新(如果设定同上面门部分的表述的话就是c<t>=ϝu∗˜c<t>+(1−ϝu)∗c<t−1>)
10|5相关门思想
在计算记忆细胞的新候选值的时候加上一个新的项:相关门ϝr,这个相关门的作用就是告诉候选值˜c<t>与c<t−1>之间有多大的相关性
。
计算这个相关门需要新的参数矩阵Wr,计算公式为:
因此在步骤的第二步,计算˜c<t>的时候公式变为:
11|0长短期记忆(LSTM)
在LSTM中,c<t>不再等于a<t>,也没有相关门。
11|1LSTM 前向传播图
12|0双向循环神经网络(Bidirectional RNN)
有正向的a<1>、a<2>、a<3>和反向的a<1>、a<2>、a<3>
13|0深层循环神经网络(Deep RNNs)
往往深度为数层,但不会达到100层。而且图中1号位置可能还会扩展相应的深度模型
(但不再是有时间序列的模型)用来更好的预测y<1>的内容。
__EOF__
![](https://files-cdn.cnblogs.com/files/Jason66661010/23.bmp)
本文链接:https://www.cnblogs.com/Jason66661010/p/14630606.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 趁着过年的时候手搓了一个低代码框架
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
2020-04-08 PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
2020-04-08 PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
2020-04-08 PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)