当前位置: 首页 > article >正文

Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析:源代码

Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析


Transformer 结构 中,自注意力(Self-Attention)是核心机制之一。然而,标准的自注意力计算复杂度为 ( O ( n 2 ) O(n^2) O(n2) ),随着序列长度增加,计算和内存开销都会急剧增长。为了解决这一问题,Gemma 2 采用了滑动窗口注意力(Sliding Window Attention)机制,通过限制每个 token 只能关注附近的 tokens,大幅降低计算复杂度,使模型能够高效处理更长的文本序列。

本文将详细解析 Gemma 2 的 Sliding Window Attention 的实现原理、代码细节以及它带来的优化效果。


1. 为什么需要滑动窗口注意力?

1.1 标准 Transformer 的计算瓶颈

在标准 Transformer 中,自注意力计算如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax} \left(\frac{QK^T}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk QKT)V
其中:

  • ( Q , K , V Q, K, V Q,K,V ) 是 查询(Query)、键(Key)、值(Value) 矩阵,形状为 ( ( n , d k ) (n, d_k) (n,dk) )。
  • 计算复杂度为 ( O ( n 2 d k ) O(n^2 d_k) O(n2dk) ),其中 ( n n n ) 是序列长度。

问题:

  • 对于 长文本(如 8K、16K token),标准 Transformer 计算量和显存占用急剧上升
  • 由于 每个 token 计算所有 token 的注意力分数,使得 全自注意力不适用于长文本任务

1.2 Sliding Window Attention 如何优化?

滑动窗口注意力(Sliding Window Attention)核心思想:

  • 每个 token 仅关注窗口范围内的 tokens,而不是整个序列。
  • 计算复杂度降低为 ( O ( n ⋅ w ) O(n \cdot w) O(nw) ),其中 ( w w w ) 是窗口大小。
  • 适用于 长文本任务,如文档摘要、问答、代码补全等

📌 示例

  • 如果窗口大小 ( w = 512 ):
    • 第 1000 个 token 仅关注 [488, ..., 1000, ..., 1512] 范围内的 tokens。
    • 而不是像标准 Transformer 一样计算 [0, ..., 1000, ..., n] 之间的所有 token 交互。

🔹 这样,每个 token 只计算窗口内 tokens 的注意力,大幅减少计算量!

可以参考笔者的另一篇博客:Sliding Window Attention(滑动窗口注意力)解析: Pytorch实现并结合全局注意力(Global Attention )


2. Gemma 2 中的滑动窗口注意力实现

Gemma 2 的 GemmaAttention 代码中,滑动窗口注意力的实现如下:

if (self.attn_type == gemma_config.AttentionType.LOCAL_SLIDINGand self.sliding_window_size is not None
):all_ones = torch.ones_like(mask)sliding_mask = torch.triu(all_ones, -1 * self.sliding_window_size + 1) * torch.tril(all_ones, self.sliding_window_size - 1)mask = torch.where(sliding_mask == 1, mask, -2.3819763e38)

3. 代码解析

这段代码的作用是 创建滑动窗口掩码(Sliding Mask),确保每个 token 只能关注窗口范围内的 tokens

(1) 创建全 1 矩阵

all_ones = torch.ones_like(mask)
  • 生成一个与 mask 形状相同的全 1 矩阵 all_ones
  • 这个矩阵用于构建滑动窗口的掩码。

示例
假设 mask 形状为 [batch, num_heads, seq_len, seq_len],即:

all_ones = torch.tensor([[[1, 1, 1, 1, 1],  [1, 1, 1, 1, 1],  [1, 1, 1, 1, 1],  [1, 1, 1, 1, 1],  [1, 1, 1, 1, 1]]
])

(2) 生成滑动窗口掩码

