《Adaptive Layer-skipping in Pre-trained LLMs》- 论文笔记

作者:Xuan Luo, Weizhi Wang, Xifeng Yan
Department of Computer Science, UC Santa Barbara
xuan_luo@ucsb.edu, weizhiwang@ucsb.edu, xyan@cs.ucsb.edu

1. 引言与动机

1.1 背景

  • LLM 的成功与挑战:
    • 大型语言模型 (LLMs) 在翻译、代码生成、推理等任务上取得巨大成功。
    • 核心问题: 当前LLM在生成每个token时,通常需要通过所有Transformer层进行完整的前向传播。
  • 计算资源浪费:
    • 这种统一的计算分配 (Uniform Allocation) 与直觉相悖:简单的任务/token(如重复词、常见短语)理应需要更少的计算资源,而复杂的任务/token(如推理、生成新信息)需要更多。
    • 导致计算效率低下, 过拟合等。

1.2 研究问题与贡献

  • 现有方法的局限:
    • 已有的层跳过 (Layer-skipping) 或早退 (Early-Exit) 方法虽然能减少计算量,但大多忽略了一个根本问题:
      • “不同 Token 的生成,其计算需求是如何变化的?” (How do computational demands vary across the generation of different tokens?)
  • 本文动机:
    • 深入探究Token生成过程中的计算需求异质性。
    • 提出一种能在预训练LLM上实现自适应层跳过的方法,且不修改原始模型参数。
  • 主要贡献:
    • 提出 FlexiDepth: 一个动态调整Transformer层数的即插即用 (plug-in) 方法。
    • 在 Llama-3-8B 上实现显著层跳过(跳过8/32层)同时保持100%基准性能。
    • 揭示了LLM计算需求与Token类型显著相关(如重复Token vs. 计算密集型Token)。
    • 开源了 FlexiDepth 模型 和 FlexiPatterns 数据集 (记录层分配模式)。

2. 相关工作

  • 层跳过/效率提升方法分类:
    • 基于统计信息跳过层: 利用层输入输出差异等信息判断并跳过不重要层 (如 ShortGPT [26])。
    • 早退 (Early-Exit): 在中间层设置判断点,若置信度足够高则直接输出,跳过后续所有层 (如 [37, 18, 34])。
    • 从头训练动态深度模型: 在训练时就加入路由机制,动态决定每层是否执行 (如 MoD [31], SkipLayer [41], Duo-LLM [2])。缺点:需要大量计算资源重新训练。
    • Encoder中的条件计算: 如 PoWER-BERT [11], CoDA [21], COLT5 [1] 等,在Encoder中根据token重要性/复杂度分配不同计算路径。缺点:非因果性,不直接适用于Decoder-only模型。
    • 预训练模型中的跳过: MindSkip [12] 可以在预训练模型上跳过,但主要探索跳过Attention,且本文作者认为其性能或方式有别。
  • FlexiDepth 的定位:
    • 专注于Decoder-only的预训练LLM。
    • 逐层 (Layer-wise) 动态决策,而非早退。
    • 通过轻量级插件实现,冻结原始模型参数。
    • 不仅提升效率,更旨在理解和利用计算需求的变化规律。

3. FlexiDepth

3.1 整体架构

  • 核心思想: 在预训练LLM的每个(或部分,如下文所述,通常是后半部分)Transformer Decoder层,增加决策和适配机制,动态决定每个Token是完整处理还是跳过该层核心计算。

  • FlexiDepth Block (图 2):
    在这里插入图片描述

    • 输入: Hidden State (X)。
    • 两个并行路径:
      • 完整处理路径 (Full-processing Path, 图2 左):
        • Token 通过标准的 Attention 和 FFN 模块。
        • 输出 = g * Original_Layer(X) (g 为路由得分)。
      • 跳过路径 (Skipping Path, 图2 右):
        • Token 绕过 Attention 和 FFN 模块。
        • 通过一个轻量级的 Adapter 进行处理。
        • 输出 = (1-g) * Adapter(Norm(X))。
    • 核心组件 (可训练):
      • Router: 决定Token走哪条路径 (计算得分 g)。
      • Adapter: 处理走跳过路径的Token,解决表征不匹配问题。
    • 输出: 两条路径的输出加权合并。
  • 关键特性: 原始LLM的Attention和FFN参数保持冻结。只训练Router和Adapter。

