稀疏注意力 一、稀疏注意力的特点 DeepSpeed有很多不错的功能:Training Overview and Features - DeepSpeed 其中有一个功能是注意力稀疏,我们重点展开说明 需要注意的是:稀疏注意力的实现并不仅限于DeepSpeed。虽然DeepSpeed提供了一种高效的稀疏注意力实现,但其他深度学习框架和库也可能提供稀疏注意力的支持。 二、稀疏注意力的示意图 “稀疏注意力”是一种与传统注意力机制不同的技术,它只关注序列中的部分元素以提高处理速度。 蓝色的单元格在图中代表了被计算的元素,也就是被注意力机制关注的部分,体现了这种选择性关注。 稀疏性:稀疏性是稀疏注意力机制的另一个重要特点。 在处理稀疏注意力内核时,DeepSpeed采用了块稀疏计算。 在训练阶段,可以使用稀疏注意力来优化模型。稀疏注意力通过减少注意力机制中需要计算的元素数量来提高训练效率。
此外,还从理论上证明了稀疏注意力机制保持了二次型全 Transformer 的表达能力和灵活性。 BigBird 模型中的稀疏注意力包括三个主要部分: 一组注意输入序列的所有部分的全局标记 所有标记注意一组相邻的局部标记 所有标记注意一组随机标记 BigBird 稀疏注意力模型由(注意输入序列的所有部分的 全局标记作为信息流的管道,证明了使用全局标记的稀疏注意力机制可以和全注意模型一样强大。 稀疏注意力模型的高效实现 大规模采用稀疏注意力的一个主要障碍,是稀疏操作在现代硬件中效率相当低。 相反,将稀疏的局部注意力和随机注意力转换成密集的张量运算,以充分利用现代单指令、多数据(single instruction, multiple data,SIMD)硬件。 稀疏注意力机制的高效实现示意图。
2025年2月,中国AI公司DeepSeek推出原生稀疏注意力机制(Native Sparse Attention, NSA),通过算法与硬件的协同创新,为长文本建模提供了高效解决方案。 原生可训练性 传统稀疏注意力机制多采用固定模式(如局部窗口或随机采样),而NSA通过动态路由机制,允许稀疏模式在训练过程中自适应调整。 这种设计使得模型能够根据任务需求自主优化注意力分布,避免人工预设模式的局限性。 例如,已有团队基于NSA改进低秩注意力机制(MLA),进一步压缩KV缓存至原有规模的5%。 3. 总结 DeepSeek原生稀疏注意力机制(NSA)不仅是技术层面的突破,更是AI发展理念的革新。它证明:在算力霸权横行的时代,以“大道至简”的算法设计为核心,依然能够实现性能与效率的双重飞跃。
而sparsemax是2016年提出的softmax的改进版,他可以得到稀疏的结果,即让一些值为0,它和softmax具有相似的性能,但具有选择性、更紧凑、注意力集中。 如下如所示,sparsemax相比如softmax是更硬的,在过大过小的地方对应1和0,即可以得到稀疏解。 注意力机制如下,其中 K=V=\hat{C} ,但是 Q=f(\hat{C}W^Q+b^Q) ,其中f为relu函数。 ,e_t,e_s\} 就是稀疏自注意力机制的得到的输出。前t个是item的embedding,字后一个es是目标embedding。 针对第一个问题,作者采用学习target embedding的方式,而不是直接采用会话中最后一个点击的商品 针对第二个问题,作者采用α-entmax的激活函数,主要是通过该方法产生稀疏解,从而避免给一些不感兴趣的商品加权
深入浅出:什么是 DeepSeek 稀疏注意力 (DSA)?本文旨在揭开 DeepSeek 稀疏注意力(DeepSeek Sparse Attention, DSA)机制的神秘面纱。 在大型语言模型中,一个核心机制叫做“注意力”(Attention),它帮助模型理解单词之间的关系。在传统的注意力机制中,模型为了理解一个词,必须将其与前面出现过的每一个词进行关联和计算。 而 DeepSeek 稀疏注意力(DSA)正是为了解决这个效率难题而设计的创新方案。2. 解决方案:DeepSeek 稀疏注意力 (DSA) 登场DeepSeek 稀疏注意力(DSA)是由 DeepSeek-AI 开发的一种创新的注意力机制,旨在解决长文本处理的效率问题。 DeepSeek 稀疏注意力(DSA)是一项关键的架构创新,它通过智能的两步筛选机制,有效解决了大型语言模型在处理长文档时面临的效率和成本瓶颈。
从2017年Transformer架构的提出,到如今的稀疏注意力和混合专家模型,LLM架构经历了快速的演进。 稀疏注意力机制 4.1 稀疏注意力的基本思想 稀疏注意力机制通过限制注意力计算的范围,将标准注意力的 O(L2)O(L^2) 复杂度降低到 O(L⋅K)O(L \cdot K) 或 O(LlogL)O 核心思想: 局部注意力:只关注相邻的位置 固定模式注意力:使用预定义的稀疏模式 自适应稀疏注意力:根据内容动态确定关注的位置 结构化稀疏:利用特定结构(如块、带状等)进行稀疏化 4.2 代表性稀疏注意力模型 1 1] [0 0 1 1 1 1] [0 0 0 1 1 1] 4.3 稀疏注意力的数学推导 对于局部稀疏注意力,假设每个位置只关注 KK 个相邻位置,则计算复杂度为 O(L⋅K)O(L \cdot :保持稀疏矩阵结构 模式化剪枝:按照特定模式剪枝权重 动态稀疏训练:训练过程中逐步增加稀疏度 7.2.3 2025年剪枝最新技术 PagedAttention剪枝:保留注意力重要区域,剪枝次要区域 渐进式稀疏化
deepseek-ai/DeepSeek-V3.2-Exp/blob/main/DeepSeek_V3_2.pdf这一次它最主要的是引入了一个新机制DeepSeek Sparse Attention(稀疏注意力 稀疏注意力的思路在很多新一代 Transformer 变体中都在被探索:即不是所有 token 间都做全连接的 self-attention,而是选一些关键 token 或局部连接,从而减少计算复杂度。 DeepSeek 在这个版本中尝试了一种“细粒度稀疏”的策略。具体就是用到了两个关键组件:Lightning Indexer和Top-k Token Selection。 接下来只在这些 top-k 上计算真正的注意力。经过两个组件之后,这样复杂度从 O(L^2)降低到O(LK),其中 k<<LDeepSeek-V3.2-Exp的优势是什么? (4)性能表现:尽管采用稀疏注意力,但整体能力与 V3.1-Terminus 基本持平,尤其在长上下文任务中展现出更优的性价比。
谷歌最近又推出了一个重磅的稀疏注意力模型:Big Bird。 之前各种刷榜的BERT和它的各种衍生版本RoBERTa等,都是构建在Transformer基础上。 谷歌团队解决这个问题的方法,是引入一种全新的稀疏注意力机制:Big Bird。 谷歌「大鸟」:稀疏注意力机制更省内存 Big Bird相对于传统的全注意力机制来说变的更稀疏,作为更长序列上的Transformer,Big Bird不仅能注意到更长的上下文信息,还将计算的二次依赖降低到了线性 实验:三种注意力机制结合效果最好 只采用随机注意力机制、局部注意力机制,或者两者融合起来,都没有三者合体的效果好。 有网友说,最近爆火的GPT-3也用了稀疏注意力机制,但是因为OpenAI的blocksparse太久没更新了,所以不知道二者有没有内在的相似性。
BiFormer中的查询感知稀疏注意力旨在让每个查询聚焦于top-k路由区域。然而,在计算注意力时,选定的键值对受到太多无关查询的影响,减弱了对更重要查询的注意力。 虽然在图像分类中使用稀疏自适应注意力(如DAT)取得了显著成果,但在针对语义分割任务进行微调时,由可变形点选择的键值对缺乏语义相关性。 BiFormer中的查询感知稀疏注意力旨在让每个查询聚焦于top-k路由区域。然而,在计算注意力时,选定的键值对受到太多无关查询的影响,减弱了对更重要查询的注意力。 为了提高查询的注意力效率,我们提出了可变形双级路由注意力(DBRA),这是一种用于视觉识别的注意力内注意力架构。在DBRA的过程中,第一个问题是如何定位可变形点。 因此,我们提出了一种注意力内注意力架构,该架构如上所述,向可变形点移动,作为查询的代理。
稀疏数组 当一个数组大部分为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理办法是: 1.记录数组一共有几行几列,有多少个不同的值 2.把具有不同值的元素的行列及值记录在一个小规模的数组 (稀疏数组 )中,从而缩小程序的规模 如下例:将一个二维数组转换为稀疏数组 稀疏数组第一行保存的值是二维数组有多少行和列,有多少个不同的值。 13个有意义的值,那么原来的二维数组还是 7*6=42,而转换后稀疏数组则是 14*3=42,如果原来的二维数组有14、15、16、...个等有意义的值,那么稀疏数组的大小将会超过原先二维数组的大小,这里就得不偿失了 这里就得到两个结论: 二维数组的有效值越少,转换为对应的稀疏数组就越高效 稀疏数组适用于空数据较多的情况下 在使用稀疏数组之前一定要具体问题具体分析,不能一股脑的用! 代码实现 还是以一个五子棋盘为例 为了对棋盘进行压缩,我们将原来的二维数组的方式转换为稀疏数组的方式 稀疏数组第一行存储的是原来二维数组的行和列以及有效的数据 第二行后存储的是每一个数据的位置和具体值
稀疏数组 先看一个实际的需求 五子棋程序中,有存盘退出和续上盘的功能。 ? 分析问题: 因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组。 1.1 稀疏数组介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 将i存到稀疏数组[0][0]的位置 将j存到稀疏数组[0][1]的位置 将count存到稀疏数组[0][2]的位置 将各个有效值的行列存到稀疏数组下一行,例如[1][0]=行,[1][1]=列,[1][ 1.2 转换思路 二维数组转稀疏数组的思路: 遍历原始的二维数组,得到有效数据的个数sum 根据sum就可以创建稀疏数组sparseArr int[sum+1][3] 将二维数组的有效数据数据存入到稀疏数组 稀疏数组转原始的二维数组的思路: 1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2 =int[5][6] 2.在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1)记录数组一共有几行几列,有多少个不同的值 2)把具体不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。 ? 二维数组转稀疏数组 public class SpareseArray { public static void main(String[] args) { /** d\t",data); } System.out.println(); } /** * 将二维数组转稀疏数组 创建稀疏数组,行数=sum+1 ,多出来的1行是对稀疏数组中总行数、总列数以及非0个总个数的 sparseArr[0][0] = chessArr1.length; sparseArr
,2020.2 IDEA 激活码 一、稀疏数组的定义 ---- 稀疏(sparsearray)数组:可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组。 当遇到此种情况时,可以使用稀疏数组。 ? 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 二、应用实例 ---- 我们将下图所示的棋盘使用稀疏数组进行存盘退出操作: ? 【1】将上面类似的二位数组棋盘保存到稀疏数组中,并存放至外部备份文件 sparsearray.text 中:稀疏数组可以简单的看作为是压缩,在开发中也会使用到。 【3】将稀疏数组文件中的内容恢复至传统的二维数组棋盘; /** * 将稀疏数组文件中的内容恢复至传统的二维数组棋盘 */ public class SparseArrayClass { public
稀疏注意力 im3 = ax3.imshow(sparse_mask.numpy(), cmap='Blues', vmin=0, vmax=1) ax3.set_title('稀疏注意力( (所有行都是1)滑动窗口注意力矩阵(i=4,第4行): 0 0 1 1 1 0 0 0稀疏注意力矩阵(i=4,第4行): 1 0 1 1 1 0 1 12. 稀疏注意力:同样大致为线性关系 O(n) ,但斜率比滑动窗口稍高。 稀疏注意力:让大模型记得更全稀疏注意力解决了滑动窗口短视的问题:比如分析一本 10 万字的小说,滑动窗口只能看到局部情节,稀疏注意力能看到开头的人物设定、中间的关键转折、结尾的结局;现在的 “超长上下文大模型 总结下来就是:追求快、处理中短文本,选滑动窗口;要兼顾全面性、搞定超长文本,就用稀疏注意力。
稀疏数组 一、介绍 稀疏数组可以看作是普通数组的压缩,当一个数组中大部分元素为0或同一个值时,可用稀疏数组来保存该数组。 由此可以发现,当一个数组上出现大量无用的数组时,我们可以使用一些方法将其压缩成稀疏数组进行存储,等到使用的时候再进行解压还原。 ,里面的有效值个数有三个, 那么转为稀疏数组后,将会变成一个4*3的稀疏数组。 ,如下图所示 由此可以分析出来,将二维数组转换成为稀疏数组只需要这么几步就可以成功。 遍历原数组,得到原数组中有效值的个数num 创建一个稀疏数组,大小为(num+1)*3 稀疏数组的第0行存放,原数组的行个数,列个数,以及有效值的个数 将有效值的行、列、值转换写入稀疏数组中
在矩阵中,如果数值为0的元素数目远远多于非0元素的数目,并且非0元素分布无规律时,则称该矩阵为稀疏矩阵(sparse matrix);与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。 当一个矩阵中含有大量的0值时,可以将矩阵以稀疏矩阵的方式存储以解决资源。在R中,可以用Matrix这个包, 它可以将矩阵转化为稀疏矩阵。 #转化成稀疏矩阵,可以看到0变成了点 library(Matrix) sparseM= Matrix(M) class(sparseM) sparseM ?
为此,「Google提出了一个稀疏注意力框架Exphormer,它使用扩展图来提高图Transformer的可扩展性,并在长期依赖关系表现出了强大的性能」。 具体来说,Exphormer 的稀疏注意力机制构建了一个由三种类型的边组成的交互图,如下图所示: 输入图的边(局部注意力) constant-degree扩展图的边(扩展注意力) 从每个节点到一小组虚拟节点的边 此外,由于使用constant-degree扩展图和少量恒定数量的虚拟节点来进行全局注意力,因此所得的稀疏注意力机制与原始输入图的大小呈线性关系,即它模拟了许多直接交互节点和边总数的顺序。 特别是,当 Exphormer 的稀疏注意力图通过自环(将节点连接到自身的边)进行增强时,它可以普遍逼近连续函数。 与稀疏Transformer的关系 将 Exphormer 与稀疏注意力方法进行比较是很有趣的。也许在概念上与我们的方法最相似的架构是 BigBird,它通过组合不同的组件来构建交互图。
2.问题分析 上面棋盘可用二维数组进行记录,但是二维数组的很多值是默认值0,因此记录了很多没有意义的数据->稀疏数组 3.基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理方法是: 记录数组一共有几行几列,有多少个不同的值。 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩程序的规模。 4.应用实例 (1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等) (2)把稀疏数组存盘,并且可以重新恢复原来的二维数组 public class MySparseArray { } } Console.WriteLine(sum); Console.WriteLine("3.创建稀疏数组 [i,j]; } } } Console.WriteLine("4.输出得到的稀疏数组
文章目录 一,稀疏数组 1.定义 2.存储 3.存储方式 1.普通存储 2.链式存储 a.普通链式存储 b.行式链式存储 c.十字链式存储 4.代码实现 3.将稀疏数组存到此磁盘中 4.从磁盘中读取稀疏数组 5.完整代码 一,稀疏数组 1.定义 稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是值无效数据量远大于有效数据量的数组 形如: 0 0 0 0 0 0 0 0 0 * - 由于稀疏矩阵中存在大量的“空”值,占据了大量的存储空间,而真正有用的数据却少之又少, * - 且在计算时浪费资源,所以要进行压缩存储以节省存储空间和计算方便。 我们可以使用java的IO流将稀疏数组存放到磁盘中,原数组和稀疏数组比较,肯定是稀疏数组体积更小,占用空间更小 /** * 将稀疏数组存入磁盘(文件) * */ public 在这里有个缺陷就是我不能动态的知道稀疏数组一共有几行,所以我选择传参的方式,这样其实是不太友好的 /** * 读文件获取稀疏数组(获取指定行数的稀疏数组)【不足】 * @return
稀疏数组 基本介绍 当一个数组中大部分元素为0,或者同一个值的数组时,可以使用系数数组来保存该数组。 稀疏数组的处理方法是: 记录数组一共有几行几列,有多少个不同改的值。 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 稀疏数组转换 二维数组转稀疏数组的思路: 遍历 原始的二维数组,得到有效数据的个数sum 根据sum就可以创建 系数数组sparseArr intsum+1 将二维数组的有效数据存入到稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组。 、 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。 代码示例 /** *当前类用于将普通的二维数组转换为稀疏数组进行存储 */ public class SparseArray { public static void main(String