《Long Context Compression with Activation Beacon》笔记

Activation Beacon出自智源与人大在2024年1月放在arxiv上的论文《Long Context Compression with Activation Beacon》(v1版的题目:Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon)。它引入了Beacon token将上下文信息蒸馏到其激活(activations);在压缩时将文本切分成固定大小的块(chunk),并根据压缩比 α \alpha α进一步将chunk分成更小的单元,beacon token插入在每个单元后面;LLM每次编码一个chunk,在自注意力机制执行过程中将chunk的信息蒸馏到beacon token的激活信息(activation)中,逐步地对整个长文本完成压缩过程,论文实验结果表明此方法可以有效加速推理过程并节省KV cache内存占用。

WeChatWorkScreenshot_51ab7dcb-bd63-4c27-ba89-8c01af79d511

实现思路

如论文图1所示意,对输入文本 X = [ x 1 , … , x n ] X = [x_1, \ldots, x_n] X=[x1,,xn],将其划分为相同尺寸w(如1024)的chunk:
[ x 1 , … , x n ] → Partition [ X 1 , … X ⌈ n / w ⌉ ] , X i = [ x ( i − 1 ) w + 1 , … , x i w ] = [ x 1 i , … , x w i ] [x_1, \ldots, x_n] \xrightarrow{\text{Partition}} [X_1, \ldots X_{\lceil n/w \rceil}], X_i=[x_{(i-1)w+1}, \ldots,x_{iw}] = [x^i_1, \ldots, x^i_w] [x1,,xn]Partition [X1,Xn/w],Xi=[x(i1)w+1,,xiw]=[x1i,,xwi]
对每一个chunk X i X_i Xi,使用一个压缩比 α i \alpha_i αi(w可由 α i \alpha_i αi整除),即将chunk划分到大小为 α \alpha α的更细粒度单元,一组共 k i = w / α i k_i=w/\alpha_i ki=w/αi个beacon token: B i = [ ⟨ b ⟩ 1 i , … , ⟨ b ⟩ k i i ] B_i=[\langle \mathbf{b} \rangle^i_1, \ldots, \langle \mathbf{b} \rangle^i_{k_i}] Bi=[⟨b1i,,bkii]被交替地插入到这些单元后。
X i → Interleave  B i X i ′ = [ x 1 i , … , x α i i , ⟨ b ⟩ 1 i , … , x w − α i + 1 i , … , x w i , ⟨ b ⟩ k i i ] X_i \xrightarrow{\text{Interleave} \ B_i} X^{\prime}_i = [x^i_1, \ldots, x^i_{\alpha_i}, \langle \mathbf{b} \rangle^i_1, \ldots, x^i_{w-\alpha_i +1}, \ldots, x^i_w, \langle \mathbf{b} \rangle^i_{k_i}] XiInterleave Bi Xi=[x1i,,xαii,b1i,,xwαi+1i,,xwi,bkii]
LLM逐一地编码这些chunk,在自注意力机制过程中将每个chunk的信息压缩到beacon token的激活(activations)中,在编码了 X i ′ X^{\prime}_i Xi后,将 X i X_i Xi的所有原始token(raw tokens)的激活信息给丢弃,但一直保留并累积beacon token B i B_i Bi的激活信息;在编码下一个chunk X i + 1 ′ X^{\prime}_{i+1} Xi+1时,LLM将累积的beacon激活作为原始上下文 X ≤ i X_{\le i} Xi的代理。

WeChatWorkScreenshot_6d367a38-54aa-4262-8f65-ffa19c9e7ddb