3.2 Router 设计

  • 目标: 为每个输入Token x_i 计算一个门控分数 g_i ∈ (0, 1),表示其通过完整路径的倾向。

  • 输入: 经过 RMSNorm 标准化的 Hidden State z = Norm(X)。

  • Router 结构 (Eq 2):
    在这里插入图片描述

    • 为什么不用简单的线性层? (消融实验会证明) 简单的线性层不足以捕捉路由决策所需的复杂模式,尤其是在冻结主干模型时。Bottleneck结构在参数高效的同时提供了足够的表达能力。
  • 输出: Gating Score G = σ(Router(z)) (Eq 1),其中 σ 是 Sigmoid 函数。

  • 路由决策: 使用预定义阈值 τ。若 g_i > τ,走完整路径;若 g_i <= τ,走跳过路径。

3.3 Attention Skipping 与 KV Cache

  • 问题: 如果完全跳过Attention层,那么该Token对应的Key (K) 和 Value (V) 就不会被计算。对于自回归模型,后续的Token将无法Attention到这个被跳过的Token,导致上下文信息丢失,严重影响生成质量 (如图3 中间的 ‘No KV Cache’ 所示)。
    在这里插入图片描述

  • FlexiDepth 的解决方案 (图3 右侧 ‘KV Cache’):

    • 对于决定跳过Attention模块的Token (即 g_i <= τ):
      • 仍然计算其对应的 Key (K) 和 Value (V) 并存入KV Cache。
      • 跳过 Query (Q) 的计算以及后续的点积注意力计算 (Scaled Dot-Product Attention)。
  • 好处:

    • 保留了完整的上下文信息,确保后续Token可以Attention到所有历史Token。
    • 依然节省了Query计算和主要的Attention矩阵计算开销。
    • 这是维护自回归生成完整性的关键设计。

3.4 FFN Skipping 与 Adapter

  • 问题: FFN层包含非线性变换,直接跳过FFN会导致:
    • 表征不匹配 (Representation Mismatch): 经过FFN处理的Token和直接跳过的Token处于不同的表示空间。
    • 性能显著下降: (消融实验会证明) 简单跳过FFN效果很差。
  • FlexiDepth 的解决方案 (图2 右侧):
    • 引入一个轻量级 Adapter。
    • 结构: 与原始FFN类似 (MLP结构),但中间维度显著减小 (例如,论文中提到减少16倍)。
    • 功能: 对跳过FFN的Token进行变换,使其表示与经过完整FFN处理的Token对齐 (align)。
  • 好处:
    • 在计算开销很小的情况下,有效弥合了跳过FFN带来的表征差异。
    • 是保证性能的另一个关键组件。

3.5 损失函数

  • 目标: 平衡 生成质量 和 计算效率 (层跳过率)。
    在这里插入图片描述
    在这里插入图片描述

  • 总损失 (Total Loss, Eq 4):

    • L_lm: 标准的下一个Token预测损失 (Language Modeling Loss)。
    • L_skip: 层跳过损失 (Layer-skipping Loss)。
    • α: 平衡系数,控制层跳过损失的权重。
  • 层跳过损失 (L_skip, Eq 3): L_skip = (1/T) * Σ_t (Σ_l g_tl)2 (原文公式似乎有误,应该是类似惩罚“使用层数”的平方和,更可能是 (1/T) * Σ_t Σ_l (g_tl)2 或者类似含义,需确认。但核心思想是惩罚使用的层数。)

    • 惩罚每个Token使用的门控分数 (g) 的总和的平方 (或者各层g的平方和)。
    • 为什么用平方? 对使用更多层的Token施加更大的惩罚,鼓励模型跳过层;同时避免模型陷入全跳或全不跳的极端。有助于稳定训练。
  • 训练细节 (Section 3.1):

    • 只在模型的后半部分层 (如 Llama-3-8B 的后16层) 应用FlexiDepth。原因:先前研究表明跳过早期层对性能影响更大。
    • Router的Bottleneck维度 (dr = d/16),Adapter的中间层维度缩小16倍。
    • 使用 Tulu-v2 数据集训练,AdamW优化器

