RNN/LSTM学习记录

news2024/9/25 13:21:45

一.RNN

什么是循环神经网络:

循环神经网络,从名字上理解“循环”,即为构成一个往复的结构,它有着这样的特点,对时序特征的数据十分敏感,能够挖掘出数据中的书序信息以及语义信息

什么是序列特性呢,就是符合时间顺序,或者其他顺序就叫做序列特性。举个例子就是

  • 拿人类的某句话来说,也就是人类的自然语言,是不是符合某个逻辑或规则的字词拼凑排列起来的,这就是符合序列特性。
  • 语音,我们发出的声音,每一帧每一帧的衔接起来,才凑成了我们听到的话,这也具有序列特性、
  • 股票,随着时间的推移,会产生具有顺序的一系列数字,这些数字也是具有序列特性。

为什么要发明循环神经网络:

我们先来看一个NLP很常见的问题,命名实体识别,举个例子,现在有两句话:

第一句话:I like eating apple!(我喜欢吃苹果!)

第二句话:The Apple is a great company!(苹果真是一家很棒的公司!)

现在的任务是要给apple打Label,我们都知道第一个apple是一种水果,第二个apple是苹果公司,假设我们现在有大量的已经标记好的数据以供训练模型,当我们使用全连接的神经网络时,我们做法是把apple这个单词的特征向量输入到我们的模型中(如下图),在输出结果时,让我们的label里,正确的label概率最大,来训练模型,但我们的语料库中,有的apple的label是水果,有的label是公司,这将导致,模型在训练的过程中,预测的准确程度,取决于训练集中哪个label多一些,这样的模型对于我们来说完全没有作用。问题就出在了我们没有结合上下文去训练模型,而是单独的在训练apple这个单词的label,这也是全连接神经网络模型所不能做到的,于是就有了我们的循环神经网络。

循环神经网络的结构及原理:

上图就是RNN的结构,我第一次看到这图的第一反应是,不是说好的循环神经网络么,起码得是神经网络啊,神经网络不是有很多球球么,也就是神经元,这RNN咋就这几个球球,不科学啊,看不懂啊!!!!随着慢慢的了解RNN,才发现这图看着是真的清楚,因为RNN的特殊性,如果展开画成那种很多神经元的神经网络,会很麻烦。

首先不要管右边的W,只看X,U,S,V,O,这幅图就变成了,如下

 

等等,这图看着有点眼熟啊,这不就是全连接神经网络结构吗?对,没错,不看W的话,上面那幅图展开就是全连接神经网络,其中X是一个向量,也就是某个字或词的特征向量,作为输入层,如上图也就是3维向量,U是输入层到隐藏层的参数矩阵,在上图中其维度就是3X4,S是隐藏层的向量,如上图维度就是4,V是隐藏层到输出层的参数矩阵,在上图中就是4X2,O是输出层的向量,在上图中维度为2。有没有一种顿时豁然开朗的感觉,正是因为我当初在学习的时候,可能大家都觉得这个问题比较小,所以没人讲,我一直搞不清楚那些神经元去哪了。。所以我觉得讲出来,让一些跟我一样的小白可以更好的理解。

弄懂了RNN结构的左边,那么右边这个W到底是什么啊?把上面那幅图打开之后,是这样的:

 等等,这又是什么??别慌,很容易看,举个例子,有一句话是,I love you,那么在利用RNN做一些事情时,比如命名实体识别,上图中的 Xt−1 代表的就是I这个单词的向量,X代表的是love这个单词的向量, Xt+1 代表的是you这个单词的向量,以此类推,我们注意到,上图展开后,W一直没有变,W其实是每个时间点之间的权重矩阵,我们注意到,RNN之所以可以解决序列问题,是因为它可以记住每一时刻的信息,每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定,公式如下,其中Qt 代表t时刻的输出, St 代表t时刻的隐藏层的值:

 值得注意的一点是,在整个训练过程中,每一时刻所用的都是同样的W。

 举个例子,方便理解

假设现在我们已经训练好了一个RNN,如图,我们假设每个单词的特征向量是二维的,也就是输入层的维度是二维,且隐藏层也假设是二维,输出也假设是二维,所有权重的值都为1且没有偏差且所有激活函数都是线性函数,现在输入一个序列,到该模型中,我们来一步步求解出输出序列:

 