如论文图2所示,Activation Beacon与一般的LLM相比只做少许修改。对于第i个chunk X i ′ X^{\prime}_i Xi,编码过程可以写作:
LLM ⁡ ( ⟨ b ⟩ 1 i , … , ⟨ b ⟩ k i − 1 i − 1 ⏟ beacon activations accumulated from  X < i ′ , x 1 i , … , x α i i , ⟨ b ⟩ 1 i , … , x w − α i + 1 i , … , x w i , ⟨ b ⟩ k i i ⏟ the current chunk  X i ′ ) , \operatorname{LLM}(\underbrace{\langle\mathbf{b}\rangle_1^i, \ldots,\langle\mathbf{b}\rangle_{k_{i-1}}^{i-1}}_{\text {beacon activations accumulated from } X_{<i}^{\prime}}, \underbrace{x_1^i, \ldots, x_{\alpha_i}^i,\langle\mathbf{b}\rangle_1^i, \ldots, x_{w-\alpha_i+1}^i, \ldots, x_w^i,\langle\mathbf{b}\rangle_{k_i}^i}_{\text {the current chunk } X_i^{\prime}}), LLM(beacon activations accumulated from X<i b1i,,bki1i1,the current chunk Xi x1i,,xαii,b1i,,xwαi+1i,,xwi,bkii),
也就是LLM的输入是前面chunk的激活累积和当前chunk需要被编码的token的混合物。设D表示LLM的隐藏层尺寸, H ∈ R ( w + k i ) × D \boldsymbol{H} \in \mathbb{R}^{(w+k_i) \times D} HR(w+ki)×D表示LLM任意层的self attention的输入隐藏状态。我们会区分raw token和beacon token:
I r = { j ∣ x j i ≠ ⟨ b ⟩ } , I b = { j ∣ x j i = ⟨ b ⟩ } ; H r = H [ I r ] , H b = H [ I b ] . \mathbb{I}^r=\left\{j \mid x_j^i \neq\langle\mathbf{b}\rangle\right\}, \quad \mathbb{I}^b=\left\{j \mid x_j^i=\langle\mathbf{b}\rangle\right\} ; \quad \boldsymbol{H}^r=\boldsymbol{H}\left[\mathbb{I}^r\right], \quad \boldsymbol{H}^b=\boldsymbol{H}\left[\mathbb{I}^b\right] . Ir={jxji=b},Ib={jxji=b};Hr=H[Ir],Hb=H[Ib].
将隐状态变成query, key, value:
Q r = W Q r H r , K r = W K r H r , V r = W V r H r , Q b = W Q b H b , K b = W K b H b , V b = W V b H b , \begin{array}{lll} \boldsymbol{Q}^r=\boldsymbol{W}_Q^r \boldsymbol{H}^r, & \boldsymbol{K}^r=\boldsymbol{W}_K^r \boldsymbol{H}^r, & \boldsymbol{V}^r=\boldsymbol{W}_V^r \boldsymbol{H}^r, \\ \boldsymbol{Q}^b=\boldsymbol{W}_Q^b \boldsymbol{H}^b, & \boldsymbol{K}^b=\boldsymbol{W}_K^b \boldsymbol{H}^b, & \boldsymbol{V}^b=\boldsymbol{W}_V^b \boldsymbol{H}^b, \end{array} Qr=WQrHr,Qb=WQbHb,Kr=WKrHr,Kb=WKbHb,Vr=WVrHr,Vb=WVbHb,
上式中 W ∗ r \boldsymbol{W}^r_* Wr是LLM原来的投影矩阵, W ∗ b \boldsymbol{W}^b_* Wb是新引入的只处理beacon token的投影矩阵。再将raw token和beacon token的query/key/value状态来得到 Q , K , V ∈ R ( w + k i ) × D \boldsymbol{Q}, \boldsymbol{K}, \boldsymbol{V} \in \mathbb{R}^{(w+k_i) \times D} Q,K,VR(w+ki)×D
Q [ I r ] = Q r , Q [ I b ] = Q b , K [ I r ] = K r , K [ I b ] = K b , V [ I r ] = V r , V [ I b ] = V b \boldsymbol{Q}\left[\mathbb{I}^r\right]= \boldsymbol{Q}^r,\boldsymbol{Q}\left[\mathbb{I}^b\right]= \boldsymbol{Q}^b, \quad \boldsymbol{K}\left[\mathbb{I}^r\right]= \boldsymbol{K}^r,\boldsymbol{K}\left[\mathbb{I}^b\right]= \boldsymbol{K}^b, \quad \boldsymbol{V}\left[\mathbb{I}^r\right]= \boldsymbol{V}^r,\boldsymbol{V}\left[\mathbb{I}^b\right]= \boldsymbol{V}^b Q[Ir]=Qr,Q[Ib]=Qb,K[Ir]=Kr,K[Ib]=Kb,V[Ir]=Vr,V[Ib]=Vb
最后,用标准方法计算self attention:
A = softmax ( mask ( Q { K a c ; K } T D ) ) , V = A { V a c ; V } \boldsymbol{A} = \text{softmax}\left(\text{mask} \left( \frac{\boldsymbol{Q}\{\boldsymbol{K}^{ac}; \boldsymbol{K} \}^T }{\sqrt{D}} \right)\right), \quad \boldsymbol{V} = \boldsymbol{A}\{\boldsymbol{V}^{ac};\boldsymbol{V} \} A=softmax(mask(D Q{Kac;K}T)),V=A{Vac;V}
上式中的 { ⋅ ; ⋅ } \{ \cdot ; \cdot\} {;}表示矩阵连接, K a c , V a c ∈ R m i − 1 × D \boldsymbol{K}^{ac}, \boldsymbol{V}^{ac} \in \mathbb{R}^{m_{i-1} \times D} Kac,VacRmi1×D是从之前的chunk累积得到的beacon token的激活参数, m i − 1 = ∑ j = 1 i − 1 k j m_{i-1} = \sum^{i-1}_{j=1} k_j mi1=j=1i1kj, mask就是causal attention mask。在self attention过程中,所有的token与其他token进行交互,使得beacon tokens的key和value( K b , V b \boldsymbol{K}^{b}, \boldsymbol{V}^{b} Kb,Vb)蒸馏了 X i X_i Xi的上下文信息,它们会增量累积:
K a c = { K a c ; K b } , V a c = { V a c ; V b } \boldsymbol{K}^{ac} = \{\boldsymbol{K}^{ac}; \boldsymbol{K}^{b}\}, \boldsymbol{V}^{ac} = \{\boldsymbol{V}^{ac};\boldsymbol{V}^{b} \} Kac={Kac;Kb},Vac={Vac;Vb}


