【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba)

项目源码地址:https://github.com/ImagineAILab/ai-by-hand-excel.git

一、RNN

1. RNN 的核心思想

RNN 的设计初衷是处理序列数据(如时间序列、文本、语音),其核心特点是:

  • 隐藏状态(Hidden State):保留历史信息,充当“记忆”。

  • 参数共享:同一组权重在时间步间重复使用,减少参数量。

2. RNN 的数学表达

对于一个时间步 t:

  • 输入:xt​(当前时间步的输入向量)。

  • 隐藏状态:ht​(当前状态),ht−1​(上一状态)。

  • 输出:yt​(预测或特征表示)。

  • 参数:权重矩阵 和偏置 ​。

  • 激活函数:σ(通常为 tanh 或 ReLU)。

更新隐藏状态的核心操作

数学本质:非线性变换

  • At​ 是当前时间步的“未激活状态”,即隐藏状态的线性变换结果(上一状态 ht−1​ 和当前输入 xt​ 的加权和)。

  • ⁡tanh 是双曲正切激活函数,将 At​ 映射到 [-1, 1] 的范围内:

  • 作用:引入非线性,使RNN能够学习复杂的序列模式。如果没有非线性,堆叠的RNN层会退化为单层线性变换。

梯度稳定性

  • tanh⁡tanh 的导数为:

  • 梯度值始终小于等于1,能缓解梯度爆炸(但可能加剧梯度消失)。

  • 相比Sigmoid(导数最大0.25),tanh⁡tanh 的梯度更大,训练更稳定。

3. RNN 的工作流程

前向传播
  1. 初始化隐藏状态 ℎ0h0​(通常为零向量)。

  2. 按时间步迭代计算:

    • 结合当前输入 xt​ 和上一状态 ht−1​ 更新状态 ht​。

    • 根据ht​ 生成输出 yt​。

反向传播(BPTT)

通过时间反向传播(Backpropagation Through Time, BPTT)计算梯度:

  • 沿时间轴展开RNN,类似多层前馈网络。

  • 梯度需跨时间步传递,易导致梯度消失/爆炸

4. RNN 的典型结构

(1) 单向RNN(Vanilla RNN)
  • 信息单向流动(过去→未来)。

  • 只能捕捉左侧上下文。

(2) 双向RNN(Bi-RNN)
  • 两个独立的RNN分别从左到右和从右到左处理序列。

  • 最终输出拼接或求和,捕捉双向依赖。

(3) 深度RNN(Stacked RNN)
  • 多个RNN层堆叠,高层处理低层的输出序列。

  • 增强模型表达能力。

5. RNN 的局限性

(1) 梯度消失/爆炸
  • 长序列中,梯度连乘导致指数级衰减或增长。

  • 后果:难以学习长期依赖(如文本中相距很远的词关系)。

(2) 记忆容量有限
  • 隐藏状态维度固定,可能丢失早期信息。

(3) 计算效率低
  • 无法并行处理序列(必须逐时间步计算)。

6. RNN 的代码实现(PyTorch)

import torch.nn as nnclass VanillaRNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super().__init__()self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)self.fc = nn.Linear(hidden_size, output_size)def forward(self, x):# x: [batch_size, seq_len, input_size]out, h_n = self.rnn(x)  # out: 所有时间步的输出y = self.fc(out[:, -1, :])  # 取最后一个时间步return y

7. RNN vs. 其他序列模型

特性RNN/LSTMTransformerMamba
长序列处理中等(依赖门控)差(O(N2))优(O(N))
并行化不可并行完全并行部分并行
记忆机制隐藏状态全局注意力选择性状态

8. RNN 的应用场景

  • 文本生成:字符级或词级预测。

  • 时间序列预测:股票价格、天气数据。

  • 语音识别:音频帧序列转文本。

二、mamba

1. Mamba 的诞生背景

Mamba(2023年由Albert Gu等人提出)是为了解决传统序列模型(如RNN、Transformer)的两大痛点:

  1. 长序列效率问题:Transformer的Self-Attention计算复杂度为 O(N2),难以处理超长序列(如DNA、音频)。

  2. 状态压缩的局限性:RNN(如LSTM)虽能线性复杂度 O(N),但隐藏状态难以有效捕捉长期依赖。

Mamba的核心创新:选择性状态空间模型(Selective SSM),结合了RNN的效率和Transformer的表达力。

2. 状态空间模型(SSM)基础

