高效流式大语言模型(StreamingLLM)——基于“注意力汇聚点”的突破性研究

论文地址:https://arxiv.org/pdf/2309.17453
github地址:https://github.com/mit-han-lab/streaming-llm

1. 研究背景与挑战

随着大语言模型(LLMs)在对话系统、文档摘要、代码补全和问答等领域的广泛应用,如何高效且准确地处理长序列生成成为亟待解决的问题。然而,现有LLMs在流式应用(如多轮对话)中面临两大主要挑战:

挑战一:解码阶段内存消耗巨大

  • 问题描述: Transformer架构的LLMs在解码阶段会缓存所有先前token的键值对(KV),导致内存消耗随序列长度呈二次增长,显著增加了解码延迟。

    • 图示说明: 如下图1(a)所示,密集注意力机制(密集注意力)需要存储所有token的KV,导致时间复杂度为 O ( T 2 ) O(T^2) O(T2),且缓存大小随文本长度增加而增加。当文本长度超过预训练长度时,性能会下降。

    图1:StreamingLLM与现有方法的对比
    图1:StreamingLLM与现有方法的对比。

挑战二:模型对长文本的泛化能力有限

  • 问题描述: 现有模型在处理超过预训练时设定的注意力窗口长度的序列时,性能会显著下降。
    • 图示说明: 如下图1(b)所示,窗口注意力机制(窗口注意力)仅缓存最近一定数量的token的KV,虽然在推理过程中效率较高,但一旦序列长度超过缓存大小,性能会急剧下降。

2. 现有方法的局限性

  • 窗口注意力:
    • 优点: 内存使用恒定,解码速度稳定。
    • 缺点: 一旦序列长度超过缓存大小,性能会崩溃。例如,移除第一个token的KV会导致模型性能大幅下降。
  • 滑动窗口重计算:
    • 优点: 在长文本上表现良好。
    • 缺点: 由于在上下文重计算中需要进行二次注意力计算,其时间复杂度为 O ( T L 2 ) O(TL^2) O(TL2),导致速度非常慢,不适用于实际流式应用。

3. 注意力汇聚点现象的发现与解释

为了解决窗口注意力的局限性,研究人员观察到一个有趣的现象:注意力汇聚点(Attention Sink)

3.1 注意力汇聚点现象
  • 现象描述: 自回归LLMs会分配大量注意力分数给初始token,无论其与语言建模任务的语义相关性如何。

    • 图示说明: 如下图2所示,在Llama-2-7B模型中,初始token在所有层和注意力头中均获得了较高的注意力分数。

    图2:Llama-2-7B模型中平均注意力logits的可视化
    图2:Llama-2-7B模型中平均注意力logits的可视化。

  • 原因分析:

    • SoftMax函数的特性: SoftMax函数要求所有上下文token的注意力分数之和为1。因此,即使当前查询在许多先前token中没有强匹配,模型仍然需要将这些不必要的注意力值分配到某些token上。
    • 初始token的全局可见性: 由于自回归语言建模的性质,初始token对所有后续token都是可见的,这使得它们更容易被训练成为注意力汇聚点,捕获不必要的注意力。
3.2 注意力汇聚点对模型性能的影响
  • 实验验证:

    • 将前四个token替换为换行符,模型仍然会显著关注这些初始换行符。
    • 重新引入这些初始token后,语言建模的困惑度(perplexity)恢复到与原始初始token相当的水平。
    • 结论: 初始token的绝对位置比其语义价值更重要。
  • 对窗口注意力的影响:

    • 移除初始token的KV会导致SoftMax函数分母发生显著变化,导致注意力分数分布偏离正常推理设置,从而导致模型性能下降。

4. StreamingLLM的提出与创新

基于上述分析,研究人员提出了StreamingLLM,一种高效的框架,使LLMs能够处理无限长度的文本,而无需任何微调。

4.1 StreamingLLM的核心思想
  • 利用注意力汇聚点: StreamingLLM利用注意力汇聚点具有高注意力值的特点,通过保留它们,可以将注意力分数分布保持在接近正常的水平。

  • 具体方法:

    • 保留注意力汇聚点token的KV: 仅保留少量初始token(例如4个)的KV作为注意力汇聚点。
    • 结合滑动窗口KV: 将注意力汇聚点token的KV与滑动窗口的KV结合起来,以锚定注意力计算并稳定模型性能。

    图4:StreamingLLM的KV缓存
    图4:StreamingLLM的KV缓存。