4. 实验设置

  • 基础模型: Llama-3-8B-Instruct (32层)。
  • 评估基准 (Benchmarks):
    • 单Token生成: MMLU, HellaSwag, Winogrande (考察知识、常识、推理)。
    • 多Token生成: GSM8K (数学推理), HumanEval (代码生成), CoQA (对话式问答)。区分这两类很重要,因为性能差异在多Token任务上更明显。
  • 评估指标 (Metrics): Accuracy (acc), Normalized Accuracy (acc_norm), Exact Match (EM), Pass@1, F1 score (根据不同任务选择)。
  • 对比基线 (Baselines):
    • Vanilla (原始 Llama-3-8B-Instruct)。
    • LayerSkip [9] (早退最后k层 + 推测解码)。
    • ShortGPT [26] (基于输入输出差异剪枝k层)。
    • LaCo [39] (层合并,减少k层)。
    • MindSkip [12] (探索Attention/FFN/Layer跳过,论文采用其Layer Skipping设置)。
  • 公平比较: 所有基线方法都应用于 Llama-3-8B,并配置为跳过相同数量 (k=4 或 k=8) 的层进行比较 (通过调整FlexiDepth的α实现近似跳过层数)。

5. 主要结果与分析

5.1 基准性能比较

在这里插入图片描述

  • 核心发现: FlexiDepth 在跳过层数(k=4, k=8)的情况下,显著优于所有基线方法,尤其是在多Token生成任务 (GSM8K, HumanEval) 上。
  • Skip 8 Layers:
    • 基线方法在 GSM8K 和 HumanEval 上性能几乎崩溃 (接近0)。
    • FlexiDepth 保持了接近100% (100.7%) 的平均性能。
  • 性能甚至略有提升?
    • 在某些任务上,FlexiDepth 性能甚至略微超过了原始模型 (Retain % > 100%)。
    • 假设: 作者推测这可能源于自适应跳过带来的隐式正则化 (implicit regularization) 效果,跳过了不信息或噪声参数。与完全微调的模型对比 (allenai/llama-3-tulu-2-8b),FlexiDepth在GSM8K/HumanEval上表现更好,说明提升不完全来自训练数据。
  • 结论: FlexiDepth 可以在大幅减少计算(跳过8层)的同时,几乎无损甚至略微提升模型在各种任务上的性能,尤其擅长处理需要复杂推理的长序列生成任务。

5.2 跨模型尺寸表现

在这里插入图片描述

  • 实验: 在不同尺寸的指令微调模型上应用FlexiDepth (Llama-2-13B, Llama-3-8B, Qwen-2.5-3B)。
  • 发现:
    • 模型越大,跳过的层数越多。
      • Llama-2-13B: 平均跳过约 6-7 层。
      • Llama-3-8B: 平均跳过约 6 层 (这里跳过层数比Table 1的8层少,可能是α取值不同)。
      • Qwen-2.5-3B: 平均只跳过 1-2 层。
  • 解释:
    • 这表明更大的模型固有地拥有更高的冗余度 (redundancy)。
    • 因此,自适应层跳过方法在更大规模的LLM上具有更大的潜力。

5.3 层分配模式

在这里插入图片描述

  • 主要发现:
    • 任务依赖性
      在这里插入图片描述

      • Summarization (总结): 平均使用更多层 (e.g., 28.65层)。需要深入理解和抽象。
      • Extractive QA (抽取式问答) / Copying (复制): 平均使用较少层 (e.g., 复制 21.95层)。依赖检索和直接输出。
      • Continuation (续写): 使用最多层 (e.g., 30.27层)。需要创造性和上下文连贯性。
    • Token 类型依赖性
      在这里插入图片描述

      • 重复/简单复制: 如重复数字列表、公式左侧的数字,使用较少层。
      • 计算/推理/高不确定性: 如数学运算的结果、总结或续写中的新信息,需要更多层。
  • 结论: LLM的计算需求确实不是均匀的,而是与任务复杂度和当前Token的功能(是复制、计算还是生成新信息)密切相关。FlexiDepth的自适应机制能够捕捉并利用这种模式。

6. 消融实验

在这里插入图片描述

  • 目的: 验证FlexiDepth中各个设计选择的必要性。基于Llama-3-8B进行。
  • 实验设置:
    • Linear Router: 将 MLP Router 替换为简单的线性层 + Sigmoid。
    • No KV Cache: 跳过Attention时,不计算和存储 K, V。
    • No Adapter: 跳过FFN时,移除Adapter。
  • 结果:
    • Linear Router: 性能显著下降 (Retain 68.7%),尤其在 GSM8K (0.657 -> 0.131)。说明复杂路由机制是必要的。
    • No KV Cache: 性能大幅下降 (Retain 84.3%)。证明为跳过Token保留KV Cache对于维护上下文至关重要。
    • No Adapter: 性能灾难性下降 (Retain 28.1%)。凸显Adapter在对齐跳过FFN的Token表征方面的关键作用。
  • 结论: FlexiDepth 中的 Router、KV Cache 保留策略、以及 FFN Adapter 都是不可或缺的设计,共同保证了模型在层跳过时的性能。

