循环神经网络 - 长短期记忆网络

在之前的博文中,我们介绍了循环神经网络的长程依赖问题及改进方案,可以参考:循环神经网络 - 长程依赖问题及改进方案-CSDN博客

但是改进方案只是可以缓解梯度消失,并不能彻底解决梯度爆炸问题和记忆容量(Memory Capacity)问题。

长短期记忆网络(Long Short-Term Memory Network,LSTM)是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。

在普通 RNN 中,由于每一步的隐藏状态只通过简单的递归更新,长时间以来传递的梯度可能会迅速消失或爆炸,导致模型无法捕捉长距离依赖。LSTM 通过引入记忆单元 c_t 和门控机制,将信息在时间步之间直接传递,且引入了“跳跃”连接(将 c_{t-1} 直接影响 ct 经过线性组合而非多次非线性变换),这样就能更稳定地传递梯度信息,捕捉长程依赖。具体来说:

  • 遗忘门 控制过去的记忆保留程度;

  • 输入门与候选记忆 决定如何加入新信息;

  • 输出门 决定如何输出对后续步骤有用的信息。

这种设计有效减弱了反向传播过程中梯度消失或爆炸的问题,使得 LSTM 能够记住和利用长时间跨度中的关键信息,这正是许多语言模型、语音处理和其他序列数据任务中的核心需求。

本文,我们来认识长短期记忆网络的相关概念,探究一下其解决梯度爆炸或消失的原理。

长短期记忆网络(LSTM)的内部状态主要指其“记忆细胞”(cell state,通常记为 c_t)以及与之相关的隐藏状态(hidden state,通常记为 h_t)。这两个状态共同决定了 LSTM 如何存储、传递和更新信息,使其能够捕获长程依赖。下面通过语言描述 LSTM 内部状态的构成、更新机制及其关键作用。

1. 内部状态的构成

  • 记忆单元(Cell State c_t​)
    记忆单元是 LSTM 的核心,它像一条传送带,沿着整个序列传递信息。其主要作用是保持长期信息,并且通过特定的门控机制有选择地“遗忘”或者“保留”信息。由于这种传递过程主要依靠乘法操作(例如和遗忘门 f_t​ 相乘),可以在一定程度上减缓梯度消失的问题。

  • 隐藏状态(Hidden State h_t​)
    隐藏状态可以被看作是当前时刻对外的输出,也是在当前时间步经过非线性激活(通常是 tanh⁡)处理后的记忆状态。它既包含了长期记忆 c_t 的信息,也反映了对当前输入的即时响应。隐藏状态经过输出门 o_t 的调制之后,是最终传递给下一层或后续运算的信号。

2. 内部状态的更新机制

LSTM 通过三个门来更新内部状态,它们分别是:

  • 遗忘门(Forget Gate)
    遗忘门决定了保留上一时刻记忆单元 c_{t-1}​ 中哪些信息。
    数学表达:

    其中 σ 是 sigmoid 函数,其输出在 [0,1] 之间。输出值越接近 1,表示对应维度的信息越应该保留,反之则“遗忘”。

  • 输入门(Input Gate)
    输入门决定了当前输入 x_t​ 中哪些新信息以及通过候选记忆 ​ 将加入到记忆单元中。
    数学表达:

  • 记忆单元更新
    最后,新的记忆单元 c_t 通过结合遗忘门与输入门的作用得到更新:

    这里“⊙”表示逐元素相乘。这意味着,上一时刻的记忆经过遗忘门滤波后和新生成的信息按比例混合,从而构成当前的记忆单元。

  • 输出门(Output Gate)
    输出门决定了如何从记忆单元中提取信息生成当前的隐藏状态:

    最终得到隐藏状态:

3. 举例说明

设想一个简单的文本生成任务——例如生成一句话。假设模型需要捕获长句子中前后字符之间的依赖关系。在处理输入“今天天气很好”时:

  • 当模型接收到“今天”时,会在记忆单元 c_t​ 中保存与“今天”相关的信息(比如时间概念)。

  • 接下来,当输入“天气”时,遗忘门 f_t 控制是否保留“今天”的信息,同时输入门 i_t​ 选择性地将与“天气”相关的新特征加入记忆单元。

  • 当进一步输入“很好”时,记忆单元中的“今天”和“天气”信息经由输出门调制,影响最终隐藏状态 h_t​ 的计算,进而帮助模型生成连贯的输出。