sliding_mask = torch.triu(all_ones, -1 * self.sliding_window_size + 1
) * torch.tril(all_ones, self.sliding_window_size - 1)
  • torch.triu(matrix, diagonal) 创建上三角矩阵,保留对角线及以上的元素。
  • torch.tril(matrix, diagonal) 创建下三角矩阵,保留对角线及以下的元素。
  • 两者相乘,得到 滑动窗口范围内的注意力掩码
示例

假设 sliding_window_size = 2

torch.triu(all_ones, -1 * 2 + 1)

参考笔者的博客:详解 torch.triu:上三角矩阵的高效构造(中英双语)
生成:

[[1, 1, 1, 1, 1],  [1, 1, 1, 1, 1],  [0, 1, 1, 1, 1],  [0, 0, 1, 1, 1],  [0, 0, 0, 1, 1]]
torch.tril(all_ones, 2 - 1)

生成:

[[1, 1, 0, 0, 0],  [1, 1, 1, 0, 0],  [1, 1, 1, 1, 0],  [1, 1, 1, 1, 1],  [1, 1, 1, 1, 1]]

相乘后:

[[0, 1, 0, 0, 0],  [1, 1, 1, 0, 0],  [0, 1, 1, 1, 0],  [0, 0, 1, 1, 1],  [0, 0, 0, 1, 1]]
  • 1 表示保留的注意力连接(窗口内)。
  • 0 表示屏蔽的部分(窗口外)。

(3) 使用 torch.where() 让窗口外的注意力分数变成 -inf

mask = torch.where(sliding_mask == 1, mask, -2.3819763e38)
  • 如果 sliding_mask[i, j] == 1,则 mask[i, j] 保持不变
  • 如果 sliding_mask[i, j] == 0,则 mask[i, j] = -inf,确保 softmax 计算时这些位置的权重变成 0。

4. 滑动窗口注意力的优化效果

✅ 计算复杂度降低

  • 标准 Transformer:( O ( n 2 ) O(n^2) O(n2) ) 计算量,无法处理长文本。
  • Sliding Window Attention:( O ( n ⋅ w ) O(n \cdot w) O(nw) ) 计算量,适用于 8K+ 长文本。

✅ 内存占用减少

  • 标准 Transformer:完整存储 ( n × n n \times n n×n ) 注意力矩阵,显存消耗巨大。
  • Sliding Window Attention:只存储 ( n × w n \times w n×w ) 相关的注意力分数,显存占用减少 ( O ( n ) O(n) O(n) ) 级别。

✅ 局部性优化

  • 适用于长文本任务,如 摘要、代码生成、长文问答
  • 保证计算效率的同时,不影响任务表现

5. 结论

💡 Gemma 2 采用 Sliding Window Attention,使得模型能够处理更长文本,同时保持计算效率!

  • 通过 滑动窗口掩码(Sliding Mask),限制 token 只能关注局部窗口范围内的 tokens。
  • 计算复杂度降低为 ( O ( n ⋅ w ) O(n \cdot w) O(nw) ),适用于 8K-16K 长文本任务。
  • 结合 局部注意力(Local Attention),确保计算高效,适用于 文档分析、QA、代码生成等任务

🚀 Gemma 2 结合 Sliding Window Attention,是长文本 Transformer 模型优化的重要方向之一!

后记

2025年2月23日14点44分于上海,在GPT4o大模型辅助下完成。

相关文章:

Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析:源代码

Gemma 2 的滑动窗口注意力(Sliding Window Attention)解析 在 Transformer 结构 中,自注意力(Self-Attention)是核心机制之一。然而,标准的自注意力计算复杂度为 ( O ( n 2 ) O(n^2) O(n2) ),随…...

机器学习数学通关指南——链式法则

前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...

Python爬虫实战:从零到一构建数据采集系统

文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代,数据采…...

DeepSeek 助力 Vue 开发:打造丝滑的单选按钮(Radio Button)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

【行业解决方案篇十八】【DeepSeek航空航天:故障诊断专家系统 】