你可能会好奇W去哪了?W在实际的计算中,在图像中表示非常困难 ,所以我们可以想象上一时刻的隐藏层的值是被存起来,等下一时刻的隐藏层进来时,上一时刻的隐藏层的值通过与权重相乘,两者相加便得到了下一时刻真正的隐藏层,如图 a1 , a2 可以看做每一时刻存下来的值,当然初始时a1 , a2是没有存值的,因此初始值为0:

 

 

当我们输入第一个序列,【1,1】,如下图,其中隐藏层的值,也就是绿色神经元,是通过公式St = f(U * Xt + W * St-1) 计算得到的,因为所有权重都是1,所以也就是 1∗1+1∗1+1∗0+1∗0=2 (我把向量X拆开计算的,由于篇幅关系,我只详细列了其中一个神经元的计算过程,希望大家可以看懂,看不懂的请留言),输出层的值4是通过公式 Qt=g(V⋅St) 计算得到的,也就是 2∗1+2∗1=4 (同上,也是只举例其中一个神经元),得到输出向量【4,4】:

 当【1,1】输入过后,我们的记忆里的 a1,a2 已经不是0了,而是把这一时刻的隐藏状态放在里面,即变成了2,如图,输入下一个向量【1,1】,隐藏层的值通过公式St=f(U * Xt + W * St−1) 得到, 1∗1+1∗1+1∗2+1∗2=6 ,输出层的值通过公式Qt=g(V * St),得到 6∗1+6∗1=12 ,最终得到输出向量【12,12】:

 

同理,该时刻过后 a1,a2 的值变成了6,也就是输入第二个【1,1】过后所存下来的值,同理,输入第三个向量【2,2】,如图,细节过程不再描述,得到输出向量【32,32】:

由此,我们得到了最终的输出序列为

至此,一个完整的RNN结构我们已经经历了一遍,我们注意到,每一时刻的输出结果都与上一时刻的输入有着非常大的关系,如果我们将输入序列换个顺序,那么我们得到的结果也将是截然不同,这就是RNN的特性,可以处理序列数据,同时对序列也很敏感。

二.LSTM

如果你经过上面的文章看懂了RNN的内部原理,那么LSTM对你来说就很简单了,首先大概介绍一下LSTM,是四个单词的缩写,Long short-term memory,翻译过来就是长短期记忆,是RNN的一种,比普通RNN高级(上面讲的那种),基本一般情况下说使用RNN都是使用LSTM,现在很少有人使用上面讲的那个最基础版的RNN,因为那个存在一些问题,LSTM效果好,当然会选择它了!

长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。

长短时记忆网络的思路:

原始 RNN 的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。
再增加一个状态,即c,让它来保存长期的状态,称为单元状态(cell state)。

把上图按照时间维度展开

 

在 t 时刻,LSTM 的输入有三个:当前时刻网络的输入值 、上一时刻 LSTM 的输出值 、以及上一时刻的单元状态 
LSTM 的输出有两个:当前时刻 LSTM 输出值 、和当前时刻的单元状态.

关键问题是:怎样控制长期状态 c ?

方法是:使用三个控制开关

第一个开关,负责控制继续保存长期状态c;
第二个开关,负责控制把即时状态输入到长期状态c;
第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出

如何在算法中实现这三个开关?

方法:用 门(gate)

定义:gate 实际上就是一层全连接层,输入是一个向量,输出是一个 0到1 之间的实数向量。
公式为:

回忆一下它的样子:

gate 如何进行控制?

方法:用门的输出向量按元素乘以我们需要控制的那个向量
原理:门的输出是 0到1 之间的实数向量,
当门输出为 0 时,任何向量与之相乘都会得到 0 向量,这就相当于什么都不能通过;
输出为 1 时,任何向量与之相乘都不会有任何改变,这就相当于什么都可以通过。


LSTM 前向计算

在 LSTM-1 中提到了,模型是通过使用三个控制开关来控制长期状态 c 的:

这些开关就是用门(gate)来实现:

接下来具体看这三重门


LSTM 的前向计算:

一共有 6 个公式

遗忘门(forget gate)
它决定了上一时刻的单元状态 c_t-1 有多少保留到当前时刻 c_t

输入门(input gate)
它决定了当前时刻网络的输入 x_t 有多少保存到单元状态 c_t

输出门(output gate)
控制单元状态 c_t 有多少输出到 LSTM 的当前输出值 h_t


遗忘门的计算为:

forget

遗忘门的计算公式中:
W_f 是遗忘门的权重矩阵,[h_t-1, x_t] 表示把两个向量连接成一个更长的向量,b_f 是遗忘门的偏置项,σ 是 sigmoid 函数。


输入门的计算:

input