在这个过程中,整个句子中远距离(“今天”与“很好”之间)的依赖通过记忆单元传递,LSTM 的三个门结构允许模型有选择地更新和维持这些信息。尽管内部使用的激活函数(如 sigmoid 和 tanh⁡)本身很简单,但通过逐层的线性变换与非线性激活的复合,LSTM 能够捕捉和表达复杂的语义依赖关系,支持长程信息的有效传递。

4. 关键理解

  • 记忆单元 c_t 是信息的长期存储器,可以跨越多个时间步稳定传递关键信息。

  • 门控机制(遗忘门、输入门、输出门)决定了信息如何在各个时间步之间选择性地保留或更新。

  • 隐藏状态 h_t 则是经过记忆单元筛选和调制后的信息,供下一层或下一时间步使用。

5. 对于候选记忆的理解

在长短期记忆网络(LSTM)中,“候选记忆”指的是在当前时间步下,根据输入和前一隐藏状态生成的一组新信息,用来在更新记忆单元时候选加入到长期记忆中的数据。它通常用符号 ​ 表示,计算公式为:

这里,表示将前一时刻的隐藏状态和当前输入拼接在一起,经过一个线性变换(由权重矩阵 W_c​ 和偏置 b_c 定义)后,再通过 tanh⁡ 激活函数映射到区间 [−1,1] 内,就得到了“候选记忆”。

为什么需要候选记忆?

候选记忆的作用在于:

  • 提供新信息的备选项:当前时间步的输入常常携带有新的信息,候选记忆就是对这些新信息的一种初步加工和表示。但新信息不是全部都适合直接加入到长期记忆中。

  • 由输入门决定是否更新:在 LSTM 中,还有一个输入门(Input Gate),其计算公式为:

    输入门 i_t 的值(介于0和1之间)将会与候选记忆逐元素相乘,形成对记忆单元的增量更新:

    这意味着,对于候选记忆中的每个元素,如果输入门对应的数值较大(接近1),那么该部分候选信息将被更多地写入到长期记忆;如果较小(接近0),则该部分新信息基本被忽略。

举例说明

假设你正利用 LSTM 处理一句话:"我爱自然语言处理"。我们来看一下某个时间步的情况:

  1. 前一时刻隐含状态h_{t-1}
    假设在处理到“爱”这个词时,隐藏状态已经捕捉到了前面“我爱”这部分的语义信息,即可以表示为 h_{t-1}​。

  2. 当前输入 x_t
    当前输入为“自然语言处理”中某个字符或词的表示,这个表示包含了与当前新信息相关的语义特征。

  3. 候选记忆计算

    这里,0.8 可能表示当前输入中对于“自然”这个概念的一个强烈信号,-0.3 表示某些信息的负面特征,而 0.4 表示另一个中等程度的特征。

  4. 输入门的作用
    同时,输入门 i_t​ 计算出的向量决定了候选记忆哪些部分真正被写入记忆单元。如果 i_t​ 计算得到:

    则实际更新记忆单元的增量就是逐元素相乘:

    这表示,记忆单元在这一时刻将吸收主要来自候选记忆的 0.72 和 0.28 两个分量,而将 -0.06 的新信息(可视为低权重或噪声)几乎忽略掉。

  5. 整体更新
    最终,记忆单元 c_t 的更新会结合上一时刻保留的信息(由遗忘门控制)与这一时刻更新的信息:

    这样,就构成了 LSTM 内部记忆状态的动态更新。

  • 候选记忆是对当前输入与前一隐藏状态进行线性组合和非线性映射后的“新信息”表示,它代表了当前时刻可以加入到长期记忆中的潜在内容。

  • 输入门决定最终哪些候选信息真正更新进记忆单元。

  • 举例中,通过具体向量的生成、输入门的筛选、以及逐元素相乘,展示了候选记忆如何帮助 LSTM 有选择地吸收新输入的信息,从而逐步构建出对长程信息的有效记忆。

       这种设计使得 LSTM 能够在动态更新中捕捉到句子、语音或其他序列数据中复杂、非线性的长期依赖关系,而候选记忆作为一种临时的备选信息起到了关键作用。