7. 局限性与未来工作

  • 主要局限性 (Limitation):
    • 理论FLOPs减少 vs. 实际吞吐量提升: 当前实现未能在现有GPU硬件上带来显著的推理速度提升。
    • 原因:
      • 控制流开销 (Control-flow overhead): 同一个batch内的样本可能走不同的计算路径 (一些Token跳过,一些不跳过),需要复杂的管理。
      • 不规则内存访问 (Irregular memory access): 不同的执行路径导致访存模式不规则,降低GPU并行效率。
  • 未来工作 (Future Work):
    • 硬件感知优化: 需要研究专门的优化技术来克服上述瓶颈,例如:
      • Token Grouping [30]: 将计算需求相似的Token分组处理。
      • Expert Sharding / Load Balancing [30, 15]: 在多GPU或专用硬件上更有效地分配计算负载。
    • 深入研究正则化效应: 探索自适应跳过是否真的能作为一种有效的正则化手段。
    • 将FlexiDepth应用于更广泛的模型和任务。

8. 结论

  • 核心贡献: 提出 FlexiDepth,一种在预训练LLM上实现动态自适应层跳过的方法,无需修改原始模型参数。
  • 关键成果:
    • 在保持SOTA性能(甚至略有超越)的同时,实现了显著的层跳过(如Llama-3-8B跳过8/32层)。
    • 显著优于现有兼容预训练模型的层跳过方法,尤其在复杂生成任务上。
  • 重要洞见:
    • 首次系统地揭示并量化了LLM中Token生成的计算需求异质性,发现其与任务类型和Token功能强相关。
    • 验证了更大模型具有更高冗余度,为自适应方法提供了更大空间。
  • 价值: 提供了一种有效的方法来提升LLM效率(潜力巨大,待硬件优化),并为理解LLM内部计算动态提供了新的视角和工具 (FlexiPatterns数据集)。

9. 代码

https://huggingface.co/xuan-luo/FlexiDepth-Llama-3-8B-Instruct/blob/main/modeling_ddllama.py

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

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

相关文章

DQN在Gym的MountainCar环境的实现

DQN on MountainCar 引言 在本次实验里&#xff0c;我构建了DQN和Dueling DQN&#xff0c;并在Gymnasium库的MountainCar环境中对它们展开测试。我通过调整训练任务的超参数&#xff0c;同时设计不同的奖励函数及其对应参数&#xff0c;致力于获取更优的训练效果。最后&#…

计算机网络综合实验指南

计算机网络综合实验指南 本实验将结合《计算机网络自顶向下》前三章的核心概念&#xff0c;通过实际操作加深对应用层、运输层和网络层的理解。实验涵盖 HTTP/TCP抓包分析、DNS解析观察、网页性能评估及简单Socket编程&#xff0c;帮助你将理论转化为实践。 实验准备 工具&…

【AI部署】腾讯云GPU-RUN—SadTalker的AI数字人视频—未来之窗超算中心

磁盘空间 创建未来之窗 查看磁盘命令 df -h 指定路径创建环境 conda create --prefix sadtalker python3.10 指令路径运行环境 conda activate ./sadtalker 安装环境 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://…

爬虫利器SpiderTools谷歌插件教程v1.0.0!!!web端JavaScript环境检测!!!

SpiderTools谷歌插件教程v1.0.0 一、SpiderTools简介二、下载通道三、插件介绍四、插件使用五、工具函数使用 补环境工具推荐&#xff1a;爬虫补环境利器webEnv 一、SpiderTools简介 SpiderTools主要用于检测和监控网页的JavaScript运行环境。该插件可以帮助开发者更好地查看…

Android开发协调布局滑动悬停

Android开发协调布局滑动悬停 直接给个xml,防止下次忘了怎么写。 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"x…

Linux学习——TCP

一.TCP编程API 1.socket函数 1.socket函数 include include int socket(int domain,int type,int protocol); 参数 domain AF_INET AF_INET6 AF_UNIX,AF_LOCAL AF_NETLINK AF_PACKET type SOCK_STREAM: 流式…

Linux驱动开发--异步通知与异步I/O

3、异步通知与异步I/O 3.1 Linux信号 阻塞与非阻塞访问、poll()函数提供了较好的解决设备访问的机制&#xff0c;但是如果有了异步通知&#xff0c;整套机制则更加完整了。 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序…

大语言模型推理能力的强化学习现状理解GRPO与近期推理模型研究的新见解

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)