引言:为什么说这是“航天故障终结者”? 2025年春节刚过,航天宏图突然官宣"DeepSeek已在天权智能体上线",这个搭载在卫星和空间站上的神秘系统,号称能提前48小时预判99.97%的航天器故障。这不禁让人想起年初NASA禁用DeepSeek引发的轩然大波,更让人好奇:这套系…...

谷歌浏览器更新后导致的刷新数据无法显示

这几天突然出现的问题,就是我做了一个网站,一直用Google展示,前两天突然就是刷新会丢失数据,然后再刷新几次吧又有了,之前一直好好的,后端也做了一些配置添加了CrossOrigin注解,然而换了edge浏览…...

nvidia-docker2 和 NVIDIA Container Toolkit 的区别及推荐

NVIDIA Docker 和 NVIDIA Container Toolkit 1. NVIDIA Docker 和 NVIDIA Docker2 nvidia-docker 是 NVIDIA 最早推出的工具,用于在 Docker 容器中启用 GPU 支持。它以独立守护进程的形式作为 Volume Plugin 存在,但与 Docker 生态系统的兼容性较差&am…...

游戏设计模式阅读 - 游戏循环

游戏与普通程序最大的不同点在于: 游戏不像其他大多数软件,游戏即使在没有玩家输入时也继续运行。 如果你站在那里看着屏幕,游戏也不会冻结。动画会持续播放。视觉效果继续闪烁。 如果运气不好的话,怪物会继续暴揍你的角色。 那么…...

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式?二、 为什么要用建造者模式?三、 建造者模式怎么实现?四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方…...

github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新