Mamba基于结构化状态空间序列模型(S4),其核心是线性时不变(LTI)系统:

  • h(t):隐藏状态

  • A(状态矩阵)、B(输入矩阵)、C(输出矩阵)

  • 离散化(通过零阶保持法):

其中

关键特性

  • 线性复杂度 O(N)(类似RNN)。

  • 理论上能建模无限长依赖(通过HiPPO初始化 A)。

3. Mamba 的核心改进:选择性(Selectivity)

传统SSM的局限性:A,B,C 与输入无关,导致静态建模能力。
Mamba的解决方案:让参数动态依赖于输入(Input-dependent),实现“选择性关注”重要信息。

选择性SSM的改动:
  1. 动态参数化

    • B, C, ΔΔ 由输入xt​ 通过线性投影生成:

  1. 这使得模型能过滤无关信息(如文本中的停用词)。
  2. 硬件优化

    • 选择性导致无法卷积化(传统SSM的优势),但Mamba设计了一种并行扫描算法,在GPU上高效计算。

4. Mamba 的架构设计

Mamba模型由多层 Mamba Block 堆叠而成,每个Block包含:

  1. 选择性SSM层:处理序列并捕获长期依赖。

  2. 门控MLP(如GeLU):增强非线性。

  3. 残差连接:稳定深层训练。

(示意图:输入 → 选择性SSM → 门控MLP → 输出)

Time-Varying Recurrence(时变递归)

作用

打破传统SSM的时不变性(Time-Invariance),使状态转移动态适应输入序列。

  • 传统SSM的离散化参数 Aˉ,Bˉ 对所有时间步相同(LTI系统)。

  • Mamba的递归过程是时变的(LTV系统),状态更新依赖当前输入。

实现方式
  • 离散化后的参数 Aˉt​,Bˉt​ 由 Δt​ 动态控制:

    • Δt​ 大:状态更新慢(保留长期记忆)。

    • Δt​ 小:状态更新快(捕捉局部特征)。

  • 效果:模型可以灵活调整记忆周期(例如,在文本中保留重要名词,快速跳过介词)。

关键点
  • 时变性是选择性的直接结果,因为 Δt​,Bt​,Ct​ 均依赖输入。

Discretization(离散化)

作用

将连续时间的状态空间方程(微分方程)转换为离散时间形式,便于计算机处理。

  • 连续SSM:

  • 离散SSM:

实现方式
  • 使用零阶保持法(ZOH)离散化:

总结

  • Selection:赋予模型动态过滤能力,是Mamba的核心创新。

  • Time-Varying Recurrence:通过时变递归实现自适应记忆。

  • Discretization:将连续理论落地为可计算的离散操作。

5. 为什么Mamba比Transformer更高效?

特性TransformerMamba
计算复杂度O(N2)O(N)
长序列支持内存受限轻松处理百万长度
并行化完全并行需自定义并行扫描
动态注意力显式Self-Attention隐式通过选择性SSM

优势场景

  • 超长序列(基因组、音频、视频)

  • 资源受限设备(边缘计算)

6. 代码实现片段(PyTorch风格)

class MambaBlock(nn.Module):def __init__(self, dim):self.ssm = SelectiveSSM(dim)  # 选择性SSMself.mlp = nn.Sequential(nn.Linear(dim, dim*2),nn.GELU(),nn.Linear(dim*2, dim)def forward(self, x):y = self.ssm(x) + x          # 残差连接y = self.mlp(y) + y          # 门控MLPreturn y

7. Mamba的局限性

  • 训练稳定性:选择性SSM需要谨慎的参数初始化。

  • 短序列表现:可能不如Transformer在短文本上的注意力精准。

  • 生态支持:目前库(如mamba-ssm)不如Transformer成熟。

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

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

相关文章

pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9

在 PyCharm 中,如果你已经安装了 Python 3.9,并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器,可以按照以下步骤操作: 步骤 1:打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…

【H桥电机驱动电路原理】-学习笔记

工作原理 电路分析 这是一个由晶体管构成的 H 桥电机驱动电路 ,以下是对其各部分的介绍: 核心器件 晶体管:电路中使用了 PNP 型的 SS8550(Q5、Q6 )和 NPN 型的 SS8050(Q9、Q10、Q13、Q14 )。…

【家政平台开发(49)】解锁家政平台上线密码:服务器选型与配置全攻略

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…

驱动开发硬核特训 · Day 10 (理论上篇):设备模型 ≈ 运行时的适配器机制

🔍 B站相应的视屏教程: 📌 内核:博文视频 - 总线驱动模型实战全解析 敬请关注,记得标为原始粉丝。 在 Linux 驱动开发中,设备模型(Device Model)是理解驱动架构的核心。而从软件工程…