文章目录 一、与文件路径相关的指令0.补充知识&#xff1a;路径的认识1.pwd 指令2.cd 指令&#xff08;含家目录的介绍&#xff09; 二、创建和删除文件的指令0.补充知识&#xff1a;普通文件和目录文件1.touch 指令&#xff08;可以修改文件的时间戳&#xff09;2.mkdir 指令3…

LangChain 单智能体模式示例【纯代码】

# LangChain 单智能体模式示例import os from typing import Anyfrom langchain.agents import AgentType, initialize_agent, Tool from langchain_openai import ChatOpenAI from langchain.tools import BaseTool from langchain_experimental.tools.python.tool import Pyt…

解决:VSCode C++ conan 安装第三方库后 头文件报错

文章目录 1 头文件include路径查找报错参考 1 头文件include路径查找报错 找到conan_toolchain.cmake中 INCLUDE_PATH list(PREPEND CMAKE_INCLUDE_PATH "/Users/hanliqiang/.conan2/p/b/fmte8c4f7a755477/p/include")生成C编译配置 CtrlShiftP 中选择C Edit Confi…

松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)

摘要 本文以CobotMagic可移动协作机器人为研究对象&#xff0c;从硬件架构设计、软件系统架构、多传感器融合定位建图系统、智能导航系统协同机制四个维度&#xff0c;深入解析机器人系统工作原理。重点研究多传感器融合定位建图系统实现原理&#xff0c;结合实测数据验证系统…

回归,git 分支开发操作命令

核心分支说明 主分支&#xff08;master/production&#xff09;存放随时可部署到生产环境的稳定代码&#xff0c;仅接受通过测试的合并请求。 开发分支&#xff08;develop&#xff09;集成所有功能开发的稳定版本&#xff0c;日常开发的基础分支&#xff0c;从该分支创建特性…

ASP.NET Core 最小 API:极简开发,高效构建(下)

在上篇文章 ASP.NET Core 最小 API&#xff1a;极简开发&#xff0c;高效构建&#xff08;上&#xff09; 中我们添加了 API 代码并且测试&#xff0c;本篇继续补充相关内容。 一、使用 MapGroup API 示例应用代码每次设置终结点时都会重复 todoitems URL 前缀。 API 通常具有…

Spring之我见 - Spring Boot Starter 自动装配原理

欢迎光临小站&#xff1a;致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置&#xff0c;其核心实现基于 自动配置&#xff08;Auto-Configuration&#xff09; 和 条件化注册&#xff08;Conditional Registration&#xff09;。以下是其生效原理&#xff1a; 约定…

精益数据分析(7/126):打破创业幻想,拥抱数据驱动

精益数据分析&#xff08;7/126&#xff09;&#xff1a;打破创业幻想&#xff0c;拥抱数据驱动 在创业的道路上&#xff0c;我们都怀揣着梦想&#xff0c;但往往容易陷入自我编织的幻想中。我希望通过和大家一起学习《精益数据分析》&#xff0c;能帮助我们更清醒地认识创业过…

牛客java练习题

[toc] 1.依赖注入 依赖注入是一种设计模式和编程思想,不依赖 具体的框架实现,可以通过多种方式和框架来实现可以通过Spring , Google Guice , PicoContainer 等都可以实现依赖注入,也可以通过手动编写实现目的: 为了解耦合,将对象之间的依赖关系从代码中解耦出来, 使系统更加…

大模型应用开发自学笔记

理论学习地址&#xff1a; https://zh.d2l.ai/chapter_linear-networks/index.html autodl学术加速&#xff1a; source /etc/network_turboconda常见操作: 删除&#xff1a; conda remove --name myenv --all -y导出&#xff1a; conda env export > environment.yml…

鸿蒙ArkUI实战之TextArea组件、RichEditor组件、RichText组件、Search组件的使用

本文接上篇继续更新ArkUI中组件的使用&#xff0c;本文介绍的组件有TextArea组件、RichEditor组件、RichText组件、Search组件&#xff0c;这几个组件的使用对应特定场景&#xff0c;使用时更加需要注意根据需求去使用 TextArea组件 官方文档&#xff1a; TextArea-文本与输…

除了`String`、`StringBuffer` 和 `StringBuilder`之外,还有什么处理字符串的方法?

一、标准库中的字符串处理类 1. StringJoiner&#xff08;Java 8&#xff09; 用途&#xff1a;用于在拼接字符串时自动添加分隔符、前缀和后缀。示例&#xff1a;StringJoiner sj new StringJoiner(", ", "[", "]"); sj.add("A").…