Mamba:6 线性RNN

若在阅读过程中有些知识点存在盲区,可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。当然最重要的是订阅跟随“鲁班模锤”

Mamba自从出道就一直被拿来和Transformer对比,文章巨多,带着标题的爆炸性字样“颠覆Transfomer”,“全面包围”等等。文章深浅不一,小编认为其背后的设计思路以及演化过程更加重要。为此本专题将从山上有座庙开始,沿着RNN、SSM、S4、HIPPO一路走来。期间抛弃冗杂的文辞,以更接地气的模式协助读者打开新的逻辑思维。

线性RNN

2023年的<Resurrecting Recurrent Neural Networks for Long Sequences>将RNN拉回了赛道。文中提出的LRU通过简单的线性函数替换神经网络,然后在两个自注意力层之间用神经网络连接起来以弥补非线性处理能力的不足。会不会有点拗口,先来看看下面的结构图:

左边是线性RNN引入新单元的架构Deep Linear Recurrent Unit(LRU),这个模型通过堆叠LRU块而构成可扩展,每两层之间是非线性投影,模型还使用了跳跃连接(类似残差网络)和归一化方法。在LRU单元内部,不同时刻的状态变化成为了线性变换,(会不会很眼熟。)

循环操作被调整为纯线性,就可以解决之前RNN的两个痛点。它在 O(log(n)) 时间内并行计算应用于n个向量的线性递推。然后通过特殊的参数设计用来解决训练中的梯度问题(左上部分)。

线性替代

线性循环神经网络是什么?其实用线性函数替换神经网络即是,大白话就是将上述的激活函数去掉。

论文作者做了实验得出结论其实线性化对于块状结构其实已经足够。

值得一提的是线性RNN配合MLP(非线性映射)在sequence to sequence map中表现尚可。下图中的隐藏状态能够还原出足够的信息。

不仅仅如此,线性化的好处在于并行化和矩阵对角化,甚至之前的魔幻矩阵A也可以不通过HiPPO模式进行预设,而是通过训练学习得到。

将并行化和矩阵对角化结合在训练速度方面的确超过了s4和s5。

梯度消失与爆炸

先来看个场景,简化模型且假设第一个输入之后的每个输入都是0。那么按照循环网络,在每一步,前一个输出都会乘以权重向量得到后一个,n步之后得到了w^{n}与x的乘积。

 这个时候假如按照梯度稍微的调整权重矩阵,那么再次训练的时候得到了如下的式子。

两者的差值是一个恒定的缩放因子w^{n-1}乘以x1。这里存在的问题是随着n变大,这项要么变得非常小,要么变得非常大,具体取决于w中的值是小于还是大于1。(想象一下1.2^{10000}0.8^{10000}的数值大小)

无论哪种情况,这都是一个问题:若梯度非常大,则权重变化太大,已经学习的现有功能就会被破坏。若梯度非常小,则权重变化不够,根本学不到任何东西。这被称为梯度消失和爆炸问题。

值得一提的是,这对于常规神经网络来说可能不是问题,因为在每一层中都会使用不同的权重。有些层的权重可以小于1,有些层的权重可以大于 1,只要梯度保持大致相同的大小,神经网络就能够学习。而且目前也有很多的权重配置方法可以确保训练过程中的梯度稳定。

但对于循环结构,在每个步骤中使用相同的权重,只有一种稳定的配置,就是都为1。任何偏离1的情况都会导致梯度呈指数增长或衰减,当权重为复数的时候使用其绝对值。那么我们如何解决梯度消失和爆炸问题呢?

只要循环权重为1并且输入为0,RNN梯度就是稳定的。线性RNN论文中,作者建议在这种稳定状态下初始化。具体来说,以复极坐标形式ae^{ib}参数化权重,其中a是幅度,b是角度。然后通过此 e^{-e^{a}}函数调整,将a的幅度限制为小于1,该函数始终输出0到1之间的数字,而不是常规的以0 为中心的正态分布中随机采样。

e^{-e^{a}} 均匀分布在0.999和1之间。b均匀分布在0和π/10弧度之间。这确保了在初始化时,权重都非常接近1。