即使网络中的激活函数和门机制看似简单,通过不断的层级组合以及权重参数的学习,LSTM 能在整个序列上捕捉和表达复杂的长期依赖和非线性关系,这正是其在自然语言处理、语音识别、时间序列预测等任务中大放异彩的原因。

这样的内部状态设计正是 LSTM 能够“记住”关键信息,同时对无用信息进行“忘记”,从而有效解决传统 RNN 长程依赖问题的核心所在。

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

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

相关文章

LLM应用开发(七)--记忆

1.LangChain记忆模块 底层原理:在最新一次问题时,带上前面的人机对话历史内容 1.1.具体方式 缓冲记忆 缓冲窗口记忆(限定存储会话信息次数) 令牌缓冲记忆 摘要总结记忆 摘要缓冲混合记忆 向量存储库记忆

Unity VideoPlayer 播放无声音

增加一个videoPlayer下挂&#xff0c;audiorSource脚本 this.videoPlayer.EnableAudioTrack(0, true); this.videoPlayer.audioOutputMode VideoAudioOutputMode.AudioSource; this.videoPlayer.SetTargetAudioSource(0, this.videoPlayer.GetComponent<AudioSource>()…

AGI|AutoGen入门食用手册,搭建你的智能体流水线

目录 1. AutoGen简介 主要特点 2.快速安装 3. 相关概念 Agent Roles and Conversations 4.多代理对话 4.1 Agents 例子: 两个对话代理 4.2 支持多样化的对话模式 1. AutoGen简介 AutoGen 是一个开源编程框架&#xff0c;用于构建AI代理并促进多个代理之间的合作以解…

基于ImGui+FFmpeg实现播放器

基于ImGuiFFmpeg实现播放器 演示&#xff1a; ImGui播放器 继续研究FFmpeg&#xff0c;之前做了一个SDL的播放器&#xff0c;发现SDL的可视化UI界面的功能稍微差了点&#xff0c;所以今天我们换了一个新的工具&#xff0c;也就是ImGui。 ImGui官方文档&#xff1a;https://g…

ES6变量声明:let、var、const全面解析

一、引言 ECMAScript 6&#xff08;简称 ES6&#xff09;的发布为 JavaScript 带来了许多革命性的变化&#xff0c;其中变量声明方式的更新尤为重要。let、var和const成为开发者日常编码中频繁使用的关键字。 本文将深入解析这三种声明方式的核心特性、区别及最佳实践&#xff…

Java基础 - 反射(2)

文章目录 示例5. 通过反射获得类的private、 protected、 默认访问修饰符的属性值。6. 通过反射获得类的private方法。7. 通过反射实现一个工具BeanUtils&#xff0c; 可以将一个对象属性相同的值赋值给另一个对象 接上篇&#xff1a; 示例 5. 通过反射获得类的private、 pro…

FCOS目标检测

一、模型框架 FCOS采用的网络架构和RetinaNet一样&#xff0c;都是采用FPN架构&#xff0c;如图2所示&#xff0c;每个特征图后是检测器&#xff0c;检测器包含3个分支&#xff1a;classification&#xff0c;regression和center-ness。 对于特征图Fi∈RHWC&#xff0c;其相对…

Java基础 - 泛型(常见用法)

文章目录 泛型类泛型方法泛型类派生子类示例 1&#xff1a;子类固定父类泛型类型&#xff08;StringBox 继承自 Box<String>&#xff09;示例 2&#xff1a;子类保留父类泛型类型&#xff08;AdvancedBox<T> 继承自 Box<T>)示例 3&#xff1a;添加子类自己的…

YOLO学习笔记 | YOLOv8环境搭建全流程指南(2025.4)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== YOLOv8环境搭建 一、环境准备与工具配置1. Conda虚拟环境搭建2. CUDA与…