根据上一次的输出和本次输入来计算当前输入的单元状态:

当前输入的单元状态c_t

当前时刻的单元状态 c_t 的计算:由上一次的单元状态 c_t-1 按元素乘以遗忘门 f_t,再用当前输入的单元状态 c_t 按元素乘以输入门 i_t,再将两个积加和:
这样,就可以把当前的记忆 c_t 和长期的记忆 c_t-1 组合在一起,形成了新的单元状态 c_t
由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。

当前时刻的单元状态c_t


输出门的计算:

output

LSTM 的反向传播训练算法

主要有三步:

1. 前向计算每个神经元的输出值,一共有 5 个变量,计算方法就是前一部分:

2. 反向计算每个神经元的误差项值。与 RNN 一样,LSTM 误差项的反向传播也是包括两个方向:
一个是沿时间的反向传播,即从当前 t 时刻开始,计算每个时刻的误差项;
一个是将误差项向上一层传播。

3. 根据相应的误差项,计算每个权重的梯度。


gate 的激活函数定义为 sigmoid 函数,输出的激活函数为 tanh 函数,导数分别为:

具体推导公式为:

具体推导公式为:


目标是要学习 8 组参数,如下图所示:

又权重矩阵 W 都是由两个矩阵拼接而成,这两部分在反向传播中使用不同的公式,因此在后续的推导中,权重矩阵也要被写为分开的两个矩阵。

接着就来求两个方向的误差,和一个梯度计算。
这个公式推导过程在本文的学习资料中有比较详细的介绍,大家可以去看原文:
https://zybuluo.com/hanbingtao/note/581764


1. 误差项沿时间的反向传递:

定义 t 时刻的误差项:

目的是要计算出 t-1 时刻的误差项:

利用 h_t c_t 的定义,和全导数公式,可以得到 将误差项向前传递到任意k时刻的公式:


2. 将误差项传递到上一层的公式:


3. 权重梯度的计算:

以上就是 LSTM 的训练算法的全部公式。

参考博客:https://zhuanlan.zhihu.com/p/123211148

                https://blog.csdn.net/Lison_Zhu/article/details/97236501

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Tkinter 图形化界面基础篇:添加图形和图像

PythonTkinter 图形化界面基础篇:添加图形和图像 引言添加图形元素步骤1:导入 Tkinter 步骤2:创建主窗口步骤3:创建 Canvas 步骤4:绘制图形 绘制线条 绘制矩形 绘制椭圆 绘制多边形 步骤5:启动主事件循环 显…

学信息系统项目管理师第4版系列23_成本管理

1. 项目成本失控的原因 1.1. 对工程项目认识不足 1.1.1. 对信息系统工程成本控制的特点认识不足 1.1.2. 工程项目的规模不合理 1.1.3. 工程项目设计及实施人员缺乏成本意识 1.1.4. 对项目成本的使用缺乏责任感 1.2. 组织制度不健全 1.2.1. 制度不完善 1.2.2. 责任不落实…

【考研408常用数据结构】C/C++实现代码汇总