当然输入的信号要乘以另一个可学习参数Δ,初始化为\sqrt{1-e^{-e^{a}}},因为e^{-e^{a}}接近于1,所以这个参数是非常小的数字。这确保了初始化时输入都接近0。

虽然模型在训练的过程中很难保证梯度的稳定性,但是按照这种方法进行初始化则在实践中已经证明,它能够学会数万步的上下文。

后话

计算速度飞快的线性RNN,可以通过训练应付极长的上下文。在线性RNN的原始论文中,它在远程竞技场基准评估了该模型。

例如在PathX任务中,模型必须根据图像是否包含两个圆之间的完整虚线路径对图像进行分类。 只不过图像被展平为16000 像素的长序列。 线性RNN在长距离领域实现了最先进的性能,在所有任务中平均比Transformer高出约33%。

受控制理论启发的状态空间模型的初始化与线性RNN初始化大致相同。不管如何,当听到状态空间模型时,都会想到线性RNN。虽然线性RNN在长距离竞技场基准测试中确实表现出色,但这并不意味着它们是良好的语言模型。对于自然语言的建模,线性RNN的性能比Transformer差得多,尤其是和各种最先进的语言模型对比。 

正如Mamba论文中所指出的,其原因是线性RNN无法选择性地忘记输出向量中的信息。如果权重接近 0,则每次输入后输出向量将设置为0,实际上模型将始终立即忘记当前输入之前的任何内容。如果权重接近1,则输出向量在与权重相乘时不会改变,因此输出向量将累积来自观察到的所有输入的信息。 然而对于自然语言模型而言,需要它具备能够根据看到的输入来决定何时存储信息以及何时忘记信息的能力。不过整体而言,线性RNN将RNN拉回了生死线。

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

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

相关文章

mapreduce的优化方法

1、数据输入 &#xff08;1&#xff09;合并小文件&#xff1a;在执行mr任务前将小文件进行合并&#xff0c;大量的小文件会产生大量的map任务&#xff0c;增大map任务装载次数 &#xff0c;而任务的装载比较耗时 &#xff0c;从而导致 mr 运行较慢。 &#xff08;2&#xff09…

YOLO数据集制作(四)|json文件转txt验证(多边形框)

以下教程用于验证转成YOLO使用的txt格式&#xff0c;适用场景&#xff1a;多边形框&#xff0c;配合json格式文件转成YOLO使用的txt格式脚本使用。 YOLO数据集制作&#xff08;三&#xff09;|Labelme标注的“多边形框”json文件转txt-CSDN博客 使用方式&#xff1a;将img_pa…

简单实现---基于STL的演讲比赛流程管理系统(C++实现)

前言 事先声明&#xff1a;本文章中编写的代码仅用于学习算法思想和编写基础形式使用&#xff0c;并未进行太多的代码优化&#xff0c;因此&#xff0c;若需要对代码进行优化以及异常处理的小伙伴们&#xff0c;可自行添加相关操作&#xff0c;谢谢&#xff01; 一、题…

探索Linux中的cd和pwd命令:理解与应用

探索Linux中的cd和pwd命令&#xff1a;理解与应用 在Linux操作系统中&#xff0c;cd和pwd是两个非常基础但又非常重要的命令。它们分别用于改变当前工作目录和显示当前工作目录的路径。本文将深入探讨这两个命令的用法&#xff0c;并结合实例进行解释&#xff0c;帮助读者更好…

如何创建 Ansible Playbooks 来自动化 Ubuntu 系统配置

介绍 Ansible 是一个简单的配置管理系统&#xff0c;可用于自动化和组织大型计算机网络的系统配置任务。虽然其他一些配置管理系统需要在服务器和客户端系统上安装许多不同的软件包&#xff0c;但使用 Ansible 只需要安装一个服务器组件并且具有对客户端机器的 SSH 访问权限。 …

数据结构与算法学习笔记四---双向链表的表示和实现(C语言)

1.前言 这篇文章主要介绍双向链表的表示和实现。 2.双向链表 单链表中只有一个指示直接后继的指针域&#xff0c;由此&#xff0c;从某个结点出发只能顺指针向后寻查其他结点。若要寻查结点的直接前驱&#xff0c;则必须从表头指针出发。换句话说&#xff0c;在单链表中&#…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

日志:打印技巧