4.2 StreamingLLM的优势
  • 高效性:

    • 与滑动窗口重计算基线相比,StreamingLLM实现了高达 22.2 × 22.2\times 22.2×的速度提升。
  • 稳定性:

    • 如下图3所示,StreamingLLM在处理长达20K tokens的文本时,其困惑度与重计算基线几乎一致,证明了其稳定性能。

    图3:StreamingLLM在20K tokens文本上的语言建模困惑度
    图3:StreamingLLM在20K tokens文本上的语言建模困惑度。

  • 可扩展性:

    • StreamingLLM使包括Llama-2、MosaicML、MPT、Falcon和Pythia在内的模型能够可靠地建模高达400万tokens的文本,甚至更多。
4.3 预训练中加入Sink Token的改进
  • 问题: 现有模型通常使用多个初始token作为注意力汇聚点,而不是仅使用一个。

  • 解决方案:

    • 在所有训练样本的开头添加一个可学习的占位符token(Sink Token)作为专门的注意力汇聚点。
  • 实验结果:

    • 如下图7所示,添加Sink Token后,模型在所有层和注意力头中均会一致地关注Sink Token,有效收集冗余注意力。
    • 如下图6所示,添加Sink Token不会对模型收敛和后续性能产生负面影响。
    • 如下图5所示,使用Sink Token训练的模型在流式应用中的困惑度更低,仅需添加Sink Token即可实现稳定的流式性能,而无需其他初始token。

    图7:有无Sink Token的模型在平均注意力logits上的可视化
    图7:有无Sink Token的模型在平均注意力logits上的可视化。

5. 实验结果与分析

5.1 长文本语言建模
  • StreamingLLM在处理长达400万tokens的文本时,其困惑度保持稳定,证明了其在各种LLM家族和规模下的有效性。
5.2 预训练中加入Sink Token的效果
  • 预训练中加入Sink Token不会损害模型性能,并且在流式应用中表现更佳。
5.3 流式问答任务
  • StreamingLLM在模拟真实世界聊天设置的流式问答任务中表现良好,精度与单样本基线相当,而窗口注意力方法由于输入长度超过缓存大小而导致精度较低。
5.4 消融研究
  • 初始token数量: 引入四个初始token作为注意力汇聚点足以,添加更多token对性能提升有限。
  • 缓存大小: 增加缓存大小并不总是能降低语言建模困惑度,表明这些模型可能没有充分利用其接收到的上下文。
5.5 效率结果
  • StreamingLLM的解码速度随缓存大小线性增长,而滑动窗口重计算基线的解码延迟呈二次增长。StreamingLLM实现了高达 22.2 × 22.2\times 22.2×的加速,同时保持了与重计算基线相似的内存占用。

6. 结论与展望

  • 结论: StreamingLLM通过引入注意力汇聚点,使LLMs能够高效处理无限长度的文本,解决了现有方法在流式应用中的局限性。
  • 未来方向:
    • 进一步研究如何更好地利用缓存中的上下文信息。
    • 探索如何将StreamingLLM与上下文扩展技术相结合,以进一步提高模型性能。

7. 总结图示

图5:StreamingLLM在超长文本上的语言建模困惑度
图5:StreamingLLM在超长文本上的语言建模困惑度。

图10:滑动窗口重计算基线与StreamingLLM的每token解码延迟和内存使用对比
图10:滑动窗口重计算基线与StreamingLLM的每token解码延迟和内存使用对比。

8. 附加说明

  • 应用场景: StreamingLLM特别适用于流式应用,如多轮对话、实时助手等。
  • 局限性: StreamingLLM不扩展模型的上下文窗口或增强其长期记忆能力,不适用于需要长期记忆和广泛数据依赖的任务。
  • 社会影响: StreamingLLM提高了LLMs的效率,使其在教育、医疗和客户服务等领域更具可访问性,但同时也带来了生成错误信息和有偏见内容的风险,需要谨慎使用。

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

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

相关文章

STM32-时钟树

STM32-时钟树 时钟 时钟

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

使用Python和Qt6创建GUI应用程序---GUI的一个非常简短的历史