### 下面代码是activation beacon在实现时,interleave插入beacon token的代码,位于model_beacon.py的Memory类的_step函数input_len = input_ids.shape[1]if beacon_size > 0:# insert beacon tokens in between raw tokens,对应论文中的式(2)input_ids_with_beacons = input_ids.new_full((input_ids.shape[0], input_len + beacon_size), self.beacon_token.item())raw_token_indices = torch.arange(input_ids_with_beacons.shape[1], device=input_ids.device)interleave_start_idx = compression_ratio - self._interleave_remainderraw_token_indices = raw_token_indices[raw_token_indices % (compression_ratio + 1) != interleave_start_idx].unsqueeze(0).expand_as(input_ids)input_ids_with_beacons = input_ids_with_beacons.scatter(dim=1, index=raw_token_indices, src=input_ids)input_ids = input_ids_with_beacons# attention mask## beacon token是参与attention的,所以默认值为1attention_mask_with_beacons = attention_mask.new_full((attention_mask.shape[0], attention_mask.shape[1] + beacon_size), 1)attention_mask_with_beacons = attention_mask_with_beacons.scatter(dim=1, index=raw_token_indices, src=attention_mask)attention_mask = attention_mask_with_beacons# labelsif labels is not None:## beacon token不参与loss的计算,所以标签为-100labels_with_beacons = labels.new_full((labels.shape[0], labels.shape[1] + beacon_size), -100)labels_with_beacons = labels_with_beacons.scatter(dim=1, index=raw_token_indices, src=labels)labels = labels_with_beacons

训练过程