一、概览 Unity日志打印技巧 常规日志打印彩色日志日志存储与上传日志开关日志双击溯源 二、常规日志打印 1、打印Hello World 调用堆栈可以很好的帮助我们定位问题&#xff0c;特别是报错的Error日志 Debug.Log("Hello World");Debug.Log("This is a log m…

【java】代理

什么是代理 假设有一个核心方法叫转账&#xff0c;为了安全性考虑&#xff0c;不能让用户直接访问接口。此时涉及到了代理&#xff0c;这使得用户只能访问代理类&#xff0c;增加了访问限制。 代理的定义&#xff1a;给目标对象提供一个代理对象&#xff0c;并且由代理对象控…

egg.socket.io后端开发

1. 安装egg-socket.io npm i egg-socket.io4.1.6 --save最好指定egg-socket.io的版本号&#xff0c;比如我后端使用"egg-socket.io": "^4.1.6", 因为跟前端的socket.io-client是一一关联&#xff0c;socket.io-client用高版本或低版本&#xff0c;都不兼容…

果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)

果蔬经营平台系统 目录 基于SSM&#xff0b;vue的果蔬经营平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

Python面试50题!面试巩固必看!

题目001: 在Python中如何实现单例模式。 点评&#xff1a;单例模式是指让一个类只能创建出唯一的实例&#xff0c;这个题目在面试中出现的频率极高&#xff0c;因为它考察的不仅仅是单例模式&#xff0c;更是对Python语言到底掌握到何种程度&#xff0c;建议大家用装饰器和元类…

【卫星影像三维重建-全流程代码实现】点云Mesh重构

点云—>Mesh模型 1.介绍1.1 背景1.2 效果示意 2 算法实现2.1 依赖库2.2 实验数据2.3 代码实现2.4 实验效果 3.总结 1.介绍 1.1 背景 &#xff08;1&#xff09;本文主要内容是将三维点云&#xff08;离散的三维点&#xff09;进行表面重建生成Mesh网格&#xff0c;之前有篇…

IP跳变是什么,有什么作用?

IP跳变&#xff0c;简单来说&#xff0c;就是用户在使用网络时&#xff0c;不固定使用一个IP地址&#xff0c;而是定期或根据需求切换到另一个IP地址。这种技术为用户在网络环境中提供了一定的灵活性和安全性。 首先&#xff0c;我们来看看IP跳变的具体实现方式。当用户需要切…

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性&#xff0c;方法&#xff0c;访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

Lists.partition用法详解

文章目录 一、引入依赖二、用法三、输出 一、引入依赖 依赖于谷歌的guava 包 <!-- guava --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.1-jre</version></dependency&…

仿照el-upload 封装自己的上传控件(el-upload 移动端无法吊起相机)

input选择图片的那个选择在h5的时候在去年下半年突然无法无法出现唤醒相机的选项 不知道出现的原因 发现el-upload作为h5的时候无法吊起相机 又因为需要对服务端地址图片进行回显&#xff08;处于编辑功能的情况下 非新增 新增el-upload 可以实现回显&#xff09; 两个功…

如文所示:

影响 ConnectWise 的 ScreenConnect 远程桌面访问产品的严重漏洞已被广泛利用来传播勒索软件和其他类型的恶意软件。 ConnectWise 于 2 月 19 日通知客户&#xff0c;它已发布针对关键身份验证绕过缺陷和高严重性路径遍历问题的补丁。该安全漏洞当时没有 CVE 标识符。第二天&am…

绘唐3启动器怎么启动一键追爆款3正式版

绘唐3启动器怎么启动一键追爆款3正式版 工具入口 一.文案助手&#xff1a; 【注意&#xff01;&#xff01;】如果图片无显示&#xff0c;一般情况下被杀毒拦截&#xff0c;需关闭杀毒软件或者信任文件路径。 win10设置排除文件&#xff1a; 1.【新建工程】使用前先新建工程…

C语言循环队列

以下是一个使用 C 语言实现的简单循环队列示例&#xff1a; #include <stdio.h> #include <stdlib.h>#define MAX_SIZE 5// 定义循环队列结构体 typedef struct {int items[MAX_SIZE];int front, rear; } Queue;// 初始化队列 void initQueue(Queue *q) {q->fr…