【 Beautiful Soup (bs4) 详解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析库&#xff0c;能够从复杂的网页文档中高效提取数据。以下是其核心知识点及示例代码。 一、库简介 1. 核心模块 BeautifulSoup&#xff1a;主类&#xff0c;用于构建文档树结构Tag&#xff1a;表示 HTML/XML 标签的对象…

傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻

2025年4月11日&#xff0c;上海——通用机器人公司傅利叶正式发布首款开源人形机器人 Fourier N1&#xff0c;并同步开放涵盖物料清单、设计图纸、装配指南、基础操作软件在内的完整本体资源包。作为傅利叶 “Nexus 开源生态矩阵” 的首个落地项目&#xff08;“N1” 即 “Nexu…

视觉目标检测大模型GAIA

中国科学院自动化研究所智能感知与计算研究中心携手华为等领军企业&#xff0c;共同推出面向产业应用的视觉目标检测全流程解决方案——GAIA智能检测平台。该研究成果已获CVPR 2021会议收录&#xff08;论文链接&#xff1a; 论文地址&#xff1a;https://arxiv.org/pdf/2106.…

前端时间同步利器:React + useEffect 实现高性能动态时钟

前言 在你奋笔疾敲代码的瞬间&#xff0c;是不是突然一低头&#xff0c;发现时间像偷偷跑路的变量&#xff0c;一眨眼就从上午飘到下午&#xff1f;饭没吃、会没开、工位也快被前端猫霸占了。仿佛你写的不是代码&#xff0c;而是“时间穿梭机”。别慌&#xff0c;咱们今天就来…

前端动画性能优化

前端动画性能优化全攻略&#xff1a;告别卡顿与高CPU占用 一、动画性能问题现状分析 1.1 性能问题现象 动画帧率低于60FPS时出现明显卡顿滚动/缩放操作时响应延迟CPU占用率长期超过70%移动端设备发热严重 1.2 核心问题根源 浏览器渲染流程中的性能瓶颈主要出现在&#xff1…

springboot中如何处理跨域

什么是跨域 跨域&#xff08;Cross-Origin&#xff09;是浏览器出于安全考虑&#xff0c;对不同源的资源访问施加的限制机制。其核心原因是同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;即浏览器仅允许协议&#xff08;Protocol&#xff09;、域名&#xf…

js实现生肖宜忌展示

实现效果图如下 实现逻辑&#xff1a; 1.录入属相列表&#xff08;列表顺序不可调整&#xff09;&#xff1b; 2.录入各属相相宜、相忌属相&#xff1b; 3.输入年份后&#xff0c;根据属相列表获取到正确的属相&#xff1b; 4.根据获取的属相去展示宜、忌属相&#xff1b; 5.打…

3DMAX笔记-UV知识点和烘焙步骤

1. 在展UV时&#xff0c;如何点击模型&#xff0c;就能选中所有这个模型的uv 2. 分多张UV时&#xff0c;不同的UV的可以设置为不同的颜色&#xff0c;然后可以通过颜色进行筛选。 3. 烘焙步骤 摆放完UV后&#xff0c;要另存为一份文件&#xff0c;留作备份 将模型部件全部分成…

AI 重构 Java 遗留系统:从静态方法到 Spring Bean 注入的自动化升级

在当今快速发展的软件行业中&#xff0c;许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法&#xff0c;随着业务的不断发展&#xff0c;其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具&#xff0c;为 Java 遗留系统的重构提供了…

【从一个 TypeScript 报错理解 ES6 模块的三种导入方式】

从一个 TypeScript 报错理解 ES6 模块的三种导入方式 在日常开发中&#xff0c;我们经常遇到模块导入导出的场景。最近在处理一个项目时&#xff0c;遇到了一个有趣的问题&#xff1a;对于只有默认导出的模块&#xff0c;我们该使用哪种导入方式&#xff1f;这个问题引发了对 …

安徽京准:NTP网络时钟服务器功能及同步模式的介绍

安徽京准&#xff1a;NTP网络时钟服务器功能及同步模式的介绍 安徽京准&#xff1a;NTP网络时钟服务器功能及同步模式的介绍 1、NTP网络时钟服务器概念&#xff1a; NTP时钟服务器&#xff0c;表面意思是时间计量工具的服务设备&#xff0c;其在现代工业中是用于对客户端设备…