arm_math.h、arm_const_structs.h 和 arm_common_tables.h

在 ​​FOC(Field-Oriented Control,磁场定向控制)​​ 中,arm_math.h、arm_const_structs.h 和 arm_common_tables.h 是 CMSIS-DSP 库的核心组件,用于实现高效的数学运算、预定义结构和查表操作。以下是它们在 FOC 控…

Android: gradient 使用

在 Android 中使用 gradient(渐变) 通常是通过 drawable 文件来设置背景。下面是可以直接用的几种用法汇总,包括线性渐变、径向渐变、扫描渐变(sweep)等: ✅ 1. Linear Gradient(线性渐变&#…

打造AI应用基础设施:Milvus向量数据库部署与运维

目录 打造AI应用基础设施:Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库?1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…

AI Agent 在医疗健康领域的深度应用剖析

引言 随着人工智能技术的迅猛发展,AI Agent 在医疗健康领域展现出了巨大的应用潜力。它犹如一位智能助手,凭借其强大的数据处理和分析能力,渗透到医疗健康的各个环节,从疾病诊断、治疗方案制定到患者康复监控,都发挥着…

树莓派超全系列教程文档--(28)boot文件夹内容

boot文件夹内容 boot 文件夹内容bootcode.binstart*.elffixup*.datcmdline.txtconfig.txtissue.txtinitramfs*ssh 或 ssh.txt设备树blob文件 ( *.dtb )内核文件 ( *.img )overlays 文件夹 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 boot 文件…

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

【LangChain核心组件】Memory:让大语言模型拥有持续对话记忆的工程实践

目录 一、Memory架构设计解析 1. 核心组件关系图 2. 代码中的关键实现 二、对话记忆的工程实现 1. 消息结构化存储 2. 动态提示组装机制 三、Memory类型选型指南 四、生产环境优化实践 1. 记忆容量控制 2. 记忆分片策略 3. 记忆检索增强 五、典型问题调试技巧 1. …

适应 AI 时代的软件开发流程:用 AI + TDD 构建可维护项目

🧠 适应 AI 时代的软件开发流程:用 AI + TDD 构建可维护项目 本文面向有系统开发经验的工程师,分享如何结合 Git 管理、AI 协作、YAML 驱动与 TDD 开发方式,高效构建一个可维护、可协作、可交付的嵌入式或通用工程项目。适合 BLE 模块、协议栈组件、物联网控制系统等项目落…

使用 chromedriver 实现网络爬虫【手抄】

1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…

Python项目--基于Python的自然语言处理文本摘要系统

1. 项目概述 自然语言处理(NLP)是人工智能领域中一个重要的研究方向&#xff0c;而文本摘要作为NLP的一个重要应用&#xff0c;在信息爆炸的时代具有重要意义。本项目旨在开发一个基于Python的文本摘要系统&#xff0c;能够自动从长文本中提取关键信息&#xff0c;生成简洁而全…

【Vue #3】指令补充样式绑定

一、指令修饰符 Vue 的指令修饰符&#xff08;Directive Modifiers&#xff09;是 Vue 模板语法中的重要特性&#xff0c;它们以半角句号 . 开头&#xff0c;用于对指令的绑定行为进行特殊处理 修饰符作用如下&#xff1a; 简化事件处理&#xff08;如阻止默认行为、停止冒泡…

Reinforcement Learning强化学习--李宏毅机器学习笔记

个人学习笔记&#xff0c;如有错误欢迎指正&#xff0c;也欢迎交流&#xff0c;其他笔记见个人空间 强化学习 vs 监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a;你有输入和明确的输出标签&#xff0c;例如图像分类。 强化学习&#xff08;Rein…

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平时开发环境以Linux系统为主&#xff0c;有时又需要使用Windows系统下开发环境&#xff0c;为了能像Linux系统那样用Windows VsCode&#xff0c;Terminal命令行是必不可少内容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介绍&#xff0c;如何在V…

软件测试之测试数据生成(Excel版)

这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理

最近在使用libwebsocket&#xff0c;感觉它搭建Http与websocket服务器比较简单&#xff0c;不像poco库那么庞大&#xff0c;但当我使用它建立websocket服务器后&#xff0c;发现websocket客户端连接一直没有连接成功&#xff0c;不知道什么原因&#xff0c;经过一天的调试&…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后&#xff0c;我们通常希望将其部署到推理平台中&#xff0c;比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…