GUI的一个非常简短的历史 图形用户界面有着悠久而可敬的历史,可以追溯到20世纪60年代。斯坦福大学的NLS(在线系统)引入了鼠标和Windows概念于1968年首次公开展示。接下来是施乐PARC的Smalltalk系统GUI 1973,这是最现代的基础通用g…

如何建设一个企业级的数据湖

建设一个企业级的数据湖是一项复杂且系统化的工程,需要从需求分析、技术选型、架构设计到实施运维等多个方面进行综合规划和实施。以下是基于我搜索到的资料,详细阐述如何建设企业级数据湖的步骤和关键要点: 一、需求分析与规划 明确业务需…

xxl-job分布式定时任务

1 前言 1.1 业务场景 业务数据同步 ( 线上数据同步到线下,新平台老平台数据的同步 ) ,消息通知,业务数据的补偿。 1.2 什么是定时任务 定时任务是指基于给定的时间点,给定的时间间隔或者给定执行次数自动的执行程序。 任务调度…

FLTK - FLTK1.4.1 - demo - adjuster.exe

文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码,用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程,工程…

Cursor的简单使用

目录 一、下载与配置 1.1、下载 1.2、汉化 1.3、模型选择 1.4、规则设置 二、Chat(聊天)和Composer(编写助手) 三、快捷键 3.1、tab(代码自动补全) 3.2、CtrlL、CtrlI 3.3、系列 3.4、预防、检测、回滚 四、无限登录 …

剥离情绪的内耗

情绪的内耗,指的是我们内心对于某些情绪的过度反应、反复纠结,或者对情感的压抑所产生的心理消耗。这种内耗通常会让我们感到疲惫、焦虑、无力,甚至影响到我们的行为和决策。要真正剥离情绪的内耗,核心在于如何认识、接受并合理处…

android的gradle

资料: GitHub - ChenSWD/CopyGradleInAction: 备份《Gradle IN Action》书中的源码,添加了部分注释 //github上一个开源项目,外加pdf书 Gradle User Manual gradle官网 讲的挺好的博客 Gradle之重新认识Gradle(项目结构、命令行、tas…

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…

【C语言系列】深入理解指针(4)

深入理解指针(4) 一、回调函数是什么?二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort排序结构数据 三、qsort函数的模拟实现四、总结 一、回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 如果你把函数的…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义:交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术,包括语音、视频图像等多媒体实时通信。 特点: 实时性:音频和视频数据是实时传输和播放的,用户之间可以进行即时的交流。交互…

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内…

组件框架漏洞

一.基础概念 1.组件 定义:组件是软件开发中具有特定功能或特性的可重用部件或模块,能独立使用或集成到更大系统。 类型 前端 UI 组件:像按钮、下拉菜单、导航栏等,负责构建用户界面,提升用户交互体验。例如在电商 AP…

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …

C语言编译过程全面解析

今天是2025年1月26日,农历腊月二十七,一个距离新春佳节仅一步之遥的日子。城市的喧嚣中,年味已悄然弥漫——能在这个时候坚持上班的人,真可称为“牛人”了吧,哈哈。。。。 此刻,我在重新审视那些曾被遗忘的…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

生信软件管家——conda vs pip

pip vs conda: 安装过python包的人自然两种管理软件都用过, Pip install和Conda install在Python环境中用于安装第三方库和软件包,但它们在多个方面存在显著的区别 总的来说: pip是包管理软件,conda既是包管理软件&…

代码随想录——二叉树(二)

文章目录 前言二叉树最大深度二叉树的最小深度翻转二叉树对称二叉树完全二叉树的节点个数平衡二叉树二叉树的所有路径左叶子之和找左下角的值路径总和从中序与后序序列构造二叉树最大二叉树合并二叉树二叉搜索树中的搜索验证二叉搜索树二叉搜索树的最小绝对差二叉树中的众数二叉…

深入剖析 Adam 优化器:原理、优势与应用

在深度学习领域,优化器的选择对模型的训练效率和性能起着决定性作用。Adam优化器作为一种自适应优化算法,凭借其根据历史梯度信息动态调整学习率的特性,备受研究者和工程师的青睐。它巧妙融合了RMSProp和Momentum两种优化算法的理念&#xff…