Activation Beacon的学习目标是在当前chunk上下文和之前压缩信息的条件下提高生成质量,损失函数如下:
min ⁡ Θ b . ∑ i = 2 ⌈ N / w ⌉ ∑ j = 1 w Pr ⁡ ( x j i ∣ ⟨ b ⟩ 1 1 , … , ⟨ b ⟩ k i − 1 i − 1 , x 1 i , … x j − 1 i ; Θ , Θ b ) . \min _{\boldsymbol{\Theta}^b} . \sum_{i=2}^{\lceil N / w\rceil} \sum_{j=1}^w \operatorname{Pr}\left(x_j^i \mid\langle\mathbf{b}\rangle_1^1, \ldots,\langle\mathbf{b}\rangle_{k_{i-1}}^{i-1}, x_1^i, \ldots x_{j-1}^i ; \mathbf{\Theta}, \boldsymbol{\Theta}^b\right) . Θbmin.i=2N/wj=1wPr(xjib11,,bki1i1,x1i,xj1i;Θ,Θb).
上式中 Θ \mathbf{\Theta} Θ是LLM的参数,在训练过程中被冻结, Θ b \mathbf{\Theta^b} Θb是每一层中beacon token对应的投影矩阵 W ∗ b \boldsymbol{W}^b_* Wb和beacon token 的embedding e ⟨ b ⟩ \mathbf{e}_{\langle b \rangle} eb(所有beacon token使用共享embedding ),训练时beacon token不参与损失计算(标签被设置为-100)因为它们仅用作压缩。

训练时第i个chunk的压缩比 α i \alpha_i αi是随机地从{2, 4, 8, 16, 32}中选取的,意在让模型灵活地支持不同的压缩粒度。而在推理时可以根据下游任务选择一个压缩比并应用到所有chunk。

训练过程分为预训练和微调,消融实验表明两个阶段对模型效果都有提升。

注意,activation beacon默认的方式是将其交替地插入在原始上下文中(代码中的interleave),论文做消融实验时尝试将beacon token全部放在chunk的最后时效果是会下降的(代码中的append)。

WeChatWorkScreenshot_de754912-a289-4c7b-b3c9-a1d1b3331676

注:Activation Beacon与MemoRAG是同一个团队出的,理解这篇思路之后,就能更好地理解MemoRAG的记忆模型了。(对比这两篇论文对应的记忆模型的代码,几乎是一样的,有点奇怪为什么memorag没有引用这篇文章,也没有对代码做说明。因为不理解memorag的记忆模型的代码,通过搜索关键字beacon搜到了这篇论文)。

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

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

相关文章

线程池 | java中的多线程

在 《Java异步编程 | CompletableFuture--实现复杂的异步控制流 》中&#xff0c;我们提到了 通过 自定义线程池 &#xff0c; 用于管理 异步任务的执行&#xff0c;避免频繁创建和销毁线程&#xff0c;提高性能。 本文将整理并介绍一些 Java 中常见的 多线程创建方式&#xf…

Javaweb之css

css的三种引入方式 1内行式 2.内嵌式 3.外部样式表 内行式和内嵌式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

SQLmap 注入-03 获得用户信息

1: Sqlmap 先进入库&#xff0c;然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …

mac 安装 python2

官网下载2.7&#xff1a; Python Release Python 2.7.18 | Python.org 查找地址&#xff1a; which python2 # /usr/local/bin/python2 设置 npm 使用 Python 2&#xff08;新建窗口&#xff09;&#xff1a; npm config set python /usr/local/bin/python2 验证 Python 版…

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统&#xff09;指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…

基于注解实现去重表消息防止重复消费

基于注解实现去重表消息防止重复消费 1. 背景/问题 在分布式系统中&#xff0c;消息队列&#xff08;如RocketMQ、Kafka&#xff09;的 消息重复消费 是常见问题&#xff0c;主要原因包括&#xff1a; 网络抖动&#xff1a;生产者或消费者因网络不稳定触发消息重发。消费者超…