1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥(如果还没有…...

Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南

文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化(Tomcat示例)3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…...

DeepSeek-R1本地化部署的硬件要求

DeepSeek-R1本地化部署的硬件要求全解析 引言 DeepSeek-R1作为一款高效的AI推理模型,凭借其卓越的推理性能和灵活的训练机制,成为了春节期间的热议话题。 然而,要在本地成功部署DeepSeek-R1,尤其是其满载的 671B 参数版本&#…...

AGI觉醒假说的科学反驳:从数学根基到现实约束的深度解析

文章目录 引言:AGI觉醒论的核心迷思一、信息论视角:意识产生的熵约束1.1 香农熵的物理极限1.2 量子退相干的时间屏障二、数学根基:形式系统的自指困境2.1 哥德尔不完备定理的现代诠释三、概念解构:AGI觉醒假说的认知陷阱3.1 术语混淆的迷雾3.2 拟人化谬误的认知根源四、意识…...

CSS—盒模型(3分钟结合示例精通盒模型)

个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–概念3–内容4–内边距5–边框6–外边距7–类型 概念 在HTML中,每一个元素都可以看作一个矩形的盒子。如图 如上图所示,一个一个的矩形都可以堪称一个元素。矩形有大有小,边有…...

蓝桥杯 3.搜索

蓝桥杯 3.搜索 文章目录 蓝桥杯 3.搜索DFS回溯DFS剪枝记忆化搜索编程66-75 DFS回溯 回溯法简介 使用**DFS(深度优先搜索)**实现, DFS是一种遍历或搜索图, 树或者图像等数据结构的算法, 当然这个图, 树未必要存储下来(隐式处理就是回溯法)搜索树一般是排列型搜索树 (总节点个数…...

JQD武学思想

无意识,无我,空,无形, 刚柔相济,时机, 战胜对手,克服内心。不预测结果,自发反击。 简单直接的攻击,去除一切冗余的东西。 李小龙其实反复在解释这些概念,常…...

供应链管理-谈判:分配式谈判、整合式谈判、原则式谈判

一、分配式谈判 序号要点解释1特点双方在一定资源或利益范围内进行分配,一方所得即另一方所失,因此也被称为“零和谈判”。2适用场景资源有限、关系不是关键因素,以及需要快速决策的情况。例如,在竞争对手之间,如拍卖…...

C语言递归——青蛙跳台阶问题和汉诺塔问题

一、青蛙跳台阶问题 •题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上n级台阶总共有多少种跳法。 •问题分析: 青蛙跳台阶问题可以分成n个子问题。假设青蛙要跳上n级台阶,那么它的最后一步有两种选择&…...

relief=tk.RAISED详细介绍 relief是指定控件的边框样式

relieftk.RAISED 是在使用 Python 的 Tkinter 库创建图形用户界面(GUI)时,用于设置控件外观样式的一个参数设置,下面为你详细解释: 整体功能概述 在 Tkinter 里,relief 参数用于指定控件的边框样式&#x…...

基于ffmpeg+openGL ES实现的视频编辑工具-添加转场(九)

在视频编辑的广阔领域中,转场效果无疑是提升视频流畅性与观赏性的关键要素。巧妙运用转场,能够让不同视频片段之间的衔接更为自然,同时赋予视频独特的创意魅力。本文将深入探讨如何借助 ffmpeg 和 openGL ES 技术,在视频编辑工具中实现丰富多样的转场效果。 一、转场技术原…...

2025.2.21 日校内模拟赛总结(AC自动机, 期望,倍增)

文章目录 时间安排题解 时间安排 将近两个半小时才过 T 1 T1 T1,后面花一个半小时过了 T 2 T2 T2,最后半个小时写不出 T 3 T3 T3 暴力没有获得分数。 反思: T 1 T1 T1 这种题要敢于去猜结论打表,由于没有直接猜结论做了很长时…...

STM32的“Unique device ID“能否修改?

STM32F1系列的"Unique device ID"寄存器的地址为0x1FFFF7E8。 这个寄存器是只读的。 "Unique device ID"寄存器位于“System memory”中。“System memory”地址范围为“0x1FFF F000- 0x1FFF F7FF”。 所有STM32 MCU上都存在系统引导加载程序。顾名思义&a…...

[内网基础] 内网基础知识 —— Windows 工作组

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Windows 工作组介绍 在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知…...

【新手初学】SQL注入之二次注入、中转注入、伪静态注入

二次注入 一、概念 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。 二、原理 防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处…...

Deepseek存算分离安全部署手册

Deepseek大火后,很多文章教大家部署Dfiy和ollamadeepseek,但是大部分都忽略了数据安全问题,本文重点介绍Deepseek存算分裂安全架设,GPU云主机只负责计算、CPU本地主机负责数据存储,确保数据不上云,保证私有…...

单页图床HTML源码+本地API接口图床系统修复版源码

源码介绍 图床系统是一种用于存储和管理图片文件的在线服务。它允许用户上传图片文件,并生成相应的图片链接,从而方便用户在网页、社交媒体或其他平台上分享图片。 PS:源码压缩包分为两个版本,一个是调用360第三方api接口,另外一…...

XML DOM4J 三、XPath

1 什么是XPath XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointe…...

IDEA使用Maven方式构建SpringBoot项目

1、环境准备 确保你已经安装了以下工具: Java JDK(推荐 JDK 8 或更高版本) IntelliJ IDEA(推荐使用最新版本) 2、创建 Spring Boot 项目 (1) 打开 IntelliJ IDEA。 (2&#xff09…...

【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)

2025年物理学与量子计算国际学术会议(ICPQC 2025)将于2025年4月18-20日在中国杭州举行。本次会议旨在汇聚全球的研究人员、学者和业界专家,共同探讨物理学与量子计算领域的最新进展与前沿挑战。随着量子技术的快速发展,其在信息处…...

EMC Isilon存储节点挂掉--Journal故障问题处理

EMC isilon 的集群存储系统经常会遇到有些节点关机后无法启动,使用串口或者接上显示器去看,会看到node节点启动到下面的位置就不正常启动了。典型的console输出如下: 老的版本,OneFS 7.0版本以前的: Checking Isilon…...