文章目录 前言数组多维数组的原理、作用稀疏数组 链表单向链表的增删改查的具体实现思路约瑟夫环问题(可不学)双向链表 树二叉搜索树中序线索二叉树哈夫曼树的编码与译码红黑树B树B树 堆顺序与链式结构队列实现优先队列排序算法(重点&#xf…

信创办公–基于WPS的EXCEL最佳实践系列 (单元格与行列)

信创办公–基于WPS的EXCEL最佳实践系列 (单元格与行列) 目录 应用背景操作步骤1、插入和删除行和列2、合并单元格3、调整行高与列宽4、隐藏行与列5、修改单元格对齐和缩进6、更改字体7、使用格式刷8、设置单元格内的文本自动换行9、应用单元格样式10、插…

【力扣】智力题+排序+距离和:2731. 移动机器人

【力扣】智力题排序距离和:2731. 移动机器人 文章目录 【力扣】智力题排序距离和:2731. 移动机器人1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一些机器人分布在一条无限长的数轴上,他们初始坐标用一个下标从 0 开始的整数数…

windows部署django服务器

windows部署django服务器 1、安装IIS1.1 控制面板-----程序----程序和功能----启用或关闭windows功能1.2安装IIS服务器,完成后,重新进入,把CGI安装进系统 2、安装python与虚拟环境2.1 安装python2.2 安装virtualenv虚拟环境2.3 创建一个虚拟环…

关于谷歌浏览器设置打开时页面不起作用的解决方法

背景 1、由于我前面不知道怎么操作的,导致我在设置新建标签页和打开软件时默认打开网页的时候,都不起作用,每次都默认打开谷歌,结果,没有梯子,谷歌还看不了 解决方法 这里我的解决方式有点粗暴&#xff0…

StreamingLLM输入、输出无限长的小记

本文中: 最多400万token上下文、推理提速22倍,StreamingLLM火了,已获GitHub 2.5K星 提到了StreamingLLM可以提供给模型无限输入、无限输出的能力,大概解读一下这个概念 可以实现: 可以支持无限输入,但原理…

沪深300期权一个点多少钱?

经中国证监会批准,深圳证券交易所于2019年12月23日上市嘉实沪深300ETF期权合约品种。该产品是以沪深300为标的物的嘉实沪深300ETF交易型指数基金为标的衍生的标准化合约,下文介绍沪深300期权一个点多少钱?本文来自:期权酱 一、沪深300期权涨…

YOLOV8改进:soft-nms、DIOU-nms、SIOU-nms、EIOU-nms、WIOU-nms

1.nms介绍 1.1 nms NMS(Non-Maximum Suppression,非极大值抑制)是一种常用的目标检测算法,用于抑制冗余的边界框,保留最具代表性的目标框。 在目标检测任务中,通常会生成多个候选边界框(boun…

基于SSM的网络安全宣传网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

立即提升吃鸡战斗力!分享顶级游戏干货!

各位吃鸡玩家,您好!在这里,我将与您分享一些提高游戏战斗力的实用技巧,同时带您体验顶级游戏作战干货! 首先,我向您推荐绝地求生作图工具。通过使用这些强大的作图工具,您可以轻松编辑出炫酷的吃…

华为OD机考算法题:字符串划分

题目部分 题目字符串划分难度难题目说明给定一个小写字母组成的字符串s,请找出字符串中两个不同位置的字符作为分割点,使得字符串分成的三个连续子串且子串权重相等,注意子串不包含分割点。 若能找到满足条件的两个分割点,请输出…

bert----学习笔记

一个简单基础模板: bert导入,分词,编码 from transformers import BertConfig, BertTokenizer, BertModel import torch from transformers import BertModel, BertTokenizer # 指定模型文件夹路径(包含 pytorch_model.bin&#…

面面俱到:揭秘吃鸡新手最关心的要领和细节,全方位指引你成为绝地求生高手!

你是否正在探索绝地求生的神秘世界,却感到迷茫和困惑?想要掌握吃鸡的要领和细节,成为一名顶尖玩家吗?现在,我们将为你揭秘吃鸡新手最关心的要领和细节,带你全面了解这个充满挑战的游戏。无论是如何选择起跳…

摆脱繁杂工作:Appwrite 带你高效开发 | 开源日报 No.50

TheAlgorithms/Java Stars: 53.8k License: MIT 这个项目是一个用 Java 实现的算法集合,旨在提供学习目的。它包含了各种不同类型的算法,并且可以通过 Gitpod.io 进行运行、编辑和贡献。该项目具有以下核心优势: 提供了大量常见算法及其实…

澳大利亚教育部宣布ChatGPT将被允许在澳学校使用!

教育部长最近宣布,从 2024 年起,包括 ChatGPT 在内的人工智能将被允许在所有澳大利亚学校使用。 (图片来源:卫报) 而早些时候,澳洲各高校就已经在寻找与Chatgpt之间的平衡了。 之前,悉尼大学就…

微服务10-Sentinel中的隔离和降级

文章目录 降级和隔离1.Feign整合Sentinel来完成降级1.2总结 2.线程隔离两种实现方式的区别3.线程隔离中的舱壁模式3.2总结 4.熔断降级5.熔断策略(根据异常比例或者异常数) 回顾 我们的限流——>目的:在并发请求的情况下服务出现故障&…

2023年软考网工上半年下午真题

试题一: 阅读以下说明,回答问题1至问题4,将解答填入答题纸对应的解答栏内。 [说明] 某企业办公楼网络拓扑如图1-1所示。该网络中交换机Switch1-Switch 4均是二层设备,分布在办公楼的各层,上联采用干兆光纤。核心交换…

前端 vite+vue3——写一个随机抽奖组件

文章目录 ⭐前言⭐设计布局⭐交互设计⭐整体代码⭐insicode代码 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于前端 vitevue3——写一个抽奖随机组件。 vue3系列相关文章: 前端vue2、vue3去掉url路由“ # ”号——nginx配置 csdn新星计…