Biotin sulfo-N-hydroxysuccinimide ester ;生物素磺基-N-羟基琥珀酰亚胺酯;生物素衍生物;190598-55-1

一、生物素及其衍生物的概述 生物素衍生物是指在生物素&#xff08;Vitamin H或B7&#xff09;分子基础上进行化学修饰得到的衍生化合物。这些衍生化合物在生物医学研究、临床诊断和药物开发等领域有着广泛的应用。 生物素&#xff08;Biotin&#xff09;是一种水溶性维生素&a…

Ubuntu如何安装redis服务?

环境&#xff1a; Ubuntu22.04 WSL2 问题描述&#xff1a; 如何安装redis服务&#xff1f; 解决方案&#xff1a; 1.在 Linux 上&#xff08;如 Ubuntu/Debian&#xff09;安装 1.通过包管理工具安装 Redis 服务器&#xff1a; sudo apt update sudo apt install redis…

Datawhale组队学习笔记task2——leetcode面试题

文章目录 写在前面Day5题目1.0112.路径总和解答2.0113路径总和II解答3.0101.对称二叉树解答 Day6题目1.0124.二叉树中的最大路径和解答2.0199.二叉树的右视图解答3.0226.翻转二叉树解答 Day7题目1.0105.从前序与中序遍历序列构造二叉树解答2.0098.验证二叉搜索树解答3.0110.平衡…

Slate文档编辑器-Node节点与Path路径映射

Slate文档编辑器-Node节点与Path路径映射 在之前我们聊到了slate中的Decorator装饰器实现&#xff0c;装饰器可以为我们方便地在编辑器渲染调度时处理range的渲染&#xff0c;这在实现搜索替换、代码高亮等场景非常有用。那么在这篇文章中&#xff0c;我们聊一下Node节点与Pat…

麒麟系统中删除权限不够的文件方法

在麒麟系统中删除权限不够的文件&#xff0c;可以尝试以下几种方法&#xff1a; 通过修改文件权限删除 打开终端&#xff1a;点击左下角的“终端”图标&#xff0c;或者通过搜索功能找到并打开终端 。定位文件&#xff1a;使用cd命令切换到文件所在的目录 。修改文件权限&…

Kotlin语言的正则表达式

Kotlin语言中的正则表达式 引言 正则表达式作为一种强大的文本处理工具&#xff0c;广泛应用于字符串匹配、数据验证、文本搜索等场景。在Kotlin语言中&#xff0c;正则表达式的应用同样得到了广泛关注。Kotlin不仅具备与Java相同的正则表达式功能优势&#xff0c;还提供了更…

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…

RFID系统安全认证协议及防碰撞算法研究(RFID Security)

目录 1.摘要 2.引言 3.前人研究成果 3.1 RFID系统协议模型 3.2 RFID系统安全认证协议分类 3.3 RFID安全认证协议及其研究 3.3.1 超轻量级安全认证协议及其研究 3.3.2 轻量级安全认证协议及其研究 3.3.2 中量级安全认证协议及其研究 3.3.3 重量级安全认证协议及其研究…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息

打印崩溃调用栈和局部变量信息的方法有所不同。以下是针对 Windows、Linux 和 MacOS 的示例代码。 Windows 在 Windows 上&#xff0c;可以使用 Windows API 来捕获异常并打印调用栈。 #include <windows.h> #include <DbgHelp.h> #include <stdio.h> #in…

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样&#xff0c;要求我们能够清楚地表达问题。通过这个过程&#xff0c;一方面要不断练习提高自己地表达能力&#xff0c;另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用&#xff1f; 有…

MySQL管理事务处理

目录 1、事务处理是什么 2、控制事务处理 &#xff08;1&#xff09;事务的开始和结束 &#xff08;2&#xff09;回滚事务 &#xff08;3&#xff09;使用COMMIT &#xff08;4&#xff09;使用保留点 &#xff08;5&#xff09;结合存储过程的完整事务例子 3、小结 …