<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>阿伟又在打电动</title>
  
  <subtitle>Awei</subtitle>
  <link href="https://www.aweisite.top/atom.xml" rel="self"/>
  
  <link href="https://www.aweisite.top/"/>
  <updated>2026-06-11T09:25:30.534Z</updated>
  <id>https://www.aweisite.top/</id>
  
  <author>
    <name>Awei</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>数据不是软件：Anthropic 如何用 Claude 实现自助式数据分析</title>
    <link href="https://www.aweisite.top/posts/25d56cd2.html"/>
    <id>https://www.aweisite.top/posts/25d56cd2.html</id>
    <published>2026-06-11T02:02:00.000Z</published>
    <updated>2026-06-11T09:25:30.534Z</updated>
    
    <content type="html"><![CDATA[<p>最近 Anthropic 发布了一篇很值得数据团队和 Agent 团队阅读的文章：<strong>《How Anthropic enables self-service data analytics with Claude》</strong>。文章讨论的不是“Claude 会不会写 SQL”，而是一个更现实的问题：当企业希望让业务人员直接通过自然语言查询数据时，如何保证 Agent 给出的答案是准确、可治理、可追溯的。</p><p>Anthropic 在文中披露，他们内部约 <strong>95% 的业务分析查询已经由 Claude 自动化完成，整体准确率约 95%</strong>。这让数据科学团队可以从大量重复的临时分析请求中解放出来，把更多精力放在因果建模、预测、机器学习等更高价值工作上。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>这篇文章最有价值的一点，是它没有把自助式数据分析简单归结为“让大模型生成 SQL”。Anthropic 的核心判断是：<strong>分析型 Agent 的准确性，本质上是上下文、数据治理和验证问题，而不是代码生成问题。</strong>(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><h2 id="一、为什么说“数据不是软件”">一、为什么说“数据不是软件”</h2><p>Anthropic 在文章中提出了一个非常关键的判断：<strong>Data is not software，数据不是软件。</strong></p><p>这句话的含义并不是说数据系统不需要工程化，而是说，数据分析 Agent 面临的问题和 Coding Agent 不一样。</p><p>在软件开发场景中，模型可以有较大的创造空间。代码有编译器、测试、类型检查、运行报错等反馈机制。模型写错了，很多时候系统会立刻暴露问题。软件开发本身也是开放式解空间，同一个需求可能有多种实现方式。</p><p>但业务数据分析不同。很多分析问题只有一个正确答案，或者至少只有一个被组织认可的正确口径。比如“本月活跃用户数”“某产品收入”“某区域故障率”，看起来只是一个简单查询，实际背后涉及数据源、指标定义、过滤条件、时间窗口、实体粒度、去重逻辑、异常数据排除等一系列业务约定。文章指出，分析场景往往没有确定性机制可以证明最终答案一定正确。(Claude)</p><p>这就带来了一个更危险的问题： <strong>Agent 查错表、选错字段、漏掉过滤条件时，SQL 可能仍然能正常执行，结果也可能看起来很合理，但答案是错的。</strong></p><p>这类错误比代码报错更隐蔽，因为它不会以异常栈的形式出现，而是以“看起来专业的错误结论”出现。</p><p>因此，业务数据 Agent 的核心挑战不是“能不能生成 SQL”，而是：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">用户问题</span><br><span class="line">  → 正确理解业务概念</span><br><span class="line">  → 映射到唯一可信的数据实体</span><br><span class="line">  → 使用正确指标口径</span><br><span class="line">  → 处理数据新鲜度和权限边界</span><br><span class="line">  → 输出可验证、可追溯的结论</span><br></pre></td></tr></table></figure><p>如果这条链路没有治理好，大模型越强，反而越可能把错误答案包装得更可信。</p><h2 id="二、业务数据-Agent-最常见的三类错误">二、业务数据 Agent 最常见的三类错误</h2><p>Anthropic 把自助式数据分析中的主要错误归纳为三类：概念到实体的歧义、数据陈旧、检索失败。(Claude)</p><p>第一类是 <strong>概念到实体的歧义</strong>。</p><p>用户说“活跃用户”，数据系统里可能有多个字段、多个表、多个看板都能回答这个问题。但“活跃”到底是什么意思？是登录过、发起过会话、完成过关键操作，还是付费使用过？是否排除欺诈用户？时间窗口是 7 天、30 天，还是自然月？使用哪个用户 ID 去重？</p><p>如果这些定义没有被治理，Agent 只能在一堆看似合理的字段中猜测。猜对了是智能，猜错了就是事故。</p><p>第二类是 <strong>数据陈旧</strong>。</p><p>企业数据系统不是静态的。表结构会变，字段含义会变，业务定义会变，指标口径会变，数据链路也会变。如果 Agent 依赖的文档、Skill、查询样例或指标说明没有及时更新，它仍然可能返回一个“符合旧世界”的答案。</p><p>这种错误尤其危险，因为它通常不是完全离谱，而是“轻微但关键地错误”。</p><p>第三类是 <strong>检索失败</strong>。</p><p>有时候正确答案其实存在：正确的数据表存在，字段描述存在，历史分析也存在。但由于搜索空间太大，Agent 没有找到它。Anthropic 的一个重要发现是，单纯给 Agent 更多历史 SQL、更多文档、更多数据资产，并不会自然解决问题。信息“存在”不等于 Agent 能“正确使用”。</p><p>这三类错误可以概括为一句话：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">业务数据 Agent 的问题，不是缺少数据，</span><br><span class="line">而是缺少被治理、可发现、可验证的正确路径。</span><br></pre></td></tr></table></figure><h2 id="三、Anthropic-的解法：用治理缩小答案空间">三、Anthropic 的解法：用治理缩小答案空间</h2><p>Anthropic 的核心方案不是把整个数据仓库开放给 Agent，让它自己探索，而是建立一套 <strong>agentic analytics stack</strong>，也就是面向 Agent 的分析栈。这个栈的目标，是分别解决实体歧义、数据陈旧和检索失败。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第一层是 <strong>Data Foundations，数据基础设施层</strong>。</p><p>这一层包括数据模型、数据转换、测试、数据仓库表，以及描述这些资产的元数据。Anthropic 明确强调，传统数据工程实践仍然重要，比如维度建模、shift-left testing、关键链路的新鲜度检查、完整性检查等。换句话说，LLM 并不会替代数据治理，反而会放大数据治理的价值。(Claude)</p><p>在这一层，最重要的实践是建立 <strong>canonical datasets</strong>，也就是权威数据集。</p><p>很多 Agent 错误来自一个常见现象：同一个业务概念在数据仓库中有多个近似实现。比如收入有多个表，用户有多个表，订单有多个表，每个表都“差不多能用”，但口径略有不同。对人类资深分析师来说，这些差异可能是经验常识；对 Agent 来说，这就是错误来源。</p><p>Anthropic 的做法是减少候选项，建立少量经过强治理的逻辑模型。这些模型要有明确 owner、可消费、可发现，并且要主动废弃近似重复表。目标是当 Agent 搜索某个概念时，能找到一个被治理的标准答案，而不是一堆候选答案。(Claude)</p><p>这对企业数据 Agent 的启发很直接：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">不要让 Agent 在整个数据仓库里自由搜索。</span><br><span class="line">应该先构建权威语义层和权威数据视图，</span><br><span class="line">让 Agent 默认走正确路径。</span><br></pre></td></tr></table></figure><h2 id="四、治理不能只靠文档，必须靠工程机制强制执行">四、治理不能只靠文档，必须靠工程机制强制执行</h2><p>很多团队的问题不是没有指标文档，而是文档没有约束力。写在 Confluence、README 或 Wiki 里的规范，如果没有工具、CI 和流程约束，很快就会过期。</p><p>Anthropic 特别强调，数据治理必须被执行。它们通过三类机制保证治理不退化：工具层路由、CI 检查、组织规范。Agent 会被结构化地优先路由到 canonical models 和 semantic layer；绕过治理层的变更会在 review 中失败；下游团队默认基于治理层建设，除非能说明原因。(Claude)</p><p>这说明 Anthropic 并不是靠一句 prompt 告诉模型“请使用正确表”，而是把“正确路径”做成默认路径和强制路径。</p><p>文章还提到一个重要做法：把数据建模代码、语义层、参考文档、权威 dashboard 定义放在同一个 repo 里，并通过 CI 保护跨层一致性。如果某个数据模型变更会破坏下游 dashboard，或者使文档中的指标定义失效，CI 应该能发现，并要求在同一个 PR 中修复。(Claude)</p><p>这个思想非常关键：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">指标口径变更</span><br><span class="line">不能只改数据表；</span><br><span class="line">也必须同步改语义层、文档、Skill 和评测。</span><br></pre></td></tr></table></figure><p>否则就会出现一个典型问题：底层字段变了，查询还能跑，Agent 仍然按照旧文档解释，最终生成一个错误但看似合理的业务结论。</p><h2 id="五、元数据要成为一等产品">五、元数据要成为一等产品</h2><p>Anthropic 认为，Coding Agent 之所以能在代码库中表现较好，是因为代码库通常有 README、类型签名、docstring、测试、目录结构等可读信息。数据仓库也可以变得“可读”，但前提是表描述、列描述、指标定义、粒度、合法值范围、血缘关系、owner、模型分层等元数据被像数据转换逻辑一样认真维护。(Claude)</p><p>这意味着，面向 Agent 的数据治理不能只停留在“表能查”。一个合格的数据资产至少需要回答以下问题：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">这张表表示什么业务对象？</span><br><span class="line">一行数据代表什么粒度？</span><br><span class="line">哪些场景应该使用它？</span><br><span class="line">哪些场景不能使用它？</span><br><span class="line">哪些字段是主键、外键或 join key？</span><br><span class="line">有哪些默认过滤条件？</span><br><span class="line">数据多久更新一次？</span><br><span class="line">owner 是谁？</span><br><span class="line">是否是 canonical source？</span><br><span class="line">与哪些 dashboard 或指标有关？</span><br></pre></td></tr></table></figure><p>对 Agent 来说，这些元数据不是附加说明，而是准确性的基础设施。</p><h2 id="六、Source-of-Truth：不要把历史-SQL-当真理">六、Source of Truth：不要把历史 SQL 当真理</h2><p>在 Anthropic 的方案中，sources of truth 是 Agent 查询数据时参考的可信表面。它们大致按可信度排序：语义层、血缘和 transformation graph、查询语料、业务上下文。(Claude)</p><p>优先级最高的是 <strong>semantic layer，语义层</strong>。如果用户问题能映射到一个已定义指标，Agent 就应该直接调用语义层函数，得到和公司其他系统一致的结果。Anthropic 还提到，他们会通过 Skill instruction 结构性要求 Agent 优先使用语义层。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>这里有一个很重要的反直觉结论：Anthropic 曾尝试让 LLM 基于原始表和查询日志自动生成指标定义，但效果不好。因为模型生成的定义看起来合理，却可能把原本要消除的歧义固化进去。Anthropic 的建议是：Claude 可以帮助生成文档，但指标定义必须由人负责。(Claude)</p><p>换句话说：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">LLM 可以辅助治理，</span><br><span class="line">但不能替代治理责任。</span><br></pre></td></tr></table></figure><p>第二个重要参考面是 <strong>lineage 和 transformation graph</strong>。当语义层无法覆盖某个问题时，Agent 可以通过血缘关系、表引用频率、模型上下游关系判断哪个表更接近权威答案，哪些模型已经废弃，哪些表粒度一致。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第三个参考面是历史查询语料，也就是 dashboard、notebook、历史分析中的 SQL。但 Anthropic 的实验发现，直接让 Agent 检索成千上万条历史 SQL，准确率提升不到 1 个百分点。真正有效的做法，是把历史查询沉淀为结构化领域文档和可复用分析模式，再写入 Skill。(Claude)</p><p>这点对很多企业尤其重要。历史 SQL 很有价值，但它不是 source of truth。它更像原材料，需要被整理、抽象、审查和治理。</p><h2 id="七、Skill：把资深分析师的流程写下来">七、Skill：把资深分析师的流程写下来</h2><p>Anthropic 对 Skill 的定义很清晰：如果 source of truth 是声明式知识，说明“指标是什么意思”；那么 Skill 就是过程性知识，说明“应该按什么顺序查哪些来源、如何处理歧义、一个完成的分析应该长什么样”。(Claude)</p><p>这也是文章中最值得关注的数据之一：在 Anthropic 的评测中，如果没有 Skills，Claude 回答分析问题的准确率不超过 21%；加入 Skills 后，整体准确率稳定超过 95%，某些领域接近 99%。(Claude)</p><p>这说明 Skill 不是简单的提示词模板，而是业务分析流程的工程化载体。</p><p>一个好的数据分析 Skill 应该包含：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">1. 什么时候触发这个 Skill</span><br><span class="line">2. 这个领域有哪些业务概念</span><br><span class="line">3. 优先使用哪些语义层指标</span><br><span class="line">4. 语义层不覆盖时，应该查哪些参考文档</span><br><span class="line">5. 每张表的粒度、范围、排除条件和 join key</span><br><span class="line">6. 必须使用的过滤条件</span><br><span class="line">7. 常见错误模式和反例</span><br><span class="line">8. 查询前需要澄清的问题</span><br><span class="line">9. 查询后如何做 adversarial review</span><br><span class="line">10. 最终回答需要包含哪些来源、口径和新鲜度信息</span><br></pre></td></tr></table></figure><p>Anthropic 还强调，Skill 文档要面向 LLM 检索来写，而不是面向人类随便读一读。比如要明确写出表的 grain、scope、exclusion、usage、gotchas、cross references。(Claude)</p><p>更重要的是，Skill 必须持续维护。Anthropic 观察到，如果 Skill 不主动维护，离线准确率会从上线时约 95% 在一个月内漂移到约 65%。后来他们把 Skill markdown 和 transformation models 放到同一个 repo，并用 code-review hook 检查 reporting-model 变更是否同步修改 Skill 文件。之后，约 90% 的数据模型 PR 都会同时包含 Skill 变更。(Claude)</p><p>这给我们的启发是：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Skill 不是一次性 prompt。</span><br><span class="line">Skill 是数据模型的一部分，</span><br><span class="line">应该进入数据工程生命周期。</span><br></pre></td></tr></table></figure><h2 id="八、Validation：让准确性可测量、可回归、可追踪">八、Validation：让准确性可测量、可回归、可追踪</h2><p>Anthropic 的验证体系包括 offline evaluations、ablation techniques 和 online validation。(Claude)</p><p>离线评测使用 question / answer pairs。Anthropic 使用两类评测：一类是基于 dashboard 的常见问题，由 Claude 自动生成后再人工验证；另一类是 long-tail eval，也就是把业务上下文、roadmap、表文档喂给 Claude，让它生成领域内可能出现的长尾问题。同时，业务人员在对话中纠正 Agent 的内容，也会被持续收集为候选 eval。(Claude)</p><p>为了避免 ground truth 漂移，Anthropic 建议把评测绑定到 snapshot date、稳定 fact table，或者让 grader 判断查询逻辑而不是动态数字。同时，评测要接入 CI，当 PR 影响相关依赖时自动重新运行。(Claude)</p><p>他们还把评测结果当作 telemetry，而不是普通测试日志。每次运行都会记录 skill version、git SHA、model ID、每条断言的通过失败、token count、耗时等信息。这样，“某个改动是否真的提升准确率”就可以通过查询回答，而不是靠感觉判断。(Claude)</p><p>这套机制非常适合企业内部 Agent：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">每一次 Skill 修改</span><br><span class="line">每一次模型升级</span><br><span class="line">每一次工具变更</span><br><span class="line">都应该能通过 eval 数据判断是否变好。</span><br></pre></td></tr></table></figure><h2 id="九、线上准确性：不仅要答对，还要让可信度可见">九、线上准确性：不仅要答对，还要让可信度可见</h2><p>在线上系统中，Anthropic 使用了几类机制保证准确性。</p><p>第一是 <strong>adversarial review</strong>。他们会用一个 Claude Skill 激进质疑最终答案背后的假设。这个机制在 eval 中带来约 6% 的准确率提升，但代价是 token 增加 32%、延迟增加 72%。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第二是 <strong>provenance footer</strong>，也就是每个回答都带上来源层级、数据新鲜度和模型 owner。比如答案来自 semantic layer、curated reference 还是 raw table；数据更新到什么时候；所属 owner 是谁。Anthropic 也承认，这不会让答案本身更正确，但能帮助使用者判断可信度。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第三是 <strong>data quality checks</strong>。即使 Agent 使用了正确字段，如果数据本身不完整、不新鲜或异常，答案仍然会错。因此，需要检查字段是否最新、完整，是否存在异常。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第四是 <strong>passive monitoring</strong>。Anthropic 会持续跟踪两个生产信号：Agent 查询中有多少比例通过语义层解决，以及回答中出现多少纠错语言，比如“表错了”“漏掉了某个过滤条件”。这些信号会和离线准确率一起定期查看。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>第五是 <strong>active correction harvesting</strong>。Anthropic 会定时扫描 stakeholder channel 中的纠错语言，自动给相关 reference doc 起草修复，并开 PR 给 domain owner。这些纠错也会回流到离线 eval。(<a href="https://claude.com/blog/how-anthropic-enables-self-service-data-analytics-with-claude">Claude</a>)</p><p>这形成了一个闭环：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">线上出错</span><br><span class="line">  → 捕获纠错</span><br><span class="line">  → 修改 reference doc / Skill</span><br><span class="line">  → 进入 PR</span><br><span class="line">  → 触发 eval</span><br><span class="line">  → 同步到各个使用界面</span><br></pre></td></tr></table></figure><h2 id="十、仍然没有完全解决的问题：silent-failure">十、仍然没有完全解决的问题：silent failure</h2><p>Anthropic 很坦诚地承认，还有一种错误无法完全捕获：<strong>silent failure</strong>。</p><p>也就是答案是错的，但看起来合理，并且没有人提出异议。当前的缓解手段包括 provenance footer、面向领导层材料的人类确认、以及对每个领域 top KPI 每天和权威 dashboard 做 sanity check。但他们也明确表示，目前还没有鲁棒解决方案。(Claude)</p><p>这恰恰是业务数据 Agent 最现实的风险。因为业务分析的错误不一定会立刻报错，它可能进入周报、汇报、决策会议，甚至影响业务判断。</p><p>所以，企业构建数据 Agent 时，目标不应该是幻想“永远不出错”，而是建立一套机制：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">让错误更难发生；</span><br><span class="line">让错误更容易被发现；</span><br><span class="line">让答案的可信度可见；</span><br><span class="line">让纠错能回流到治理资产；</span><br><span class="line">让关键结论在进入决策前可复核。</span><br></pre></td></tr></table></figure><h2 id="十一、对企业数据-Agent-的落地启发">十一、对企业数据 Agent 的落地启发</h2><p>如果把 Anthropic 的实践抽象成一套可落地方案，可以总结为以下几点。</p><p>第一，先建立 canonical datasets，不要让 Agent 直接面对混乱的数据仓库。</p><p>第二，语义层应该成为默认入口。能通过 semantic layer 解决的问题，不应该 fallback 到手写 SQL。</p><p>第三，每个指标都需要 owner、grain、unit、freshness、required filters、valid range、lineage 等元数据。</p><p>第四，历史 SQL 只能作为治理素材，不能直接作为 source of truth。</p><p>第五，Skill 要写成过程规范，而不是提示词片段。它应该描述如何澄清问题、如何选数据源、如何执行查询、如何审查结果、如何输出来源。</p><p>第六，Skill 和数据模型要放在同一个工程生命周期中。模型变更、指标变更、字段变更，必须同步更新 Skill 和评测。</p><p>第七，评测要进入 CI。不能只在上线前测一次，而要在每次改动后持续回归。</p><p>第八，最终回答必须带 provenance。用户至少要知道答案来自哪里、数据是否新鲜、口径是什么、owner 是谁、置信等级如何。</p><p>第九，对高风险问题引入 adversarial review 和人工确认。</p><p>第十，把用户纠错变成文档、Skill 和 eval 的更新，而不是只在当前会话里修正一次。</p><h2 id="结语：数据-Agent-的关键不是“会查”，而是“查得对”">结语：数据 Agent 的关键不是“会查”，而是“查得对”</h2><p>这篇文章最大的价值，在于它把自助式数据分析从“自然语言生成 SQL”的狭窄视角中拉了出来。</p><p>真正的业务数据 Agent，不是一个 SQL 生成器，而是一个运行在数据治理体系之上的分析执行系统。它需要理解业务语义，知道哪些数据可信，知道什么时候必须澄清，知道如何验证结果，也知道如何把错误反馈回治理流程。</p><p>Anthropic 的实践说明，想让 Agent 大规模处理业务数据，不能只堆模型能力。更重要的是建设四类基础设施：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">被治理的数据入口；</span><br><span class="line">明确的人类负责的指标定义；</span><br><span class="line">持续维护的 Skill；</span><br><span class="line">可回归、可追踪、可上线监控的评测体系。</span><br></pre></td></tr></table></figure><p>一句话总结：</p><p><strong>数据 Agent 的准确性，不主要来自更强的 SQL 生成能力，而来自更好的数据治理、语义约束、流程化 Skill 和持续验证闭环。</strong></p><p>这也是“数据不是软件”这句话真正值得重视的地方。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近 Anthropic 发布了一篇很值得数据团队和 Agent 团队阅读的文章：&lt;strong&gt;《How Anthropic enables self-service data analytics with Claude》&lt;/strong&gt;。文章讨论的不是“Claude </summary>
      
    
    
    
    <category term="AI" scheme="https://www.aweisite.top/categories/AI/"/>
    
    
    <category term="Claude" scheme="https://www.aweisite.top/tags/Claude/"/>
    
    <category term="Anthropic" scheme="https://www.aweisite.top/tags/Anthropic/"/>
    
    <category term="AI" scheme="https://www.aweisite.top/tags/AI/"/>
    
    <category term="数据分析" scheme="https://www.aweisite.top/tags/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>Skill 优化与生命周期管理</title>
    <link href="https://www.aweisite.top/posts/a61e4724.html"/>
    <id>https://www.aweisite.top/posts/a61e4724.html</id>
    <published>2026-06-11T02:01:00.000Z</published>
    <updated>2026-06-11T09:25:30.540Z</updated>
    
    <content type="html"><![CDATA[<h1>Skill 优化与生命周期管理</h1><blockquote><p>基于 Anthropic 官方 skill-creator 方法论及 Skill Authoring Best Practices 整理。本文聚焦 Skill 生命周期管理框架与迭代优化实践——如何规划、评估、改进和长期维护 Skill。</p></blockquote><hr /><h2 id="1-生命周期全景"><strong>1. 生命周期全景</strong></h2><h3 id="1-1-Skill-是持续优化对象，不是一次性文档"><strong>1.1 Skill 是持续优化对象，不是一次性文档</strong></h3><p>Skill 不是写完即交付的静态说明书，而是需要持续迭代的工程产物。原始方法论强调：先出草稿、跑测试、让用户看结果、再重写 Skill，反复循环——而不是&quot;写完就上线&quot;。</p><p>把 Skill 视为需要管理的生命周期对象，核心收益是：</p><ul class="lvl-0"><li class="lvl-2"><p>每次改进有据可查、可回溯</p></li><li class="lvl-2"><p>质量和效率可量化对比</p></li><li class="lvl-2"><p>触发准确率可以独立优化</p></li></ul><h3 id="1-2-生命周期七阶段"><strong>1.2 生命周期七阶段</strong></h3><p>一个完整的 Skill 生命周期包含七个阶段：</p><ol><li class="lvl-3"><p><strong>明确目标与触发场景</strong> — 这个 Skill 要解决什么问题？用户在什么情况下需要它？</p></li><li class="lvl-3"><p><strong>写出第一版 Skill</strong> — 先写对触发（description），再写好执行（正文步骤）</p></li><li class="lvl-3"><p><strong>设计测试提示词</strong> — 准备真实用户场景的 eval prompts</p></li><li class="lvl-3"><p><strong>对照评估</strong> — 对比有无 Skill 的效果差异（质量、效率、稳定性）</p></li><li class="lvl-3"><p><strong>收集反馈与量化分析</strong> — 结合人工 review 与量化指标，定位问题</p></li><li class="lvl-3"><p><strong>多轮迭代直到收益趋稳</strong> — 根据反馈改写 Skill，每轮对照上一版基线</p></li><li class="lvl-3"><p><strong>优化触发</strong> — 单独调整 description，提高&quot;该触发时触发&quot;的准确率</p></li></ol><p>这七个阶段不是一次性的，而是循环往复的——每次迭代都可能回到前面的阶段重新审视。</p><h3 id="1-3-适用范围"><strong>1.3 适用范围</strong></h3><p>这套生命周期方法适合：</p><ul class="lvl-0"><li class="lvl-2"><p>从零创建一个新 Skill</p></li><li class="lvl-2"><p>对已有 Skill 进行改写和增强</p></li><li class="lvl-2"><p>想知道新版 Skill 是否真的优于旧版</p></li><li class="lvl-2"><p>想提升 Skill 的触发率，减少该触发时不触发的问题</p></li><li class="lvl-2"><p>希望把 Skill 开发从&quot;一次性写提示词&quot;升级为可验证、可迭代、可量化的工程流程</p></li></ul><p>不太适合：</p><ul class="lvl-0"><li class="lvl-2"><p>临时写一段一次性提示词</p></li><li class="lvl-2"><p>任务高度主观且不打算做任何回归测试</p></li></ul><hr /><h2 id="2-规划阶段：先定义，再动笔"><strong>2. 规划阶段：先定义，再动笔</strong></h2><h3 id="2-1-Capture-Intent：四个前置问题"><strong>2.1 Capture Intent：四个前置问题</strong></h3><p>开始写 Skill 之前，先确认四个问题：</p><ol><li class="lvl-3"><p>这个 Skill 到底要让 Agent 做什么</p></li><li class="lvl-3"><p>它应该在什么语境下触发</p></li><li class="lvl-3"><p>输出格式是什么</p></li><li class="lvl-3"><p>是否需要配套测试用例</p></li></ol><p>如果当前对话中已经包含完整工作流——例如用户说&quot;把刚才这个过程做成一个 skill&quot;——那就优先从已有对话中抽取信息：</p><ul class="lvl-0"><li class="lvl-2"><p>使用过哪些工具</p></li><li class="lvl-2"><p>步骤顺序是什么</p></li><li class="lvl-2"><p>用户修正过什么</p></li><li class="lvl-2"><p>输入输出长什么样</p></li><li class="lvl-2"><p>哪些要求是隐性的（用户没说但实际执行中遵循了）</p></li></ul><p><strong>最佳实践：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>不要一上来就写 <a href="http://SKILL.md">SKILL.md</a>，先提炼真实使用场景</p></li><li class="lvl-2"><p>优先从已有会话中回收信息，减少反复问用户</p></li><li class="lvl-2"><p>对于客观任务，默认建议加入测试；对于风格类任务，可默认弱化定量断言</p></li></ul><h3 id="2-2-Interview-Research：主动挖边界"><strong>2.2 Interview &amp; Research：主动挖边界</strong></h3><p>写测试提示词之前，必须把以下问题问清或查清：</p><ul class="lvl-0"><li class="lvl-2"><p>边界情况有哪些</p></li><li class="lvl-2"><p>输入/输出格式是否固定</p></li><li class="lvl-2"><p>是否存在示例文件</p></li><li class="lvl-2"><p>成功标准是什么</p></li><li class="lvl-2"><p>是否依赖某些脚本、工具、数据、文档</p></li></ul><p><strong>最佳实践：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>主动问 edge cases，不要等用户想起来</p></li><li class="lvl-2"><p>主动补研究，而不是把理解成本都压给用户</p></li><li class="lvl-2"><p>写测试提示词之前，先把任务边界收敛</p></li></ul><h3 id="2-3-规划阶段检查清单"><strong>2.3 规划阶段检查清单</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已确定 2–3 个具体使用场景</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已确定所需工具（内置或 MCP）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已确认边界情况和成功标准</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已规划文件夹结构</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已决定是否需要配套测试用例</p></li></ul><hr /><h2 id="3-评估阶段：不只盯着最终输出"><strong>3. 评估阶段：不只盯着最终输出</strong></h2><h3 id="3-1-读-transcript，不要只看最终输出"><strong>3.1 读 transcript，不要只看最终输出</strong></h3><p>原始文档反复强调：<strong>要读 transcript，不要只看 final output</strong>。</p><p>很多问题不在结果表面，而在中间路径：</p><ul class="lvl-0"><li class="lvl-2"><p>做了大量无效步骤（来回读同一个文件、重复调用工具）</p></li><li class="lvl-2"><p>忽略了 Skill 自带的脚本或 reference</p></li><li class="lvl-2"><p>过度思考、工具使用低效</p></li><li class="lvl-2"><p>被 Skill 中的冗余说明拖慢</p></li><li class="lvl-2"><p>输出看似正确，但过程不稳定、不可复现</p></li></ul><p>只看最终输出会给你虚假的安全感——结果对了不代表 Skill 写好了。</p><h3 id="3-2-评估质量与效率并重"><strong>3.2 评估质量与效率并重</strong></h3><p>评估 Skill 时，要同时关注：</p><ul class="lvl-0"><li class="lvl-2"><p><strong>质量指标：</strong> 输出是否正确、完整、符合预期格式</p></li><li class="lvl-2"><p><strong>效率指标：</strong> token 消耗、执行耗时、步骤数量</p></li><li class="lvl-2"><p><strong>稳定性指标：</strong> 多次执行的均值与标准差（mean ± stddev）</p></li></ul><p>一个有价值的提醒：一个&quot;更会做事但极慢极贵&quot;的 Skill，不一定是更好的 Skill。如果新版 Skill 质量提升 5% 但 token 消耗翻倍，需要认真权衡。</p><blockquote><p><strong>注意：</strong> 原始说明特别强调，任务完成通知里带的 <code>total_tokens</code> 与 <code>duration_ms</code> 可能是唯一能抓到这些数据的时机，一旦收到完成通知就要立刻记录，不要等所有任务结束后再回忆。</p></blockquote><h3 id="3-3-设计有效的测试用例"><strong>3.3 设计有效的测试用例</strong></h3><p>测试提示词的质量直接决定评估的有效性。</p><p><strong>先写 prompt，不急着写断言。</strong> 先准备 2–3 个真实、像用户会说的话的测试提示词。断言可以在运行过程中逐步补充。</p><p>好 eval prompt 的特征：</p><ul class="lvl-0"><li class="lvl-2"><p>具体、有上下文、有细节、接近真实输入</p></li><li class="lvl-2"><p>包含文件名、路径、业务背景、字段名</p></li><li class="lvl-2"><p>覆盖语气差异、口语、缩写、错别字</p></li><li class="lvl-2"><p>覆盖同一意图的多种表述方式</p></li></ul><p>坏例子（过于抽象，没有区分力）：</p><ul class="lvl-0"><li class="lvl-2"><p>&quot;Format this data&quot;</p></li><li class="lvl-2"><p>&quot;Create a chart&quot;</p></li></ul><p>好例子（具体，接近真实使用）：</p><ul class="lvl-0"><li class="lvl-2"><p>&quot;帮我把 <code>Q3-sales-raw.csv</code> 里的数据按地区汇总，生成一个柱状图，标题用'第三季度区域销售对比'，导出为 PNG&quot;</p></li></ul><p><strong>断言设计原则：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>客观可验证</p></li><li class="lvl-2"><p>命名清晰</p></li><li class="lvl-2"><p>不是表面通过（例如只检查&quot;有没有输出文件&quot;而不检查内容正确性）</p></li><li class="lvl-2"><p>真正区分&quot;做对了&quot;与&quot;看起来像做对了&quot;</p></li><li class="lvl-2"><p>对于高度主观的技能，不要硬塞断言，保留定性评审更合理</p></li></ul><h3 id="3-4-跨模型测试"><strong>3.4 跨模型测试</strong></h3><p>来自 Skill Authoring Best Practices 的建议：用不同模型测试同一个 Skill，每个模型暴露不同的问题维度。</p><table><thead><tr><th>模型</th><th>测试目的</th></tr></thead><tbody><tr><td><strong>Haiku</strong></td><td>检查指令是否足够详细——小模型更容易暴露指令模糊的问题</td></tr><tr><td><strong>Sonnet</strong></td><td>检查是否清晰高效——平衡执行质量</td></tr><tr><td><strong>Opus</strong></td><td>检查是否过度解释——大模型可能被冗余说明拖慢</td></tr></tbody></table><h3 id="3-5-评估阶段检查清单"><strong>3.5 评估阶段检查清单</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否读过 transcript，而不只是 final output</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否定位了浪费步骤或低效操作</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否对比了质量、效率和稳定性指标</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 测试 prompt 是否像真实用户输入</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 断言是否真正可验证、具有区分力</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否在多个模型上验证过（至少 Haiku + Sonnet）</p></li></ul><hr /><h2 id="4-迭代优化：如何真正改好一个-Skill"><strong>4. 迭代优化：如何真正改好一个 Skill</strong></h2><h3 id="4-1-从反馈中提炼共性，而不是打局部补丁"><strong>4.1 从反馈中提炼共性，而不是打局部补丁</strong></h3><p>每次评估后，面对失败或低效案例，不要只为当前样例做超窄修补。问自己：</p><ul class="lvl-0"><li class="lvl-2"><p>这次失败背后的<strong>共性</strong>是什么</p></li><li class="lvl-2"><p>是触发不清、步骤不清，还是缺脚本</p></li><li class="lvl-2"><p>能否用更通用的方法处理未来相似任务</p></li></ul><p>反馈处理优先级：</p><ul class="lvl-0"><li class="lvl-2"><p>有具体负面反馈的样例优先处理</p></li><li class="lvl-2"><p>空反馈通常表示&quot;没问题&quot;，不需要强制改进</p></li><li class="lvl-2"><p>将反馈抽象成&quot;可泛化的改进项&quot;，而不是逐条打补丁</p></li></ul><h3 id="4-2-保持-Prompt-精瘦"><strong>4.2 保持 Prompt 精瘦</strong></h3><p>如果 transcript 显示模型做了很多没价值的动作，往往说明 Skill 本身在&quot;诱导浪费&quot;——冗余的说明、过多的选项、不必要的验证步骤都会拖慢执行。</p><p>这时应该<strong>删除</strong>不必要说明，而不是继续追加更多规则。一个常见的反模式是：发现模型在某处出错，就加一段长说明；再发现另一个问题，再加一段——最终 Skill 越来越臃肿，触发和执行的效率都下降。</p><h3 id="4-3-用示例约束，用因果替代-MUST"><strong>4.3 用示例约束，用因果替代 MUST</strong></h3><p>来自 Skill Authoring Best Practices 的关键洞察：<strong>如果你发现自己不断加粗写 <code>ALWAYS</code>、<code>NEVER</code>，那很可能意味着你过拟合到几个测试样例上了。</strong></p><p>更好的方式是说明每步的意图和后果：</p><ul class="lvl-0"><li class="lvl-2"><p>为什么这一步重要</p></li><li class="lvl-2"><p>错过会造成什么后果</p></li><li class="lvl-2"><p>在什么场景下它最关键</p></li></ul><p>模型能理解意图与因果，不只是机械照做。解释&quot;为什么要这样做&quot;通常比增加更多刚性条款更有效。</p><p>对于格式要求、命名规则、报告结构，<strong>给示例比纯抽象规则更稳定</strong>。尤其适合的场景：</p><ul class="lvl-0"><li class="lvl-2"><p>commit message 格式</p></li><li class="lvl-2"><p>报告结构模板</p></li><li class="lvl-2"><p>文件命名规则</p></li><li class="lvl-2"><p>表格格式</p></li><li class="lvl-2"><p>输出 JSON / Markdown 模板</p></li></ul><h3 id="4-4-何时脚本化"><strong>4.4 何时脚本化</strong></h3><p>如果多个测试用例里，模型都在重复写类似的辅助代码（如 <code>create_docx.py</code>、<code>build_chart.py</code>），说明这些动作应该内置到 <code>scripts/</code> 里。</p><p>脚本化沉淀的三层收益：</p><ol><li class="lvl-3"><p><strong>减少重复劳动</strong> — 模型不再每次都临场写同样的代码</p></li><li class="lvl-3"><p><strong>提高稳定性</strong> — 确定性脚本 &gt; 每次生成的代码</p></li><li class="lvl-3"><p><strong>降低 token 与执行波动</strong> — 脚本调用是固定开销，模型生成的代码开销不可预测</p></li></ol><p>判断标准：如果一个操作在 3 个以上测试用例中被模型重复实现，就应该脚本化。</p><h3 id="4-5-迭代阶段检查清单"><strong>4.5 迭代阶段检查清单</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否读过 transcript，而不只是 final output</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否定位了浪费步骤</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否从反馈中提炼了可泛化问题（而非打局部补丁）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否减少了冗余 prompt（而非追加更多规则）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否把重复工作脚本化</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否进行了新一轮对照评估</p></li></ul><hr /><h2 id="5-避免过拟合：通用性优先"><strong>5. 避免过拟合：通用性优先</strong></h2><p>Skill 写作阶段很容易被几个测试样例&quot;绑架&quot;。如果 Skill 只对当前反复测试的几个案例有效，那它几乎没有价值。</p><p><strong>原则：</strong></p><ul class="lvl-0"><li class="lvl-2"><p>不要为了通过某一条 eval 加入过窄规则</p></li><li class="lvl-2"><p>观察失败背后的共性，而不是给单一问题打补丁</p></li><li class="lvl-2"><p>优先抽象成可迁移的原则、脚本或模式</p></li></ul><p><strong>信号识别：</strong> 当你发现自己在 Skill 里写了针对特定文件名、特定字段名或特定数值的条件分支时，停下来问：这条规则是因为这个具体案例，还是因为一类问题？</p><hr /><h2 id="6-Description-触发优化"><strong>6. Description 触发优化</strong></h2><h3 id="6-1-Description-是一级触发器"><strong>6.1 Description 是一级触发器</strong></h3><p>在 Skill 体系中，<code>SKILL.md</code> frontmatter 里的 <code>description</code> 不是普通简介，而是 Skill 触发的主要依据。它必须同时写清两类信息：</p><ul class="lvl-0"><li class="lvl-2"><p>这个 Skill <strong>做什么</strong></p></li><li class="lvl-2"><p><strong>什么时候该调用它</strong></p></li></ul><p>当前模型存在 <strong>undertrigger</strong> 倾向——即使 description 写清楚了，模型也可能不触发 Skill。因此 description 要写得更主动、更明确，不能过于保守。</p><h3 id="6-2-好-description-的特征"><strong>6.2 好 description 的特征</strong></h3><p>推荐公式：<code>[做什么] + [什么时候触发] + [关键能力]</code></p><p>以官方示例说明：</p><p><strong>模糊（反例）：</strong></p><blockquote><p>帮助项目。</p></blockquote><p><strong>只描述功能但不写触发（反例）：</strong></p><blockquote><p>创建复杂的多页文档系统。</p></blockquote><p><strong>正确（正例）：</strong></p><blockquote><p>分析 Figma 设计文件并生成开发者交接文档。当用户上传 .fig 文件、要求&quot;设计规范&quot;、&quot;组件文档&quot;或&quot;设计到代码交接&quot;时使用。</p></blockquote><blockquote><p>管理 Linear 项目工作流，包括冲刺规划、任务创建和状态跟踪。当用户提到&quot;sprint&quot;、&quot;Linear 任务&quot;、&quot;项目规划&quot;或要求&quot;创建 tickets&quot;时使用。</p></blockquote><blockquote><p>PayFlow 端到端客户入职工作流。处理账户创建、支付设置和订阅管理。当用户说&quot;入职新客户&quot;、&quot;设置订阅&quot;或&quot;创建 PayFlow 账户&quot;时使用。</p></blockquote><p>三个正例的共同特点：</p><ul class="lvl-0"><li class="lvl-2"><p>具体提到产品名和文件类型</p></li><li class="lvl-2"><p>包含用户会说的真实短语（不是技术术语堆砌）</p></li><li class="lvl-2"><p>明确说明使用场景边界</p></li><li class="lvl-2"><p>覆盖不同表述风格（正式、口语、缩写）</p></li></ul><h3 id="6-3-理解触发机制"><strong>6.3 理解触发机制</strong></h3><p>Skill 并不是对所有匹配 description 的请求都会触发。对于很简单的一步任务，模型可能直接完成，而不去 consult skill。</p><p>因此触发评测的 query 不应过于简单。真正能有效检验 description 的，是那种稍复杂、多步骤、专业性强、使用 Skill 明显更有收益的请求。</p><h3 id="6-4-触发优化检查清单"><strong>6.4 触发优化检查清单</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> description 是否同时说明&quot;做什么&quot;和&quot;何时触发&quot;</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否包含用户会说的真实短语（而非仅术语）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否覆盖同一意图的多种表述（正式、口语、带错别字）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 是否兼顾正例（should-trigger）和反例（should-not-trigger）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 反例是否有区分力（最差的反例是完全无关的句子，没有测试价值）</p></li></ul><hr /><h2 id="7-常见误区"><strong>7. 常见误区</strong></h2><h3 id="误区-1：只看最终输出，不看-transcript"><strong>误区 1：只看最终输出，不看 transcript</strong></h3><p>后果：很多低效、脆弱、不可复现的问题会被掩盖。结果看起来正确，但过程充满了浪费和隐患。</p><h3 id="误区-2：为少量例子过拟合"><strong>误区 2：为少量例子过拟合</strong></h3><p>后果：当前几个样例看起来更顺，但泛化能力更差。Skill 变成了针对测试集的&quot;作弊纸&quot;。</p><h3 id="误区-3：把-description-写得太保守"><strong>误区 3：把 description 写得太保守</strong></h3><p>后果：Skill 明明该触发，却始终没有被 consult。当前模型倾向 undertrigger，description 应适度主动。</p><h3 id="误区-4：把重复劳动留给模型临场发挥"><strong>误区 4：把重复劳动留给模型临场发挥</strong></h3><p>后果：每次都重新造轮子，成本高且不稳定。重复出现 3 次以上的操作就应沉淀到 <code>scripts/</code>。</p><h3 id="误区-5：指令模糊，期待模型自行补全"><strong>误区 5：指令模糊，期待模型自行补全</strong></h3><p>后果：输出不稳定、不可预期。用具体示例和校验条件替代模糊描述。</p><h3 id="误区-6：断言只验证表面特征"><strong>误区 6：断言只验证表面特征</strong></h3><p>后果：例如只检查&quot;有没有输出文件&quot;，却不检查内容正确性。这会制造虚假的高通过率，掩盖真正的质量问题。</p><h3 id="误区-7：不断追加规则而非删减"><strong>误区 7：不断追加规则而非删减</strong></h3><p>后果：发现一个问题加一段说明，Skill 越来越臃肿，触发和执行的效率都持续下降。有时删减比追加更有效。</p><hr /><h2 id="8-最小生命周期流程（可复用模板）"><strong>8. 最小生命周期流程（可复用模板）</strong></h2><p>以下是一个 Skill 从零创建到迭代收敛的最小化标准流程：</p><ol><li class="lvl-3"><p><strong>明确目标与触发场景</strong> — 用 2–3 个具体用例描述清楚</p></li><li class="lvl-3"><p><strong>写一版 <a href="http://SKILL.md">SKILL.md</a></strong> — 先写好 description（触发），再写好正文（执行）</p></li><li class="lvl-3"><p><strong>准备 2–3 条真实 eval prompts</strong> — 像用户会说的话，含具体文件和业务背景</p></li><li class="lvl-3"><p><strong>对照评估</strong> — 对比有无 Skill 的效果差异</p></li><li class="lvl-3"><p><strong>写断言并评分</strong> — 质量、效率、稳定性三个维度</p></li><li class="lvl-3"><p><strong>聚合结果</strong> — 汇总 pass rate、token 消耗、耗时</p></li><li class="lvl-3"><p><strong>收集反馈</strong> — 邀请用户或同行 review</p></li><li class="lvl-3"><p><strong>根据反馈改 Skill</strong> — 提炼共性而非打局部补丁</p></li><li class="lvl-3"><p><strong>重复 4–8</strong> — 直到收益趋稳（增量改进不再显著）</p></li><li class="lvl-4"><p><strong>单独优化 description</strong> — 提高触发准确率（可准备 ~20 条 trigger eval queries 专项测试）</p></li></ol><hr /><h2 id="9-延伸参考"><strong>9. 延伸参考</strong></h2><p>本文内容主要来源于以下 Anthropic 官方资源：</p><ul class="lvl-0"><li class="lvl-2"><p><strong>skill-creator</strong>（<code>anthropics/skills</code> 仓库中的元 SKILL）— 定义了完整的 Skill 研发方法论、评测流程与迭代框架</p></li><li class="lvl-2"><p><strong>Skill Authoring Best Practices</strong> — Anthropic 官方的 Skill 写作最佳实践文档，涵盖自由度设定、反模式识别、跨模型测试等</p></li><li class="lvl-2"><p><strong>The Complete Guide to Building Skills for Claude</strong> — Anthropic 官方的 Skill 构建完整指南，涵盖结构规范、YAML 规范、分发与故障排查</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;Skill 优化与生命周期管理&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;基于 Anthropic 官方 skill-creator 方法论及 Skill Authoring Best Practices 整理。本文聚焦 Skill 生命周期管理框架与迭代优化实践——如何</summary>
      
    
    
    
    <category term="AI" scheme="https://www.aweisite.top/categories/AI/"/>
    
    
    <category term="Claude" scheme="https://www.aweisite.top/tags/Claude/"/>
    
    <category term="Skill" scheme="https://www.aweisite.top/tags/Skill/"/>
    
    <category term="Anthropic" scheme="https://www.aweisite.top/tags/Anthropic/"/>
    
    <category term="AI" scheme="https://www.aweisite.top/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>Skill 构建完整最佳实践</title>
    <link href="https://www.aweisite.top/posts/f439a132.html"/>
    <id>https://www.aweisite.top/posts/f439a132.html</id>
    <published>2026-06-11T02:00:00.000Z</published>
    <updated>2026-06-11T09:25:30.538Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>基于《The Complete Guide to Building Skills for Claude》及 Skill Authoring Best Practices 整理。本文面向<strong>手动编写 Skill</strong> 的开发者——你直接写 <a href="http://SKILL.md">SKILL.md</a>、手动测试、手动迭代，涵盖 YAML frontmatter、正文写作、目录结构、分发共享等完整知识。</p></blockquote><hr /><h2 id="1-一句话理解-Skill"><strong>1. 一句话理解 Skill</strong></h2><p>Skill 是一组以文件夹形式打包的指令、流程与附加资源，用来教 Agent 在特定任务上稳定地采取正确步骤、调用正确工具、输出符合预期结果。</p><ul class="lvl-0"><li class="lvl-2"><p>适合可重复、可标准化的任务</p></li><li class="lvl-2"><p>不是一次性 prompt，而是可复用工作方式</p></li><li class="lvl-2"><p>可独立使用，也可与 MCP 配合</p></li></ul><hr /><h2 id="2-标准结构"><strong>2. 标准结构</strong></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">your-skill-name/</span><br><span class="line">├── SKILL.md</span><br><span class="line">├── scripts/</span><br><span class="line">├── references/</span><br><span class="line">└── assets/</span><br></pre></td></tr></table></figure><p>关键规则：</p><ul class="lvl-0"><li class="lvl-2"><p><code>SKILL.md</code> 文件名必须完全一致</p></li><li class="lvl-2"><p>文件夹名使用 kebab-case</p></li><li class="lvl-2"><p>skill 文件夹内部不要放 <code>README.md</code></p></li></ul><p><strong>分层装载（Progressive Disclosure）：</strong></p><ol><li class="lvl-3"><p><strong>YAML frontmatter（name + description）</strong> — 总是进入上下文，负责触发判断</p></li><li class="lvl-3"><p><strong><a href="http://SKILL.md">SKILL.md</a> 正文</strong> — Skill 触发后加载，负责主流程</p></li><li class="lvl-3"><p><strong>references/scripts/assets</strong> — 按需读取，负责细节支撑</p></li></ol><p><a href="http://SKILL.md">SKILL.md</a> 保持精炼（理想 &lt; 500 行），超长说明拆到 <code>references/</code>，并在正文中明确告诉模型何时读取哪个 reference。</p><hr /><h2 id="3-三个核心原则"><strong>3. 三个核心原则</strong></h2><h3 id="3-1-渐进式披露"><strong>3.1 渐进式披露</strong></h3><p>同上，三层模型。</p><h3 id="3-2-可组合性"><strong>3.2 可组合性</strong></h3><p>你的 skill 应能与其他 skills 共存，不应假设自己是唯一能力来源。</p><h3 id="3-3-可移植性"><strong>3.3 可移植性</strong></h3><p>尽量让 skill 可跨 <a href="http://Claude.ai">Claude.ai</a>、Claude Code、API 复用；环境要求写进 <code>compatibility</code>。</p><hr /><h2 id="4-MCP-与-Skill"><strong>4. MCP 与 Skill</strong></h2><ul class="lvl-0"><li class="lvl-2"><p>MCP：提供连接与工具访问</p></li><li class="lvl-2"><p>Skill：提供工作流与最佳实践</p></li><li class="lvl-2"><p>MCP 解决&quot;能做什么&quot;</p></li><li class="lvl-2"><p>Skill 解决&quot;应该怎么做&quot;</p></li></ul><hr /><h2 id="5-规划方法"><strong>5. 规划方法</strong></h2><p>从用例出发，不要一上来就写 <a href="http://SKILL.md">SKILL.md</a>。先定义 2–3 个具体用例，每个用例写清：</p><ul class="lvl-0"><li class="lvl-2"><p>目标结果</p></li><li class="lvl-2"><p>触发方式</p></li><li class="lvl-2"><p>执行步骤</p></li><li class="lvl-2"><p>所需工具</p></li><li class="lvl-2"><p>嵌入的领域知识</p></li></ul><p>常见三类：文档与资产生成、工作流自动化、MCP 增强。</p><hr /><h2 id="6-成功标准"><strong>6. 成功标准</strong></h2><h3 id="定量"><strong>定量</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>触发准确率</p></li><li class="lvl-2"><p>工具调用数 / token 消耗</p></li><li class="lvl-2"><p>API 失败率</p></li></ul><h3 id="定性"><strong>定性</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>用户无需频繁提示下一步</p></li><li class="lvl-2"><p>多次执行结果一致</p></li><li class="lvl-2"><p>新用户低指导即可完成</p></li></ul><hr /><h2 id="7-YAML-frontmatter-最小模板"><strong>7. YAML frontmatter 最小模板</strong></h2><h3 id="必填字段"><strong>必填字段</strong></h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">your-skill-name</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">这个</span> <span class="string">skill</span> <span class="string">做什么。用户在什么情况下应使用它。</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><h3 id="完整模板（含官方所有可选字段）"><strong>完整模板（含官方所有可选字段）</strong></h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">your-skill-name</span>               <span class="comment"># 必填，kebab-case，最长 64 字符</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&gt;</span>                       <span class="comment"># 必填，WHAT + WHEN，最长 1024 字符</span></span><br><span class="line">  <span class="string">这个</span> <span class="string">skill</span> <span class="string">做什么。当用户提到</span> [<span class="string">触发短语</span>] <span class="string">时使用。</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span>                         <span class="comment"># 可选，开源许可证</span></span><br><span class="line"><span class="attr">compatibility:</span> <span class="string">claude-code</span>           <span class="comment"># 可选，环境要求，1–500 字符</span></span><br><span class="line"><span class="attr">allowed-tools:</span> <span class="string">&quot;Bash(python:*) Bash(npm:*) WebFetch&quot;</span>  <span class="comment"># 可选，限制工具</span></span><br><span class="line"><span class="attr">metadata:</span>                            <span class="comment"># 可选，自定义键值对</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Your</span> <span class="string">Team</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">workflow-automation</span></span><br><span class="line">  <span class="attr">tags:</span> [<span class="string">project-management</span>, <span class="string">automation</span>]</span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><p><strong>关键规则：</strong></p><ul class="lvl-0"><li class="lvl-2"><p><code>name</code> 必填，kebab-case，最长 64 字符，须与文件夹名一致</p></li><li class="lvl-2"><p><code>description</code> 必填，最长 1024 字符，必须写清做什么 + 什么时候用，带真实触发短语</p></li><li class="lvl-2"><p>禁止 XML 尖括号 <code>&lt; &gt;</code>（安全限制，frontmatter 出现在系统提示中，恶意内容可能注入指令）</p></li><li class="lvl-2"><p>名称中禁止使用 <code>claude</code> 或 <code>anthropic</code>（保留字）</p></li><li class="lvl-2"><p>描述应使用第三人称</p></li></ul><hr /><h2 id="8-写好-description"><strong>8. 写好 description</strong></h2><p>推荐公式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[做什么] + [什么时候触发] + [关键能力]</span><br></pre></td></tr></table></figure><h3 id="关键原则"><strong>关键原则</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>description 不是普通简介，是 Skill 触发的主要依据</p></li><li class="lvl-2"><p>必须同时写清两类信息：这个 Skill <strong>做什么</strong>，以及<strong>什么时候该调用它</strong></p></li><li class="lvl-2"><p>当前模型存在 <strong>undertrigger</strong> 倾向，因此 description 要写得更主动、更明确，不能过于保守</p></li></ul><h3 id="写法对比（官方示例）"><strong>写法对比（官方示例）</strong></h3><p>模糊（反例）：</p><blockquote><p>帮助项目。</p></blockquote><p>只描述功能但不写触发（反例）：</p><blockquote><p>创建复杂的多页文档系统。</p></blockquote><p>正确（正例）：</p><blockquote><p>分析 Figma 设计文件并生成开发者交接文档。当用户上传 .fig 文件、要求&quot;设计规范&quot;、&quot;组件文档&quot;或&quot;设计到代码交接&quot;时使用。</p></blockquote><blockquote><p>管理 Linear 项目工作流，包括冲刺规划、任务创建和状态跟踪。当用户提到&quot;sprint&quot;、&quot;Linear 任务&quot;、&quot;项目规划&quot;或要求&quot;创建 tickets&quot;时使用。</p></blockquote><blockquote><p>PayFlow 端到端客户入职工作流。处理账户创建、支付设置和订阅管理。当用户说&quot;入职新客户&quot;、&quot;设置订阅&quot;或&quot;创建 PayFlow 账户&quot;时使用。</p></blockquote><p>三个正例的共同特点：具体提到产品名和文件类型、包含用户会说的真实短语、明确说明使用场景。</p><h3 id="好描述特征"><strong>好描述特征</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>具体</p></li><li class="lvl-2"><p>带用户真实说法</p></li><li class="lvl-2"><p>写清适用对象/文件类型/场景</p></li><li class="lvl-2"><p>强调结果价值</p></li><li class="lvl-2"><p>覆盖不同表述风格（正式、口语、缩写、带错别字等）</p></li></ul><hr /><h2 id="9-写好-SKILL-md-正文"><strong>9. 写好 <a href="http://SKILL.md">SKILL.md</a> 正文</strong></h2><h3 id="推荐结构"><strong>推荐结构</strong></h3><ol><li class="lvl-3"><p>标题与目的（说明要解决的问题和适用边界）</p></li><li class="lvl-3"><p>核心步骤</p></li><li class="lvl-3"><p>示例</p></li><li class="lvl-3"><p>错误处理</p></li><li class="lvl-3"><p>references 链接</p></li></ol><h3 id="写作原则"><strong>写作原则</strong></h3><h4 id="设定适当的自由度（来自-Skill-Authoring-Best-Practices）"><strong>设定适当的自由度（来自 Skill Authoring Best Practices）</strong></h4><p>Skill 不是越严格越好，需要根据任务特性设定合适的自由度级别：</p><table><thead><tr><th>自由度</th><th>形式</th><th>适用场景</th></tr></thead><tbody><tr><td><strong>高自由度</strong></td><td>纯文本指令</td><td>多种方法均可行、依上下文决策（如代码审查流程）</td></tr><tr><td><strong>中自由度</strong></td><td>伪代码或带参数的脚本</td><td>有首选模式但可接受变化</td></tr><tr><td><strong>低自由度</strong></td><td>无参或极少参数的特定脚本</td><td>脆弱、易出错的操作，需精确步骤（如数据库迁移）</td></tr><tr><td></td><td></td><td></td></tr></tbody></table><p>原文用类比说明：窄桥靠近悬崖处需要护栏和精确指示，开阔地带只需大方向。</p><h4 id="解释为什么，比堆-MUST-更有效（来自-skill-creator）"><strong>解释为什么，比堆 MUST 更有效（来自 skill-creator）</strong></h4><p>如果你发现自己不断写 <code>ALWAYS</code>、<code>NEVER</code>，这通常是黄色信号。更好的方式是说明：</p><ul class="lvl-0"><li class="lvl-2"><p>为什么这一步重要</p></li><li class="lvl-2"><p>错过会造成什么后果</p></li><li class="lvl-2"><p>在什么场景下它最关键</p></li></ul><p>模型能理解意图与因果，不只是机械照做。</p><h4 id="用示例约束输出"><strong>用示例约束输出</strong></h4><p>对于格式要求、命名规则、报告结构，给示例比纯抽象规则更稳定。适合的场景：</p><ul class="lvl-0"><li class="lvl-2"><p>commit message 格式</p></li><li class="lvl-2"><p>报告结构</p></li><li class="lvl-2"><p>文件命名</p></li><li class="lvl-2"><p>表格格式</p></li><li class="lvl-2"><p>输出 JSON / Markdown 模板</p></li></ul><h4 id="保持通用性，避免过拟合"><strong>保持通用性，避免过拟合</strong></h4><p>Skill 写作阶段很容易被几个测试样例&quot;绑架&quot;。如果 Skill 只对反复测试的几个案例有效，那它几乎没有价值。</p><ul class="lvl-0"><li class="lvl-2"><p>不要为了通过某一条 eval 加入过窄规则</p></li><li class="lvl-2"><p>观察失败背后的共性，而不是给单一问题打补丁</p></li><li class="lvl-2"><p>优先抽象成可迁移的原则、脚本或模式</p></li></ul><h3 id="最佳实践"><strong>最佳实践</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>指令要具体、可执行</p></li><li class="lvl-2"><p>关键校验前置</p></li><li class="lvl-2"><p>常见报错给出明确解决方案</p></li><li class="lvl-2"><p>长说明放 <code>references/</code></p></li><li class="lvl-2"><p>确定性验证优先脚本化</p></li><li class="lvl-2"><p>用祈使句，步骤明确</p></li></ul><h3 id="多域技能按变体组织"><strong>多域技能按变体组织</strong></h3><p>如果一个 Skill 覆盖多个云、多种框架或多个场景，不要把所有细节揉在一个长文里。更好的方式：</p><ul class="lvl-0"><li class="lvl-2"><p>主 <code>SKILL.md</code> 中做选择逻辑</p></li><li class="lvl-2"><p>再指向具体变体文档，如 <code>aws.md</code>、<code>gcp.md</code>、<code>azure.md</code></p></li></ul><h3 id="需要避免的反模式（来自-Skill-Authoring-Best-Practices）"><strong>需要避免的反模式（来自 Skill Authoring Best Practices）</strong></h3><ul class="lvl-0"><li class="lvl-2"><p><strong>使用 Windows 风格路径</strong>：始终用正斜杠，<code>scripts/helper.py</code> 而非 <code>scripts\helper.py</code></p></li><li class="lvl-2"><p><strong>引用嵌套过深</strong>：所有 reference 文件应从 <a href="http://SKILL.md">SKILL.md</a> 直接链接（一级引用），避免链式引用</p></li><li class="lvl-2"><p><strong>包含时效信息</strong>：不要在 Skill 中写入日期或随时间变化的信息；遗留模式用 <code>&lt;details&gt;</code> 折叠标记</p></li><li class="lvl-2"><p><strong>术语不一致</strong>：选定一个术语（如统一用&quot;API endpoint&quot;）贯穿全文，不要混用同义词</p></li><li class="lvl-2"><p><strong>提供过多选项</strong>：除非必要，给出默认方案和一个逃生舱口，而非多个并列选择</p></li></ul><hr /><h2 id="10-脚本化重复工作"><strong>10. 脚本化重复工作</strong></h2><p>如果多个测试用例里模型都在重复写类似的辅助代码，说明这些动作应该被 skill 内置到 <code>scripts/</code> 里。脚本化沉淀的三层收益：</p><ul class="lvl-0"><li class="lvl-2"><p>减少重复劳动</p></li><li class="lvl-2"><p>提高稳定性</p></li><li class="lvl-2"><p>降低 token 与执行波动</p></li></ul><hr /><h2 id="11-测试与迭代"><strong>11. 测试与迭代</strong></h2><h3 id="11-1-三种测试层级"><strong>11.1 三种测试层级</strong></h3><ul class="lvl-0"><li class="lvl-2"><p><a href="http://Claude.ai">Claude.ai</a> 手工测试</p></li><li class="lvl-2"><p>Claude Code 脚本测试</p></li><li class="lvl-2"><p>API 程序化测试</p></li></ul><blockquote><p><strong>官方建议：</strong> 先在单个具有挑战性的任务上反复迭代直到 Claude 成功，再将成功方案提炼成 Skill，然后扩展到多个测试用例。</p><p><strong>跨模型测试（来自 Skill Authoring Best Practices）：</strong> 分别用 Haiku（检查指令是否足够详细）、Sonnet（检查是否清晰高效）、Opus（检查是否过度解释）测试同一个 Skill。</p></blockquote><h3 id="11-2-测试提示词设计"><strong>11.2 测试提示词设计</strong></h3><p>好的 eval prompt 应该具体、有上下文、有细节、接近真实输入。包含文件名、路径、业务背景、字段名、语气差异、口语缩写等。</p><p>坏例子：<code>&quot;Format this data&quot;</code>、<code>&quot;Create a chart&quot;</code>好例子：包含具体文件、格式要求、业务上下文的完整描述。</p><h3 id="11-3-三类测试覆盖"><strong>11.3 三类测试覆盖</strong></h3><ol><li class="lvl-3"><p><strong>触发测试</strong> — description 是否能准确触发</p></li><li class="lvl-3"><p><strong>功能测试</strong> — skill 是否按预期执行</p></li><li class="lvl-3"><p><strong>性能对比测试</strong> — with-skill 比 baseline 好在哪</p></li></ol><h3 id="11-4-迭代信号"><strong>11.4 迭代信号</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>欠触发：补关键词和场景说明</p></li><li class="lvl-2"><p>过触发：缩小范围，增加排除条件</p></li><li class="lvl-2"><p>执行不稳：补校验、补错误处理、优化步骤说明</p></li><li class="lvl-2"><p><strong>只看最终输出还不够，要读 transcript</strong> — 中间路径的低效、冗余、不稳定会掩盖真正问题</p></li></ul><hr /><h2 id="12-分发与共享"><strong>12. 分发与共享</strong></h2><p>推荐做法：</p><ol><li class="lvl-3"><p>GitHub 公开仓库托管</p></li><li class="lvl-3"><p>面向人类写 README</p></li><li class="lvl-3"><p>在 MCP 文档中解释为何要和 skill 搭配</p></li><li class="lvl-3"><p>提供快速安装指南</p></li></ol><p>对外表达重点：</p><ul class="lvl-0"><li class="lvl-2"><p>讲结果，不讲内部实现</p></li><li class="lvl-2"><p>讲&quot;连接能力 + 工作流能力&quot;的组合价值</p></li><li class="lvl-2"><p>强调节省时间、降低学习成本、提高一致性</p></li></ul><hr /><h2 id="13-五种常见模式"><strong>13. 五种常见模式</strong></h2><ol><li class="lvl-3"><p>顺序式工作流编排</p></li><li class="lvl-3"><p>多 MCP 协同</p></li><li class="lvl-3"><p>迭代式精修</p></li><li class="lvl-3"><p>上下文感知式工具选择</p></li><li class="lvl-3"><p>领域智能增强</p></li></ol><hr /><h2 id="14-故障排查"><strong>14. 故障排查</strong></h2><h3 id="上传失败"><strong>上传失败</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>检查 <code>SKILL.md</code></p></li><li class="lvl-2"><p>检查 YAML 分隔符和缩进</p></li><li class="lvl-2"><p>检查 skill name 是否合规</p></li></ul><h3 id="不触发-过触发"><strong>不触发 / 过触发</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>优先改 <code>description</code></p></li><li class="lvl-2"><p>让 Claude 复述触发范围做调试</p></li><li class="lvl-2"><p>欠触发补真实术语，过触发加限定词</p></li></ul><h3 id="加载了但执行不对"><strong>加载了但执行不对</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>压缩说明，突出关键规则</p></li><li class="lvl-2"><p>把模糊要求改成明确校验条件</p></li><li class="lvl-2"><p>关键验证脚本化</p></li></ul><h3 id="MCP-调用失败"><strong>MCP 调用失败</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>先验证 MCP 本身是否可用</p></li><li class="lvl-2"><p>检查认证、权限、工具名</p></li><li class="lvl-2"><p>尝试让 Claude 直接调用 MCP</p></li></ul><h3 id="上下文过大"><strong>上下文过大</strong></h3><ul class="lvl-0"><li class="lvl-2"><p>控制 <code>SKILL.md</code> 大小</p></li><li class="lvl-2"><p>把细节移到 <code>references/</code></p></li><li class="lvl-2"><p>不要同时开太多 skills</p></li></ul><hr /><h2 id="15-上线前检查清单（来自-Complete-Guide）"><strong>15. 上线前检查清单（来自 Complete Guide）</strong></h2><h3 id="开始之前"><strong>开始之前</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已确定 2–3 个具体使用场景</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已确定所需工具（内置或 MCP）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已规划文件夹结构</p></li></ul><h3 id="开发过程中（来自-Complete-Guide）"><strong>开发过程中（来自 Complete Guide）</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 文件夹以 kebab-case 命名</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> <code>SKILL.md</code> 文件存在（拼写准确，区分大小写）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> YAML frontmatter 有 <code>---</code> 分隔符</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> <code>name</code> 字段：kebab-case，无空格，无大写字母</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> <code>description</code> 包含功能（WHAT）和使用时机（WHEN）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 无 XML 标签（<code>&lt; &gt;</code>）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 指令清晰且可执行</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 包含错误处理</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 提供了示例</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 引用已清晰链接</p></li></ul><h3 id="上传之前（来自-Complete-Guide）"><strong>上传之前（来自 Complete Guide）</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已测试在明显任务上的触发</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已测试在换句话请求上的触发</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已验证不会在无关话题上触发</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 功能测试通过</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 工具集成正常（如适用）</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 已压缩为 .zip 文件</p></li></ul><h3 id="上传之后"><strong>上传之后</strong></h3><ul class="lvl-0" class="contains-task-list"><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 在真实对话中测试</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 监控触发不足/过度触发情况</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 收集用户反馈</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 迭代 description 和指令</p></li><li class="lvl-2" class="task-list-item"><p><input class="task-list-item-checkbox" disabled="" type="checkbox"> 在 metadata 中更新版本号</p></li></ul><hr /><h2 id="16-可复用模板"><strong>16. 可复用模板</strong></h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">projecthub-sprint-planning</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">管理</span> <span class="string">Linear/ProjectHub</span> <span class="string">冲刺规划流程，包括读取当前状态、评估容量、建议优先级并创建任务。适用于用户提到</span> <span class="string">sprint、迭代规划、创建</span> <span class="string">tickets、project</span> <span class="string">planning</span> <span class="string">等场景。</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">author:</span> <span class="string">Your</span> <span class="string">Team</span></span><br><span class="line">  <span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line">  <span class="attr">mcp-server:</span> <span class="string">projecthub</span></span><br><span class="line">  <span class="attr">category:</span> <span class="string">workflow-automation</span></span><br><span class="line">  <span class="attr">tags:</span> [<span class="string">sprint-planning</span>, <span class="string">linear</span>, <span class="string">automation</span>]</span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><hr /><h2 id="17-常见误区"><strong>17. 常见误区</strong></h2><h3 id="误区-1：为少量例子过拟合"><strong>误区 1：为少量例子过拟合</strong></h3><p>后果：当前几个样例看起来更顺，但泛化能力更差。抽象共性，而不是打局部补丁。</p><h3 id="误区-2：把-description-写得太保守"><strong>误区 2：把 description 写得太保守</strong></h3><p>后果：Skill 明明该触发，却始终没有被 consult。当前模型倾向 undertrigger，description 应适度主动。</p><h3 id="误区-3：把重复劳动留给模型临场发挥"><strong>误区 3：把重复劳动留给模型临场发挥</strong></h3><p>后果：每次都重新造轮子，成本高且不稳定。应沉淀到 <code>scripts/</code>。</p><h3 id="误区-4：指令模糊，期待模型自行补全"><strong>误区 4：指令模糊，期待模型自行补全</strong></h3><p>后果：输出不稳定、不可预期。用具体示例和校验条件替代模糊描述。</p><hr /><h2 id="18-延伸阅读"><strong>18. 延伸阅读</strong></h2><ul class="lvl-0"><li class="lvl-2"><p><strong>The Complete Guide to Building Skills for Claude</strong> — Anthropic 官方 Skill 构建完整指南（结构规范、YAML 规范、分发与故障排查）</p></li><li class="lvl-2"><p><strong>Skill Authoring Best Practices</strong> — Anthropic 官方 Skill 写作最佳实践（自由度设定、反模式识别、跨模型测试）</p></li><li class="lvl-2"><p><strong><code>anthropics/skills</code></strong> — GitHub 开源仓库，包含 skill-creator 等官方 Skill 示例</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;基于《The Complete Guide to Building Skills for Claude》及 Skill Authoring Best Practices 整理。本文面向&lt;strong&gt;手动编写 Skill&lt;/strong&gt; 的开发者</summary>
      
    
    
    
    <category term="AI" scheme="https://www.aweisite.top/categories/AI/"/>
    
    
    <category term="Claude" scheme="https://www.aweisite.top/tags/Claude/"/>
    
    <category term="Skill" scheme="https://www.aweisite.top/tags/Skill/"/>
    
    <category term="Anthropic" scheme="https://www.aweisite.top/tags/Anthropic/"/>
    
    <category term="AI" scheme="https://www.aweisite.top/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>HPC系统中基于粗粒度聚类和细粒度模型共享的有效节点级异常检测</title>
    <link href="https://www.aweisite.top/posts/38d8733a.html"/>
    <id>https://www.aweisite.top/posts/38d8733a.html</id>
    <published>2025-07-28T20:55:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1><strong>摘要</strong></h1><p>高性能计算 （HPC） 系统对于科学进步和工程突破至关重要。意外的性能下降或系统故障可能会严重影响这些工作。本文介绍了 NodeSentry，这是一种为大规模 HPC 系统的计算节点量身定制的新型无监督异常检测框架。NodeSentry 利用粗粒度聚类和细粒度模型共享的组合方法，有效应对现代 HPC 部署特有的大规模节点规模、频繁的作业转换和复杂模式所带来的挑战。对两个真实世界 HPC 数据集的评估表明 NodeSentry 具有卓越的性能，实现了超过 0.876 的 F1 分数。这比现有的最佳基线方法平均提高了 0.560，同时将训练开销平均降低了 45.69%。此外，为了提高可重复性并为更广泛的研究社区做出贡献，我们开源了 NodeSentry 的代码库，并引入了专为 HPC 系统设计的新型聚类调整和异常标记工具。</p><h1>1. 导语</h1><p>​高性能计算 （HPC） 系统在社会和科学领域的各种数据密集型应用中发挥着至关重要的作用，例如天气预报、特效渲染和航空航天 [4]。这些系统通常由大量计算节点组成，这些节点通过高带宽、低延迟网络互连，形成集群或超级计算机 [8]。每个节点（在本文中我们使用“node”作为“compute node”的简写）都配备了多个处理器内核和大量的内存容量 [24]，许多节点通常会集中他们的资源来处理单个的大规模计算工作。错综复杂、广阔的架构和高度动态的工作调度大大放大了系统故障的可能性 [4， 14， 50]，例如，世界排名第一的超级计算机 Frontier 最初的平均故障间隔时间只有几个小时 [44]。因此，实时识别性能异常至关重要，尤其是在它们升级为系统故障之前。表 1 [11， 28， 33] 提供了 HPC 系统中节点异常的详细信息。实现这一目标的一种普遍方法是实时监控节点并检测异常 [34]。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​为了检测节点的异常情况，运维人员会密切监控和收集这些节点的大规模性能指标，例如核心利用率和内存使用百分比 [20]。这些指标以多变量时间序列 （MTS） 的形式按预定义的时间间隔聚合。图 1 说明了来自三个节点的这些指标的子集。我们观察到 HPC 系统的 MTS 与其他应用场景中观察到的 MTS 之间存在根本差异。具体来说，与云数据中心 [18， 38]、微服务系统 [39， 49] 和蜂窝基站 [27， 39] 相比，HPC 系统表现出三个独特的 MTS 特性：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​1） <strong>高节点规模和度量维度</strong>：HPC 系统通常由数万个节点组成。由于每个节点有大量的内核、内存、网络接口和其他组件，每个节点都会生成大量的指标，即在我们的场景中有 3,014 个指标（图 1 中只显示了几个）。相比之下，一个节点的 MTS 在典型的数据中心中仅包含数十个指标 [18， 38]。</p><p>​2） <strong>动态作业转换和作业模式关联</strong>：众所周知，HPC 中的作业通常很复杂，需要跨多个节点进行分布式协作执行，例如，（a） 在节点 1 中，（f） 在节点 3 中。而从单个节点的角度来看，作业是不断切换的，例如，Node-3 中的 （f）、（g）、（h） 和 （i） 都是不同的作业，其中 （h） 代表空闲等待状态，可以看作是一种特殊类型的作业。可以观察到，执行相同作业的节点通常具有相似的模式，即 （a） 和 （f）。但是，不同的作业也可能表现出类似的模式，例如 （e） 和 （i）。此外，这种相关性意味着，即使没有重复的作业信息，其他节点上的作业模式也可以为了解目标节点上的作业行为提供有价值的见解。</p><p>​3） <strong>同一作业中子模式之间的差异</strong>：尽管不同的 MTS 段可能表现出相似的模式，但单个段（对应于单个作业）中的细粒度模式并不是静态的。例如，段 （e） 和 （i） 的最后一部分和前半部分显示出显著差异，我们分别称为子模式 1 和子模式 2。这是因为连续作业段中的特定任务可能会随时间而变化。</p><p>​多年来，HPC 系统中的自动异常检测引起了人们的极大兴趣 [3–5， 10， 30， 32， 37， 42]。然而，现有的方法假设 MTS 具有稳定的模式和强大的周期性，无法有效解决表现出这些特征的节点的异常检测问题。对于特性 1，一些方法 [10， 22， 30] 为每个节点训练一个模型，随着节点规模和度量维度的增长，训练成本呈指数级增长。对于特性 2，无法积累稳定、长期连续的模式数据导致某些方法的训练和检测性能明显不佳 [5， 10， 30， 32， 42]。尽管一些方法 [3， 4， 37] 考虑了这些特征，但它们没有考虑特性 3 的影响，未能有效地模拟子模式之间的变化。</p><p>​幸运的是，在我们的场景中，我们可以使用 Slurm（HPC 系统广泛采用的作业调度工具）的 sacct 命令 [1] 轻松地从管理系统中<strong>获取每个作业的开始时间、结束时间和执行节点</strong>。通过使用作业的开始和结束时间，我们可以将节点上收集的连续时间序列分割成多个段，每个段代表一个特定作业的时间序列模式（将在 § 3.2 中详细说明）。因此，我们可以放弃为每个节点或每个作业单独训练模型的方法。相反，我们采用以下策略：首先，我们<strong>根据作业将所有节点分段为 MTS 分段</strong>。然后，我们<strong>将这些区段聚类</strong>。之后，我们为<strong>每个簇训练一个模型</strong>，该模型能够同时<strong>关注各种子模式</strong>。当要检测到新作业时，只需要有限数量的数据来匹配最合适的模式，从而通过相应的模型实现有效的异常检测。然而，实施这种有针对性的异常检测策略面临两个主要挑战（将在 § 2.1 中详细说明）。</p><p>​1） <strong>对不同长度的 segment 进行粗粒度模式的聚类</strong>：由于计算复杂性巨大，对 MTS 的数千个维度进行聚类是不切实际的，<strong>需要降维</strong>。另一方面，基于作业的细分会产生不同长度的细分，其聚类构成了主要挑战。此外，考虑不同长度的自适应聚类方法通常会导致很高的计算复杂性 [26， 49]。这些限制阻碍了现有方法有效执行模式聚类。</p><p>​2） <strong>细粒度子模式的识别和模型共享</strong>：虽然聚类方法可以成功地对表现出相似全局趋势的分段进行分组，但同一簇中的细分可能<strong>仍包含仍未充分识别的复杂子模式</strong>。另一个重大挑战在于有效地识别和适应这些细粒度的子模式，以训练一个共享模型，以确保准确的异常检测和模型泛化。</p><p>​为了应对上述挑战，我们提出了 NodeSentry，这是一个针对 HPC 系统中节点的无监督异常检测框架。NodeSentry 首先提取全面的特征，并利用<strong>分层凝聚聚类 （HAC）</strong> [31， 49] 进行粗粒度模式聚类，旨在<strong>快速分类和识别主要趋势</strong>。然后，NodeSentry 采用 Transformer 和 <strong>Mix of Experts （MoE）</strong> [17， 36] 的组合来实现更<strong>细粒度的模型共享和优化</strong>，从而可以处理簇内的子模式，并增强模型的泛化和检测能力。本文的主要贡献总结如下：</p><p>​1） 我们首次总结了 HPC 系统中计算节点的独特特性。受其启发，我们提出了一种通过粗粒度聚类和细粒度模型共享的新型异常检测框架 NodeSentry，该框架显着增强了 HPC 系统的可靠性和稳定性。</p><p>​2） 我们提取全面的统计、时间和光谱特征，并利用 HAC 将不同长度的片段表示为固定宽度向量以进行模式聚类，从而解决挑战 1。随后，我们整合了 Transformer 的自注意力机制和 MoE 的模型共享优势，以增强检测性能和泛化能力，解决了挑战 2。</p><p>​3） 我们对从生产系统中收集的两个不同的数据集进行了广泛的实验。结果表明，NodeSentry 的平均 F1 分数分别为 0.876 和 0.891，比最佳基线方法高出 0.562 和 0.558，同时与最快的深度学习基线方法相比，训练开销分别降低了 77.93% 和 13.45%。</p><p>​4） 为了确保更好的可重复性，我们已公开提供样本数据集和代码1。我们还为 HPC 系统中的 MTS 发布了聚类调整和异常标记工具2。</p><h1>2. 挑战和技术</h1><p>​在本节中，我们将详细讨论这些挑战，并介绍一些将用于应对这些挑战的技术。此外，我们还定义了异常检测的具体问题。</p><h2 id="2-1-挑战">2.1 挑战</h2><p><strong>挑战 1：对粗粒度模式的不同长度的 segment 进行聚类。</strong></p><p>​如图 1 所示，有不同的 job，它们都记录在 job 管理系统中。但是，由于训练数据不足且计算成本高，直接为每个作业训练单个模型是不切实际的。因此，我们需要将相似的作业聚在一起训练共享模型，这需要根据每个节点内的不同作业对数据进行分割，并有效地将这些 MTS 段进行聚类，这是一个难题。</p><p>​<strong>高度量维度</strong>使得直接在原始 MTS 上执行聚类变得不可行。首先，维度的绝对数量会导致维度的诅咒。随着维度数量的增加，不同数据点的距离之间的对比度会减小，从而难以区分聚类簇。此外，聚类算法的计算复杂性会随着维度数量的增加而呈指数级增长，这对于大规模节点来说可能不切实际。</p><p>​HPC 系统中不同的作业持续时间会导致 MTS 段的<strong>长度不相等</strong>，这给聚类带来了很大的困难。针对<strong>不同长度的线段的现有聚类方法</strong>大致可分为两种类型：<strong>基于形状的方法</strong>和<strong>基于深度学习的方法</strong>。动态时间扭曲 （DTW） [26] 是最典型的基于形状的聚类方法，计算量大且效率低下。使用这种方法对一周的数据进行聚类需要 3.8 个月，这对于实际应用来说是不可接受的。另一方面，基于深度学习的方法需要<strong>大量的数据</strong>来学习有效的表示[38,46–49]。但是，在 HPC 系统中，作业的生存期可能非常短暂，并且 MTS 分段的长度有限可能无法提供足够的信息来支持深度学习模型的训练。</p><p>​综上所述，<strong>降低维度</strong>并<strong>提取指标的统计、时间和光谱特征</strong>进行聚类成为一种合适的方法 [9， 15， 25， 37]。降维方法通过将数据转换为低维空间同时保留重要信息来帮助减轻降维的诅咒。另一方面，特征提取方法旨在通过分析数据的统计、时间和光谱特征来识别最相关和最具鉴别性的特征。通过提取有意义的特征并压缩时间维度，我们可以提高聚类效率并实现更好的性能。</p><p><strong>挑战 2：细粒度子模式的识别和模型共享。</strong></p><p>​从图 3 中可以明显看出，在 HPC 系统中，即使在同一作业中，MTS 也可以表现出不同的子模式。在将相似模式聚类到不同的簇之后，接下来的挑战在于为每个聚类簇训练一个共享模型，同时有效地解决子模式的固有多样性。</p><p>​传统的共享策略，包括使用簇质心进行模型训练 [49] 和基于度量维度 [18] 的数据共享，都有局限性。具体来说，使用簇质心进行模型训练 [49] 涉及将相似的模式分组到聚类簇中，并根据每个簇的质心训练模型。这种方法假设簇内的同质性，这可能会破坏模型有效泛化到复杂子模式的能力。同时，基于度量维度的数据共享 [18] 捕获了 MTS 中的跨度量相关性，将每个度量视为处理跨模式的不同数据的位置，这忽略了时间依赖性，并损害了模型适应子模式细微变化的能力。这些策略经常与数据的代表性不足作斗争，导致模型的泛化能力下降。</p><p>​相比之下，将<strong>集成学习</strong>整合到共享策略中提供了一个新颖的视角 [12， 54]。通过利用多个个体学习者的优势，集成学习可以有效地解决簇中子模式的固有多样性。这种方法不仅增强了模型跨相似模式进行泛化的能力，还提高了其对不同子模式的适应性。具体来说，集成方法可以聚合针对同一簇内不同数据子集进行训练的单个学习者的结果，从而提供更全面、更稳健的基础模式表示。因此，此策略为 HPC 系统中的训练共享模型提供了更有效的解决方案。MoE 是实现此策略的极好方法 [23]，而 Transformer 非常适合集成专注于不同细微子模式的专家 [16， 21]。</p><h2 id="2-2-技术">2.2 技术</h2><p>​通过严格的分析，我们确定了一组有效解决核心问题的针对性技术。本节深入探讨了我们选择的技术，概述了理论基础。</p><p>​<strong>分层凝聚聚类</strong>。HAC 是一种基于树状图的自下而上的聚类技术，为选择策略提供了灵活性，并提供了对聚类结构的清晰解释。HAC 允许多级聚类结果，这对于发现模式非常有用。HAC 可以处理不同大小和形状的簇，这与基于质心的聚类算法（例如 k-means）不同，后者采用圆形或球形聚类。</p><p>​<strong>Transformer 神经网络</strong>。Transformer 利用自我注意机制实现全局上下文建模，从而更好地捕获 MTS 中的长距离依赖关系 [40， 53]。它的并行计算能力在训练和推理过程中提供了更高的速度和可扩展性。此外，前馈网络 （FFN） 的加入有助于提高模型的训练稳定性和表达能力。这些特性使 Transformer 成为当前自然语言处理和 MTS 建模任务中的主流模型。</p><p>​<strong>专家混合</strong>。MoE 结合了多个专家的优势和不同的知识表示，提供了丰富的数据特征和强大的模式捕获能力 [45， 51]。与密集模型相比，MoE 可以在保持相对较低的计算成本的同时享受其优势 [21]。此外，这些特征还可以促进模型共享，降低每个专家模型的训练数据要求并允许模型从 MTS 的有限时间范围内学习更多知识。Transformer 中 MoE 的组合在模型训练任务中得到了广泛的关注和应用。</p><h2 id="2-3-问题定义">2.3 问题定义</h2><p>​运维人员需要对实时采集的 MTS 进行分析。考虑一个具有 $$N$$ 个节点的大型 HPC 系统，其中采集的 MTS $$M$$ 与每个节点相关联。在 $$T$$ 长度带时间戳的观察序列中，$$X \in R^{N×M×T}$$ 表示所有节点在连续时间戳下的 MTS。对于每个节点 $$n \in {1， ...， N }$$，作业调度列表中记录的信息可以处理为 $$S_n = { (start <em>{n, j}， end</em>{n, j}) }<em>{J_n}^{j=1}$$，其中 $$J_n$$ 是作业总数，$$start</em>{n，j}$$ 和 $$end_{n，j}$$ 是第 j 个作业的开始和结束时间戳。</p><p>​基于上述定义，异常检测问题表述如下：给定一个训练输入 $$X$$，对于要测试的长度为 $$\hat$$ 的 $$\hat{X}$$，我们需要确定 $$Y \in {0， 1}^{N×T}$$ ，其中 $$Y$$ 表示测试时间戳处的每个节点是否异常（1 表示异常）。</p><h1>3. 方法</h1><h2 id="3-1-设计概述">3.1 设计概述</h2><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​该框架的总体结构如图 2 所示，它包含两个主要阶段：离线模型训练阶段和在线异常检测阶段。</p><p>​在离线模型训练阶段，NodeSentry 首先对原始 MTS 进行预处理，以消除不同节点之间的格式、范围和模式差异。随后，为了识别作业的模式并减少模型训练开销，NodeSentry 对处理后的 MTS 分段执行粗粒度聚类。这种方法使模型能够在聚类簇上进行训练，而不是在单个 MTS 分段上进行训练。为了有效地识别和适应同一簇中的子模式，NodeSentry 将专家网络分配给簇内的不同 Segment 以进行模型共享。每个专家网络都可以专注于处理特定的子模式，从而提高性能和泛化能力。在线异常检测阶段，NodeSentry 从预处理的 MTS 提取特征用于匹配聚类库中的模式。随后，动态分配适当的模型以识别目标节点中的异常。</p><h2 id="3-2-MTS-预处理">3.2 MTS 预处理</h2><p>​出于以下三个原因，我们需要进行预处理作：1） 为了确保数据的干净和有代表性，我们对缺失值应用线性插值。2） 为了在保留关键信息的同时降低复杂性，我们对核心指标进行节点级聚合，从而获得稳定的节点状态洞察。3） 为了捕获有意义的模式并减少连续度量的歧义，我们在转换点实施了基于作业的细分，隔离了节点行为以进行特定的作业分析。这些构成了我们标准化的四步预处理管道的核心组件：</p><p>​<strong>清理</strong>：在实际生产环境中，数据收集和传输过程中可能会出现数据丢失 [43]。当值缺失时，我们使用附近的观测值线性填充这些位置。</p><p>​<strong>降维</strong>：正如挑战 1 中强调的那样，由于 MTS 的高维性，降维是必不可少的。我们采用一种组合方法，利用两种技术来实现显著的降维，同时最大限度地减少信息损失：基于度量语义的降维和相似性分析。</p><p>​（1） 基于度量语义的降维：为了降低数据复杂性并保留基本的节点状态信息，我们在节点级别聚合了相似的指标，仅组合语义相同的指标以保持数据完整性。这种方法涉及聚合具有相同物理含义的指标（例如，CPU 使用率、内存消耗）[4， 37]。</p><p>​（2） 基于相似性分析的降维：在此步骤中，我们使用以下公式计算每对节点级指标之间的 Pearson 相关系数：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>r</mi><mo>=</mo><mfrac><mrow><mo>∑</mo><mrow><mo stretchy="false">(</mo><msub><mi>X</mi><mi>i</mi></msub><mo>−</mo><mover accent="true"><mi>X</mi><mo>ˉ</mo></mover><mo stretchy="false">)</mo><mo stretchy="false">(</mo><msubsup><mi>X</mi><mi>i</mi><mo mathvariant="normal">′</mo></msubsup><mo>−</mo><mover accent="true"><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup><mo>ˉ</mo></mover><mo stretchy="false">)</mo></mrow></mrow><msqrt><mrow><mo>∑</mo><mrow><mtext>（</mtext><msub><mi>X</mi><mi>i</mi></msub><mo>−</mo><mover accent="true"><mi>X</mi><mo>ˉ</mo></mover><msup><mtext>）</mtext><mn>2</mn></msup></mrow><mo>∑</mo><mrow><mtext>（</mtext><msubsup><mi>X</mi><mi>i</mi><mo mathvariant="normal">′</mo></msubsup><mo>−</mo><mover accent="true"><msup><mi>X</mi><mo mathvariant="normal">′</mo></msup><mo>ˉ</mo></mover><msup><mtext>）</mtext><mn>2</mn></msup></mrow></mrow></msqrt></mfrac></mrow><annotation encoding="application/x-tex">r = \frac{\sum{(X_i - \bar{X})(X_i^\prime - \bar{X^\prime})}}{\sqrt{\sum{（X_i - \bar{X}）^2 }\sum{（X_i^\prime - \bar{X^\prime}）^2} }   }</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.6271em;vertical-align:-1.13em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4971em;"><span style="top:-2.1534em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9566em;"><span class="svg-align" style="top:-3.2em;"><span class="pstrut" style="height:3.2em;"></span><span class="mord" style="padding-left:1em;"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord cjk_fallback">（</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1667em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mord"><span class="mord cjk_fallback">）</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord cjk_fallback">（</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7337em;"><span style="top:-2.4231em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.0448em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6779em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mord"><span class="mord cjk_fallback">）</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.9166em;"><span class="pstrut" style="height:3.2em;"></span><span class="hide-tail" style="min-width:1.02em;height:1.28em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.28em" viewBox="0 0 400000 1296" preserveAspectRatio="xMinYMin slice"><path d="M263,681c0.7,0,18,39.7,52,119c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120c340,-704.7,510.7,-1060.3,512,-1067l0 -0c4.7,-7.3,11,-11,19,-11H40000v40H1012.3s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60zM1001 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2834em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.1667em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-2.4413em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6779em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span style="top:-3.2523em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.13em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>​$$X$$ 和 $$X^\prime$$  是需要计算相关系数的两个指标。对于 r ≥ 0.99 的量度对，这些量度对通常表现出几乎相同的量度曲线，并且往往会遇到类似的异常。我们消除了极其相似的指标，只保留一个指标，因此不会牺牲准确异常检测所需的关键模式。</p><p>​在聚合每个内核的指标并过滤掉高度相似的冗余指标后，我们最终得到了几个维度，大约是原始维度的十分之一。</p><p>​<strong>标准化</strong>：不同的指标具有不同的单位和范围，这可能会导致异常检测期间的贡献不同。为了处理具有不同单位和范围的指标之间的维度差异，我们应用了数据标准化。在计算每个节点-指标对的训练数据的平均值 $$\mu_{i，j}$$ 和标准差 $$\sigma_{i，j}$$ 时，我们排除了每个指标的前 5% 和后 5% 的极端异常值，以避免数据分布偏斜 [35]。这些极端异常值被定义为明显偏离正态数据分布的数据点，通常是由于测量误差、数据输入错误或自然变化造成的。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi>X</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo separator="true">,</mo><mi>t</mi></mrow><mo mathvariant="normal">′</mo></msubsup><mo>=</mo><mfrac><mrow><msub><mi>X</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo separator="true">,</mo><mi>t</mi></mrow></msub><mo>−</mo><msub><mi>μ</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow></msub></mrow><msub><mi>σ</mi><mrow><mi>i</mi><mo separator="true">,</mo><mi>j</mi></mrow></msub></mfrac></mrow><annotation encoding="application/x-tex">X_{i, j, t}^\prime =\frac{ X_{i,j,t}-\mu_{i, j}}{\sigma_{i,j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.185em;vertical-align:-0.3831em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-2.453em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.3324em;vertical-align:-0.9721em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">μ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>​在标准化数据时，任何超出 -5 到 +5 范围的剩余值都将剪切到这些边界。这可确保标准化数据保持在合理范围内，从而防止残差异常值的不当影响。</p><p>​<strong>分段</strong>：由于节点在作业期间表现出不同的模式，直接分析连续 MTS 可能会引入模糊的关键信息。我们采用基于作业的分割方法来划分 MTS。具体来说，我们首先确定作业过渡点（从 Slurm [1] 获取的作业的开始和结束时间）。然后，我们将每个任务转换点之间的 MTS 视为一个独立的分段，表示节点在特定任务中的连续模式。</p><h2 id="3-3-粗粒度聚类">3.3 粗粒度聚类</h2><p>​在 HPC 系统中，不同作业的计算需求和持续时间表现出高度的不确定性，导致节点中动态且频繁的作业转换。为了简化 HPC 系统中异常检测的问题空间并降低模型训练的复杂性，我们在宏观层面对已处理的 MTS 分段执行粗粒度聚类。这种方法通过将相似的细分分组在一起来帮助捕获代表性模式，从而使模型能够在训练期间专注于这些关键簇。粗粒度聚类过程涉及特征提取和分段聚类，以有效降低数据复杂度并提高训练效率。</p><p>​<strong>特征提取</strong>：特征提取是数据分析过程中获取关键信息的关键步骤。该过程通常涉及将 MTS 转换为一组描述信号本质的描述性参数。具体来说，我们使用时间序列特征提取库 （TSFEL） [6] 为每个指标提取 134 个可解释的特征索引。这些功能涵盖统计、时间和频谱域，包括但不限于中位数、绝对能量和最大功率谱。</p><p>​<strong>分段聚类</strong>：NodeSentry 使用 HAC 和欧几里得距离进行分段聚类。值得注意的是，运算符不需要迭代尝试来确定最佳聚类数。我们使用轮廓系数来衡量聚类性能，它结合了内聚和分离 [2]。较高的轮廓系数表示簇之间的距离越远，而簇内的距离越短，从而实现了高簇内聚和低簇间耦合。</p><h2 id="3-4-细粒度模型共享">3.4 细粒度模型共享</h2><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​在通过粗粒度聚类对表现出相似模式的 分段（segment ）进行分组后，同一簇中的 分段（segment ）可能会仍然包含尚未完全识别的复杂子模式。为了捕获细粒度的复杂子模式，NodeSentry 利用 Transformer 来增强时间上下文信息，而无需固定大小的窗口输入，从而提高检测性能 [29， 41]。此外，NodeSentry 将 MoE 结合在一起，通过将专家网络分配给簇内的不同段来实现模型共享。每个专家网络都可以专注于处理特定的子模式，从而提高性能和泛化能力 [52]。</p><p>​对子模式进行建模的整体架构如图 3 所示。输入 MTS 是 Token 化的，每个标记都是一个向量，由每个时间点的指标值组成。然后，通过位置编码处理这些标记。NodeSentry 将 Transformer 中的密集 FFN 层替换为稀疏 MoE 层。该层由 N 个 FFN 组成，表示为 experts，并独立在Token上运行。MoE 层接收Token $$x$$ 作为输入，并通过门控网络将其路由到一组 $$N$$ 个专家 $${E_i （x）}^N_{i=1}$$，路由变量 $$W_r$$ 计算结果 $$h（x） = W_r \cdot x$$. 专家 $$i$$ 的门限值 $$p_i$$是根据 $$h(x)_i$$ 计算得出的，由层中 $$B$$ 个 专家的 softmax 进行归一化，并表示每个专家与此输入的相关性。具有最高门限值的 top-k 专家，被认为是最适合处理这些数据的，将形成专家集$$n$$，这些专家的加权结果将决定 MoE 层的输出 [16]：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><msup><mi>e</mi><mrow><mi>h</mi><mo stretchy="false">(</mo><mi>x</mi><msub><mo stretchy="false">)</mo><mi>i</mi></msub></mrow></msup><mrow><mo>∑</mo><msubsup><msup><mi>e</mi><mrow><mi>h</mi><mo stretchy="false">(</mo><mi>x</mi><msub><mo stretchy="false">)</mo><mi>j</mi></msub></mrow></msup><mi>j</mi><mi>N</mi></msubsup></mrow></mfrac></mrow><annotation encoding="application/x-tex">p_i(x) = \frac{e^{h(x)_i}}{\sum{e^{h(x)_j}}_j^N}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.8994em;vertical-align:-1.3344em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.565em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.0613em;"></span><span class="mord"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord"><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8301em;"><span style="top:-3.0051em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2819em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0613em;"><span style="top:-2.453em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span><span style="top:-3.283em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.2913em;"><span class="pstrut" style="height:3.0613em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.7383em;"><span class="pstrut" style="height:3.0613em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>y</mi><mo>=</mo><munder><mo>∑</mo><mrow><mi>i</mi><mo>∈</mo><mi>n</mi></mrow></munder><mrow><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><msub><mi>E</mi><mi>i</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">y=\sum_{i \in n}{p_i(x)E_i(x)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.355em;vertical-align:-1.305em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em;"><span style="top:-1.8723em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.305em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span></span></span></p><p>​每个token都分配给相应的专家，其结果 $$y$$ 将被送入解码器中以重建数据。在训练期间，根据专家的损失，将更新MOE层中的路由变量$$W_r$$。门限网络学习如何更有效地为不同的数据子图案选择专家，而专家则专注于学习特定子图案。该模型是通过<strong>最小化输入数据和重建数据之间的差异</strong>来训练的，该数据由加**权平方误差（WMSE）**计算得出：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>W</mi><mi>M</mi><mi>S</mi><mi>E</mi><mo>=</mo><mfrac><mn>1</mn><mi>M</mi></mfrac><mo>∑</mo><msubsup><mrow><msub><mi>W</mi><mi>i</mi></msub><mo stretchy="false">(</mo><msub><mi>X</mi><mi>i</mi></msub><mo>−</mo><msubsup><mi>X</mi><mi>i</mi><mo mathvariant="normal">′</mo></msubsup><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>M</mi></msubsup></mrow><annotation encoding="application/x-tex">WMSE = \frac{1}{M} \sum{W_i(X_i - X_i^\prime )^2}_{i=1}^{M}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.05764em;">MSE</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-2.453em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0953em;"><span style="top:-2.4003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.317em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>​其中 $$M$$ 为度量元个数，$$W_i$$为权重，$$X_i$$ 和 $$X_i^\prime$$ 分别表示待检测节点第 $$i$$ 个度量元的原始数据和重构数据。为了衡量数据的稳定性，我们使用了平均绝对变化( MAC )：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>M</mi><mi>A</mi><mi>C</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mi>T</mi><mo>−</mo><mn>1</mn></mrow></mfrac><mo>∑</mo><msubsup><mrow><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>−</mo><msub><mi>x</mi><mi>t</mi></msub><mi mathvariant="normal">∣</mi></mrow><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>T</mi><mo>−</mo><mn>1</mn></mrow></msubsup></mrow><annotation encoding="application/x-tex">MAC = \frac{1}{T - 1} \sum{|x_{t-1} - x_t|}_{t=1}^{T-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord"><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9812em;"><span style="top:-2.4003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>​其中$$M$$ 是数据点的个数，$$x_t$$ 是第 $$t$$ 个观测值。我们根据每个簇的训练数据计算每个度量的MAC，以获得 $$W$$。</p><p>​值得注意的是，<strong>利用最接近聚类质心的</strong>$$K$$<strong>段</strong>来训练共享模型构成了一种数据增强形式。结果，<strong>我们增强了transformer中的位置编码</strong>，以在不同的内部和之间合并位置信息分段。通过这种设计，Nodesentry自然可以为每个聚类簇训练共享模型，而无需大量的训练数据和高训练开销。</p><h2 id="3-5-在线异常检测">3.5 在线异常检测</h2><p>​完成离线模型训练阶段后，我们<strong>为每个簇保存共享模型</strong>。在运行时，Nodesentry执行与离线阶段相同的<strong>预处理</strong>步骤。然后，Nodesentry在节点的工作过渡之后，在短时间内使用MTS（例如1小时）来提取功能。 Nodesentry计算这些特征与现有簇质心之间的距离，以<strong>匹配最相似的模式</strong>。最后，Nodesentry采用相应的共享模型进行检测。</p><p>​来自每个节点的MTS被馈入共享模型，该模型生成重建数据。输入和重建数据之间的<strong>重建误差</strong>表明输入MTS接近正常行为的概率，也称为<strong>异常得分</strong>。在阈值选择中，我们<strong>动态设置了异常得分的阈值</strong>。具体来说，我们沿时间轴<strong>定义了一个滑动窗口</strong>。当异常得分<strong>超过K-Sigma</strong>的上限时，数据点被认为是异常[7]。在实践中，操作员经常设置3个sigma阈值。</p><p>​鉴于数据的动态性质并且提前捕获所有可能的模式是不可能的，Nodesentry的驱动需要通过识别最相似的数据来利用现有数据来检测未见过的模式。具体而言，当新模式可以与聚类库中的任何现有<strong>聚类匹配</strong>时，我们对现有模型进行<strong>增量微调</strong>以使其适应新模式的更改。对于<strong>无法匹配的模式</strong>，我们在这些<strong>新模式上执行聚类并</strong>相应地训练新模型。与具有大量数据的重新训练模型相比，该策略不仅显着提高了增量和转移学习的效率，而且还可以有效地解决节点中频繁的工作转变问题。</p><h1>4. 评估</h1><p>​在本节中，我们评估了Nodesentry的性能，旨在回答以下研究问题：</p><p>• RQ1：Nodesentry可以通过两阶段策略实现出色的异常检测性能吗？</p><p>• RQ2：Nodesentry的每个模块是否对其性能产生重大贡献？</p><p>• RQ3：在有限的数据集使用有限的数据集后，Nodesentry对Nodesentry产生了什么影响？</p><p>• RQ4：不同的超参数如何影响Nodesentry？</p><h2 id="4-1-实验设置">4.1 实验设置</h2><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p><strong>4.1.1数据集</strong>。为了解决RQ1-4，我们对从顶级全球HPC服务供应商的环境的生产中收集的两个数据集进行了广泛的实验。我们认为，对大型超级计算机系统的评估足以代表性。它们源自以各种节点硬件设计为特征的阵列。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​为了防止数据泄漏，我们通过考虑它们各自的开始时间来将数据分为不同的培训和测试集。具体来说，我们将最初<strong>60％的时间从训练集作为训练集</strong>使用，而从以后的时间为测试集的数据。表 2列出了这些数据集的详细信息。此外，我们组织了专家使用我们的工具（请参阅第4.2节）标记测试集，结合工作调度列表和手动验证。通过将标记的异常样品的数量除以测试集中的总样本来得出异常比率。值得注意的是，这些<strong>性能异常不一定是故障</strong>，但可能表明潜在的效率低下或瞬态问题。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​D1：我们从聚类中的一个数组中收集数据，其中包括1,294个节点和13,379个分配的作业，一周内，<strong>以15秒的间隔进行了采样</strong>。如图4所示，我们进行了一个现实世界的统计实验，即这些工作段中约有<strong>94.9％的持续时间少于一天</strong>。一周的数据收集期被认为足以进行模型训练和验证。每个计算节点均可以3,014个指标进行监视，涵盖节点性能的多个维度。详细信息在表3 中列出。如第3.2节所述，我们对每核指标进行清洗和降维，最终总共获得了82个指标。</p><p>​D2：我们收集30个节点和1,430个分配的工作，在8天内以15秒的间隔采样。最初总共收集了773个相应的监视指标，并最终确定了116个指标。</p><p>​我们之所以选择不使用公开可用的数据集，是因为它们缺乏工作调度列表的集成和节点的监视指标，这对于我们的目标至关重要。 Antarex3数据集仅提供系统级的性能指标。虽然Prodigy4数据集涵盖节点，但它仅提供由模型而不是原始数据处理的中间文件。</p><p><strong>4.1.2 基线方法</strong>。为了评估Nodesentry的有效性，我们将其与四种高级基线方法进行了比较：Prodigy [4]，Ruad [30]，examon [10]和ISC’20 [32]。我们不尝试监督的学习方法。 TPDS’18 [42]和Albadross [3]采用机器学习分类器，这些分类器引入了模型复杂性和监督类型中的差异。重要的是，DeepHYDRA[37]，Proctor [5]和examon [10]利用半监督方法。 DeepHydra [37]和Proctor [5]在很大程度上依赖其监督组件，而ExaMon[10]源自一项全面的分析，该分析既整合受监督和无监督的组件。为了确保进行公平的比较，我们专门选择了ExaMon[10]中使用的无监督方法进行评估。此外，我们不会选择针对非HPC系统（例如，微服务系统或Web系统）明确设计的异常检测方法，因为这些系统中的实例在运行时<strong>具有固定的任务</strong>，并<strong>展示了常规和周期性的数据模式</strong>。</p><p>​我们配置所有这些方法的参数。具体来说，对于特定数据集并非特定的参数设置，我们使用相应论文中提到的相同配置。对于特定于数据集的参数设置，我们根据相应论文或数据集中提供的范围进行调整。</p><p><strong>4.1.3 实验</strong>。所有实验均在离线验证平台上进行以下配置进行：我们使用Python 3.8.10，Pytorch 2.0.1和Scikit-Learn 1.1.1实施Nodesentry和基线方法，并在配备64 × Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz, two NVIDIA(R) Tesla(R) V100S, 和 187 GB RAM.。</p><p><strong>4.1.4 评估指标</strong>。我们使用标准的点异常检测指标精度，召回曲线下的区域（AUC）和F1得分来评估所有方法的性能。此外，鉴于我们数据集中存在的多个计算节点，我们平均每个节点的精度，召回和AUC平均，而F1得分源自平均精度和召回率。考虑到运营经验的两种实际考虑，我们采用了以前的研究中广泛使用的调整策略[3-5、10、30、32]：1）<strong>假设存在实际连续的异常时间戳，指定的方法在这些时间戳中确定了任何异常，我们将其视为准确检测</strong>。 2）我们故意从每个模式转换的初始和结束1分钟间隔中排除异常，其中某些指标可能会显着偏离预期值。</p><h2 id="4-2-实验的标注工具">4.2 实验的标注工具</h2><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​尽管该方法是一个无需标注数据的完全无监督异常检测方法，但其准确性仍然真实标注的验证。考虑到使用现有标签工具的高维标准标准的高成本、难度，缺乏明显的标注标准，以及使用现有标签工具处理高维度的挑战，我们开发了一种基于图形的用户界面工具，允许操作员调整MTS中的群集和标签异常。该工具在Python中使用TKINTER和MATPLOTLIB实现，代码库跨越约1,600行。图5描述了主要接口，包括以下功能：</p><p>​1）它有助于选择显示或隐藏特定的度量尺寸，支持MTS的可视化，拖动和水平/垂直放大，并区分各种节点状态，从而为操作员提供增强的视角。</p><p>​2）它使操作员能够通过指定开始时间和结束时间间隔来标记或取消异常间隔，从而将其保存为异常。为了减轻工作量，我们整合了多种异常检测方法（例如统计方法和深度学习方法），以帮助标记。</p><p>​3）它结合了内置的聚类方法，并提供了数据分布的可视化。此外，它有助于簇的动态调整，并更新每个群集的质心。</p><p>​我们根据工作调度列表和操作员的手动验证采用全面的方法，以避免未标注和遗漏。特别是，作业的最终失败不能完全归因于计算节点中的性能异常[10]。它可能是由代码错误或存储资源不足引起的。此外，节点中的性能异常可能在工作失败之前表现出来[13]。该原则也适用于闲置等待状态。因此，要确保精确标记的计算节点的实时异常检测必须变得重要。通过在执行工作期间检测异常，我们可以主动终止工作，以防止任何进一步的异常传播。当在闲置等待期间出现异常时，操作员可以实施隔离和缓解的措施。</p><h2 id="4-3-总体表现（RQ1）">4.3 总体表现（RQ1）</h2><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​表 4 中显示了不同方法的性能。与所有基线方法相比，Nodesentry获得了令人印象深刻的0.876和0.891 F1得分，相对于第二名而言，相对提高分别为179.04％和167.57％。通过粗粒的聚类和细粒度的模型共享捕获和学习不同作业中节点的模式特征的策略为Nodesentry的成功做出了贡献。其他方法[4、10、30、32]忽略了模式和副本的差异。在第6节中详细讨论了每个基线表现不佳的具体原因。相比之下，Nodesentry量身定制的方法对节点行为的细微差别敏感，并通过实时动态和自适应选择模型来增强异常检测性能。</p><p>​我们通过比较离线训练所需的时间与检测每个节点的平均时间来分析复杂性。 Nodesentry的异常检测效率令人满意，平均时间检测每个时间点是否为异常不超过2毫秒。该潜伏期在可接受的异常检测范围内。值得注意的是，由于使用贝叶斯高斯混合模型（BGMM）聚类而不是深度学习模型，ISC 20 [32]的开销最低，导致其性能最差。与其他深度学习基线方法相比，Nodesentry证明了最佳的训练效率，相对提高了77.93％和13.45％的训练效率。</p><h2 id="4-4-消融研究（RQ2）">4.4 消融研究（RQ2）</h2><p>​为了证明Nodesentry（即段聚类和模型共享）中关键组件的有效性，我们在两个数据集上进行消融实验，创建五个变体C1-C5。 1）C1去除粗粒聚类，仅使用单个模型。 2）C2随机选择段来训练相同数量的模型，以替换由聚类过程产生的代表性分段。 3）C3将不同长度的片段切成相等的长度。 4）C4消除了在位置编码内区分段段的实践。 5）C5用密集的FFN层代替稀疏的MOE层。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><p>​表 5说明了在各种应用程序方面的Nodesentry的性能增强，超过了所有前面提到的替代方案的性能。这突出了每个组件在达到峰值性能方面的关键贡献。培训单独模型（C1）或采用选择随意的模型集合（C2）没收将数据分割为相干子集的能力，从而阻碍了磨练不同数据段的独特属性的能力。未能利用数据中的结构信息会导致性能下降。此外，粗粒聚类和细粒模型共享构成了异常检测的有效策略。不同长度的段包含不同量的信息，并且均匀处理这些信息会导致在工作信息表示（C3）中引起不平衡。采用这种变体可能会对模型异常检测的有效性和操作效率产生不利影响。使用模型共享模块，位置编码增强了在异质段（C4）识别位置信息的能力（C4）。相反，用致密的FFN层（C5）取代稀疏的MOE层会侵蚀适应性和多功能性。这归因于以下事实：MOE层本质上更擅长管理数据的多样性和复杂性，这是FFN层通常不足的熟练程度。</p><h2 id="4-5-增量训练（RQ3）">4.5 增量训练（RQ3）</h2><p>​为了评估训练集大小的影响以及增量训练的有效性，我们辨别训练集大小和模型性能之间的牢固正相关。我们从最小的训练集开始进行实验，并逐步增加大小，直到达到完整的训练集。每个大小都是通过从完整数据集的分层随机采样得出的，从而确保了实验性有效性必不可少的随机性和公正性。模型训练遵循统一的参数设置，以排除外部变量的混淆影响。</p><p>​如图6（a）所示，实验发现表明，训练组尺寸较小，性能显着降低。这种现象可能是由于无法提供足够数据来培养强大模型的较小训练而产生的，因此导致Nodesentry对新模式的检测不足。 Nodesentry的表演表现出明显的增强，并在训练集尺寸上升级，这证明了其精致的结构设计和明智的方法论选择。在仅可用数据有限的实际情况下，可以通过第3.5节中介绍的增量训练管道来优化异常检测的性能。</p><h2 id="4-6-超参数灵敏度（RQ4）">4.6 超参数灵敏度（RQ4）</h2><p>​我们讨论了Nodesentry六个超参数的影响。训练集大小的详细信息可在§4.5中找到。图6说明了不同的高参数设置对F1得分的影响。</p><p>​1）粗粒聚类中的簇数。当Nodesentry的性能降至最优数值，但是一旦超过此阈值，它就会稳定。如第3.3节所述，Nodesentry具有自主识别最有生产力的聚类数量的天生能力，从而在没有折衷的情况下保持了峰值性能。</p><p>​2）MOE的专家数量。数量不足的专家可能导致数据显着特征的不完整表示，而多余的可能会导致过度拟合，从而降低了普遍性。当专家的数量设置为3时，Nodesentry会表现出色。</p><p>​3）分配给每个令牌的专家数量。每个专家在识别子图案变化方面的专业化表明，巩固其产出可能会导致不必要的复杂性和潜在的不准确性。因此，当每个令牌都分配给一个专家时，Nodesentry的表现最好。</p><p>​4）图案匹配的时期。较短的时期不会捕获足够的上下文信息，从而降低了检测准确性。我们的实验表明，建议使用1小时供一般用途，并保留长期用于高智能应用。</p><p>​5）选择阈值的时间窗口。 Nodesentry在阈值选择方面表现出鲁棒性，非常适合不同的窗口长度。但是，为了确保计算效率和模型稳定性，建议使用较短的时间窗口（例如15分钟或20分钟），因为它们在不损害性能的情况下降低了计算复杂性。</p><h1>5. 讨论</h1><h2 id="5-1-部署">5.1 部署</h2><p>​Nodesentry部署在配备8核，64个线程处理器和128 GB RAM的专用节点上，旨在监视和分析生产环境群集的大小和配置与D2相当。在部署阶段，使用大规模原子/分子大规模平行模拟器（LAMMPS）[19] [19]进行分子动力学模拟。同时，通过Chaosblade5 Toolkit系统地引入了故障注射方案（例如，磁盘完整，内存耗尽和CPU超载），以验证系统鲁棒性。在连续的一个月评估期内，Nodesentry表现出有效的操作性绩效，平均每小时监测周期的模式匹配，并在5.11秒内完成，并实现每个采样点36毫秒的实时检测潜伏期。 Nodesentry表现出强大的异常检测能力，在识别性能异常和注射故障时，精度和召回率分别为0.857和0.923。</p><p>​如图7所示，部署工作流都集成了离线和在线操作模式。当用户提交计算作业时，SLURM作业调度程序会根据用户定义的参数（例如节点计数和运行时要求）动态分配HPC群集的资源。同时，Prometheus6从所有节点收集粒度性能指标，将此遥测数据存储在时间序列数据库中以支持离线模型培训。在在线阶段，收集的数据将传递给实时检测nodesentry。检测到异常后，Nodesentry触发了对操作员的警报。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/asynccode" alt="img" /></p><h2 id="5-2-案例研究">5.2 案例研究</h2><p>​在本节中，我们对D1进行了案例研究，以进一步证明Nodesentry的工作过程。如图8所示，节点45中的内存级故障导致指标中的异常。 Nodesentry将检测到的工作模式与最相似的历史模式相匹配，并应用了学习的模型来检测异常。在每个时间点计算原始MT和重建的MTS之间的差异。 Nodesentry在工作失败前54分钟检测到节点异常，使操作员能够尽早干预以防止工作失败。由于与内存相关的指标显示出显着下降，因此记忆不足被确定为工作失败的原因。与传统方法相比，Nodesentry通过有效处理复杂的工作模式和子图案的表现出色，使其更适合HPC系统的动态和大规模性质。</p><h2 id="5-3-限制和威胁">5.3 限制和威胁</h2><p>​在在线检测过程中，Nodesentry的局限性主要涉及节点的频繁工作过渡。及时，精确的模式匹配对于维护模型的准确性是必要的，而使用一定的时间。但是，实验表明这项时间投资被认为是可以接受的。</p><p>​关于内部有效性威胁，我们进行了严格的重复实验测试，并迭代优化配置每个模块。实验结果代表了多个试验的平均值。 Nodesentry还面临外部有效性威胁。该领域缺乏公开可用的数据集。我们使用大型超级计算机系统验证Nodesentry。但是，这可能并不能完全代表所有HPC系统。但是，我们对Nodesentry的一般性充满信心。</p><h1>6. 相关工作</h1><p>​HPC系统中节点的各种异常检测方法可以大致分为三组：监督方法，半佩顿方法和无监督的方法。</p><p>​<strong>监督方法</strong>。 TPDS 18 [42]和Albadross [3]分别使用特征提取和特征选择技术。然后，他们训练机器学习分类器以检测不同的性能异常。这些方法需要使用标记的数据进行培训，其中包含正常样本和异常样本。但是，他们要求专家的广泛领域知识和标签工作，这通常是劳动密集型的。因此，对于大型HPC系统，这些方法几乎是不切实际的。</p><p>​<strong>半监督方法</strong>。 DeepHydra [37]将应用程序的密度空间聚类与噪声（DBSCAN）和基于学习的异常检测结合在一起，从而引入了半监督训练的基于监督的MSE基于MSE的损失功能。Proctor [5]和examon [10]使用自动编码器（AE）进行异常检测。 Proctor [5]学习隐藏的图层功能，以通过监督分类器来检测异常。另一方面，审查[10]结合了重建误差和分类概率的结果。与受监督的方法相比，它们仅需要相对少量的标记数据和大量未标记的数据进行培训。但是，这种限制限制了异常样品的建模能力。</p><p>​<strong>无监督的方法</strong>。 Ruad [30]利用长期记忆（LSTM）细胞，明确捕获时间依赖性。 Ruad [30]需要为每个节点培训特定的深层模型，从而导致其他存储和调度要求。 ISC 20 [32]采用BGMM和Mahalanobis距离来适合高斯分布，其能力仅使用机器学习有效地对MTS数据的复杂动态进行建模。 Prodigy [4]是基于变异AE（VAE）的异常检测框架。 ISC 20 [32]着重于聚类整个段，而Prodigy [4]提取了以后的检测过程。最重要的是，它们俩都没有考虑在同一细分市场上可能会有很大变化的复杂子图案。</p><h1>7.  结论</h1><p>​鉴于维持HPC系统中的操作稳定性的固有复杂性，我们提出了Nodesentry，这是一种无监督的MTS异常检测框架，专门为HPC系统中的节点设计。 Nodesentry将粗粒段聚类与细粒模型共享相结合，提高其可扩展性和效率，同时显着提高了异常检测准确性和概括能力。通过使用从生产HPC系统收集的数据进行广泛评估，我们证明了Nodesentry在异常检测获得高精度和高精度召回率方面的有效性。此外，为了促进可重复性，我们设有开源的Nodesentry代码库，并引入了专门为HPC系统设计的新型聚类调整和异常标签工具。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;&lt;strong&gt;摘要&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;高性能计算 （HPC） 系统对于科学进步和工程突破至关重要。意外的性能下降或系统故障可能会严重影响这些工作。本文介绍了 NodeSentry，这是一种为大规模 HPC 系统的计算节点量身定制的新型无监督异常检测框架。</summary>
      
    
    
    
    
    <category term="Aiops" scheme="https://www.aweisite.top/tags/Aiops/"/>
    
  </entry>
  
  <entry>
    <title>RUAD：HPC系统中无监督的异常检测</title>
    <link href="https://www.aweisite.top/posts/6bf8f2be.html"/>
    <id>https://www.aweisite.top/posts/6bf8f2be.html</id>
    <published>2025-07-28T20:55:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h2 id="摘要">摘要</h2><p>现代高性能计算（HPC）系统的复杂性日益增加，需要引入自动化和数据驱动的方法，以支持系统管理员为增加系统可用性的努力。异常检测是改善可用性不可或缺的一部分，因为它减轻了系统管理员的负担，并减少了异常和解决方案之间的时间。但是，对当前的最新（SOA）检测方法进行了监督和半监督，因此它们需要具有异常的人体标签数据集 - 在生产HPC系统中收集通常是不切实际的。基于聚类的无监督异常检测方法，旨在减轻准确的异常数据的需求，到目前为止的性能差。在这项工作中，我们通过提出RUAD来克服这些局限性，RUAD是一种新型的无监督异常检测模型。 Ruad比当前的半监督和无监督的SOA方法取得了更好的结果。这是通过考虑数据中的时间依赖性以及在模型体系结构中包括长期术语记忆单元的实现。对拟议的方法进行了评估，以完整的tier-0系统历史记录（来自Cineca，带有980个节点的Marconi100）。 RUAD在半监督训练中达到曲线（AUC）下的面积为0.763，在无监督的训练中达到了0.767的AUC，这改善了SOA方法，在半监督训练中达到0.747的AUC，在无训练的训练中，AUC的AUC为0.747。它也大大胜过基于聚类的当前SOA无监督的异常检测方法，其AUC为0.548。</p><h2 id="1-导语">1. 导语</h2><p>​高性能计算（HPC）系统（例如异质体系结构和更高功率集成密度）的最新趋势增加了其管理和维护的复杂性[1]。一个典型的当代HPC系统由数千个相互连接的节点组成；每个节点通常包含多个不同的加速器，例如图形处理器，FPGA和张量芯[2]。监视所有这些子系统的健康是系统管理员的越来越艰巨的任务。为了简化此监视任务，并减少了管理员的异常叛乱和响应之间的时间，近年来已经引入了自动异常检测系统[3]。</p><p>​导致停机时间或系统不可用的异常是昂贵的事件。它们的成本主要与HPC系统无法接受新的计算作业的时间有关。由于HPC系统的成本高昂并且服务寿命有限[4]，因此减少无法获得时间符合该系统的运营商的利益。与故障节点的手动报告相比，系统管理员的故障和响应之间的时间可以大大减少这方面的异常检测[5]。现代超级计算机具有监视系统，使系统管理员对系统的整体视图[3]。这些监视系统收集的数据和描述系统可用性的历史数据是机器学习异常检测方法[6，7，8，9，10]的基础，该方法构建了超级计算机及其计算节点的数据驱动模型。在这项工作中，我们专注于Cineca Tier0 HPC系统（Marconi100 [11，12]在2020年6月的Top500列表中排名第9位[13]），该列表采用了一个称为Excon [14]的整体监控系统。</p><p>​生产HPC系统是可靠的机器，通常很少有停机事件 - 例如，在Cineca的Marconi100中，与事件故障事件相对应的时间戳平均代表了所有数据的0.035％。但是，尽管异常是罕见的事件，但它们仍然显着影响该系统的总体可用性 - 在观察期间，至少有一个主动异常（不可用的节点）的时间为14.4％。在HPC系统上进行异常检测的最新方法（SOA）基于深度学习（DL）领域的监督和半佩斯的方法[5]；因此，这些方法<strong>需要具有准确注释的停机时间（或异常）的训练集</strong>。 反过来，这需要监视基础架构来跟踪停机时间事件；在某些情况下，这可以使用特定的软件工具（例如Nagios [15]）来完成，但是正确配置这些工具是系统管理员的复杂且耗时的任务。</p><p>​到目前为止，通过以有监督或半监督的方式训练模型来训练模型，通过部署异常报告工具来应对HPC系统的异常检测挑战。对准确标记的训练集的需求是当前方法在实践中应用的主要局限，因为它在系统管理员的时间和精力方面很昂贵。停机时间跟踪还必须能够记录与其他监控服务相同的粒度失败。生产HPC系统中的某些方法仅按日期[1、2、3]记录停机事件。在大多数生产HPC系统中，准确的异常检测是不容易实现的。因此，文献中的大多数方法都经过历史或合成数据或超级计算机的测试，这些超级计算机以经过精心控制的方式注入故障[18]。对异常数据集进行异常标注的另一个局限性在于，大多数HPC系统的短生命周期。在HPC领域，一个计算节点和系统的生命周期为三到五年。在实践中，短生命周期意味着，在系统被部署到客户站点之前，供应商没有时间创建一个数据集来训练一个异常检测系统。</p><p>​一个完全无监督的异常检测方法可以新节点甚至在全新的HPC系统上部署。然后，它将在无需与系统管理员进行任何互动的情况下在线学习。此外，这样的系统将更容易部署，因为它不需要额外的框架来报告和记录异常事件（除了构建目标超级计算机的数据驱动模型所需的监视基础架构之外，这种基础架构是一种基础架构，一种在当前HPC设施中越来越广泛的基础设施[3]）。</p><p>​当前的无监督的HPC系统的异常检测方法，例如[19，20，21]。它们要么工作在日志数据上，要么工作在传感器数据上。基于日志数据[ 19、21 ]的方法虽然有用，但只能提供超级计算机状态的事后和受限视图。用于传感器数据异常检测的SoA [ 20 ]是基于聚类的，需要系统管理员进行一定程度的人工分析，与半监督方法相比性能较差。基于稠密自编码器的半监督方法[ 5、6、22]可以以无监督的方式进行训练，该方法通过训练来重现它们的输入。然而，目前的工作都没有探讨过这种可能性。根据SoA，由于密集自编码器也能够学习异常[ 5、6、22]的特征，模型的表现会更差</p><p>​这项工作的主要动机是提出一种新的方法，该方法仅依赖于异常是罕见的事件，并且当以无监督方式训练时，至少与以半监督方式训练时一样工作良好- -这在当前的SoA中并非如此。在这项工作中，我们提出了一种无监督方法：RUAD (循环无监督异常检测)，它适用于传感器数据，并优于所有其他方法，包括目前的So A半监督方法[ 5 ]和So A无监督方法[ 20 ]。RUAD通过考虑数据中的时间依赖关系来实现。我们通过在所提出的神经网络模型结构中使用长短期记忆( LSTM )单元来实现，该模型显式地考虑了观测现象的时间维度。由LSTM层组成的RUAD模型能够学习正常运行的特征，即使测试集中存在异常数据，我们也展示了即使测试集中存在异常数据，由LSTM层组成的RUAD模型也能够学习正常运行的特征- - RUAD模型能够以无监督的方式进行训练。RUAD针对单个HPC计算节点：每个计算节点都有不同的异常检测模型。这背后的动机是可扩展性：通过这种方式，每个节点可以用最小的开销来训练自己的模型-而且，这种策略也可以在更大的超级计算机中工作，就像节点数量增加一样，我们只需要添加新的检测模型。</p><h3 id="1-1-本文贡献">1.1 本文贡献</h3><p>​总之，在本文中，我们提出了一个异常检测框架，可以处理复杂的系统监控数据，扩展到大规模的HPC系统，并且即使没有可用的标记数据集也可以进行训练。本文的主要贡献在于：</p><p>​我们提出了一种完全无监督的异常检测方法( RUAD )，该方法利用异常很少的事实，并通过使用自编码器网络中的LSTM单元显式地考虑数据中的时间依赖关系。由此产生的深度学习模型优于先前最先进的半监督方法[ 5 ]，基于时间不感知的自动编码器网络。在本文提出和分析的数据集(采集自Marconi100超级计算机)上，前一种方法取得了0.7470的曲线下面积( ACU )测试集得分。相比之下，我们的无监督方法取得了最好的测试集AUC得分为0.7672。据我们所知，这项工作是首次将这种方法应用于HPC系统监控和异常检测领域</p><p>​我们对我们的方法进行了非常大规模的实验评估。我们对Marconi100的980 +个节点分别训练了4种不同的深度学习模型。据我们所知，这是在HPC系统中有关异常检测的最大规模的实验，无论是考虑的节点数还是时间长度。先前的工作仅在观测时间(以文献为例,仅对HPC系统的20个节点进行了两个月的分析)较短的节点子集上评估模型。模型的逐节点训练也证明了面向大型HPC系统的逐节点模型的可行性。在单个NVIDIA Volta V100 GPU上，单个模型的训练时间小于30分钟。</p><h3 id="1-2-本文的结构">1.2 本文的结构</h3><p>​我们在第二节中介绍了当前的技术状态和我们的论文的位置。第3节描述了用于异常检测的机器学习方法，包括我们的新方法。我们的结果的经验验证的实验设置在第4.1节中详细介绍，我们的结果在第4节的其余部分中讨论。最后，第五节给出了一些结束语。</p><h2 id="2-相关工作">2. 相关工作</h2><p>​检测偏离(即操作异常)规范的事件或实例的驱动存在于许多工业应用中。异常检测模型最早的应用之一是金融行业[ 23、24 ]中的信用卡欺诈检测。最近，异常检测(和相关的预测性维护)在制造业[ 25、26 ]，物联网[ 27、28、29 ]，能源部门[ 30 ]，医疗诊断[ 31、32 ]，IT安全[ 33 ]，甚至在复杂物理实验[ 34 ]中变得相关。</p><p>通常，HPC系统中的异常是指(并导致)次优运行模式的周期，导致作业失败或错误完成的故障，或节点和其他组件硬件故障。虽然HPC系统有几种可能的故障缓解策略[ 35 ]和容错策略[ 36 ]，但这种类型的异常仍然会显著减少用户可用的计算时间[ 37 ]。向百亿亿次的过渡和硬件组件异质性的增加只会加剧因故障引起的问题，以及已经困扰HPC机器[ 1、3、38]的异常状况。一项DARPA研究估计，未来的超大规模HPC系统的故障可能每35 - 39分钟就会发生一次[ 39 ]，从而严重影响超级计算的可用性和系统管理员的负荷。</p><p>​然而，当查看特定组件而不是整个HPC系统(例如,考虑单个计算节点)时，故障仍然是非常罕见的事件，因此属于异常检测领域，这可以看作是监督学习在不平衡类上的一个极端情况[ 40 ]。由于与正常操作有关的数据远远超过与异常有关的数据，经典的监督学习方法倾向于过度拟合正常数据，并在异常数据上给出次优的性能[ 41 ]。为了缓解类别不平衡问题，通常从两个角度来处理异常检测问题。在最新技术( SoA )中发现的解决类不平衡的方法要么修改数据[ 42 ]，要么使用专门的技术，这些技术在异常检测问题上效果很好[ 5 ]。数据操纵方法通过减少属于正常操作(在多数类抽样下)的数据或者通过过采样甚至生成异常数据(对少数类进行过度抽样)来解决数据集不平衡问题[ 42 ]。HPC系统中用于异常检测的数据操作尚未得到深入研究。相反，大多数现有的方法依赖于合成数据生成，例如，在真实(非生产)超级计算机或HPC模拟器中注入异常[ 5 ]。</p><p>​另一种研究方法是使用不同的学习策略，即半监督ML模型，从HPC系统中利用大量的正常数据。半监督模型不是在包含多个类的数据集上学习- -从而学习所有类的特征- -而是只在正常数据上训练。因此，他们被训练来学习正常类(数据集中的多数类)的特征。然后将异常识别为与正常类[ 40、6、43、22、44]学习到的特征不对应的任何事物。</p><p>​关于用于开发和部署异常检测系统的数据类型，我们可以识别两个宏类：整体监控系统(即:考)收集的系统监控数据和日志数据。然后用系统或节点级可用性的信息对这些数据进行标注，从而创建与数据点相关的标签。标签编码系统是否正常运行或发生异常。由于获取带标签的系统监控数据是昂贵且耗时的，因此可以通过向HPC系统中&quot;注入&quot;异常来获得用于监督学习的带标签数据集(如[ 18 ] )。标签对于有监督、半监督和无监督方法都很重要。在第一种情况下，它们用于计算损失，在第二种情况下用于识别训练数据集和验证，而在第三种情况下，只用于验证。这些数据可以直接用于监督学习任务，也可以在处理新特征(特征构建)后使用。该方法的实例是[ 45、17、46 ]，其中作者使用有监督的ML方法来分类HPC系统中的性能变化和作业级故障。在故障检测方面，[ 8、18 ]提出了一种基于随机森林(一种基于决策树的集成方法)的监督方法来对HPC系统中的故障进行分类。所有提到的方法都使用注入到HPC系统中的合成异常来训练监督分类模型。方法[ 5 ]和[ 16 ]是利用从生产HPC系统(与注入异常相反)收集的真实异常的少数方法之一。在本文中，我们感兴趣的是真实的异常，因此，在我们的定量比较中，我们将不包括使用合成/模拟数据或注入异常的方法。</p><p>​所有提到的方法都没有考虑到数据(模型不是在时间序列上训练的,而是在不包含时间信息的表格数据上训练的)的时间依赖性。系统监测数据方法[ 47 ]是第一个通过计算时间维度(聚合、滑动窗口统计、滞后特征)上的统计特征来考虑数据中的时间依赖关系。大多数处理时间序列异常检测的方法都是针对系统日志数据的。标记的异常要么使用日志解析器进行分析[ 48 ]，要么使用深度学习方法进行检测。深度学习用于异常检测的方法是基于LSTM神经网络的，因为它们是其他文本处理领域的一种行之有效的方法。</p><p>​与有标记的训练集相比，在无标记数据集上所做的工作要少得多- -尽管这种情况在实际中更为常见。到目前为止，所有关于无标签数据集的研究都集中在系统日志数据上。文献[ 19 ]提出了一种基于k - means的无监督学习方法，该方法不考虑日志数据的时间动态性。文献[ 20 ]提出了一种基于传感器数据的聚类方法。该方法将作为实验部分(因为它是传感器上唯一的无监督方法,而不是在日志数据上)的基线之一。一种方法[ 21 ]以无监督的方式处理时间序列数据。它使用基于LSTM的自编码器，并在现有的日志数据集上进行训练。本文提出的异常检测器取得了0.59的AUC (受试者-操作者特征曲线下面积)。尽管它工作在一个完全不同类型的数据集(日志数据相对于系统监控数据)上，这是与本文提出的研究范围最接近的现有工作。正如我们在论文后面所展示的那样，通过在每个节点上部署系统监测数据的无监督异常检测方法，我们可以取得比日志数据模型[ 21 ]报告的要好得多的结果。表1总结了本节描述的最相关的方法，重点介绍了训练集和时间依赖。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/29ff78a8-0ec2-460e-8d4c-16b7115e70ed.png" alt="img" /></p><p>本文的新颖之处在于，相对于现有的著作而言，具有三方面的意义：</p><ul class="lvl-0"><li class="lvl-2"><p>提出了一种基于无监督时间序列的异常检测模型RUAD；</p></li><li class="lvl-2"><p>提出了一种捕获时间依赖关系的深度学习架构；</p></li><li class="lvl-2"><p>该方法在具有真实异常的大规模生产数据集上进行了评估- -据我们所知，这是迄今为止对这类问题进行的最大规模的评估。</p></li></ul><h2 id="3-方法">3. 方法</h2><p>​在这一部分中，我们描述了所提出的无监督异常检测方法。我们不直接介绍所提出的方法( LSTM自编码器深度网络)，因为我们想说明它是如何对当前最先进的方法进行重要扩展的；因此，我们首先介绍了三种基线方法，i )指数平滑(作为最基本的比较方法)，ii )无监督聚类和 iii )文献[ 5 ]中使用的密集自编码器。然后，我们详细描述了我们的方法，并强调了它的关键优势(无监督的训练机制和时间维度的明确包含)。</p><h3 id="3-1-节点异常标记">3. 1  节点异常标记</h3><p>​我们的目标是识别一个节点的严重故障，使其无法执行常规的计算任务。正如Nagios报告的那样，这种故障并不一定与移除生产节点一致。在与CINECA系统管理员的讨论中，我们得出结论，节点可用性的最佳代理是最关键的状态，正如Nagios所报告的那样。为此，我们创建了一个新的标签，称为节点异常，如果Nagios报告的任何子系统都报告了临界状态，则该标签的值为1。从这些事件(报告的异常)中，我们然后根据Jira [ 50 ]中的报告测试或配置来过滤已知的假阳性事件。吉拉原木由CINECA提供。我们以前的工作[ 5 ]中使用的标签不适用于M100，因为它们被广泛用于表示从生产中移除的节点，用于测试和校准。在这项工作中，我们研究了HPC机器生命周期的早期阶段，当进行了几轮重新配置，从而部分地破坏了系统的正常生产流程。Jira 日志由CINECA提供。我们以前的工作[ 5 ]中使用的标签不适用于M100，因为它们被广泛用于表示从生产中移除的节点，用于测试和校准。在这项工作中，我们研究了HPC机器生命周期的早期阶段，当进行了几轮重新配置，从而部分地破坏了系统的正常生产流程。对比表2中的两种标注策略，可以看出两者的重合度最小。此外，由于M100在运行的前10个月中经历了大量的测试阶段，节点被标记为从生产中移除，但仍然正常运行，因此节点异常报告的数量远远少于其他异常。在论文的其余部分，第0类或第1类将始终指节点异常值分别为0或1。正常数据是所有节点异常取值为0的数据，异常数据是节点异常取值为1的数据。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/c31453a0-41ee-4fa8-9686-c03ca6084e04.png" alt="img" /></p><h3 id="3-2-重建误差及结果评价">3. 2 重建误差及结果评价</h3><p>​异常检测问题可以形式化地表述为训练模型$$M$$的问题，该模型估计在$$t_0$$时刻结束的长度为$$W$$的向量序列代表$$t_0$$时刻的异常的概率$$P$$：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/50b7ada6-a42b-4850-b29b-29ae9879b555.png" alt="img" /></p><p>​向量$$\vec{X}_{t_0-W+1}$$收集$$t$$时刻的所有特征值；特征为从计算节点采集的传感器测量值。$$W$$是模型$$M$$作为输入的过去窗口的大小。如果模型不考虑过去的值--就像作为基线实现的稠密模型一样[ 5 ] --并且窗口大小W为1，问题可以简化为估计：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/5cb1abe2-3457-45db-93ff-06f85c66a88d.png" alt="img" /></p><p>​在自编码器的情况下，模型$$M$$由两部分组成：自编码器$$A$$ (一个神经网络)和异常分数，异常分数由自编码器的重构误差计算。通过比较自编码器模型A的输出与真实值向量$$\vec{X}_{t_0}$$，计算重构误差。模型$$A$$的任务是重构其输入序列的最后一个元素：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/06780c86-bbab-40e4-b396-35cc7a095771.png" alt="img" /></p><p>​向量$$\hat{\vec{X}<em>{t_0}}$$( t0为向量$$\vec{X}</em>{t_0}$$的重构。同上式2，窗口大小$$W$$可取1。模型$$M$$输出归一化后的数据。重建误差计算为绝对误差之和模型$$A$$的输出与每个特征的归一化输入值之间的差值：$$\text{Error}(t_0) = \sum{}^N_i{|\hat{x_i} - x_i|}$$，其中$$N$$是特征的个数，$$\hat{\vec{x_i}}$$是模型A的输出。然后将误差除以训练集上的最大误差进行归一化：$$\text{Normalized error}(t_0) = \frac{\text{Error}(t_0)}{max(\text{Error}(t))}$$。我们估计第1类(异常)的概率为</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/cf20d21d-4977-4e84-92c3-7122866db94f.png" alt="img" /></p><p>基于概率$$P(\vec{x}<em>{t_0} \text{是异常})$$ ，分类器对序列 $$\vec{x}</em>{t_0-W}, ... , \vec{x}_{t_0}$$是否属于第0类(正常运行)中的第1类(异常)进行预测。这个预测依赖于一个阈值$$T$$，它是一个可调参数：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/d743a294-c627-4f78-90ae-89fb14028515.png" alt="img" /></p><p>​为了避免选择特定的阈值$$T$$，我们引入了接收者-操作者特征曲线( Receiver- operator characteristic curve，ROC曲线)作为性能指标。它允许我们评估所有可能的决策阈值的分类方法的性能[ 51 ]。接受者-操作者特征曲线绘制了真阳性率与假阳性率的关系。随机决策表示两者之间的线性关系- -对于一个分类器来说要有意义，ROC曲线需要在对角线上方。对于曲线上的每个特定点，ROC曲线位于另一曲线上方的分类器为较好的分类器。分类器的整体性能可以用ROC曲线下的面积( Area Under the ROC Curve，AUC )来定量计算；一个做出随机决策的分类器的AUC等于0.5。AUC得分低于0.5的指定分类器比随机选择差。最好可能的AUC分数是1，这是通过一个分类器实现的，它将实现真阳性率等于1，同时具有0 (从广义上讲,这只能在微不足道的数据集或非常简单的学习任务上实现)的假阳性率。</p><h3 id="3-3-小基线：指数平滑法">3.3 小基线：指数平滑法</h3><p>​指数平滑作为一个平凡的基线比较来实现。它是一种简单且计算廉价的方法，可以检测数值中的快速变化(跳跃)。如果异常只是简单的数值快速变化，特征之间不存在相关性，那么简单的指数平滑方法就可以将其区分开来。因此，我们选择指数平滑作为第一个基线，因为它在计算上是廉价的，并且不需要训练集。此外，如果指数平滑表现不佳，这强调我们确实在解决一个非平凡的异常检测问题，为此需要更强大的模型。</p><p>​对于基线，我们选择独立地实现每个特征的指数平滑。特征i在t时刻的指数平滑计算为：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/f3d9817b-7695-4d4c-a28c-a79684c751f7.png" alt="img" /></p><p>​其中x ( i )是t时刻xi的估计，α是方法的参数.我们对集合F中的所有特征都这样做，观测开始时的估计值等于t0时刻的实际值：x ( i t0 = xi t0 )。</p><h3 id="3-4-无监督基线：聚类">3.4 无监督基线：聚类</h3><p>​一种可能的无监督异常检测方法是使用标准的无监督机器学习技术，如文献[ 20 ]提出的k - means聚类。簇的确定是在训练集上进行的；属于测试集的每个新实例都与其中一个预训练的簇相关联。我们选择这种特殊的无监督技术进行比较，因为它是文献(就我们所掌握的知识而言)中发现的唯一一种使用传感器数据而不是日志的无监督方法，因此我们保证了公平的比较。然而，需要指出的是，聚类虽然属于无监督机器学习领域，但无法以无监督的方式检测异常- -对于在训练集上确定的每个聚类，必须计算异常的概率。这个概率只能通过标签来计算。</p><p>​本文采用文献[ 20 ]中的聚类方法来证明所得结果的有效性。我们使用了K - means聚类[ 19 ]，就像在[ 20 ]中提出的那样。我们在训练集上对聚类进行了训练。根据训练集上的轮廓得分1，我们确定了每个节点的最佳聚类数2。对于每个确定的簇，计算属于第1类的实例的百分比。我们用这个异常实例的百分比作为每个实例分配到特定集群的异常概率。训练集和测试集的划分与所有其他评价方法相同。</p><h3 id="3-5-半监督基线：稠密自编码器">3.5 半监督基线：稠密自编码器</h3><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/0b4505ec-8fc2-4bbc-8902-b46b9ed5b6c0.png" alt="img" /></p><p>​竞争基线方法是基于当前最先进的稠密自编码器模型[ 5 ]提出的。自编码器是一种神经网络( NN )，它的训练目的是重现它们的输入。该网络分为两个(通常是对称的)部分：编码器和解码器。编码器的作用是将输入压缩为更浓缩的表示。这种表示被称为潜在层。为了防止网络学习简单的身份函数，我们选择隐层小于原始输入大小(输入特征数量) [ 6 ]。解码器的作用是利用潜在表示对原始输入进行重构。</p><p>​稠密自编码器是异常检测的常用选择，因为我们可以通过作用于隐层的大小来限制其表达能力。压缩潜在维度迫使编码器从输入数据中提取最显著的特征；除非输入数据是高度冗余的，否则自动编码器不能正确地学习以重新创建它经过一定的潜在尺寸缩减后的输入。在当前生产超级计算机的异常检测技术中( [ 5 ] )，稠密自编码器以半监督的方式使用，这意味着网络仅使用与超级计算机节点正常运行对应的数据点( 0类)进行训练。半监督训练是可行的，因为正常点占绝大多数，因此很容易获得；然而，这需要有标记的数据，或者至少有一定的确定性，HPC系统在正常条件下运行足够长的时间。一旦自动编码器仅使用正常数据进行训练，它将能够识别相似但先前未见过的点。相反，它将努力重建新的不遵循学习到的正常行为的点，即我们正在寻找的异常；因此，重建误差会更高。自编码器模型的结构如图1a所示。稠密自编码器没有考虑数据的时间动态性，其输入和目标输出是相同的向量：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/e31ae9f1-0483-4fb3-b4f9-1d39ab0bfbfc.png" alt="img" /></p><h3 id="3-6-循环无监督异常检测：RUAD">3.6 循环无监督异常检测：RUAD</h3><p>​在超越现有模型的基础上，我们提出了一种不同的方法，RUAD。它将一个向量序列作为输入，然后尝试只重构该序列中的最后一个向量：</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/0ef4ec40-d478-47cd-9eb5-4a675d31bcba.png" alt="" /></p><p>​输入序列长度是一个可调参数，它指定了观察窗口$$$$的大小。所提出的方法的思想在原理上类似于密集自编码器，但有两个重要的扩展：1 )我们将输入序列编码成更有效的表示(隐层)，2 )我们以无监督的方式(从而消除了对标记数据的要求)训练自编码器。第一个创新点的关键见解是，虽然描述超级计算节点的数据是由多元时间序列组成的，但最先进的方法并没有明确地考虑时间维度--密集自编码器既没有时间的概念，也没有数据点序列的概念。为了克服这个限制，我们的方法通过对导致异常的值序列进行编码来实现。编码器网络由长短期记忆( LSTM )层组成，这些层经常被证明非常适合时间维度相关的上下文[ 53 ]。LSTM层由递归细胞组成，这些细胞有来自上一个时间戳的输入和来自长期记忆的输入。</p><p>​为了解决当前的近百亿亿次和未来的百亿亿次HPC系统规模将由数千个节点组成的问题[ 3 ]，我们需要一种可扩展的异常检测方法。目前在整个超级计算机上进行异常检测的最可扩展的方法是节点特定的方法，因为每个计算节点都可以训练自己的模型。尽管如此，我们希望通过最小程度地影响HPC系统的正常运行来实现这一目标。这就是为什么所提出的解决方案具有较小的开销是很重要的。此外，由于我们想训练一个每一个节点的模型，我们希望该方法具有数据有效性。为了满足这些要求，我们选择不使解码器对称于编码器。因此，本文提出的方法由一个Dense解码器和一个LSTM编码器组成。LSTM编码器的输出被传递到一个密集解码器中，该解码器通过在输入序列中重新生成最终的向量来训练。因此，解码器网络由全连接的密集层组成。所提出的方法的体系结构与最先进的方法在图1中进行了比较。</p><p>​训练复杂度的降低使得我们可以为每个计算节点训练一个单独的模型。正如之前所示( [ 54 ] )，节点特定的模型提供了比在所有数据上训练的单个模型更好的结果。经过初步的实证分析，在没有显著的精度损失的情况下，我们决定采用这种方案(每个节点有一个模型)，而训练时间大大减少了(约50 %)；这在我们的案例中是非常重要的，因为我们为Marconi 100 ( 980+)的每个节点训练了一个DL模型，这无疑是一个不可忽略的计算努力。</p><h3 id="3-7-数据预处理">3.7 数据预处理</h3><p>​正如第3.6节所介绍的那样，我们提出的方法包括为每个节点训练一个模型。因此，每个节点的数据首先被分割成训练集和测试集。训练集包含80 %的数据，测试集包含最后20 %的数据(大致上最近两个月的数据)。需要强调的是，我们选择了两个不重叠的数据集进行训练和测试。这就避免了处理测序时信息的交叉传递。此外，检验的因果性得以保留。(没有使用未来的数据来训练模型)。这使得研究结果对实际使用是有效的。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/6af9b82d-7f2d-4cee-9b8b-637c3e3c73df.png" alt="img" /></p><p>​对于半监督训练，通过去除异常事件(异常事件由节点异常标签识别,如3.1节所述)对训练集进行筛选。我们将该滤波器命名为半监督滤波器，如图2所示。对于无监督学习，不对训练集进行筛选。对于两种情况(无监督和半监督学习)，均使用标签对结果进行评估。滤波后，一个定标器被拟合到训练数据中。定标器是将数据缩放到[ 0、1 ]区间的转换器。在实验部分，在每个特征上使用min / max定标器[ 55 ]。在对训练数据进行拟合后，将定标器应用于测试数据- -为了对测试集进行重新定标，训练集的min和max值使用(因为这是DL方法的标准做法)。缩放后，训练集和测试集都被过滤掉，以确保时间一致性：数据被分割成没有缺失块(缺失的组块是半监督过滤的结果)的序列。小于$$W$$的序列被删除。最后，将序列转化为长度为$$W$$的批量序列。图2描述了整个数据预处理流程。</p><h3 id="3-8-评价方法的总结">3.8 评价方法的总结</h3><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/34288153-d685-48bf-880f-849e493be23c.png" alt="img" /></p><p>​我们将我们提出的方法RUAD与已建立的半监督和无监督基线进行了比较。预处理过滤器的总结如表3所示。半监督滤波器适用于所有的半监督方法。时间一致性滤波器应用于明确考虑数据时间维度的方法：指数平滑和RUAD。在半监督和无监督版本中对RUAD和当前基于稠密自编码器的SoA异常检测方法( [ 5 ] )进行了评估。</p><p>​我们希望强调的是，与无监督学习基线[ 20 ]不同，我们提出的方法RUAD在模型训练后不需要额外的动作。本文提出的方法RUAD在无标记数据集上工作，不需要额外的训练后分析。与训练集需求相关的方法总结如表4所示。</p><p><img src="https://raw.githubusercontent.com/Cerber2ol8/blog-img/main/imgs/cb051fa3-40da-4419-bfc1-c9e003a50886.png" alt="img" /></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;摘要&quot;&gt;摘要&lt;/h2&gt;
&lt;p&gt;现代高性能计算（HPC）系统的复杂性日益增加，需要引入自动化和数据驱动的方法，以支持系统管理员为增加系统可用性的努力。异常检测是改善可用性不可或缺的一部分，因为它减轻了系统管理员的负担，并减少了异常和解决方案之间的时间。但是，对当前的</summary>
      
    
    
    
    
    <category term="Aiops" scheme="https://www.aweisite.top/tags/Aiops/"/>
    
  </entry>
  
  <entry>
    <title>Quiet-STaR：让语言模型在“说话”前思考</title>
    <link href="https://www.aweisite.top/posts/fb2e3334.html"/>
    <id>https://www.aweisite.top/posts/fb2e3334.html</id>
    <published>2024-10-17T00:48:05.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>Quiet-STaR：让语言模型在“说话”前思考</h1><p>论文： <a href="https://arxiv.org/abs/2403.09629"> [arxiv 2403.09629]Quiet-STaR- Language Models Can Teach Themselves to Think Before Speaking（Stanford 2024）</a></p><h2 id="1-背景">1. 背景</h2><h2 id="1-1-CoT与StaR">1.1 CoT与StaR</h2><p>通过生成中间推理步骤（rationale），可以显著提高大型语言模型（LLM）在复杂推理任务（如数学、常识性问答）中的表现。比如“思维链”，但是它需要构建大量基本原理（思考过程）数据集，或者需要使用牺牲准确性的few-shot方式。</p><p>&quot;Self-Taught Reasoner&quot; (STaR) 自学推理机 技术采用了一种迭代自我增强的策略，利用少量理由样例和大量无理由的数据集，不断提升模型的复杂推理能力。核心流程如下：</p><p><img src="../images/20231-01207-01/img-3.png" alt="upload successful" /></p><ol><li class="lvl-3"><p>通过小样本提示LLM生成回答的理由。</p></li><li class="lvl-3"><p>如果生成的答案错误，给模型提供正确的答案，重新生成理由。</p></li><li class="lvl-3"><p>将正确生成的理由加入到微调数据集。</p></li><li class="lvl-3"><p>不断重复该过程。</p></li></ol><h3 id="1-2-StaR存在的问题">1.2 StaR存在的问题</h3><p>STaR 通过从问答中的少数例子中推断基本原理并从那些导致正确答案的例子中学习，使得大语言模型可以通过利用其自身的推理能力来改进自身。</p><p>STaR证明了：语言模型可以通过采样理由来尝试回答问题，并带着理由进行训练，可增强其在问答（QA）数据集上的推理能力，但也存在如下缺陷：</p><ol><li class="lvl-3"><p>其侧重于于单个任务或预定义的任务集</p></li><li class="lvl-3"><p>其推理任务需要针对提供的答案-原因对数据集，也就是依赖提供的数据集去构建推理任务。</p></li><li class="lvl-3"><p>人为策划的QA数据集限制了其基本原理的规模和普遍性。</p></li></ol><p>理想情况下，语言模型应当可以学习推断任意文本中未阐明的基本原理，而不依赖于特定的QA数据集。针对上述问题，文章提出了Quiet-STar方法。</p><h2 id="2-Quiet-StaR方法">2. Quiet-StaR方法</h2><h3 id="2-1-概述">2.1 概述</h3><p>Quiet-STaR扩展了STaR，该方法训练LM来生成推理内容，帮助它从大型互联网文本语料库中推断出未来的文本，允许LM从各种任务中学习，而不仅是数学QA或特定推理任务。其利用语言模型预先存在的推理能力来生成基本原理，并基于强化学习方法的奖励来训练语言模型。</p><p>该方法让LM学习每个token生成的基本原理来解释未来的文本，从而改进其预测。可以理解为“安静地”应用STaR，训练模型在说话（输出文本）前先思考。</p><h3 id="2-2-基本思想">2.2 基本思想</h3><p>模型在预测每一个token之前，就先输出固定长度的思考内容，然后再基于思考的内容进行下一步预测。</p><p><img src="../images/20231-01207-01/img-4.png" alt="upload successful" /></p><p>大体来说，其做法是：首先在每个token生成后，生成一串基本原理token来解释未来的文本（think），将带有想法和不带有想法的下一个预测token进行混合（talk），然后使用REINFORCE增加有助于模型预测未来文本的想法的可能性，同时丢弃使未来文本不太可能出现的想法(learn)。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>思考（Think） 并行理由生成</strong></p></li></ul><p>并行为每个token分别生成多个可能的“思考”序列，输入为整个训练句子<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>X</mi><mrow><mn>0</mn><mo>:</mo><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">X_{0:n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，每个token的思考序列数量r，每条思考序列的长度t，其中n为token数量。每个token的多个思考序列之间使用<code>&lt;开始思考&gt;</code>和<code>&lt;结束思考&gt;</code>token包围，这些token也是可学习的嵌入向量。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>表达（Talk），混合带有理由预测和基础预测</strong></p></li></ul><p>使用模型生成的思考来预测下一个token，并与原始预测token进行混合，生成最终的输出。这个混合过程由一个浅层MLP组成的“混合头”（Mixing Head）控制，它学习如何更好地结合思考前后的预测结果。</p><ul class="lvl-0"><li class="lvl-2"><p><strong>学习（learn），优化理由生成</strong></p></li></ul><p>使用强化学习算法来优化思考过程，如果某个思考序列能够提高后续文本预测准确率，那么生成这个序列的概率就会增加，循环这个过程，使得语言模型能够逐步提升自己的推理能力，该过程不仅预测接下来的一个token，而是预测接下来的多个token。</p><h3 id="2-3-具体工作流">2.3 具体工作流</h3><p><img src="../images/20231-01207-01/img-4.png" alt="upload successful" /></p><p>1.原始文本（Origin Text）</p><p>原始文本输入序列： <code>4 2 + 1 2 = 5 4 \n</code>, 输入序列长度n为9。</p><p>2.思考过程（Think）</p><p>指定超参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span>来表示生成的“思考”序列数量，并行为每个token分别生成多个可能的“思考”序列，其中每个序列以<code>&lt;START&gt;</code>开始，以<code>&lt;END&gt;</code>结束，中间是语言模型生成的token。</p><p>3.采样想法（Sampled Thought）</p><p>使用生成的思考序列来预测下一个token，图中生成了两个序列：序列<code>2 + 2</code>有助于预测下一个token，而序列<code>4 + 1</code>对于预测没有帮助。</p><p>4.学习过程（Learn）</p><p>有助于预测的思考会得到奖励（绿色√），从而增加这种思考序列生成的概率，而没有帮助或有害的思考则会被丢弃（红色×），从而降低类似思考产生的概率。</p><p>5.模型更新</p><p>基于这个奖励/惩罚机制，语言模型不断更新，学习生成更有帮助的思考。这个过程允许模型通过生成内部“思考”来改善其预测的能力，而不需要外部监督。模型可以通过尝试不同的思考并评估它们的有用性来“自学”更好的推理策略。</p><h2 id="3-技术细节">3. 技术细节</h2><h3 id="3-1-问题描述">3.1 问题描述</h3><p>Quiet-STaR 在序列的每一对观测token之间引入一个辅助的&quot;理由&quot;变量，其目标是优化一个参数为θ的语言模型，该模型具有生成中间思想(或理论基础)的能力，使得</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace width="1em"/><mi>θ</mi><mo>=</mo><msub><mtext>arg max</mtext><mi>θ</mi></msub><msub><mi>E</mi><mi>x</mi></msub><mo stretchy="false">[</mo><mi>l</mi><mi>o</mi><mi>g</mi><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mi>i</mi><mo>:</mo><mi>n</mi></mrow></msub><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mrow><mn>0</mn><mo>:</mo><mi>i</mi></mrow></msub><mo separator="true">,</mo><mi>r</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mi>a</mi><mi>l</mi><msub><mi>e</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mrow><mn>0</mn><mo>:</mo><mi>i</mi></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\quad \theta = \text{arg max}_\theta E_x[logp_\theta(x_{i:n}|x_{0:i}, rationale_\theta(x_{0:i})]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord text"><span class="mord">arg max</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.242em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2441em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">na</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)]</span></span></span></span></p><p>其中n为输入序列长度。</p><p>也就是说，通过找到参数 θ，使得在给定输入序列和基于该序列生成理由的情况下，生成后续序列的概率最大化。</p><h3 id="3-2-存在的挑战与解决方案">3.2 存在的挑战与解决方案</h3><p>Quiet-STaR 需要在输入序列的每个token位置高效地生成推理，且每个令牌单独的前向传递，这对于长序列来说在计算上变得难以处理。</p><p>也就是说，对于一个输入序列，模型不仅要预测下一个token，还需要根据当前位置之前的token生成一个推理序列，这个过程增加了额外的计算开销。</p><p>针对这个问题，Quiet-STaR使用了<strong>并行采样</strong>算法。</p><h4 id="3-2-1-并行采样算法">3.2.1 并行采样算法</h4><p><img src="../images/20231-01207-01/img-5.png" alt="upload successful" /></p><p>语言模型会在推理的过程中为所有输入token生成下一个token的分布，这允许模型为每个token采样一个后续token。比如输入序列为<code>&lt;bos&gt; the cat sat</code>，对于其中的每个token，可能会生成下面的预测<code>yes</code>、<code>orange</code>、<code>saw</code> 、<code>down</code>，每个后继token本身对于序列前缀来说都是一个合理的下一个token。</p><p>首先，我们知道Masked Self-attention的权重为如下所示的形式</p><p><img src="../images%5C20231-01207-01%5Cimg-6.png" alt="upload successful" />Attention在经过Mask后，只有一部分被保留。也就是下面右图中的左上部分。</p><p><img src="../images%5C20231-01207-01%5Cimg-7.png" alt="upload successful" /></p><p>Quiet-STaR缓存每个前向传递的结果，将一个对角线注意力掩码串接到前一个注意力掩码上，每个生成的想法token只需要计算用于它与生成它路径token的注意力，以及和它自己的注意力，而不需要计算其他路径上token的注意力。如图所示，如果我们输入序列为<code>a b c d</code>，即序列长度n=4，理由采样数量r为1，那么会产生<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>×</mo><mi>r</mi><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">n × r = 4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>个想法通路，每个想法通路的长度为t（t&gt;2)。</p><p>这个过程一共需要得到$$n × r = 4$个token序列，直接按照原来的attention计算方式会对每个通路进行单独计算，这会带来计算量的浪费。然而，我们可以缓存<code>a-&gt;b-&gt;c-&gt;d</code> 的生成路径，于是便可以直接得到<code>a' b' c' d'</code>四个token（因为<code>a'</code>和<code>b</code>都是a生成token的候选），这样就分别得到了a、b、c、d第一个thought的第一个token。然后，我们通过计算<code>a b c d</code>序列的masked self-attention，它们和<code>a' b' c' d'</code>的masked atttion，以及<code>a' b' c' d'</code>各自对自身的self-attention，就得到了上面右侧的三个矩阵。对于a的第一个想法路径，其下一个应该是<code>a''</code>，它需要计算的是<code>a a'</code>的masked self-attention，它恰好可以由上面的三个矩阵的一部分拼接而成。</p><div style="display: flex; justify-content: center; gap: 20px;"><img title="" src="../images\20231-01207-01\img-8.png" alt="Image 1" style=" width:200px;"> <img title="" src="../images\20231-01207-01\img-9.png" alt="Image 2" style="width:200px;" data-align="inline"> <img title="" src="../images\20231-01207-01\img-10.png" alt="Image 3" style="width:200px;"></div><p>同理，对于<code>b''</code>，我们也可以将<code>a b</code>做attention的结果，拼接上<code>b'</code>与<code>a b</code>的attention和<code>b'</code>对自己的attention得到，<code>c'' d''</code>也是如此。也就是说，我们在得到上面三个矩阵的时候，就同时得到了<code>a'' b'' c'' d''</code>所需要的attention矩阵。通过这种方式，我们在基本序列计算完成之后，就可以立即得到对每个token其中一个采样通路的第一个token，这样就能够完成同时对所有通路进行采样。</p><h4 id="3-2-2-混合头">3.2.2 混合头</h4><p>为了平滑向思维过渡，Quiet-STaR在有思维和无思维的预测之间引入了一个学习的插值。给定思考结束token的隐藏状态和原始文本不带thought的CLS token的隐藏状态，混合头输出一个权重，该权重决定了思维后预测logits将被使用的程度。这个头部使用的是一个浅层的多层感知器，为每个token输出一个标量。其作用类似于在语言模型内部的“对话系统”，用于确定是听从带有思考的推理结果还是不带思考的推理结果。对于不同的上下文，混合头可以学会何时更多地依赖思考，合适更多地依赖原始预测。</p><h4 id="3-3-3-优化理由生成">3.3.3 优化理由生成</h4><p>Quiet-STaR 将开始和结束标记嵌入初始化为破折号<code>-- </code>对应的嵌入，其在文本数据中经常出现，表示停顿或想法。这充分利用了语言模型的先验知识。从直观上来看，开始的思想token可以理解为将模型放入&quot;思维模式&quot;中，结束的思想token可以理解为它告诉模型什么时候完成了思考。</p><h4 id="3-3-4-非短视评分和Teacher-forcing">3.3.4 非短视评分和Teacher-forcing</h4><p><strong>非短视评分</strong></p><p>由于我们并不期望思考在预测每一个token时都是有用的，因此我们更希望模型的奖励更多地依赖于思考后面的语义内容，而不是依赖于下一个确切的单词。因此Quiet-STaR采用了一种非短视(non-myopic)的损失函数，同时预测多个未来token的同时，模型计算理性思考对接下来n_true个token的预测效果。这样做可以使得模型能更全面评估理性思考的实际作用，而不是仅仅是用于预测下一个token，非短视损失函数也可以捕捉那些不会立即带来好处，但会对预测更远的结果有帮助的token。这种方式提高了Quiet-STaR的性能，特别是在需要进行长序列推理的任务中。</p><p><strong>Teacher-forcing</strong></p><p>Teacher-forcing是一种在序列生成任务中常见的训练技术，它通过在训练过程中使用真是标签（实际的目的序列）来作为输入，帮助模型更快速地收敛。</p><p>比如，给定输入句子“我想吃”，模型需要预测的下一个词可能是“冰淇凌”、“炸鸡”等。如果没有Teacher-forcing，模型会在生成每个词时依赖前一步的输出。如果模型一开始的输出就不准确，那么后续的词也大概率不准确，这种错误会逐渐累积，最终造成预测的词和预期相差甚远。而Teacher-forcing会直接将每一步的真实标签（目的序列中的下一个词）作为下一步模型的输入，从而保证模型不会因为错误累积而无法快速学习到序列关系。</p><p><img src="../images%5C20231-01207-01%5Cimg-11.png" alt="upload successful" />其中实线表示语言模型计算，虚线表示通过Teacher-forcing插入token，搅拌器表示混合头。</p><p>在并行生成思考时，模型同时从序列的每个位置生成多个思考序列，这些序列与真实序列之间没有直接对应关系，模型无法根据这些生成的序列与真实序列间的差异来更新模型参数。比如对于原始输入序列<code>the cat sat on the mat.</code> ，对于token <code>cat</code> 模型可能会生成下面几个理性思考：<code>Because it is an animal.</code>、<code>Because it is a pet.</code>、<code>Because it is mentioned in the text.</code>。 这些理性思考序列是并行生成的，没有明确的“正确”答案，因为多个理性思考序列都可能合理解释下一个token的出现，传统的反向传播方法就无法直接应用。</p><p>为了解决上述问题，Quiet-STaR首先基于当前的理性思考来预测未来的n_true个token，然后通过Teacher-forcing将真实未的未来token作为输入，继续预测更远的未来token。通过该方式，模型可以接收到关于其预测准确性的反馈，避免了生成的thought没有真实标注无法直接通过反向传播梯度的问题，使得模型更倾向于在未来的迭代中生成更有用的思考，并且不会因之前的错误累积影响未来token的预测。</p><p><em><strong>参考文献</strong></em></p><ol><li class="lvl-3"><p><a href="https://arxiv.org/abs/2403.09629"><em>Quiet-STaR: Language Models Can Teach Themselves to Think Before Speaking</em></a></p></li><li class="lvl-3"><p><a href="https://www.bilibili.com/video/BV1x8sQerEar"><em>bilibili@学术砖家 Quiet-STaR解读</em></a></p></li><li class="lvl-3"><p><a href="https://www.bilibili.com/video/BV1NQsre2EEC"><em>bilibili@mardinff Quiet-STaR解读</em></a></p></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;Quiet-STaR：让语言模型在“说话”前思考&lt;/h1&gt;
&lt;p&gt;论文： &lt;a href=&quot;https://arxiv.org/abs/2403.09629&quot;&gt; [arxiv 2403.09629]Quiet-STaR- Language Models Can Teach</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>机器学习笔记——EM算法</title>
    <link href="https://www.aweisite.top/posts/f511c36f.html"/>
    <id>https://www.aweisite.top/posts/f511c36f.html</id>
    <published>2024-10-08T20:52:00.000Z</published>
    <updated>2026-06-11T09:31:37.286Z</updated>
    
    <content type="html"><![CDATA[<p>EM（期望最大，Expectation-Maximization）算法是一种常用的迭代优化算法，通常用于含有<strong>隐变量</strong>或<strong>不完全数据</strong>的问题中，旨在估计模型的参数，使得对观测数据的对数似然函数达到最大化。它广泛应用于混合高斯模型（GMM）、隐马尔可夫模型（HMM）、协同过滤等问题中。</p><h3 id="EM算法的基本思想">EM算法的基本思想</h3><p>EM 算法通过<strong>迭代</strong>地执行两个步骤：</p><ul class="lvl-0"><li class="lvl-2"><p><strong>E 步（期望步，Expectation Step）</strong>：在当前参数的基础上，计算隐含变量的<strong>期望值</strong>。</p></li><li class="lvl-2"><p><strong>M 步（最大化步，Maximization Step）</strong>：给定隐含变量的期望值，最大化似然函数，重新估计模型参数。</p></li></ul><p>这个过程会在 E 步和 M 步之间反复迭代，直到模型的参数收敛到一个局部最优解。</p><h3 id="EM算法的核心步骤">EM算法的核心步骤</h3><p>假设我们有一些带有隐变量的数据，数据的联合分布为 P(X,Z∣θ)，其中：</p><ul class="lvl-0"><li class="lvl-2"><p>X 是<strong>观测数据</strong>（可见数据）。</p></li><li class="lvl-2"><p>Z 是<strong>隐变量</strong>（隐藏数据）。</p></li><li class="lvl-2"><p>θ 是模型的<strong>参数</strong>，我们希望通过 EM 算法来估计这些参数。</p></li></ul><p>EM 算法的目标是通过最大化<strong>对观测数据的似然函数</strong>来估计参数：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><mi>X</mi><mo>∣</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>Z</mi><mo>∑</mo><mtext>​</mtext><mi>P</mi><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mi>Z</mi><mo>∣</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">L(θ)=P(X∣θ)=Z∑​P(X,Z∣θ)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">​</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)</span></span></span></span></p><p>由于隐变量 Z 的存在，直接求解对数似然比较复杂，因此通过 EM 算法来迭代优化。具体步骤如下：</p><h4 id="1-初始化：">1. <strong>初始化</strong>：</h4><p>首先，我们对参数 θ 进行<strong>初始化</strong>。这些初始值可以随机选取或通过某些启发式方法得到。</p><h4 id="2-E-步（期望步）：">2. <strong>E 步（期望步）</strong>：</h4><p>在 E 步中，给定当前模型参数 θ(t)，计算隐变量的<strong>条件期望</strong>。直观上讲，这一步是计算在当前参数下，隐变量 Z 的可能取值。具体而言，E 步计算的是<strong>后验分布</strong>：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>∣</mo><msup><mi>θ</mi><mrow><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo><mo>=</mo><msub><mi>E</mi><mrow><mi>Z</mi><mo>∣</mo><mi>X</mi><mo separator="true">,</mo><msup><mi>θ</mi><mrow><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow></msup></mrow></msub><mtext>​</mtext><mo stretchy="false">[</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi>P</mi><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mi>Z</mi><mo>∣</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">Q(θ∣θ^{(t)})=E_{Z∣X,θ^{(t)}}​[logP(X,Z∣θ)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">Q</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.138em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1556em;vertical-align:-0.4056em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.4694em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span><span class="mrel mtight">∣</span><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span><span class="mpunct mtight">,</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.822em;"><span style="top:-2.822em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5357em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4056em;"><span></span></span></span></span></span></span><span class="mord">​</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mclose">)]</span></span></span></span></p><p>这相当于在当前参数 θ(t) 下，给定观测数据 X，计算 Z 的<strong>期望值</strong>，从而得到一个新的目标函数 Q(θ) 来表示。</p><h4 id="3-M-步（最大化步）：">3. <strong>M 步（最大化步）</strong>：</h4><p>在 M 步中，最大化步骤是通过更新参数 θ 来最大化上一步中计算得到的 Q(θ∣θ(t))：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo stretchy="false">(</mo><mi>t</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>θ</mi><mi>m</mi><mi>a</mi><mi>x</mi><mtext>​</mtext><mi>Q</mi><mo stretchy="false">(</mo><mi>θ</mi><mo>∣</mo><mi>θ</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">θ(t+1)=argθmax​Q(θ∣θ(t))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mord">​</span><span class="mord mathnormal">Q</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∣</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">))</span></span></span></span></p><p>这一优化过程可以被视为是寻找使得期望似然函数最大的参数。</p><h4 id="4-迭代过程：">4. <strong>迭代过程</strong>：</h4><p>重复执行 E 步和 M 步，直到参数 θ 的变化足够小（即达到某个收敛条件），或者对数似然函数的改进趋于停止。</p><h3 id="EM-算法的直观理解">EM 算法的直观理解</h3><ol><li class="lvl-3"><p><strong>初始参数</strong>：在初始参数下，模型对数据的描述可能不太准确，但给定参数后，我们可以计算隐含变量的期望值（E 步）。</p></li><li class="lvl-3"><p><strong>隐变量的更新</strong>：基于当前参数的模型假设，推断每个数据点的隐变量（如在高斯混合模型中，这是每个数据点属于哪个高斯成分的概率）。</p></li><li class="lvl-3"><p><strong>参数的更新</strong>：在给定隐变量的期望值后，最大化似然估计，更新模型参数，使模型更好地拟合观测数据（M 步）。</p></li><li class="lvl-3"><p><strong>重复</strong>：这一过程反复执行，随着参数的更新，模型逐渐收敛到一个能解释数据的较优状态。</p></li></ol><h3 id="EM-算法的应用示例">EM 算法的应用示例</h3><p><strong>高斯混合模型（GMM）</strong> 是 EM 算法的典型应用场景。假设数据是由多个高斯分布混合生成的，我们不知道每个数据点来自哪个高斯分布。EM 算法帮助我们估计每个数据点属于哪个高斯分布（隐含变量），以及每个高斯分布的参数。</p><p><strong>GMM中的EM算法过程：</strong></p><ol><li class="lvl-3"><p><strong>初始化</strong>：初始化每个高斯成分的均值、协方差矩阵和混合系数。</p></li><li class="lvl-3"><p><strong>E 步</strong>：根据当前的高斯成分参数，计算每个数据点属于每个高斯分布的概率（即计算隐含变量的期望值）。</p></li><li class="lvl-3"><p><strong>M 步</strong>：利用这些概率来更新每个高斯分布的参数（均值、协方差和混合系数）。</p></li><li class="lvl-3"><p><strong>迭代</strong>：不断重复 E 步和 M 步，直到参数收敛。</p></li></ol><h3 id="优缺点">优缺点</h3><ul class="lvl-0"><li class="lvl-2"><p><strong>优点</strong>：</p><ul class="lvl-2"><li class="lvl-4">适用于<strong>隐变量模型</strong>，尤其是观测数据不完整或带有噪声的情况。</li><li class="lvl-4">每次更新步骤都会增加对数似然函数的值，保证算法的收敛性。</li></ul></li><li class="lvl-2"><p><strong>缺点</strong>：</p><ul class="lvl-2"><li class="lvl-4">EM 算法只能保证<strong>局部最优解</strong>，无法保证找到全局最优解。</li><li class="lvl-4">对初始参数较为敏感，容易陷入局部最优。</li><li class="lvl-4">在某些模型中，E 步可能计算复杂或涉及数值不稳定性。</li></ul></li></ul><h3 id="总结">总结</h3><p>EM 算法通过两个步骤交替迭代：E 步估计隐变量的期望，M 步最大化期望似然函数，逐步优化模型参数。它是处理隐变量或不完全数据的一种常用方法，广泛应用于<strong>聚类分析</strong>、<strong>混合模型</strong>和<strong>隐马尔可夫模型</strong>等领域。</p><h3 id="代码实现">代码实现</h3><h4 id="高斯混合模型（GMM）中的-EM-算法">高斯混合模型（GMM）中的 EM 算法</h4><p>在这个例子中，我们有两组高斯分布的数据，并希望使用 EM 算法估计它们的参数。</p><h3 id="代码说明">代码说明</h3><ol><li class="lvl-3"><p><strong>数据生成</strong>：我们生成了两组二维高斯分布的数据，分别表示两个类。</p></li><li class="lvl-3"><p><strong>EM算法</strong>：</p><ul class="lvl-2"><li class="lvl-5"><strong>E步</strong>：在 <code>e_step</code> 函数中，给定当前参数（均值、协方差和权重），计算每个数据点属于每个高斯成分的后验概率（即责任度 <code>responsibilities</code>）。</li><li class="lvl-5"><strong>M步</strong>：在 <code>m_step</code> 函数中，使用 E 步计算的责任度来更新每个高斯成分的参数（包括均值、协方差和混合系数）。</li><li class="lvl-5"><strong>对数似然函数</strong>：在 <code>compute_log_likelihood</code> 中，我们计算了当前参数下数据的对数似然，用于判断算法是否收敛。</li></ul></li><li class="lvl-3"><p><strong>迭代过程</strong>：EM算法会不断执行E步和M步，直到对数似然函数收敛。</p></li></ol><h3 id="结果解释">结果解释</h3><p>最终输出的参数包括：</p><ul class="lvl-0"><li class="lvl-2"><p><strong>混合系数（weights）</strong>：表示每个高斯成分的权重，即每个类的比例。</p></li><li class="lvl-2"><p><strong>均值（means）</strong>：每个高斯分布的中心位置。</p></li><li class="lvl-2"><p><strong>协方差矩阵（covariances）</strong>：描述每个高斯分布的形状和大小。</p></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> scipy.stats <span class="keyword">import</span> multivariate_normal</span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机生成两个高斯分布的数据</span></span><br><span class="line">np.random.seed(<span class="number">0</span>)</span><br><span class="line">n_samples = <span class="number">300</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成数据</span></span><br><span class="line">mean1 = [<span class="number">0</span>, <span class="number">0</span>]</span><br><span class="line">cov1 = [[<span class="number">1</span>, <span class="number">0</span>], [<span class="number">0</span>, <span class="number">1</span>]]  <span class="comment"># 协方差矩阵为单位矩阵</span></span><br><span class="line">data1 = np.random.multivariate_normal(mean1, cov1, <span class="built_in">int</span>(<span class="number">0.5</span> * n_samples))</span><br><span class="line"></span><br><span class="line">mean2 = [<span class="number">3</span>, <span class="number">3</span>]</span><br><span class="line">cov2 = [[<span class="number">1</span>, <span class="number">0.2</span>], [<span class="number">0.2</span>, <span class="number">1</span>]]  <span class="comment"># 协方差矩阵有一定的相关性</span></span><br><span class="line">data2 = np.random.multivariate_normal(mean2, cov2, <span class="built_in">int</span>(<span class="number">0.5</span> * n_samples))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 合并两组数据</span></span><br><span class="line">data = np.vstack((data1, data2))</span><br><span class="line"></span><br><span class="line"><span class="comment"># EM 算法参数初始化</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">initialize_parameters</span>(<span class="params">n_clusters, n_features</span>):</span><br><span class="line">    weights = np.ones(n_clusters) / n_clusters  <span class="comment"># 初始化每个高斯分布的权重</span></span><br><span class="line">    means = np.random.rand(n_clusters, n_features) * <span class="number">5</span>  <span class="comment"># 初始化均值</span></span><br><span class="line">    covariances = np.array([np.eye(n_features)] * n_clusters)  <span class="comment"># 初始化协方差矩阵为单位矩阵</span></span><br><span class="line">    <span class="keyword">return</span> weights, means, covariances</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算 E 步，返回每个点属于每个高斯成分的后验概率</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">e_step</span>(<span class="params">data, weights, means, covariances, n_clusters</span>):</span><br><span class="line">    n_samples = data.shape[<span class="number">0</span>]</span><br><span class="line">    responsibilities = np.zeros((n_samples, n_clusters))</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(n_clusters):</span><br><span class="line">        rv = multivariate_normal(mean=means[k], cov=covariances[k])</span><br><span class="line">        responsibilities[:, k] = weights[k] * rv.pdf(data)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 归一化 responsibilities，使每个点属于不同高斯分布的概率和为1</span></span><br><span class="line">    responsibilities /= responsibilities.<span class="built_in">sum</span>(axis=<span class="number">1</span>, keepdims=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">return</span> responsibilities</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算 M 步，更新模型参数（均值、协方差和混合系数）</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">m_step</span>(<span class="params">data, responsibilities, n_clusters</span>):</span><br><span class="line">    n_samples, n_features = data.shape</span><br><span class="line">    weights = np.<span class="built_in">sum</span>(responsibilities, axis=<span class="number">0</span>) / n_samples</span><br><span class="line">    means = np.dot(responsibilities.T, data) / np.<span class="built_in">sum</span>(responsibilities, axis=<span class="number">0</span>)[:, np.newaxis]</span><br><span class="line">    </span><br><span class="line">    covariances = np.zeros((n_clusters, n_features, n_features))</span><br><span class="line">    <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(n_clusters):</span><br><span class="line">        diff = data - means[k]</span><br><span class="line">        covariances[k] = np.dot(responsibilities[:, k] * diff.T, diff) / np.<span class="built_in">sum</span>(responsibilities[:, k])</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> weights, means, covariances</span><br><span class="line"></span><br><span class="line"><span class="comment"># 计算对数似然函数，判断收敛</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">compute_log_likelihood</span>(<span class="params">data, weights, means, covariances, n_clusters</span>):</span><br><span class="line">    log_likelihood = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(n_clusters):</span><br><span class="line">        rv = multivariate_normal(mean=means[k], cov=covariances[k])</span><br><span class="line">        log_likelihood += weights[k] * rv.pdf(data)</span><br><span class="line">    <span class="keyword">return</span> np.log(log_likelihood).<span class="built_in">sum</span>()</span><br><span class="line"></span><br><span class="line"><span class="comment"># EM 算法主函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">em_algorithm</span>(<span class="params">data, n_clusters, n_iter=<span class="number">100</span>, tol=<span class="number">1e-4</span></span>):</span><br><span class="line">    n_samples, n_features = data.shape</span><br><span class="line">    weights, means, covariances = initialize_parameters(n_clusters, n_features)</span><br><span class="line">    </span><br><span class="line">    log_likelihoods = []</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n_iter):</span><br><span class="line">        <span class="comment"># E 步：计算 responsibilities</span></span><br><span class="line">        responsibilities = e_step(data, weights, means, covariances, n_clusters)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># M 步：更新权重、均值和协方差</span></span><br><span class="line">        weights, means, covariances = m_step(data, responsibilities, n_clusters)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 计算对数似然</span></span><br><span class="line">        log_likelihood = compute_log_likelihood(data, weights, means, covariances, n_clusters)</span><br><span class="line">        log_likelihoods.append(log_likelihood)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 检查收敛</span></span><br><span class="line">        <span class="keyword">if</span> i &gt; <span class="number">0</span> <span class="keyword">and</span> np.<span class="built_in">abs</span>(log_likelihoods[-<span class="number">1</span>] - log_likelihoods[-<span class="number">2</span>]) &lt; tol:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;EM算法在第 <span class="subst">&#123;i&#125;</span> 次迭代时收敛。&quot;</span>)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> weights, means, covariances, responsibilities</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行EM算法，寻找高斯混合模型的参数</span></span><br><span class="line">n_clusters = <span class="number">2</span></span><br><span class="line">weights, means, covariances, responsibilities = em_algorithm(data, n_clusters)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;混合系数:&quot;</span>, weights)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;均值:&quot;</span>, means)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;协方差:&quot;</span>, covariances)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;EM（期望最大，Expectation-Maximization）算法是一种常用的迭代优化算法，通常用于含有&lt;strong&gt;隐变量&lt;/strong&gt;或&lt;strong&gt;不完全数据&lt;/strong&gt;的问题中，旨在估计模型的参数，使得对观测数据的对数似然函数达到最大化。它广泛应用</summary>
      
    
    
    
    <category term="机器学习" scheme="https://www.aweisite.top/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="machine learning" scheme="https://www.aweisite.top/tags/machine-learning/"/>
    
  </entry>
  
  <entry>
    <title>Tree Of Thoughts 解读</title>
    <link href="https://www.aweisite.top/posts/dc4a249.html"/>
    <id>https://www.aweisite.top/posts/dc4a249.html</id>
    <published>2024-07-31T16:35:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-思维链（Chain-Of-Thought）">1. 思维链（Chain Of Thought）</h2><p>要介绍ToT，首先要介绍下大名鼎鼎的CoT，也就是<strong>思维链（Chain Of Thought）</strong>。</p><p><img src="../../images/20240731-01/image-20240731164038850.png" alt="image-20240731164038850" /></p><p>思维链属于**提示词工程(Prompt Engineering)**的一种，其主要思想是通过向大语言模型展示一些少量的样例，在样例中将多步问题分解为中间步骤，通过中间步骤得出最终答案。大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。CoT提示作为一种简单机制，成功引出大型语言模型中的多步推理行为，并在不同任务上表现出强大的性能提升。</p><p>我们使用喜闻乐见的一个比大小的例子来测试思维链的做作用。众所周知，强如gpt4这样的模型，面对如<code>11.3和11.11谁更大</code>这种问题时也会出现错误。（当前版本已经被修复了，先前同样的问题得到的答案是<code>11.11&gt;11.3</code>）</p><p><img src="../../images/20240731-01/image-20240731165607755.png" alt="image-20240731165607755" /></p><p>有人分析说其出现的原因是<code>xx.yy</code>这样的数字默认情况下被分词器拆分成了<code>xx</code>，<code>.</code>和<code>yy</code>三个不同的token，而没有当成一个整体。如果我们使用思维链来构建这个问题，就变成了下面的情况：</p><p><img src="../../images/20240731-01/image-20240731165758265.png" alt="image-20240731165758265" /></p><p>很显然模型根据给出的few-shot提示推理得到了正确的答案，在prompt提示下，模型理解了语句中的<code>.yy</code>是数学中的小数位，而不是附加上的额外数字。</p><p>思想链推理是模型规模的一个<strong>涌现性质</strong>，能够显著拓宽大型语言模型所能执行的推理任务范围。然而根据Wei等人的说法，“思维链仅在使用∼100B参数的模型时才会产生性能提升”。较小的模型编写了不合逻辑的思维链会导致精度比标准提示更差。通常，模型从思维链提示过程中获得性能提升的方式<strong>与模型的大小成比例</strong>。</p><h2 id="2-零样本思维链（Zero-shot-CoT）与自洽性思维链（Self-Consistency-CoT">2. 零样本思维链（Zero-shot-CoT）与自洽性思维链（Self-Consistency-CoT)</h2><p><strong>零样本思维链</strong>（Zero Shot Chain of Thought，Zero-shot-CoT）提示过程是对 CoT prompting的后续研究，引入了一种非常简单的零样本提示。他们发现，通过在问题的结尾附加“<strong>让我们一步步思考。</strong>”这几个词，大语言模型能够生成一个回答问题的思维链。从这个思维链中，他们能够提取更准确的答案。</p><p>OK，那同样的例子，再使用Zero Shot Chain of Thought，看一下结果。</p><p><img src="../../images/20240705-01/image-20240731170902619.png" alt="image-20240731170902619" /></p><p>可以看到，当时用<strong>let's think step by step</strong>后，LLM将其认为是一个数学问题并进行一步步拆分分析，最后推到出正确答案，并且这种方式不需要在提示阶段进行额外的推理提示。</p><p><strong>自洽性思维链</strong>（Self Consistency Chain of Thought ）是从语言模型中采样一组不同的输出，并返回该集中最一致的答案。这种集成方法在与思维链提示相结合时提高了推理的准确性。</p><p><strong>例如</strong>: INPUT:</p><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">“如果有3辆车在停车场，后来又来了2辆车，停车场共有几辆车？”</span><br></pre></td></tr></table></figure><p>通过温度采样（temperature sampling）、top-k采样或核采样（nucleus sampling）等模型生成多个推理路径，如下：</p><p>OUTPUT1：</p><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">3辆车在停车场，2辆车到达，共3+2=5辆车。</span><br></pre></td></tr></table></figure><p>OUTPUT2：</p><figure class="highlight tex"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">停车场有3辆车，后来2辆车到达，所以有5辆车。</span><br></pre></td></tr></table></figure><p>然后对生成的候选答案进行统计，记录每个答案出现的频率，通过对所有采样的推理路径的最终答案进行投票，选择出现频率最高的答案作为最终答案。</p><p>当然，以上只是一些常规推理问题，如果是类似于24点（给定4个数字，判断是否能通过加减乘除组合得到24）这种复杂问题，仅仅使用CoT还能否得到正确的答案呢？</p><p><img src="../../images/20231127-01/img-11.png" alt="upload successful" /></p><p>对于这个问题，文章<code>Tree of Thoughts: Deliberate Problem Solving with Large Language Models</code>表示，使用标准CoT提示回答的准确只有4.0%（对应当时版本的gpt-4）。</p><h2 id="3-思维树-Tree-of-Thoughts">3. 思维树 Tree of Thoughts</h2><p>传统的语言模型采用从左到右的token级别决策过程，可能在复杂问题解决中表现不足。ToT框架通过允许语言模型在决策过程中探索多条推理路径和进行自我评估，提升了其解决问题的能力。</p><p>实验表明，ToT显著提高了语言模型在需要非平凡计划或搜索的新任务（如游戏24、创意写作和微型填字游戏）上的表现。例如，在游戏24中，使用思维链提示的GPT-4只解决了4%的任务，而ToT方法取得了74%的成功率。</p><p><img src="../../images/20240731-01/image-20240731205745367.png" alt="image-20240731205745367" /></p><p>ToT将任何问题框定为树上的搜索，其中每个节点都是一个状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><mo stretchy="false">[</mo><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s=[x,z_{1···i}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，表示到目前为止有输入和思想序列的部分解。</p><p>ToT的一个具体实例包括四个问题：如何将中间过程分解为思想步骤；如何从每个状态中产生潜在的思想；如何启发式地评估状态；使用什么搜索算法。</p><ol><li class="lvl-3"><p><strong>思维分解。</strong> CoT在没有显式分解的情况下连贯地采样思维，而ToT利用问题属性来设计和分解中间思维步骤。根据问题的不同，一个思维可以是几个单词(填字游戏)、一行等式( 游戏24)，也可以是写作计划的整段(Creative Writing)。一般来说，一个思维应该足够&quot;小&quot;，以使LMs能够产生有希望的、多样的样本(例如,生成一本整本书通常太&quot;大&quot;而不连贯)，但也应该足够&quot;大&quot;，以使LMs能够评估其解决问题的前景(例如,生成一个token通常太&quot;小&quot;而无法评估)。</p></li><li class="lvl-3"><p><strong>思维发生器</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>s</mi><mo separator="true">,</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G(p_θ,s,k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">G</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> 。给定一个树状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><mo stretchy="false">[</mo><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s = [x,z_{1···i}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub></mrow><annotation encoding="application/x-tex">p_θ</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示参数为θ的预训练LM，用小写字母<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo separator="true">,</mo><mi>s</mi><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo></mrow><annotation encoding="application/x-tex">x,y,z,s,· · ·</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mpunct">,⋅⋅⋅</span></span></span></span>表示语言序列，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">[</mo><mn>1</mn><mo stretchy="false">]</mo><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">,</mo><mi>x</mi><mo stretchy="false">[</mo><mi>n</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x = ( x[1],···,x[n])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord">1</span><span class="mclose">]</span><span class="mpunct">,⋅⋅⋅,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">n</span><span class="mclose">])</span></span></span></span>，其中每个<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">x[i]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span></span></span></span>是一个token，使得<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">[</mo><mn>1...</mn><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_θ(x)=\prod_{i=1}^{n} p_θ(x[i]|x[1...i])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.104em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8043em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord">1...</span><span class="mord mathnormal">i</span><span class="mclose">])</span></span></span></span>。我们考虑了两种策略来生成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>个候选项用于下一步的思考：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>(a) <strong>采样</strong> 对语言模型的条件概率进行采样，从而生成下一个中间推理步骤：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>j</mi><mo stretchy="false">)</mo></mrow></msup><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>j</mi><mo>=</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z ^{(j)} \sim p^{CoT}_θ(z_{i+1}|s) = p^{CoT}_θ(z_{i+1}|x,z_{1···i})(j = 1···k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> 。</p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>j</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">z ^{(j)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span> 表示第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 个可能的中间推理步骤，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">z_{i+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>  表示当前要生成的下一个中间推理步骤。</p></li><li class="lvl-2"><p>(b) <strong>提出</strong>  通过使用“提出提示”的策略（proposal prompting），生成多个中间推理步骤：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">,</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">]</mo><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>p</mi><mi>r</mi><mi>o</mi><mi>m</mi><mi>p</mi><mi>t</mi></mrow></msubsup><mo stretchy="false">(</mo><msubsup><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msubsup><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[z^{(1)},···,z^{(k)}] \sim p^{prompt}_θ(z^{(1···k)}_{i+1}|s)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.138em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,⋅⋅⋅,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.38em;vertical-align:-0.3352em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9115em;"><span style="top:-2.3987em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.1809em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">ro</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">pt</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3013em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3352em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span></span></span></span>  。其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">,</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[z^{(1)},···,z^{(k)}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.138em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,⋅⋅⋅,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span>表示一组 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 个可能的中间推理步骤，**<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msubsup></mrow><annotation encoding="application/x-tex">z^{(1···k)}_{i+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.38em;vertical-align:-0.3352em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3352em;"><span></span></span></span></span></span></span></span></span></span>**表示当前要生成的第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 步的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 个中间推理步骤。</p></li></ul><p>在24点游戏中使用的是proposal prompting，它的提示词如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1-shot</span></span><br><span class="line">propose_prompt = <span class="string">&#x27;&#x27;&#x27;Input: 2 8 8 14</span></span><br><span class="line"><span class="string">Possible next steps:</span></span><br><span class="line"><span class="string">2 + 8 = 10 (left: 8 10 14)</span></span><br><span class="line"><span class="string">8 / 2 = 4 (left: 4 8 14)</span></span><br><span class="line"><span class="string">14 + 2 = 16 (left: 8 8 16)</span></span><br><span class="line"><span class="string">2 * 8 = 16 (left: 8 14 16)</span></span><br><span class="line"><span class="string">8 - 2 = 6 (left: 6 8 14)</span></span><br><span class="line"><span class="string">14 - 8 = 6 (left: 2 6 8)</span></span><br><span class="line"><span class="string">14 /  2 = 7 (left: 7 8 8)</span></span><br><span class="line"><span class="string">14 - 2 = 12 (left: 8 8 12)</span></span><br><span class="line"><span class="string">Input: &#123;input&#125;</span></span><br><span class="line"><span class="string">Possible next steps:</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><ol start="3"><li class="lvl-4"><p><strong>状态评估器</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V(p_θ,S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>利用LM有意地推理作为状态评估器，评估它们在解决问题上的进展，作为搜索算法的<em>启发式（heuristic）</em>，以确定哪些状态要继续探索，以何种顺序进行。与思想生成器类似，有两种策略来单独或共同评估状态：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>( a ) 独立地对每个状态<strong>赋值</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>v</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>v</mi><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∀</mi><mi>s</mi><mo>∈</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">V ( p_θ , S) ( s ) \sim  p^{value}_θ ( v | s ) \forall s\in S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1322em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mord">∀</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> ，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span> 是评估函数，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 是当前需要评估的一组状态，<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>v</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>v</mi><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p^{value}_θ ( v | s )</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1322em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span></span></span></span></strong> 表示在给定状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 的条件下，生成评估值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 的概率分布。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span>评估状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>，以产生一个标量值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> (如1 ~ 10)或一个分类(如确定/可能/不可能)。</p></li></ul><p><img src="../../images/20240731-01/image-20240731220258301.png" alt="image-20240731220258301" /></p><p>比如24游戏中使用了<code>sure/likely/impossible</code>这种方式</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">value_prompt = <span class="string">&#x27;&#x27;&#x27;Evaluate if given numbers can reach 24 (sure/likely/impossible)</span></span><br><span class="line"><span class="string">10 14</span></span><br><span class="line"><span class="string">10 + 14 = 24</span></span><br><span class="line"><span class="string">sure</span></span><br><span class="line"><span class="string">11 12</span></span><br><span class="line"><span class="string">11 + 12 = 23</span></span><br><span class="line"><span class="string">12 - 11 = 1</span></span><br><span class="line"><span class="string">11 * 12 = 132</span></span><br><span class="line"><span class="string">11 / 12 = 0.91</span></span><br><span class="line"><span class="string">impossible</span></span><br><span class="line"><span class="string">...</span></span><br><span class="line"><span class="string">&#123;input&#125;</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><ul class="lvl-0"><li class="lvl-2"><p>( b )跨状态<strong>投票</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo stretchy="false">[</mo><mi>s</mi><mo>=</mo><msup><mi>s</mi><mo>∗</mo></msup><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">V ( p_θ , S) ( s ) = 1[ s = s^*]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mopen">[</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，通过投票机制选出一个最优状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>s</mi><mo>∗</mo></msup><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>v</mi><mi>o</mi><mi>t</mi><mi>e</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>s</mi><mo>∗</mo><mi mathvariant="normal">∣</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s^* \sim p^{vote}_θ ( s * | S )</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6887em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0767em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7936em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>，然后评估每个状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>。如果某个状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span> 等于最优状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>s</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">s^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6887em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span>，则该状态的评估值为 1；否则评估值为 0。这种方法用于识别和选择最有希望的状态进行进一步探索。</p></li></ul><p><img src="../../images/20240731-01/image-20240731220603610.png" alt="image-20240731220603610" /></p><p>在创造性写作中使用的是跨状态的投票，其提示词如下。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vote_prompt = <span class="string">&#x27;&#x27;&#x27;Given an instruction and several choices, decide which choice is most promising. Analyze each choice in detail, then conclude in the last line &quot;The best choice is &#123;s&#125;&quot;, where s the integer id of the choice.</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">compare_prompt = <span class="string">&#x27;&#x27;&#x27;Briefly analyze the coherency of the following two passages. Conclude in the last line &quot;The more coherent passage is 1&quot;, &quot;The more coherent passage is 2&quot;, or &quot;The two passages are similarly coherent&quot;.</span></span><br><span class="line"><span class="string">&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><p><strong>4. 搜索算法</strong>。最后，根据树结构采用了两种相对简单的搜索算法：</p><ul class="lvl-0"><li class="lvl-2"><p>(a) <strong>广度优先搜索(BFS)</strong> (算法1)每一步保持一组最有希望的b个状态。这被用于游戏24和创意写作，其中树深度限制为(T≤3)，初始思想步骤可以被评估和修剪到一个小的集合( b≤5)。</p></li><li class="lvl-2"><p>(b) <strong>深度优先搜索(DFS)</strong> (算法2 )首先探索最有希望的状态，直到最后的输出达到(t &gt; T)，或者状态评估器认为从当前的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>s</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>≤</mo><msub><mi>v</mi><mrow><mi>t</mi><mi>h</mi></mrow></msub></mrow><annotation encoding="application/x-tex">s ( V ( p_θ , { s }) ( s )≤v_{th}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">s</span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为一个值阈值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mrow><mi>t</mi><mi>h</mi></mrow></msub></mrow><annotation encoding="application/x-tex">v_{th}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> )不可能解决问题。在后一种情况下，s中的子树被剪枝以进行开发的交易探索。在这两种情况下，DFS都回溯到s的父状态继续探索。</p></li></ul><p><img src="../../images/20240731-01/image-20240801144949481.png" alt="image-20240801144949481" /></p><p>在24点游戏中使用的是bfs，代码片段如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">solve</span>(<span class="params">args, task, idx, to_print=<span class="literal">True</span></span>):</span><br><span class="line">    ...</span><br><span class="line"><span class="keyword">for</span> step <span class="keyword">in</span> <span class="built_in">range</span>(task.steps):</span><br><span class="line">        <span class="comment"># generation</span></span><br><span class="line">        <span class="keyword">if</span> args.method_generate == <span class="string">&#x27;sample&#x27;</span>:</span><br><span class="line">            new_ys = [get_samples(task, x, y, args.n_generate_sample, prompt_sample=args.prompt_sample, stop=task.stops[step]) <span class="keyword">for</span> y <span class="keyword">in</span> ys]</span><br><span class="line">        <span class="keyword">elif</span> args.method_generate == <span class="string">&#x27;propose&#x27;</span>:</span><br><span class="line">            new_ys = [get_proposals(task, x, y) <span class="keyword">for</span> y <span class="keyword">in</span> ys]</span><br><span class="line">        new_ys = <span class="built_in">list</span>(itertools.chain(*new_ys))</span><br><span class="line">        ids = <span class="built_in">list</span>(<span class="built_in">range</span>(<span class="built_in">len</span>(new_ys)))</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># evaluation</span></span><br><span class="line">        <span class="keyword">if</span> args.method_evaluate == <span class="string">&#x27;vote&#x27;</span>:</span><br><span class="line">            values = get_votes(task, x, new_ys, args.n_evaluate_sample)</span><br><span class="line">        <span class="keyword">elif</span> args.method_evaluate == <span class="string">&#x27;value&#x27;</span>:</span><br><span class="line">            values = get_values(task, x, new_ys, args.n_evaluate_sample)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># selection</span></span><br><span class="line">        <span class="keyword">if</span> args.method_select == <span class="string">&#x27;sample&#x27;</span>:</span><br><span class="line">            ps = np.array(values) / <span class="built_in">sum</span>(values)</span><br><span class="line">            select_ids = np.random.choice(ids, size=args.n_select_sample, p=ps).tolist()</span><br><span class="line">        <span class="keyword">elif</span> args.method_select == <span class="string">&#x27;greedy&#x27;</span>:</span><br><span class="line">            select_ids = <span class="built_in">sorted</span>(ids, key=<span class="keyword">lambda</span> x: values[x], reverse=<span class="literal">True</span>)[:args.n_select_sample]</span><br><span class="line">        select_new_ys = [new_ys[select_id] <span class="keyword">for</span> select_id <span class="keyword">in</span> select_ids]</span><br><span class="line"></span><br><span class="line">        ...</span><br><span class="line">        ys = select_new_ys</span><br><span class="line">    <span class="keyword">return</span> ys, ...</span><br></pre></td></tr></table></figure><p>首先根据不同策略生成中间步骤，然后通过<code>value</code>方式进行评估，最后将所有<code>possible</code>和'sure'的结果加入select_new_ys`列表中，作为下一步的输入，进行下一轮评估和选择。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;1-思维链（Chain-Of-Thought）&quot;&gt;1. 思维链（Chain Of Thought）&lt;/h2&gt;
&lt;p&gt;要介绍ToT，首先要介绍下大名鼎鼎的CoT，也就是&lt;strong&gt;思维链（Chain Of Thought）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;i</summary>
      
    
    
    
    <category term="摸鱼日记" scheme="https://www.aweisite.top/categories/%E6%91%B8%E9%B1%BC%E6%97%A5%E8%AE%B0/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>Tree of Thoughts: Deliberate Problem Solving with Large Language Models</title>
    <link href="https://www.aweisite.top/posts/55ae080b.html"/>
    <id>https://www.aweisite.top/posts/55ae080b.html</id>
    <published>2024-07-28T16:18:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<h1>思维树：用大型语言模型深思熟虑地解决问题</h1><h2 id="摘要">摘要</h2><p>语言模型越来越多地被用于跨广泛任务的一般问题解决，但在推理过程中仍然局限于令牌级别的、从左到右的决策过程。这意味着他们可能在需要探索的任务、战略前瞻或初始决策起关键作用的任务中落空。为了克服这些挑战，我们引入了一种新的语言模型推理框架- - &quot;思维树&quot; ( Tree of Thoughts，ToT )，它推广了流行的&quot;思维链&quot; ( Chain of Thoughts )方法来促进语言模型，并允许对文本( &quot;思想&quot;)的连贯单元进行探索，作为问题解决的中间步骤。ToT允许LM进行深思熟虑的决策，通过考虑多条不同的推理路径和自我评估的选择来决定下一步的行动方向，并在必要时进行前瞻或回溯以做出全局选择。我们的实验表明，ToT显著提高了语言模型在3个需要非平凡计划或搜索的新颖任务上的问题解决能力：游戏24、创意写作和微型填字游戏。例如，在第24局的比赛中，有思维链提示的GPT-4只解决了4%的任务，而我们的方法取得了74%的成功率。所有提示的代码：<a href="https://github.com/ysymyth/tree-of-thought-llm">https://github.com/ysymyth/tree-of-thought-llm</a>.</p><h2 id="1导言">1导言</h2><p>GPT [22、23、1、20]和PaLM [ 5 ]等最初设计用于生成文本的语言模型(Language Model，LM)的扩展版本已被证明越来越能够执行需要数学、符号、常识和知识推理的越来越广泛的任务。也许令人惊讶的是，所有这些进步的背后仍然是生成文本的原始自回归机制，它以从左到右的方式逐个做出token级别的决策。这样一个简单的机制是否足以使LM被构建成一个通用的问题求解器?如果不是，会有哪些问题挑战当前的范式，又应该有哪些替代机制?</p><p>有关人类认知的文献提供了回答这些问题一些线索。对&quot;双加工&quot;模型的研究表明，人们有两种参与决策的模式--快速的、自动的、无意识的模式('系统1')和缓慢的、刻意的、有意识的模式('系统2 ') [27、28、13、12]。这两种模式之前已经被连接到机器学习中使用的多种数学模型中。例如，在人类和其他动物中关于强化学习的研究已经探索了他们在何种情况下从事联想的&quot;无模型&quot;学习或更审慎的&quot;基于模型&quot;的规划[6]。例如，对人类和其他动物的强化学习的研究已经探索了他们在何种情况下进行关联的&quot;无模型&quot;学习或更慎重的基于&quot;模型&quot;的规划[ 6 ]。LMs的简单关联令牌级选择也与&quot;系统1 &quot;有关，因此可能会受益于更慎重的&quot;系统2 &quot;规划过程的增强，即( 1 )保持并探索当前选择的多样化替代方案，而不是仅仅挑选一种；( 2 )评估其当前状态，并积极展望或回溯，以做出更多的全球决策。</p><p><img src="../../../images/20231127-01/img-7.png" alt="upload successful" />图1：图示说明了用LLMs解决问题的各种方法。每个矩形框代表一种思想，它是一个连贯的语言序列，是问题解决的中间步骤。在图2、4、6中可以看到思想是如何产生、评价和搜索的具体例子。</p><p>为了设计这样的规划过程，我们回到人工智能(以及认知科学)的起源，从Newell、Shaw和Simon从20世纪50年代[18、19]开始探索的规划过程中获得灵感。Newell等人将问题求解[ 18 ]描述为通过组合问题空间进行搜索，用树表示。因此，我们提出了用语言模型解决一般问题的思维树(ToT)框架。如图1所示，现有方法(下文详述)在对问题解决的连续语言序列进行采样时，ToT主动维护了一棵思想树，其中每个思想都是一个连贯的语言序列，作为问题解决的中间步骤(表1 )。这样的高级语义单元允许LM通过刻意的推理过程来自我评估不同的中间思想在解决问题方面的进展，该过程也在语言(图2,4,6)中实例化。这种通过LM自我评估和审议来实现搜索启发式的方法是新颖的，因为以前的搜索启发式要么是编程的，要么是学习的。最后，我们将这种基于语言的生成和评估多样化思想的能力与搜索算法相结合，如广度优先搜索(BFS)或深度优先搜索(DFS)，从而可以通过前瞻和回溯对思想树进行系统探索。</p><p>在实证上，我们提出了3个新的问题，它们挑战了现有的LM推理方法，即使是最先进的语言模型GPT-4 [20]：游戏24、创意写作和填字游戏(表1)。这些任务需要演绎推理、数学、常识、词汇推理能力，以及融入系统规划或搜索的方式。我们展示了ToT在所有三个任务上都获得了优越的结果，因为它具有足够的通用性和灵活性来支持不同层次的思想、不同的思想生成和评估方式以及适应不同问题性质的不同搜索算法。我们还分析了这些选择如何通过系统消融影响模型性能，并讨论了未来更好地训练和使用LM的方向。</p><h2 id="2-背景">2. 背景</h2><p>我们首先将一些现有的使用大型语言模型进行问题求解的方法进行形式化，我们的方法是受到启发并稍后进行比较的。我们用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub></mrow><annotation encoding="application/x-tex">p_θ</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示参数为θ的预训练LM，用小写字母<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mtext>，</mtext><mi>y</mi><mtext>，</mtext><mi>z</mi><mtext>，</mtext><mi>s</mi><mtext>，</mtext><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo></mrow><annotation encoding="application/x-tex">x，y，z，s，· · ·</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">x</span><span class="mord cjk_fallback">，</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord cjk_fallback">，</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord cjk_fallback">，</span><span class="mord mathnormal">s</span><span class="mord cjk_fallback">，</span><span class="mpunct">⋅⋅⋅</span></span></span></span>表示语言序列，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">[</mo><mn>1</mn><mo stretchy="false">]</mo><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">,</mo><mi>x</mi><mo stretchy="false">[</mo><mi>n</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x = ( x[1],···,x[n])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord">1</span><span class="mclose">]</span><span class="mpunct">,⋅⋅⋅,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">n</span><span class="mclose">])</span></span></span></span>，其中每个x[i]是一个token，使得<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">[</mo><mn>1...</mn><mi>i</mi><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_θ(x)=\prod_{i=1}^{n} p_θ(x[i]|x[1...i])</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.104em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8043em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mopen">[</span><span class="mord">1...</span><span class="mord mathnormal">i</span><span class="mclose">])</span></span></span></span>。我们用大写字母<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo separator="true">,</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo></mrow><annotation encoding="application/x-tex">S,···</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mpunct">,⋅⋅⋅</span></span></span></span>表示语言序列的集合。</p><p><strong>输入-输出( Input-Output，IO )提示</strong>是最常见的将问题输入<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>转化为输出<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>的LM方法：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>∼</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>m</mi><mi>p</mi><msub><mi>t</mi><mrow><mi>I</mi><mi>O</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y\sim p_θ(y|prompt_{IO}(x))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">p</span><span class="mord mathnormal">ro</span><span class="mord mathnormal">m</span><span class="mord mathnormal">p</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">I</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">))</span></span></span></span>，其中提示<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mi>r</mi><mi>o</mi><mi>m</mi><mi>p</mi><msub><mi>t</mi><mrow><mi>I</mi><mi>O</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">prompt_{IO}(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">ro</span><span class="mord mathnormal">m</span><span class="mord mathnormal">p</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">I</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>用任务指令和/或少量的输入输出示例包装输入<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>。为简单起见，令<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>p</mi><mi>r</mi><mi>o</mi><mi>m</mi><mi>p</mi><mi>t</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>o</mi><mi>u</mi><mi>t</mi><mi>p</mi><mi>u</mi><mi>t</mi><mi mathvariant="normal">∣</mi><mi>i</mi><mi>n</mi><mi>o</mi><mi>p</mi><mi>u</mi><mi>t</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>p</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><mi>o</mi><mi>u</mi><mi>t</mi><mi>p</mi><mi>u</mi><mi>t</mi><mi mathvariant="normal">∣</mi><mi>p</mi><mi>r</mi><mi>o</mi><mi>m</mi><mi>p</mi><mi>t</mi><mo stretchy="false">(</mo><mi>i</mi><mi>n</mi><mi>o</mi><mi>p</mi><mi>u</mi><mi>t</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">p_θ^{prompt}(output|inoput)=p_θ(output|prompt(inoput))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2128em;vertical-align:-0.3013em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9115em;"><span style="top:-2.3987em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.1809em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span><span class="mord mathnormal mtight">ro</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">pt</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3013em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">tp</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord">∣</span><span class="mord mathnormal">in</span><span class="mord mathnormal">o</span><span class="mord mathnormal">p</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">tp</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mord">∣</span><span class="mord mathnormal">p</span><span class="mord mathnormal">ro</span><span class="mord mathnormal">m</span><span class="mord mathnormal">pt</span><span class="mopen">(</span><span class="mord mathnormal">in</span><span class="mord mathnormal">o</span><span class="mord mathnormal">p</span><span class="mord mathnormal">u</span><span class="mord mathnormal">t</span><span class="mclose">))</span></span></span></span>，则IO提示可表示为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>I</mi><mi>O</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y \sim p^{IO}_θ(y|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">I</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">O</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>。</p><p><strong>思维链(CoT)提示</strong> 提出了解决输入<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>到输出<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>的映射为非平凡(例如,当<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>是数学问题, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>是最后的数值答案时)的情况。其核心思想是引入一连串的思想<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mn>1</mn></msub><mtext>，</mtext><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mtext>，</mtext><msub><mi>z</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">z_1，···，z_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord cjk_fallback">，</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>来桥接<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span>，其中每个<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">z_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是一个连贯的语言序列，作为解决问题(例如, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">z_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以作为数学QA的中间方程)的一个有意义的中间步骤。为了解决CoT存在的问题，对每个思维 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mi>i</mi></msub><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z_i \sim p^{CoT}_θ (z_i|x,z_{1···i-1})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>  进行顺序采样，输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>n</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y \sim p^{CoT}_θ(y|x,z_{1···n})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 。实践中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>n</mi></mrow></msub><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">]</mo><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>n</mi></mrow></msub><mo separator="true">,</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[z_{1···n} ,y] \sim p^{CoT}_θ(z_{1···n},y|x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> 被采样为连续的语言序列，思维的分解(例如,每个<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>z</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">z_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 是短语、句子还是段落)被留有歧义。</p><p><strong>自洽CoT ( CoT-SC )</strong> 是一种集成方法，采样<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 独立同分布链的思想： <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mi>z</mi><msub><mrow><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>n</mi></mrow></msub><mo separator="true">,</mo><msup><mi>y</mi><mrow><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">]</mo><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>n</mi></mrow></msub><mo separator="true">,</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>i</mi><mo>=</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[z{(i)}_{1···n},y^{(i)}] \sim p^{CoT}_θ( z_{1···n},y|x)(i = 1···k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1877em;vertical-align:-0.2997em;"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord"><span class="mord"><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.4003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight">i</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> ，然后返回最频繁的输出：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><mi>x</mi></mrow><mi>y</mi></msub><mi mathvariant="normal">#</mi><mo stretchy="false">{</mo><mi>i</mi><mi mathvariant="normal">∣</mi><msup><mi>y</mi><mrow><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><mi>y</mi><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">{argmax}_y\# \{i|y^{(i)}=y\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2682em;vertical-align:-0.3802em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.0573em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3802em;"><span></span></span></span></span></span></span><span class="mord">#</span><span class="mopen">{</span><span class="mord mathnormal">i</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight">i</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">}</span></span></span></span> 。CoT-SC在CoT的基础上进行了改进，因为对于同一个问题(例如,用不同的方法证明同一个定理)，通常有不同的思维过程，通过探索更丰富的思维集合，可以使输出的决策更加忠实。但是，每条链内部并不存在对不同思想步骤的局部探索，&quot;最频繁&quot;启发式只适用于输出空间有限的(例如,多选择题)。</p><h2 id="3-思维树：用LM有意识地解决问题">3. 思维树：用LM有意识地解决问题</h2><blockquote><p>一个真正的问题解决过程涉及到反复使用可用的信息来发起探索，进而揭示更多的信息，直到找到解决问题的方法。- - Newell等[18]</p></blockquote><p>对人类问题求解的研究表明，人们通过一个组合问题空间进行搜索--一棵树，其中节点代表部分解，分支对应于修改它们的运算符[ 18、19]。采取哪个分支是由启发式决定的，它有助于导航问题空间并引导问题解决者走向解决方案。这一视角凸显了现有使用LMs解决一般性问题的方法的两个关键缺陷：1)在局部上，它们没有探索一个思维过程中的不同延续--树的分支。2)在全局范围内，它们不包含任何类型的计划、前瞻或回溯，以帮助评估这些不同的选项--这种启发式指导的搜索似乎是人类解决问题的特征。</p><p>为了解决这些不足，我们引入了思维树(Tree of Thoughts，ToT)，该范式允许LM探索思想上的多条推理路径(图1(c))。ToT将任何问题框定为树上的搜索，其中每个节点都是一个状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><mo stretchy="false">[</mo><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s=[x,z_{1···i}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，表示到目前为止有输入和思想序列的部分解。ToT的一个具体实例包括四个问题：1. 如何将中间过程分解为思想步骤；2. 如何从每个状态中产生潜在的思想；3. 如何启发式地评估状态；4. 使用什么搜索算法。</p><p><strong>1 思维分解。</strong> CoT在没有显式分解的情况下连贯地采样思维，而ToT利用问题属性来设计和分解中间思维步骤。如表1所示，根据问题的不同，一个思维可以是几个单词(填字游戏)、一行等式( 游戏24)，也可以是写作计划的整段(Creative Writing)。一般来说，一个思维应该足够&quot;小&quot;，以使LMs能够产生有希望的、多样的样本(例如,生成一本整本书通常太&quot;大&quot;而不连贯)，但也应该足够&quot;大&quot;，以使LMs能够评估其解决问题的前景(例如,生成一个token通常太&quot;小&quot;而无法评估)。</p><p><strong>2. 思维发生器</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>s</mi><mo separator="true">,</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G(p_θ,s,k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">G</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">s</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> 。给定一个树状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo>=</mo><mo stretchy="false">[</mo><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s = [x,z_{1···i}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，我们考虑了两种策略来生成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>个候选项用于下一步的思考：</p><ul class="lvl-0"><li class="lvl-2"><p>(a) <strong>采样</strong> 采样一个来自CoT Prompt的独立同分布思维(创意写作,图4)：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>j</mi><mo stretchy="false">)</mo></mrow></msup><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>C</mi><mi>o</mi><mi>T</mi></mrow></msubsup><mo stretchy="false">(</mo><msub><mi>z</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">∣</mi><mi>x</mi><mo separator="true">,</mo><msub><mi>z</mi><mrow><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>i</mi></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>j</mi><mo>=</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">z ^{(j)} \sim p^{CoT}_θ(z_{i+1}|s) = p^{CoT}_θ(z_{i+1}|x,z_{1···i})(j = 1···k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1244em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">∣</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.044em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">⋅⋅⋅</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> 。当思维空间为丰富的(例如,每个思想都是一个段落)，独立同分布样本导致多样性时，效果更好；</p></li><li class="lvl-2"><p>(b) <strong>提出</strong>  顺次提出使用&quot;提出Prompt&quot;的思维(游戏24,图2;十字架,图6)：$ [z^{(1)},···,z^{(k)}] \sim p^{prompt}<em>θ(z^{(1···k)}</em>{i+1}|s)$  。这在思维空间受约束较大的(例如,每一个思想都只是一个词或一条线)时效果更好，因此在同一语境下提出不同的思维避免了重复。</p></li></ul><p>**3 .状态评估器<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">V ( p_θ , S)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>。**给定一个不同状态的前沿面，状态评估器评估它们在解决问题上的进展，作为搜索算法的<em>启发式</em>，以确定哪些状态要继续探索，以何种顺序进行。虽然<em>启发式</em>是解决搜索问题的标准方法，但它们通常是预编程的( e.g. Deep Blue )或学习的(如AlphaGo)。我们提出了第三种选择，即利用LM有意地推理状态。在适用的情况下，这种深思熟虑的启发式可以比编程规则更灵活，比学习的模型更有效。与思想生成器类似，我们考虑两种策略来单独或共同评估状态：</p><ul class="lvl-0"><li class="lvl-2"><p>( a ) 独立地对每个状态<strong>赋值</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>v</mi><mi>a</mi><mi>l</mi><mi>u</mi><mi>e</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>v</mi><mi mathvariant="normal">∣</mi><mi>s</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∀</mi><mi>s</mi><mo>∈</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">V ( p_θ , S) ( s ) \sim  p^{value}_θ ( v | s ) \forall s\in S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1322em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord">∣</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mord">∀</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> ，其中一个值提示关于状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>的理由，以产生一个标量值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> (如1 ~ 10)或一个分类(如确定/可能/不可能)，可以启发式地转换成一个值。这种评价性推理的基础可以因问题和思考步骤而异。在这项工作中，我们通过少量的前瞻性模拟(例如,快速确认5 , 5 , 14通过5 + 5 + 14可以达到24 ,或者' hot l '通过填充' e ' in '可以表示' inn ')和常识( ( 1 ) ( 2 ) ( 3 )太小,达不到24 ,或者没有词可以以&quot; tzxc &quot;开头)来探索评估。前者可能促进&quot;好&quot;状态，后者有助于消除&quot;坏&quot;状态。这样的估值不需要完美，只需要近似即可</p></li><li class="lvl-2"><p>( b )跨状态<strong>投票</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo stretchy="false">[</mo><mi>s</mi><mo>=</mo><msup><mi>s</mi><mo>∗</mo></msup><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">V ( p_θ , S) ( s ) = 1[ s = s^*]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mopen">[</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mclose">]</span></span></span></span> ，其中一个&quot;好&quot;状态<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>s</mi><mo>∗</mo></msup><mo>∼</mo><msubsup><mi>p</mi><mi>θ</mi><mrow><mi>v</mi><mi>o</mi><mi>t</mi><mi>e</mi></mrow></msubsup><mo stretchy="false">(</mo><mi>s</mi><mo>∗</mo><mi mathvariant="normal">∣</mi><mi>S</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s^* \sim p^{vote}_θ ( s * | S )</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6887em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6887em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0767em;vertical-align:-0.2831em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7936em;"><span style="top:-2.4169em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2831em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mclose">)</span></span></span></span>是基于在投票提示符中刻意比较S中的不同状态而被投票出来的。当问题成功较难直接对( e.g.通道连贯性)进行赋值时，自然要对不同的局部解进行比较，并投票选出最有希望的局部解。这在精神上类似于一种&quot;阶梯式&quot;自洽策略，即把&quot;探索哪种状态&quot;作为多选QA，并使用LM样本对其进行投票。</p></li></ul><p>对于这两种策略，我们都可以多次提示LM聚合值或投票结果来交换时间/资源/成本以获得更忠实/健壮的启发式。</p><p><img src="../../../images/20231127-01/img-8.png" alt="upload successful" /></p><ol start="4"><li class="lvl-3"><p><strong>搜索算法</strong>。最后，在ToT框架中，可以根据树结构来即插即用不同的搜索算法。我们探索了两种相对简单的搜索算法，并为以后的工作留下了更先进的(例如A*, MCTS )：</p></li></ol><ul class="lvl-0"><li class="lvl-2"><p>(a) <strong>广度优先搜索(BFS)</strong> (算法1)每一步保持一组最有希望的b个状态。这被用于游戏24和创意写作，其中树深度限制为(T≤3)，初始思想步骤可以被评估和修剪到一个小的集合( b≤5)。</p></li><li class="lvl-2"><p>(b) <strong>深度优先搜索(DFS)</strong> (算法2 )首先探索最有希望的状态，直到最后的输出达到(t &gt; T)，或者状态评估器认为从当前的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>V</mi><mo stretchy="false">(</mo><msub><mi>p</mi><mi>θ</mi></msub><mo separator="true">,</mo><mi>s</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo><mo>≤</mo><msub><mi>v</mi><mrow><mi>t</mi><mi>h</mi></mrow></msub></mrow><annotation encoding="application/x-tex">s ( V ( p_θ , { s }) ( s )≤v_{th}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">s</span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为一个值阈值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mrow><mi>t</mi><mi>h</mi></mrow></msub></mrow><annotation encoding="application/x-tex">v_{th}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> )不可能解决问题。在后一种情况下，s中的子树被剪枝以进行开发的交易探索。在这两种情况下，DFS都回溯到s的父状态继续探索。</p></li></ul><p>从概念上讲，ToT作为LMs解决一般性问题的方法有几个好处：(1)一般性。IO、CoT、CoT-SC和自细化可以看作是ToT (即深度和广度有限的树木;图1)的特例。(2)模块化。基础LM，以及思想分解、生成、评估和搜索过程都可以独立变化。(3)适应性。可以容纳不同的问题属性、LM能力和资源约束。(4)便利性。不需要额外的训练，只需要一个预训练的LM就足够了。下一节将展示这些概念性的好处如何在不同的问题中转化为强有力的实证表现。</p><h2 id="4-实验">4. 实验</h2><p>我们提出了三个困难的任务，即使从最先进的语言模型GPT-4 [ 20 ]中采样，使用标准的IO提示或思维链(CoT)提示。我们展示了在思想树中刻意搜索(ToT)如何产生更好的结果，更重要的是，有趣和有前途的新方法来使用语言模型来解决需要搜索或规划的问题。除非另有说明，我们使用聊天完成模式GPT-4进行实验，采样温度为0.7。</p><p><img src="../../../images/20231127-01/img-9.png" alt="upload successful" /></p><h3 id="4-1-游戏24">4.1 游戏24</h3><p>24游戏是一个数学推理挑战，目标是用4个数字和基本算术运算( + - * / )得到24。例如，给定输入' 4 9 10 13 '，一个解的输出可以是' $( 10 - 4 ) * ( 13 - 9 ) = 24 $'。</p><p><img src="../../../images/20231127-01/img-10.png" alt="upload successful" /></p><p><strong>任务设置</strong> 。我们从<code>4nums.com</code>抓取了1，362个游戏，按照人类求解时间由易到难进行排序，并使用索引为901-1，000的相对困难游戏子集进行测试。对于每个任务，我们认为输出是成功的，如果它是一个有效的等式，等于24，并且每个任务只使用一次输入数字。我们报告了100场比赛的成功率作为衡量标准。</p><p><strong>基线</strong>。我们使用一个标准的输入-输出(IO)提示，包含5个语境例子。为了促进思维链(CoT)，我们用3个中间方程来增加每个输入-输出对，每个方程在两个剩余的数字上操作。例如，给定输入' 4 9 10 13 '，思维可以是' 13-9 = 4 (剩余: 4 4 10)；10-4 = 6 (剩余: 4 6)；4 * 6 = 24 (剩余：24 ) '。对于每个游戏，我们对IO和CoT提示进行了100次的平均性能采样。我们还考虑了一个CoT自洽基线，它取自100个CoT样本的大部分输出，并在一个IO样本的基础上采用迭代-精化方法，最多迭代10次。在每一次迭代中，LM以所有以前的历史为条件，如果输出不正确，则&quot;反思你的错误并生成一个精致的答案&quot;。需要注意的是，它使用了关于方程正确性的真实反馈信号。</p><p><strong>ToT设置</strong>。要把游戏24框定到ToT，很自然地要把思维分解成3个步骤，每个步骤是一个中间等式。如图2(a)所示，在每个树节点上，我们提取&quot;剩余&quot;的数字，并提示LM提出一些可能的下一步步骤。同样的&quot;提议提示&quot;用于所有3个思考步骤，尽管它只有一个4个输入数字的例子。我们在ToT中执行广度优先搜索(BFS)，在每个步骤中我们保留最好的b = 5个候选者。为了在ToT中执行深思熟虑的BFS，如图2(b)所示，我们提示LM将每个想法候选项评估为&quot;确定/可能/不可能&quot;，达到24。其目的是促进正确的部分解可以在很少的前瞻试验中被判定，并消除基于&quot;太大/小&quot;常识的不可能的部分解，并保留其余的&quot;也许&quot;。我们对每个思维采样3次值。</p><p><img src="../../../images/20231127-01/img-11.png" alt="upload successful" /></p><p><strong>结果</strong>。如表2所示，IO、CoT和CoT-SC提示方法在任务上表现不佳，仅达到7.3 %、4.0 %和9.0 %的成功率。相比之下，宽度b = 1的ToT已经达到了45 %的成功率，而宽度b = 5的ToT则达到了74 %。我们还考虑了IO / CoT的Oracle设置，通过使用k个样本中最好的( 1≤k≤100)来计算成功率。为了将IO / CoT ( k的最佳)与ToT进行比较，我们考虑计算ToT中每个任务访问的树节点跨越 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>1</mn><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">b = 1 · · · 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span></span></span></span> ，并将图3(a)中的5个成功率映射，将IO / CoT ( k的最佳)视为在一个bandit中的访问k个节点。毫不奇怪，CoT的规模比IO要好，在100个CoT样本中，最好的达到了49 %的成功率，但仍然比在ToT( b &gt; 1)中探索更多的节点差得多。</p><p><strong>误差分析</strong>。 图3(b)分解了CoT和ToT样本在哪一步任务失败，即想法(在CoT中)或所有b个想法(在ToT中)无效或不可能达到24。值得注意的是，大约60 %的CoT样本在生成第一步，即相当于前三个词(如' 4 + 9 ')后，就已经失败了。这凸显了从左到右直接解码的问题。</p><h3 id="4-2-创造性的写作">4.2 创造性的写作</h3><p>接下来，我们发明了一个创造性的写作任务，其中输入是4个随机句子，输出应该是4个段落，分别在4个输入句子中结束。这样的任务具有开放性和探索性，对创造性思维和高层次规划提出了挑战。</p><p><strong>任务设置</strong>。我们从<code>randomwordgenerator.com</code>中随机抽取句子组成100个输入，每个输入约束都没有真值段落。由于我们发现GPT-4可以在大部分时间内遵循输入约束，因此我们主要通过两种方式来评估篇章连贯性：使用GPT-4的零样本提示来提供1-10的标量分数，或者使用人工判断来比较不同方法的输出对。对于前者，我们采样了5个分数，并对每个任务的输出进行了平均，我们发现这5个分数通常是一致的，平均每个输出的标准差约为0.56。对于后者，我们在一项盲法研究中使用作者的一个子集来比较CoT vs. ToT生成通道对，其中通道的顺序在100个输入上随机翻转。</p><p><strong>基线</strong>。考虑到任务的创造性，IO和CoT提示均为zero-shot。前者促使LM在给定输入约束的情况下直接生成一个连贯的段落，后者则促使LM先做一个简短的计划再写段落，即<strong>该计划作为中间的思想步骤</strong>。每个任务产生10个IO和CoT样本。我们还考虑了在每个任务的随机IO样本之上进行迭代-求精的( k≤5)方法，其中LM以输入约束和最后生成的文章为条件，以决定该通道是否已经&quot;完美连贯&quot;，如果没有生成精细的文章。</p><p><strong>ToT设置。</strong> 我们构建了一个深度为2 (且仅有1个中间思想步骤)的ToT-LM首先生成<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">k = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span> 个计划并投票选出最好的一个(图4 )，然后基于最好的计划生成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">k = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span> 个通道并投票选出最好的一个。这里宽度限制 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">b = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> ，因为每一步只保留一个选择。在两个步骤中均使用简单的零样本投票提示( &quot;分析下面的选择,然后得出结论,哪个是指令最希望的&quot;)采样5票。</p><p><strong>结果</strong>。 图5(a)显示了100个任务的平均GPT-4得分，其中ToT(7.56)被认为比IO(6.19)和CoT(6.93)平均产生更多的连贯段落。虽然这样的自动度量可能是有噪音的，但图5(b)证实了这一发现，在100个文章对中，有41个文章对，人类更喜欢ToT而不是CoT，而在21 (另外38对是&quot;相似连贯的&quot;)文章对中，人类只喜欢CoT而不是ToT。最后，迭代求精在该自然语言任务上更有效，它将IO一致性得分从6.19提高到7.67，ToT一致性得分从7.56提高到7.91。我们认为，它可以被认为是ToT框架中思想生成的第三种途径，即新思想可以从提炼旧思想中产生，而不是独立同分布或依次生成。</p><p><img src="../../../images/20231127-01/img-12.png" alt="upload successful" /></p><h3 id="4-3-迷你十字">4.3 迷你十字</h3><p>在《24游戏》和《创意写作》中，ToT相对较浅--至多需要3个思维步骤才能达到最终输出。这里我们将5 × 5迷你纵横字作为一个涉及自然语言的更难的搜索问题进行探讨。再次，目标不仅仅是解决任务，因为更一般的交叉词可以通过专门的NLP管道[ 31 ]轻松解决，它利用大规模检索而不是LM。相反，我们旨在探索LM作为一般问题解决者的极限，它探索自己的思想，并以深思熟虑的推理作为启发式指导自己的探索。</p><p><strong>任务设置</strong>。 我们从GooBix抓取数据，其中包含156个5 × 5微型纵横字谜游戏。由于我们观察到相邻的游戏包含相似的线索，我们使用20个指标为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mtext>，</mtext><mn>6</mn><mtext>，</mtext><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mo separator="true">⋅</mo><mtext>，</mtext><mn>91</mn><mtext>，</mtext><mn>96</mn></mrow><annotation encoding="application/x-tex">1，6，· · ·，91，96</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">1</span><span class="mord cjk_fallback">，</span><span class="mord">6</span><span class="mord cjk_fallback">，</span><span class="mpunct">⋅⋅⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord cjk_fallback">，</span><span class="mord">91</span><span class="mord cjk_fallback">，</span><span class="mord">96</span></span></span></span> 的游戏进行测试，用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>136</mn><mtext>，</mtext><mn>141</mn><mtext>，</mtext><mn>146</mn><mtext>，</mtext><mn>151</mn><mtext>，</mtext><mn>156</mn></mrow><annotation encoding="application/x-tex">136，141，146，151，156</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">136</span><span class="mord cjk_fallback">，</span><span class="mord">141</span><span class="mord cjk_fallback">，</span><span class="mord">146</span><span class="mord cjk_fallback">，</span><span class="mord">151</span><span class="mord cjk_fallback">，</span><span class="mord">156</span></span></span></span>的游戏进行提示。对于每个任务，输入描述了5条水平线索和5条垂直线索，输出应该是5 × 5 = 25个字母的棋盘来解决交叉词。对于评估，我们考虑三个成功等级：正确字母( 25次/场)，单词(每场比赛10次)和游戏。</p><p><strong>基线</strong>。 我们在IO提示符中提供了5个示例输入-输出对，在CoT提示符中额外添加了顺序为h1..5然后v1..5的中间词。我们对10个样本运行每个提示并对结果进行平均。</p><p><strong>ToT设置</strong>。 我们利用深度优先搜索(算法2)，不断探索最有前途的后续单词线索，直到状态不再有前途，然后回溯到父状态以探索替代思想。为了使搜索容易处理，后续的想法被限制不改变任何填充的单词或字母，因此ToT至多有10个中间步骤。对于思维生成，在每个状态下，我们将所有现有的思维( ( 如' h2.motor ; h1.task 在图6中的状态(a))转化为字母约束，以获得剩余的线索( ( 如' <a href="http://v1.To">v1.To</a> heap: tm___;...') )，并提示一个提案提示5次，以提出下一个单词的位置和内容的候选词。</p><p>重要的是，我们还提示LM对不同的想法给出一个置信水平，并将这些跨提案进行聚合，以获得一个排序的下一步要探索的想法列表(图6(a))。对于状态评估，我们同样将每个状态转化为剩余线索的字母约束，然后对每个线索进行评估，如果给定的约束是可以填充的。如果任何剩余的线索被认为&quot;不可能&quot;填写(如' <a href="http://v1.to">v1.to</a> Heap: tm_s_')，则对状态子树的探索进行剪枝，DFS回溯到其父节点，以探索下一个有希望的想法。我们将DFS搜索步数限制为100步，并将最深的探索状态(首先探讨了多重的情况)简单地渲染到最终的输出中。</p><p><img src="../../../images/20231127-01/img-13.png" alt="upload successful" /></p><p><strong>结果</strong>。 如表3所示，IO和CoT提示方法表现不佳，单词级别的成功率低于16%，而ToT显著提高了所有指标，实现了60%的单词级别成功率，并解决了20个游戏中的4个。这种改善并不奇怪，因为IO和CoT缺乏机制来尝试不同的线索，改变决策，或者回溯。</p><p><strong>甲骨文与消融研究</strong>。 当每个任务从oracle最佳DFS状态(而不是启发式确定的最佳状态)输出时，ToT性能甚至更高，实际上解决了7 / 20个游戏(表3 , ' +最佳状态')，表明我们的简单输出启发式可以很容易地改进。有趣的是，有时候当填字游戏实际解决时，状态评价者可能仍然认为某些单词是&quot;不可能的&quot;并进行修剪--这可能是因为5 × 5设计的填字游戏中存在一些GPT-4无法识别的稀有或专有单词。考虑到状态评估作为一种剪枝启发式是不完善的，我们也对剪枝进行了探索，发现其性能普遍较差(表3,' -prune ')。然而，对于4 / 20的游戏(尽管通过启发式方法只输出1)，(3)其中的游戏ToT +剪枝无法在100步内求解出正确的解。因此，更好的DFS剪枝启发式对于这种情况下的问题求解至关重要。最后，我们通过运行一个消融来确认回溯的重要性，该消融在最多20个步骤中不断填充最有希望的线索，并允许覆盖。这类似于宽度限制为b = 1的&quot;贪婪&quot; BFS搜索，并且性能较差，单词级别的成功率仅为20 % (表3 ,' -backtrack')。</p><h2 id="5-相关工作">5. 相关工作</h2><p><strong>规划与决策</strong>。 智能规划和决策对于实现预定目标至关重要。由于他们是在大量的世界知识和人类实例的基础上训练的，LMs已经吸收了丰富的常识，这使得根据问题设置和环境状态[ 10、39、34、11、32、38、37]提出合理的计划成为可能。我们提出的思想树方法扩展了现有的规划公式，在每个解决问题的步骤中同时考虑多个潜在可行的计划，并从最有前途的计划着手。思想采样和价值反馈之间的集成有机地整合了规划和决策机制，实现了在解决方案树内部的有效搜索。另一方面，传统的决策程序通常需要训练专门的奖励和策略模型，如强化学习(例如CHAI )，而我们使用LM本身来提供决策的价值估计。</p><p><strong>自我反思</strong>。  使用LLMs来评估自身预测的可行性正在成为问题解决中越来越重要的过程。[ 25、17、21 ]引入了&quot;自我反思&quot;机制，其中LM向他们的后代候选人提供反馈。文献[ 4 ]基于LM自身的代码执行结果，通过注入LM自身产生的反馈消息来提高LM的代码生成精度。类似地，[ 14 ]也引入了对动作和状态的&quot;评价&quot;或&quot;审查&quot;步骤，以决定在解决计算机操作任务时采取的下一个动作。与我们最近的工作非常相关的另一个工作是&quot;自评估引导解码&quot; [ 36 ]。与我们的方法类似，自评估解码也遵循一个树型结构过程，从随机波束搜索解码中采样叶子，然后由LLM本身用精心准备的自评估提示进行评估。然而，他们的方法使用了将思想表示为代码的PAL提法[ 7 ]，这使得我们在本文中考虑的创造性写作等具有挑战性的任务变得困难。因此，我们的&quot;思想之树&quot;提法更具有通用性，能够处理具有挑战性的任务，而GPT-4仅在标准提示下达到非常低的准确率。</p><p><strong>程序引导的Llm生成</strong>。 我们的提议还与最近的进展有关，这些进展用象征性的程序指导来组织LM的行为。例如，文献[ 24 ]将LM嵌入到算法搜索过程中，以帮助逐步解决问答等问题，其中搜索树由可能提供答案的相关段落展开。然而，这种方法与我们的不同之处在于，树是通过采样外部段落而不是LM自己的思想来扩展的，并且没有反射或投票步骤。另一种方法LLM + P [ 15 ]更进一步，将实际的规划过程委托给一个经典的规划器。</p><p><strong>经典的搜索方法。</strong> 最后但并非最不重要的是，我们的方法可以被视为经典搜索方法在问题求解中的现代体现。例如，它可以被认为是一种类似于A <em>的启发式搜索算法[ 8 ]，其中每个搜索节点上的启发式由LM的自评估提供。从这个角度来看，我们的方法也与文献[ 16 ]中提出的NeuroLogic A</em> esque译码相关，它受到 A* 搜索的启发，但引入了对LM有效的前瞻启发式来改进波束搜索或top-k采样译码。然而，这种方法仅限于句子生成任务，而我们的框架是为复杂的、多步骤的问题解决而设计的，并有价值反馈的保护。</p><h2 id="6-讨论">6. 讨论.</h2><p><strong>局限性及未来方向</strong>。对于GPT-4已经擅长的许多现有任务，ToT等刻意搜索可能不是必要的，作为第一步，本工作只探讨了三个相对简单的任务，这些任务对GPT-4提出了挑战，并要求与LMs结合更好的搜索和规划能力。然而，随着我们开始在更多的现实决策应用(例如编码、数据分析、机器人学等。)中部署LM，更复杂的任务可能会出现，并为研究这些研究问题提供了新的机会。此外，为了提高任务性能，像ToT这样的搜索方法需要比采样方法更多的资源(如GPT-4 API成本)，但是ToT的模块化灵活性允许用户自定义这样的性能-成本权衡，并且正在进行的开源工作[ 29 ]应该在不久的将来很容易地减少这样的成本。最后，这项工作的重点是使用现成的LM，使用ToT风格的高级反事实决策(例如,审议下一段的潜在选择,而不是预测下一个标记)微调LM可能会带来机会，以增强LM的解决问题能力。</p><p><strong>更广泛的影响。</strong> ToT是一个框架，赋予LM更自主、更智能地决策和解决问题的能力。虽然目前的任务仅限于推理和搜索问题，但未来涉及与外部环境或人类互动的应用可能会带来潜在的危险，例如促进LMs的有害使用。另一方面，ToT还提高了模型决策的可解释性和人类对齐的机会，因为得到的表示是可读的、高级的语言推理，而不是隐式的、低级的token。</p><p><strong>结论</strong>。 LMs的关联&quot;系统1&quot;可以通过一个&quot;系统2&quot;进行有益的扩展，该&quot;系统2&quot;基于搜索问题解的可能路径树。思维树框架为当代LM提供了一种将关于问题解决的经典见解转化为可操作的方法的途径。同时，LMs解决了这些经典方法的一个弱点，为解决诸如创意写作等不易形式化的复杂问题提供了途径。我们将LMs与人工智能的经典方法的交集视为未来工作的一个令人兴奋的方向。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;思维树：用大型语言模型深思熟虑地解决问题&lt;/h1&gt;
&lt;h2 id=&quot;摘要&quot;&gt;摘要&lt;/h2&gt;
&lt;p&gt;语言模型越来越多地被用于跨广泛任务的一般问题解决，但在推理过程中仍然局限于令牌级别的、从左到右的决策过程。这意味着他们可能在需要探索的任务、战略前瞻或初始决策起关键作用的任务</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
    <category term="nlp" scheme="https://www.aweisite.top/tags/nlp/"/>
    
  </entry>
  
  <entry>
    <title>LLaVA 与ollama+open webui部署实战</title>
    <link href="https://www.aweisite.top/posts/cad734f.html"/>
    <id>https://www.aweisite.top/posts/cad734f.html</id>
    <published>2024-07-05T18:46:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-Paper">1. Paper</h2><p><strong>LLaVA: Visual Instruction Tuning(<a href="https://arxiv.org/abs/2304.08485">https://arxiv.org/abs/2304.08485</a>)</strong></p><p>LLaVA（Large Language and Vision Assistant, github: <a href="https://github.com/haotian-liu/LLaVA%EF%BC%89%E6%98%AF%E4%B8%80%E7%A7%8D%E5%B0%86%E8%A7%86%E8%A7%89%E5%92%8C%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B%E7%BB%93%E5%90%88%E8%B5%B7%E6%9D%A5%E7%9A%84%E5%A4%9A%E6%A8%A1%E6%80%81%E6%A8%A1%E5%9E%8B%E3%80%82LLaVA%E4%B8%BB%E8%A6%81%E9%80%9A%E8%BF%87%E8%A7%86%E8%A7%89%E6%8C%87%E4%BB%A4%E8%B0%83%E4%BC%98%EF%BC%88Visual">https://github.com/haotian-liu/LLaVA）是一种将视觉和语言模型结合起来的多模态模型。LLaVA主要通过视觉指令调优（Visual</a> Instruction Tuning）来实现模型的训练和优化。</p><h3 id="1-1-模型架构">1.1 模型架构</h3><p><img src="../../images/20240705-01/x1.png" alt="Refer to caption" /></p><p>LLaVA的主要目标是有效地利用预训练LLM模型和视觉模型的能力，模型架构如图，其使用 Vicuna 作为 𝜙 参数化的LLM 𝑓𝜙(⋅)，因为Vicuna的checkpoint具有最好的语言任务指令跟踪能力。</p><p>对于输入图像 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> ，LLaVA使用预训练的 CLIP 视觉编码器 ViT-L/14 ，它提供了视觉特征 $𝐙_v=𝑔(𝐗_v) $。考虑到最后一个 Transformer 层之前和之后的网格特征，LLaVA使用了一个简单的线性层，将图像特征连接到词嵌入空间中。具体来说，使用了一个可训练的投影矩阵 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>𝐖</mi></mrow><annotation encoding="application/x-tex">𝐖</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">W</span></span></span></span> 来将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐙</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐙_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>转换到语言嵌入token <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐇</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐇_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> ，这些token与语言模型中的词嵌入空间具有相同的维度：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mspace width="1em"/><mspace width="1em"/><mspace width="1em"/><mspace width="1em"/><mspace width="1em"/><msub><mi>H</mi><mi>v</mi></msub><mo>=</mo><mi>W</mi><mo>⋅</mo><msub><mi>Z</mi><mi>v</mi></msub><mo separator="true">,</mo><mspace width="1em"/><mtext>with</mtext><mspace width="1em"/><msub><mi>Z</mi><mi>v</mi></msub><mo>=</mo><mi>g</mi><mo stretchy="false">(</mo><msub><mi>X</mi><mi>v</mi></msub><mo stretchy="false">)</mo><mspace width="1em"/><mspace width="1em"/><mspace width="1em"/><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\quad \quad \quad \quad \quad H_v = W \cdot Z_v, \quad \text{with}\quad    Z_v = g(X_v) \quad \quad \quad (1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord text"><span class="mord">with</span></span><span class="mspace" style="margin-right:1em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mspace" style="margin-right:1em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span></p><p>由此得到一系列视觉token <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐇</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐇_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><h3 id="1-2-数据生成与处理">1.2 数据生成与处理</h3><p>为了生成指令跟随数据，LLaVA利用了语言模型（如GPT-4或ChatGPT），创建了包含视觉内容的指令数据。这些数据分为三类：对话、详细描述和复杂推理。通过COCO等图像数据集生成了大约15.8万条语言-图像指令数据，其中包括对话、详细描述和复杂推理的问题和答案 。</p><p><img src="../../images/20240705-01/image-20240705222200889.png" alt="image-20240705222200889" /></p><p>从表中可以看出，它使用两种类型的符号表示：</p><p>(𝑖) <strong>标题</strong></p><p>从各种角度描述视觉场景，即以一段自然语言来描述视觉场景;</p><p>(𝑖𝑖) <strong>边界框</strong></p><p>定位场景中的对象，每个框对对象概念及其空间位置进行编码，就像常规的视觉检测数据集。</p><h3 id="1-3-训练过程">1.3 训练过程</h3><p>LLaVA的训练过程包括对语言模型进行指令调优(Instruction Tuning)，利用预训练的视觉模型和语言模型，通过多轮对话数据来优化模型的响应能力。所有的回答被视为助理的响应，形成统一的多模态指令跟随序列 。</p><p><img src="../../images/20240705-01/x1.png" alt="Refer to caption" /></p><p>对于每张图片 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> ，其生成多回合对话数据<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msubsup><mi>𝐗</mi><mi>q</mi><mn>1</mn></msubsup><mo separator="true">,</mo><msubsup><mi>𝐗</mi><mi>a</mi><mn>1</mn></msubsup><mo separator="true">,</mo><mo>⋯</mo><mo separator="true">,</mo><msubsup><mi>𝐗</mi><mi>q</mi><mi>𝑇</mi></msubsup><mo separator="true">,</mo><msubsup><mi>𝐗</mi><mi>a</mi><mi>𝑇</mi></msubsup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(𝐗_q^1,𝐗_a^1,⋯,𝐗_q^𝑇,𝐗_a^𝑇)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2244em;vertical-align:-0.3831em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3831em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> ，其中 𝑇 是总回合数。将所有对话组织成一个序列，所有答案视为助手的响应，并将 𝑡 第 - 轮的指令<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>𝐗</mi><mrow><mi>i</mi><mi>n</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi></mrow><mi>t</mi></msubsup></mrow><annotation encoding="application/x-tex">𝐗_{instruct}^t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0522em;vertical-align:-0.2587em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7936em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2587em;"><span></span></span></span></span></span></span></span></span></span> 视为：</p><p><img src="../../images/20240705-01/image-20240705221547103.png" alt="image-20240705221547103" />（2)</p><p>这样做使得多模态的指令跟随序列的格式进行了统一，于是，便可以使用原始的自回归训练方法，对LLM的预测token进行指令微调(instruction-tuning )。</p><p>用于训练模型的输入序列如下，这里只展示了两轮对话，实际上的对话论数根据指令跟随的数据而变化。</p><p><img src="../../images/20240705-01/image-20240705221847513.png" alt="image-20240705221847513" /></p><p>与Vicuna-v0相同，LLaVA也设置了<code>system message</code> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>X</mi><mrow><mi>s</mi><mi>y</mi><mi>s</mi><mi>t</mi><mi>e</mi><mi>m</mi><mo>−</mo><mi>m</mi><mi>e</mi><mi>s</mi><mi>s</mi><mi>a</mi><mi>g</mi><mi>e</mi></mrow></msub></mrow><annotation encoding="application/x-tex">X_{system-message}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">sys</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight">ess</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span> ，并且设置 <code>&lt;STOP&gt; = ### </code>。模型通过训练来预测辅助答案和停止位置，因此在自回归模型中只使用<code>绿色 sequence/tokens </code>来计算损失。</p><p>具体来说，对于长度 𝐿 序列，其通过以下方式计算目标答案 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的概率：</p><p><img src="../../images/20240705-01/image-20240705223504160.png" alt="image-20240705223504160" />（3)</p><p>其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>𝜽</mtext></mrow><annotation encoding="application/x-tex">𝜽</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0em;"></span><span class="mord">𝜽</span></span></span></span>是可训练参数， <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mrow><mi>i</mi><mi>n</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi><mo separator="true">,</mo></mrow></msub><mo>&lt;</mo><mi>𝑖</mi></mrow><annotation encoding="application/x-tex">𝐗_{instruct,}&lt;𝑖</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9722em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">t</span><span class="mpunct mtight">,</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>分别 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>a</mi></msub><mo separator="true">,</mo><mo>&lt;</mo><mi>𝑖</mi></mrow><annotation encoding="application/x-tex">𝐗_a,&lt;𝑖</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8805em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span>是当前预测token之前所有回合的指令和应答token <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝒙</mi><mi>𝑖</mi></msub></mrow><annotation encoding="application/x-tex">𝒙_𝑖</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5944em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord boldsymbol" style="margin-right:0.12583em;">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1258em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 。（预测结果的概率等于每次预测token概率的连乘）</p><h4 id="特征对齐的预训练">特征对齐的预训练</h4><p>为了构造的输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>i</mi></msub><mi>n</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>u</mi><mi>c</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">𝐗_instruct</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">n</span><span class="mord mathnormal">s</span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">u</span><span class="mord mathnormal">c</span><span class="mord mathnormal">t</span></span></span></span>，对于图像 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> ，随机抽取一个问题 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>q</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9722em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span> 作为一个语言指令，要求助手简要描述图像，而真实预测答案 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐗</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">𝐗_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 是图像的原始标题。LLaVA在训练中冻结了视觉编码器和LLM权重，并仅使用可训练参数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>𝜽</mtext><mo>=</mo><mi>𝐖</mi></mrow><annotation encoding="application/x-tex">𝜽=𝐖</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mord">𝜽</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6861em;"></span><span class="mord mathbf" style="margin-right:0.01597em;">W</span></span></span></span> （投影矩阵）以最大化 （3） 的概率。通过这种方式，图像特征 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>𝐇</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">𝐇_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8361em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathbf">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以与预训练LLM的词嵌入对齐。</p><p>这个阶段可以理解为冻结的LLM训练一个适配的视觉分词器。</p><h4 id="端到端微调">端到端微调</h4><p>始终保持视觉编码器权重冻结，并继续更新投影层和LLaVA 中的预训练LLM 权重，即（3） 中的可训练参数 𝜽={𝐖,𝜙} 。</p><h3 id="1-4-评估与结果">1.4 评估与结果</h3><p>LLaVA在多个基准测试中表现出色。例如，在12个基准测试中，LLaVA在11个测试中取得了最佳成绩，仅在一个测试中排名第二 。通过调整视觉-语言连接器（如使用两层MLP替代线性投影），LLaVA的多模态能力得到了显著提升。</p><h3 id="1-5-优化与改进">1.5 优化与改进</h3><p>LLaVA的研究还探索了不同设计选择的影响，例如跳过初始连接器预训练对模型性能的影响，发现预训练连接器对于模型性能至关重要。此外，LLaVA还利用相关性图（relevancy maps）可视化模型的注意力，帮助理解模型在处理视觉输入时的关注点。</p><p>综上所述，LLaVA通过结合视觉和语言模型，并利用大规模的指令数据进行调优，显著提升了多模态模型的性能和响应能力。这一方法展示了在视觉-语言结合领域的巨大潜力和应用前景。</p><h2 id="2-部署">2.部署</h2><h3 id="2-2-Ollama-与-open-WebUI-Docker部署">2.2 Ollama 与 open WebUI Docker部署</h3><p>使用<code>docker compose</code>来部署服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">services:</span><br><span class="line">    open-webui:</span><br><span class="line">      image: ghcr.io/open-webui/open-webui:ollama</span><br><span class="line">      container_name: open-webui</span><br><span class="line">      restart: always</span><br><span class="line">      ports:</span><br><span class="line">        - <span class="string">&quot;3000:8080&quot;</span></span><br><span class="line">      deploy:</span><br><span class="line">        resources:</span><br><span class="line">          reservations:</span><br><span class="line">            devices:</span><br><span class="line">              - capabilities: [gpu]</span><br><span class="line">      volumes:</span><br><span class="line">        - ./ollama:/root/.ollama</span><br><span class="line">        - ./open-webui:/app/backend/data</span><br></pre></td></tr></table></figure><p>使用<code>docker compose up -d</code>来部署服务，等待部署完成，访问<code>http://127.0.0.1:3000/</code>即可进入WebUI界面。</p><p><img src="../../images/20240705-01/image-20240706202716404.png" alt="image-20240706202716404" /></p><h3 id="2-1-模型下载">2.1  模型下载</h3><h4 id="2-1-1-ollama社区模型">2.1.1 ollama社区模型</h4><p>创建完账号之后直接在管理员面板拉取模型，也可以在容器内通过命令行<code>ollama pull llavaL:13b-v1.6-vicuna-q5_K_M</code>来拉取。</p><p><img src="../../images/20240705-01/image-20240709165214056.png" alt="image-20240709165214056" /></p><h4 id="2-1-1-自定义模型">2.1.1 自定义模型</h4><p>使用<code>snap_download</code>从<code>huggingface</code>下载模型，选择的版本为<code>llava-v1.6-mistral-7b</code>。</p><p><code>注：这里下载的是别人量化过的gguf文件，如果要自定义模型，需要自己使用llama.cpp进行编译量化</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> huggingface_hub <span class="keyword">import</span> snapshot_download</span><br><span class="line">%env HF_ENDPOINT=<span class="string">&quot;https://hf-mirror.com&quot;</span></span><br><span class="line">snapshot_download(</span><br><span class="line">  repo_id=<span class="string">&quot;KBlueLeaf/llama3-llava-next-8b-gguf&quot;</span>,</span><br><span class="line">  local_dir=<span class="string">&quot;llama3-llava-next-8b-gguf&quot;</span>,</span><br><span class="line">  max_workers=<span class="number">8</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>在容器内创建<code>llava.Modelfil</code>:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">FROM /path_to_model/llama3-llava-next-8b-gguf/llama3-llava-next-8b-Q8_0.gguf</span><br><span class="line">TEMPLATE &quot;&lt;|im_start|&gt;system</span><br><span class="line">&#123;&#123; .System &#125;&#125;&lt;|im_end|&gt;</span><br><span class="line">&lt;|im_start|&gt;user</span><br><span class="line">&#123;&#123; .Prompt &#125;&#125;&lt;|im_end|&gt;</span><br><span class="line">&lt;|im_start|&gt;assistant</span><br><span class="line">&quot;</span><br><span class="line">PARAMETER stop &lt;|im_start|&gt;</span><br><span class="line">PARAMETER stop &lt;|im_end|&gt;</span><br><span class="line"></span><br><span class="line">LICENSE &quot;&quot;&quot; Apache License  Version 2.0, January 2004 &quot;&quot;&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用命令行创建模型<code>ollama create llava -f llava.Modelfile</code>，执行结束后即可在webui中找到创建好的模型。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;1-Paper&quot;&gt;1. Paper&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;LLaVA: Visual Instruction Tuning(&lt;a href=&quot;https://arxiv.org/abs/2304.08485&quot;&gt;https://arxiv.org/abs/</summary>
      
    
    
    
    <category term="摸鱼日记" scheme="https://www.aweisite.top/categories/%E6%91%B8%E9%B1%BC%E6%97%A5%E8%AE%B0/"/>
    
    
    <category term="LLMs" scheme="https://www.aweisite.top/tags/LLMs/"/>
    
  </entry>
  
  <entry>
    <title> Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey 大模型的参数高效微调：综述</title>
    <link href="https://www.aweisite.top/posts/18f5f83b.html"/>
    <id>https://www.aweisite.top/posts/18f5f83b.html</id>
    <published>2024-04-18T18:52:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<p>索引术语- -大型语言模型、参数高效微调、计算机系统、分布式系统。</p><p>原文链接: <a href="https://arxiv.org/abs/2403.14608">Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey</a></p><h2 id="摘要">摘要</h2><p>大型模型代表了多个应用领域的开创性进展，在不同的任务中取得了显著的成就。然而，它们前所未有的规模伴随着巨大的计算成本。这些模型往往由数十亿个参数组成，需要耗费大量的计算资源才能执行。特别是在受计算能力限制的硬件平台上，扩展的规模和计算需求为定制特定的下游任务带来了相当大的挑战。</p><p>参数高效微调( Parameter Efficient Fine-Tuning，PEFT )通过高效地适应各种下游任务的大模型，提供了一种实用的解决方案。特别地，PEFT是指在最小化引入的额外参数数量或所需的计算资源的同时，调整预先训练好的大型模型的参数，使其适应特定的任务或领域的过程。这种方法在处理具有高参数计数的大规模语言模型时尤为重要，因为从零开始微调这些模型可能会导致计算开销大和资源密集型，从而在支撑系统平台设计中带来相当大的挑战。</p><p>在这项调查中，我们对各种PEFT算法进行了全面的研究，考察了它们的性能和计算开销。此外，我们提供了使用不同PEFT算法开发的应用程序的概述，并讨论了用于减轻PEFT计算成本的常用技术。除了算法角度，我们还概述了各种真实世界的系统设计，以调查与不同PEFT算法相关的实现成本。这项调查是研究人员了解PEFT算法及其系统实现的不可或缺的资源，对最近的进展和实际应用提供了详细的见解。</p><h2 id="I-导语">I. 导语</h2><p>大型模型( LMs )最近引起了公众的极大兴趣。他们对上下文和细微差别的理解能力使他们能够熟练地处理跨多个领域的多样化任务，包括自然语言处理( NLP )、计算机视觉( CV )等。在NLP领域，大型语言模型( Large Language Models，LLMs )在文本生成[ 10 ]，[ 243 ]，翻译[ 239 ]，[ 61 ]，个性化聊天机器人[ 192 ]，[ 103 ]，[ 187 ]和摘要[ 212 ]等任务中取得了显著的进步，表现出卓越的能力。</p><p>早期的研究[ 10 ]表明，LLMs表现出高度的泛化能力，使其能够将获得的知识应用到原始训练中没有包含的新任务中。这种能力通常被称为零样本学习。尽管如此，微调仍然是必要的，以进一步提高LLMs在新的用户数据集和任务上的最优性能。</p><p>由于LLM的规模，广泛采用的LLM微调策略是在保持其余参数不变的情况下，调整有限个LLM参数。这种技术称为参数高效微调( Parameter-Efficient-Mining，PEFT )，是指在保持其他参数不变的情况下，选择性地调整其中一小部分参数。此外，PEFT的应用超越了NLP领域，并迅速引起了CV界的兴趣，用于处理具有大参数的微调视觉模型，如Vision Transformers( ViT )和扩散模型，以及视觉语言模型等学科模型。</p><p><img src="../../images/20240418-01/2024-04-18-19-05-54-image.png" alt="" /></p><p>图1：综述内容概览</p><p>在该篇综述中，我们系统地回顾和分类了PEFT算法的最新进展，以及在不同场景下与各种PEFT算法相关的系统实现成本。图1呈现了本次调查的概况内容。第2节介绍了LLM和PEFT的一些基本概念，包括LLM的计算流程、PEFT的基本知识以及常用的数据集和任务。</p><p>在第三节中，我们根据PEFT算法的计算流程对其进行了分类。在第三节- A中，我们介绍了加性算法，这些算法要么引入额外的权重参数，要么修改激活函数。对于只需要利用现有参数进行微调的算法，属于选择性方法的范畴，其介绍可参见第III - B节。在第III - C节中，我们探索了重新参数化的PEFT，它对原始模型参数进行(低维)重新参数化以进行训练，同时将权重转换回来以保持推断速度。此外，还有结合上述技术的算法，我们将其归类为混合方法，在第III - D节中进行阐述</p><p>在第五节中，我们将本次调查的范围扩展到计算视角之外，以涉及各种潜在的应用场景。我们探索了将PEFT技术应用于不同模型架构的创新，包括LLMs (第V ~ A段)，Vision Transformer (第五部分- - B)，Vision Language对齐模型(第五部分- - C)和Diffusion模型(第V - D部分)，以适用于不同的下游任务，强调了PEFT在一系列场景中的通用性和适用性。在第六节中，我们探讨了PEFT方法的系统设计挑战。讨论内容包括3个面向实际PEFT部署的高级系统解决方案：分布式调优(第六部分- - B)、服务于(第六部分- - C)的PEFT查询和并发PEFT调优(第六部分- - D)。</p><p>在最后的第七节中，我们总结了我们的研究，并从算法和系统的角度提出了几个潜在的未来方向，希望为该领域的进一步研究和发展提供有价值的见解。</p><h2 id="II-背景">II. 背景</h2><p>在这一部分中，我们首先讨论了LLM的计算流程，包括它的基本组成部分，计算复杂性，以及作为案例研究它所涉及的计算流程。我们在第II - B节中对不同的PEFT算法进行了简要概述。</p><p><img src="../../images/20240418-01/2024-04-18-19-08-34-image.png" alt="" /></p><p>图2：( a ) Llama结构。( b ) Llama自回归模型。( c )三种常见的PEFT操作。所有可学习的成分都用红色突出显示，而冻结的成分用灰色突出显示。LoRA应用于所有的Query、Key和Value块。适配器针对的是FFN模块。Soft - Prompt侧重于调整每个解码器的输入激活。为了简单起见，我们只展示了一个解码器。</p><h3 id="A-LLaMA-的计算流"><strong>A. LLaMA 的计算流</strong></h3><p>为了更深入地理解LLM和其他基于Transformer的模型，我们采用了LLaMA - 7B这一前沿的开源LLM模型来研究LLM和Transformer的架构。如图2 ( a )所示，LLaMA由三个主要部分组成：嵌入块，解码器块的堆栈和由线性层和softmax层组成的头块。嵌入层的主要作用是将非结构化的文本信息转化为离散的数值向量( tokens )块，以方便后续处理。然后将嵌入的token传递到解码器层进行进一步的处理。每个LLaMA解码器由两个基本部件组成：多传感头自注意力( MSA )和前馈网络( FFN )。在MSA模块中，每个token都会被输入token的两个线性映射之间通过点生成得到的注意力图进行聚类。然后将分组后的token进一步通过前馈神经网络进行处理。此外，LLaMA采用均方根图层标准化( RMSNorm ) [ 211 ]作为图层标准化的替代，以保证训练的高效性。</p><p>LLM以两种显著的方式区别于其他深度神经网络( DNN )模型，如卷积神经网络( CNN )。首先，LLM表现出固有的自回归特性，需要多次迭代才能完成生成任务。此外，LLM包含一个注意力机制，它是一个计算复杂度与输入长度成二次方关系的组件。另一方面，LLM固有的计算特性在于每个解码器层内部的注意力块。图2 ( c )描绘了注意力块中计算流程的高层概貌。</p><p>在推理过程中，每个解码器使用一个4维张量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>b</mi><mo>×</mo><mi>l</mi><mo>×</mo><mi>d</mi></mrow></msup></mrow><annotation encoding="application/x-tex">x \in \mathbb{R}^{b \times l \times d}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">b</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span></span></span></span></span> 作为输入表征。输入的token首先与三个权重矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mi>Q</mi></mrow><annotation encoding="application/x-tex">WQ</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal">Q</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">WK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mi>V</mi></mrow><annotation encoding="application/x-tex">WV</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">WV</span></span></span></span>相乘，产生的输出称为查询( <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span> )，键( $K $)和值( <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span> )。考虑到MSA模块无法识别位置数据和LLMs固有的自回归性质，查询和键将经历一个使用旋转位置嵌入[ 165 ] ( RoPE ,在式( 1 )中记为Rp . q)编码位置信息的过程。随后，键和值将与先前的token相结合。</p><p>在位置嵌入之后，中间激活将经历一系列的乘法，softmax和残差加法，以产生如方程9所述的MSA输出。这里需要注意的是，方程中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">d_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是指多头注意力机制中特征维度的个数。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mi>Q</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>V</mi><mo>=</mo><mi>R</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mi>q</mi></msub><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>R</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mi>k</mi></msub><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>W</mi><mi>v</mi></msub><mi>x</mi><mo stretchy="false">)</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">( Q, K, V = R(W_qx), R(W_kx), W_vx ) \qquad (1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">Q</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>SA</mtext><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mtext>Softmax</mtext><mo stretchy="false">(</mo><mfrac><mrow><mi>Q</mi><msup><mi>K</mi><mi>T</mi></msup></mrow><msqrt><msub><mi>d</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></msub></msqrt></mfrac><mo stretchy="false">)</mo><mi>V</mi><mspace width="2em"/><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{SA}(x) = \text{Softmax}({\frac{QK^T}{\sqrt{d_{head}}}})V \qquad (2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">SA</span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4483em;vertical-align:-0.93em;"></span><span class="mord text"><span class="mord">Softmax</span></span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>MSA</mtext><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">[</mo><msub><mtext>SA</mtext><mn>1</mn></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">;</mo><msub><mtext>SA</mtext><mn>2</mn></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo separator="true">;</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">;</mo><msub><mtext>SA</mtext><mi>k</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><msub><mi>W</mi><mn>0</mn></msub><mspace width="2em"/><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{MSA}(x) = [\text{SA}_1(x);\text{SA}_2(x);...;\text{SA}_k(x)]W_0 \qquad (3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">MSA</span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord"><span class="mord text"><span class="mord">SA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord text"><span class="mord">SA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord text"><span class="mord">SA</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)]</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mclose">)</span></span></span></span></span></p><p>然后将SA输出转发给FFN块进行进一步处理。FFN块将有另外三个矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>g</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{gate}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>，计算可以用图来说明：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mi>F</mi><msub><mi>N</mi><mrow><mi>L</mi><mi>L</mi><mi>a</mi><mi>M</mi><mi>a</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo stretchy="false">(</mo><mi>S</mi><mi>i</mi><mi>L</mi><mi>U</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>g</mi><mi>a</mi><mi>t</mi><mi>e</mi></mrow></msub><mi>x</mi><mo stretchy="false">)</mo><mo>⊙</mo><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>+</mo><mi>x</mi><mspace width="2em"/><mo stretchy="false">(</mo><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FFN_{LLaMa}(x) = W_{up}(SiLU(W_{gate}x) \odot (W_{down}x)) + x \qquad (4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">FF</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">LL</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span><span class="mord mathnormal mtight">a</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.10903em;">LU</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">))</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mclose">)</span></span></span></span></span></p><p>其中x表示FFN层的输入，SiLU是LLaMA中使用的非线性函数。在原始Transformer中，FFN块可以表示为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mi>F</mi><msub><mi>N</mi><mrow><mi>T</mi><mi>r</mi><mi>a</mi><mi>n</mi><mi>s</mi><mi>f</mi><mi>o</mi><mi>m</mi><mi>e</mi><mi>r</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo stretchy="false">(</mo><mi>R</mi><mi>e</mi><mi>L</mi><mi>U</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>D</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo><mi>x</mi><mo stretchy="false">)</mo><mo>+</mo><mi>x</mi><mspace width="2em"/><mo stretchy="false">(</mo><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FFN_{Transfomer}(x) = W_{up}(ReLU(W_{Down})x) + x \qquad (5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">FF</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">an</span><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">er</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.10903em;">LU</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">Do</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mclose">)</span></span></span></span></span></p><p>最后一个解码器层的输出将被发送到一个线性层，该线性层产生一个跨越完整词表的概率分布来预测序列中的下一个token。然后将产生的token与之前的token进行拼接，并将其作为下一轮处理的输入。这个生成过程以自回归的方式重复，直到产生一个完整的token序列(称为完成) ( (图2 ( b )) )。对于训练，其计算流程与推理类似，只是将生成的句子直接与真值输出进行比较，产生训练损失。然后通过LLM权重计算梯度，以最小化这种训练损失。</p><p>为了分析LLM中的计算开销和内存开销，我们还设置了后面第三节中使用的一系列参数。表1以LLaMA - 7B模型为例，给出了模型的参数大小和计算维数。</p><p>LLM模型根据先前的提示(输入)和先前生成的序列，为每一轮生成token(单词)一，如图2所示。这个过程会重复进行，直到模型输出命中和终止token。为了加速LLM模型中的推理过程，人们采取将之前的Key和Value存储在语义相关缓存( KV-cache )中的策略，因此不需要为每个新的token重新计算它们。从数学上讲，我们可以在式( 6 )中表示总解码器的kv - cache内存开销。</p><p>在该方程中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>是上下文长度和批大小，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>L</mi></mrow><annotation encoding="application/x-tex">L</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>是层数。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>d</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></msub></mrow><annotation encoding="application/x-tex">d_{head}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为头部尺寸，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></mrow><annotation encoding="application/x-tex">n{head}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">n</span><span class="mord"><span class="mord mathnormal">h</span><span class="mord mathnormal">e</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span></span></span></span></span>为头部数量。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mi>i</mi><mi>z</mi><mi>e</mi><mo>=</mo><mi>L</mi><mo>×</mo><mn>2</mn><mo>×</mo><mi>b</mi><mo>×</mo><mi>l</mi><mo>×</mo><msub><mi>d</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></msub><mo>×</mo><msub><mi>n</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></msub><mspace width="2em"/><mo stretchy="false">(</mo><mn>6</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">Size = L \times 2 \times b \times l \times d_{head} \times n_{head} \qquad (6)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">i</span><span class="mord mathnormal">ze</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">L</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">6</span><span class="mclose">)</span></span></span></span></span></p><p><img src="../../images/20240418-01/image-20240418202851860.png" alt="image-20240418202851860" /></p><p>表1：LLaMA - 7B体系结构的配置参数和计算操作</p><h3 id="B-参数高效微调概述"><strong>B.参数高效微调概述</strong></h3><p>微调对于增强隐形用户数据集和任务上的LLM性能仍然是必不可少的。随着模型规模的不断增大，标准的全微调范式需要成千上万的GPU并行工作，效率极低且不可持续。一种算法被提出，即参数有效的微调( PEFT )，其目的是调整最小的参数，以获得比完全调整下游任务更好的性能。</p><p>在并行开发中，视觉和多模态领域的大规模预训练模型也展示了其有效的表示学习能力，能够通过微调从大数据集适应到较小的数据集或跨越各种数据模态。因此，这种能力使PEFT对更广泛的研究社区具有越来越大的吸引力。</p><p><img src="../../images/20240418-01/image-20240418202727814.png" alt="image-20240418202727814" /></p><p>图3：大模型的高效参数微调方法的分类。</p><p>我们根据PEFT算法的操作将其分为加性、选择性、重新参数化和混合微调。如图3所示，通常使用三种主要的加法微调算法：( 1 )适配器；( 2 )软提示；( 3 )其他。它们的不同之处在于附加的可调模块或参数不同。另一方面，选择性微调不需要任何额外的参数，它从骨干模型中选择一小部分参数，只使它们可调，而在下游任务的微调过程中保持大多数参数不变。我们根据所选参数的分组情况对选择性微调进行了分类：</p><p>( 1 )非结构性遮蔽（Structural Masking）；( 2 )结构遮蔽（Structural Masking）。重新参数化表示模型参数在两种等效形式之间的转换。具体来说，重新参数化微调在训练过程中引入额外的低秩可训练参数，然后将其与原始模型集成进行推理。该方法分为两种主要策略：( 1 )低秩分解( Lowrank Decomposition )；( 2 ) LoRA衍生。混合微调探索了不同PEFT方法的设计空间，并结合了它们的优点。</p><h3 id="C-用于LLM评估的下游任务"><strong>C.用于LLM评估的下游任务</strong></h3><p>有两类任务已被广泛用于LLM评估，第一类是通用语言理解评估( GLUE ) [ 175 ]基准，该基准集成了9个句子或句子对语言理解任务( Co LA、SST - 2、MRPC、STS - B、QQP、MNLI、QNLI、RTE、WNLI)，其选择依据是数据集大小、文本类型和难度等级的多样性，并基于已建立的现有数据集。它还包括一个专门设计的诊断数据集，用于评估和分析模型在自然语言中固有的各种语言现象中的性能。此外，它还具有一个公共的排行榜来跟踪基准测试集上的性能，以及一个仪表板来可视化模型在诊断集上的性能。</p><p>在最近的LLM论文中使用的另一种类型的数据集是常识推理，集成到我们的研究中迎合了多种研究方面：( 1 ) OpenBook QA [ 135 ]的目的是促进高级问答的研究，深入理解主题和语言。( 2 ) PIQA [ 8 ]主要强调日常场景，体现了对非常规解决方案的偏好。( 3 )社会IQA [ 157 ]作为一个新颖的问答基准，专门用于衡量社会常识智能。( 4 ) HellaSwag [ 208 ]作为一个数据集，其本质是确定机器在恰当地总结句子方面的能力。( 5 ) Bool Q [ 30 ]是一个专门用于问答的数据集，特别是针对二进制响应(是/否查询)。( 6 ) WinoGrande [ 156 ]是一个新的汇编，包含44，000个问题。( 7 ) ARC-easy [ 31 ]是一个新颖的数据集，它构成了真正的年级-学校层面的多选科学问题，旨在通过复杂的问题回答来激发研究的活力。( 8 ) ARC -挑战[ 31 ]，与众不同的是，仅仅包含了那些基于检索算法和词共现算法都不能准确解决的问题。</p><p>图像识别是视觉模型的主要基准和应用，例如细粒度视觉分类基准( FGVC )和视觉任务适配基准( VTAB )。除了图像分类，视频行为识别是另一个关键的应用领域，涉及Kinetics-400 [ 92 ]，SSv2 [ 56 ]和HMDB51 [ 96 ]等数据集。此外，PEFT已被用于密集预测任务，使用数据集如MSCOCO [ 113 ]，ADE20K [ 230 ]和PASCAL VOC [ 43 ]。</p><h2 id="Ⅲ-PEFT-分类">Ⅲ. PEFT 分类</h2><p>PEFT策略大致可以分为四类：添加型PEFT (第三节- A)，它通过注入新的可训练模块或参数来修改模型结构；选择性PEFT (第三节- B)，使微调过程中的参数子集可训练；再参数化PEFT (第三节- C)，即对原始模型参数进行(低维)再参数化构造，用于训练，然后等效变换回来进行推断；而混合PEFT (第三节- D)则结合了不同PEFT方法的优点，构建了统一的PEFT模型。不同类型的PEFT算法的概述如图4所示。</p><p><img src="../../images/20240418-01/image-20240418202809738.png" alt="image-20240418202809738" /></p><p>图4：不同类型的PEFT算法。</p><h3 id="A-添加型PEFT"><strong>A .添加型PEFT</strong></h3><p>标准的完全微调需要大量的计算开销，并且可能会损害模型的泛化能力。为了缓解这个问题，一种广泛使用的方法是保持预训练的主干不变，只引入在模型架构中具有战略地位的最小数量的可训练参数。在对特定下游任务进行微调的同时，只更新这些额外模块或参数的权重，这将导致存储、内存和计算资源需求的大幅减少。由于这些技术具有增加参数的特点，这些技术可以被称为添加微调，如图4 ( a )所示。接下来，我们讨论了几种流行的Additive PEFT算法。</p><p>1 )<strong>适配器(Adapter)</strong>：适配器方法涉及在Transformer块中插入小的适配器层。通常，适配器层由一个下投影矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>r</mi><mo>×</mo><mi>d</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_{down} \in \mathbb{R}^ {r \times d }</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">d</span></span></span></span></span></span></span></span></span></span></span></span>，一个非线性激活函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>σ</mi><mo stretchy="false">(</mo><mo>⋅</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sigma (\cdot)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord">⋅</span><span class="mclose">)</span></span></span></span> 和一个上投影矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>r</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_{up}\in \mathbb{R}^{d \times r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span></span></span></span></span>组成。在该上下文中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>表示隐藏层的维度，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span> 作为瓶颈维度，是用于配置适配器的超参数。将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">h_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>作为适配器的输入，适配器模块(带残差)内的计算可以概括如下：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>Adapter</mtext><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mi>σ</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mi>x</mi><mo stretchy="false">)</mo><mo>+</mo><mi>x</mi><mspace width="2em"/><mo stretchy="false">(</mo><mn>7</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\text{Adapter}(x) = W_{up}\sigma(W_{down}x)+x \qquad (7)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord text"><span class="mord">Adapter</span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mclose">)</span></span></span></span></span></p><p><img src="../../images/20240418-01/image-20240419091317545.png" alt="image-20240419091317545" /></p><p>图5：3种具有代表性的基于适配器的微调算法示意图。蓝色代表冷冻，黄色代表可训练。</p><p>NLP领域中适配器的概念最初是由Serial Adapter [ 75 ]引入的，如图5 ( a )所示。在他们的方法中，每个Transformer块通过增加两个适配器模块来增强，其中一个位于自注意力层之后，另一个位于FFN层之后。后续的研究旨在解决与适配器层相关的额外计算成本。提出了一个改进的框架AdapterFusion [ 145 ]，其中适配器层仅在FFN层之后的&quot; Add &amp; Norm &quot;步骤后插入，以提高计算效率。相反，文献[ 67 ]介绍了一种并行适配器( PA )方法，如图5 ( b )所示，它将传统上顺序的适配器层重组为一个并行的侧网络，并与每个Transformer子层一起运行。类似地，CIAT [ 242 ]、CoDA [ 101 ]和Kron A [ 42 ]也采用了并行适配器设计。除并行设计外，CoDA采用稀疏激活机制提高推理效率，如图5 ( c )所示。具体来说，CoDA采用软的top - k选择过程，在每一层中识别k个重要的token，这些token将由冻结的预训练Transformer层和适配器分支共同处理，以保持模型的准确性。相反，那些不重要的token只由适配器分支处理，而跳过繁重的预训练层，从而在不影响整体性能的情况下优化推理效率。</p><p>为了增强适配器的性能和泛化性，各种研究实现了多任务学习策略，如AdapterFusion [ 145 ]，AdaMix [ 180 ]，PHA [ 226 ]，AdapterSoup [ 29 ]，MerA [ 70 ]和Hyperformer [ 129 ]。AdapterFusion将所有预先训练好的适配器保留在模型中，并使用融合模块对多任务信息进行融合。与AdapterFusion不同，MerA通过基于权重和激活的最优传输将预训练的适配器合并为单个适配器。该方法避免了引入任何额外的可训练参数，从而提高了计算效率。Hyperformer 将多任务信息存储在一个共享的超网络中，该网络根据任务和层id嵌入生成任务和层特定的适配器参数。给定一个新的任务，只需要学习一个额外的任务嵌入，从而减少了训练参数的数量。</p><p>2 )<strong>软提示(Soft Prompt)</strong>：或者说，提示调优提供了一种额外的方法来改进模型，通过微调来实现性能的提高。人们普遍认为，软提示的连续嵌入空间内在地包含了更多的信息，而不是通过语境学习来优化离散的token表示[ 144 ]。受这一概念的启发，研究人员直接在输入序列的开始处添加可调向量，称为软提示。这可以表示为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi mathvariant="normal">X</mi><mi>l</mi></msup><mo>=</mo><mo stretchy="false">[</mo><msup><msub><mi mathvariant="normal">S</mi><mi mathvariant="normal">l</mi></msub><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi mathvariant="normal">S</mi><msub><mi mathvariant="normal">N</mi><mi mathvariant="normal">S</mi></msub></msub><mo separator="true">,</mo><msup><mi mathvariant="normal">x</mi><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msup><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msubsup><mi mathvariant="normal">x</mi><msub><mi>N</mi><mi>X</mi></msub><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msubsup><mo stretchy="false">]</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>8</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathrm{X}^{l} = [\mathrm{S_l}^{(l)},...,\mathrm{S_{N_S}},\mathrm{x}^{(l)},...,\mathrm{x}_{N_X}^{(l)}] \qquad (8)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8991em;"></span><span class="mord"><span class="mord mathrm">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8991em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.4386em;vertical-align:-0.3938em;"></span><span class="mopen">[</span><span class="mord"><span class="mord"><span class="mord mathrm">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathrm mtight">l</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9612em;"><span style="top:-3.1362em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathrm">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathrm mtight">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1433em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2503em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathrm">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathrm">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4065em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567em;margin-left:-0.109em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1433em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3938em;"><span></span></span></span></span></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">8</span><span class="mclose">)</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi mathvariant="normal">X</mi><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">\mathrm{X}^{(l)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em;"></span><span class="mord"><span class="mord mathrm">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span>是第<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span>层的输入token序列，包括软提示token <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>s</mi><mi>i</mi><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msubsup></mrow><annotation encoding="application/x-tex">s_i^{(l)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3217em;vertical-align:-0.2769em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span></span></span></span> 和原始输入token <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>x</mi><mi>i</mi><mrow><mo stretchy="false">(</mo><mi>l</mi><mo stretchy="false">)</mo></mrow></msubsup></mrow><annotation encoding="application/x-tex">x_i^{(l)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3217em;vertical-align:-0.2769em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0448em;"><span style="top:-2.4231em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.2198em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span></span></span></span>。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mi>S</mi></msub></mrow><annotation encoding="application/x-tex">N_S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为软提示token数量，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>N</mi><mi>X</mi></msub></mrow><annotation encoding="application/x-tex">N_X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为原始输入token数量。</p><p><strong>前缀微调(Prefix-tuning )</strong>[ 105 ]在所有Transformer层中引入了与键值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>和值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>相关的可学习向量。为了保证优化过程中的稳定性，<strong>Prefix-tuning</strong>采用了一种重新参数化的策略，利用MLP层来生成这些前缀向量，而不是直接对其进行优化。微调后，只保存前缀向量进行推理。该技术在多个研究[ 104 ]、[ 121 ]、[ 224 ]中被采用和改进。例如，<strong>p-tuning v2</strong> [ 121 ]去除了重新参数化，并将其应用扩展到更广泛的模型规模和NLP任务中。<strong>APT</strong> (自适应前缀调谐) [ 224 ]通过引入自适应门机制控制各层中前缀的重要性来增强前缀调优。并行工作<strong>p - tuning</strong> [ 123 ]和即时调整[ 102 ]仅在初始词嵌入层而不是所有层应用可学习向量来提高训练和推理效率。值得注意的是，及时调整主要在大型模型的背景下显示其有效性，特别是那些具有超过110亿参数的模型[ 102 ]。作为补充**，Xprompt** [ 126 ]通过一种层次化的结构化剪枝来消除负提示令牌，从而在较小的模型规模上弥合性能差距。文献[ 179 ]的工作为快速调谐提供了一些理论分析，证明了其在有限深度Transformers中的普遍性和局限性。<strong>IDPG</strong> (依赖实例的提示生成) [ 189 ]通过使用轻量级提示生成器根据每个输入句子生成提示来改善提示调整。在相关的方法中，<strong>LPT</strong> (晚期提示调谐) [ 122 ]也利用了一个提示生成器来获得实例感知的提示。与之前的工作不同，LPT只在一个中间层之后添加这些提示，而不是在初始层或所有层。这种策略性放置消除了中间层以下的梯度计算，从而显著加快了训练速度。同时，由于较短的反向传播路径保留了更多与任务相关的信息，LPT可以提高整体性能。受LPT的启发，<strong>SPT</strong> (选择性提示微调) [ 240 ]更深入地研究了即时插入策略的重要性。它在每一层中引入一个可学习的概率门来决定是使用上一层传播过来的提示还是注入新生成的提示。<strong>APrompt</strong> [ 177 ]采用了另一种提示插入策略。除了在每个Transformer层的输入序列开始处插入输入提示外，APrompt还在自注意力块中的各自查询、键和值矩阵中预先添加额外的可学习提示，以学习新的注意力模式。除此之外，APrompt包含了对特定任务头部的学习。</p><p>软提示的概念已经被用于各种下游任务[ 28 ]，[ 184 ]，尽管它们的训练容易出现不稳定和收敛缓慢的问题。为了解决这个问题，<strong>SPoT</strong> [ 173 ]使用从一个或多个任务中学习到的源提示来初始化新任务的提示。类似地，<strong>TPT</strong> (可迁移提示调优) [ 166 ]提出了将软提示从一个任务转移到另一个任务的初始化，这表明更好的提示初始化可以获得较大的训练收敛加速比。<strong>InfoPrompt</strong> [ 185 ]开发了两个基于互信息的损失函数，即头损失和表征损失，以找到更好的提示初始化，并学习足够的任务相关信息，从而也加快了收敛。<strong>PTP</strong> [ 18 ]深入研究了训练不稳定的根本原因。它识别了传统即时调整中损失景观的陡峭性质，其中输入数据的微小变化可能会导致显著的损失波动。为了缓解这种情况，PTP引入了基于扰动的正则化器来平滑损失景观，从而稳定训练过程。<strong>DePT</strong> [ 160 ]用一对低秩矩阵将软提示分解成一个较短的软提示，并用两个不同的学习率进行优化。该策略不仅提高了性能，而且提高了训练和推理效率。<strong>SMoP</strong> (稀疏混合提示( Sparse Mixture-of-Prompts )) [ 27 ]通过使用短的软提示来降低训练和推理成本。在训练过程中，训练多个简短的软提示，每个提示针对数据集的特定子集。在推理过程中，SMoP集成了一个门控机制，将每个输入实例路由到一个适当的短提示。这种技术不仅提高了训练和推理阶段的效率，而且保持了与使用更长的软提示所获得的性能相当。为了进一步减少软提示参数的数量，IPT (内在的提示调谐) [ 148 ]通过在多个任务上训练一个自动编码器来识别一个内在的任务子空间。然后在新的任务上进行调整，只需要在这个子空间内调整几个参数，大大减少了训练参数的数量。</p><p><img src="../../images/20240418-01/image-20240419093718574.png" alt="image-20240419093718574" /></p><p>图6：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">I</mi><mi mathvariant="normal">A</mi><msup><mo stretchy="false">)</mo><mn>3</mn></msup></mrow><annotation encoding="application/x-tex">\mathrm{(IA)^3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathrm">IA</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathrm mtight">3</span></span></span></span></span></span></span></span></span></span></span></span>和SSF插图。蓝色代表冻结，黄色代表可训练。</p><p>3 )其他加法方法：除上述方法外，还有其他方法在微调过程中策略性地加入了额外的参数。例如，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi mathvariant="normal">I</mi><mi mathvariant="normal">A</mi><msup><mo stretchy="false">)</mo><mn>3</mn></msup></mrow><annotation encoding="application/x-tex">\mathrm{(IA)^3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathrm">IA</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathrm mtight">3</span></span></span></span></span></span></span></span></span></span></span></span>[ 116 ] 引入了三个可学习的重标度向量：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mi>k</mi></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><msub><mi>d</mi><mi>k</mi></msub></msup></mrow><annotation encoding="application/x-tex">l_k \in \mathbb{R}^{d_k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mi>v</mi></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><msub><mi>d</mi><mi>v</mi></msub></msup></mrow><annotation encoding="application/x-tex">l_v \in \mathbb{R}^{d_v}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>，和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><msub><mi>d</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub></msup></mrow><annotation encoding="application/x-tex">l_{ff} \in \mathbb{R}^{d_{ff}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9805em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:0em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>，如图6 ( a )所示，分别对key，value和FFN激活进行重新标度。自注意力块内的操作可以描述如下：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mi>A</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>S</mi><mi>o</mi><mi>f</mi><mi>t</mi><mi>m</mi><mi>a</mi><mi>x</mi><mrow><mfrac><mrow><mi>Q</mi><mo stretchy="false">(</mo><msub><mi>l</mi><mi>k</mi></msub><mo>⊙</mo><msup><mi>K</mi><mi>T</mi></msup><mo stretchy="false">)</mo></mrow><msqrt><msub><mi>d</mi><mrow><mi>h</mi><mi>e</mi><mi>a</mi><mi>d</mi></mrow></msub></msqrt></mfrac><mo stretchy="false">(</mo><msub><mi>l</mi><mi>v</mi></msub><mo>⊙</mo><mi>V</mi><mo stretchy="false">)</mo><mi mathvariant="normal">.</mi></mrow><mspace width="2em"/><mo stretchy="false">(</mo><mn>9</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">SA(x) =  Softmax{\frac{Q(l_k \odot K^T)}{\sqrt{d_{head}} }(l_v \odot V).} \qquad (9)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">A</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4483em;vertical-align:-0.93em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5183em;"><span style="top:-2.2528em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8572em;"><span class="svg-align" style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord" style="padding-left:0.833em;"><span class="mord"><span class="mord mathnormal">d</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">h</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-2.8172em;"><span class="pstrut" style="height:3em;"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5,-221l0 -0c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47zM834 80h400000v40h-400000z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1828em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.93em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mclose">)</span><span class="mord">.</span></span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mclose">)</span></span></span></span></span></p><p>在FFN中，重标度可以表示为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mi>F</mi><msub><mi>N</mi><mrow><mi>T</mi><mi>r</mi><mi>a</mi><mi>n</mi><mi>s</mi><mi>f</mi><mi>o</mi><mi>m</mi><mi>e</mi><mi>r</mi></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo stretchy="false">(</mo><msub><mi>l</mi><mrow><mi>f</mi><mi>f</mi></mrow></msub><mo>⊙</mo><mi>σ</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo separator="true">,</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>10</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">FFN_{Transfomer}(x) = W_{up}(l_{ff}\odot \sigma (W_{down}x)), \qquad (10)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">FF</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mord mathnormal mtight">an</span><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">m</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">er</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">ff</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mclose">))</span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord">10</span><span class="mclose">)</span></span></span></span></span></p><p>式中：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊙</mo></mrow><annotation encoding="application/x-tex">\odot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊙</span></span></span></span> 为Hadamard积。此外，尺度向量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">l_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">l_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以无缝集成到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>Q</mi></msub></mrow><annotation encoding="application/x-tex">A_Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">Q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>W</mi></msub></mrow><annotation encoding="application/x-tex">A_W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">W</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的权重矩阵中。这种整合有效地消除了推断过程中额外的计算成本。类似的方法<strong>SSF</strong> [ 109 ]也对模型的激活进行线性变换，如图6 ( b )所示。具体来说，在预训练模型中的每个操作(即MSA、FFN和层归一化)之后，注入一个SSF - ADA层，该层对操作产生的特征进行缩放和移位。在微调过程中，只有那些SSF - ADA层可以被更新，而在推理过程中，类似于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>I</mi><mi>A</mi><msup><mo stretchy="false">)</mo><mn>3</mn></msup></mrow><annotation encoding="application/x-tex">\mathrm( IA )^3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal">A</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span></span>，这些SSF-ADA层可以合并到模型权重中，因此不会产生额外的推理开销。<strong>IPA</strong> (推理时间策略适配器) [ 124 ]提供了一种新颖的方法，在不修改基模型参数的情况下，将LLMs (如GPT-4 )与用户特定的需求对齐。这在处理参数极大且往往无法直接获取的模型时尤为显著。IPA通过在解码阶段将一个基LLM的输出分布(基策略)与一个较小的模型的输出分布(适配器策略)结合(通过乘法和归一化)来实现。在训练过程中，策略适配器的参数使用强化学习进行微调，而基本策略的参数保持不变。在推理过程中，IPA利用基模型和训练好的策略适配器的联合分布进行解码，并对其进行裁剪以满足特定的用户定义标准。</p><h3 id="B-选择性PEFT">B.选择性PEFT</h3><p>与加性PEFT通过增加更多的参数来增加模型复杂度不同，选择性PEFT对现有参数的子集进行微调，以增强模型在下游任务中的性能，如图4 ( b )所示。具体来说，给定一个含有参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>=</mo><mo stretchy="false">{</mo><mrow><msub><mi>θ</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>θ</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>θ</mi><mi>n</mi></msub></mrow><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\theta = \lbrace{\theta_1,\theta_2,...,\theta_n} \rbrace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>的模型，其中每个<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示一个单独的模型参数，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>表示这些参数的总数，选择性PEFT的过程通过对这些参数施加一个二进制掩码<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mo stretchy="false">{</mo><msub><mi>m</mi><mn>1</mn></msub><mtext>，</mtext><msub><mi>m</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>m</mi><mi>n</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">M = \lbrace m_1，m_2,... ,m_n \rbrace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>来表示。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>中的每个<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>要么为0，要么为1，表明相应的参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是选择(1)还是不选择(0)进行微调。微调后更新的参数集<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>θ</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">\theta^\prime</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span>由下式给出：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>θ</mi><mo mathvariant="normal">′</mo></msup><mo>=</mo><msub><mi>θ</mi><mi>i</mi></msub><mo>−</mo><mi>η</mi><mo>⋅</mo><msub><mi>m</mi><mi>i</mi></msub><mo>⋅</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="script">L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>θ</mi><mi>i</mi></msub></mrow></mfrac><mspace width="2em"/><mo stretchy="false">(</mo><mn>11</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta^\prime = \theta_i - \eta \cdot m_i \cdot \frac{\partial \mathcal{L}}{\partial \theta_i} \qquad (11)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8019em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.5945em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.2074em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord" style="margin-right:0.05556em;">∂</span><span class="mord mathcal">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">11</span><span class="mclose">)</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>η</mi></mrow><annotation encoding="application/x-tex">\eta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">η</span></span></span></span>表示学习率，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="script">L</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>θ</mi><mi>i</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{\partial \mathcal{L}}{\partial \theta_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3252em;vertical-align:-0.4451em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8801em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em;">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em;"><span style="top:-2.357em;margin-left:-0.0278em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em;">∂</span><span class="mord mathcal mtight">L</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4451em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>表示损失函数关于参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\theta_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的梯度。在这个公式中，只有被选中(即<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m_i=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)的参数在反向传播过程中更新。</p><p><strong>Diff剪枝</strong>[ 59 ]是将可学习的二进制掩码应用于微调过程中的模型权重的代表性工作。为了达到参数效率，掩模通过L0范数惩罚的可微近似进行正则化。<strong>PaFi</strong> [ 111 ]简单地选择绝对震级最小的模型参数作为可训练的。<strong>FishMask</strong> [ 169 ]利用近似Fisher信息确定参数重要性。然后根据这些信息选择前 k 个参数组成掩码M。类似地，<strong>Fish-Dip</strong> [ 34 ]也使用Fisher信息来计算M，但是掩码会在每个训练周期中动态地重新计算。受彩票假说[ 46 ]，[ 130 ]的启发，<strong>LTSFT</strong> [ 3 ]介绍了另一种确定参数重要性的技术，在初始微调阶段选择变化最大的参数子集组成掩码M。<strong>SAM</strong> [ 48 ]提出了一种二阶近似方法，用一个解析可解的优化函数来近似原问题，以帮助确定参数掩模。<strong>Child-tuning</strong> [ 194 ]提出了两种方法来在每次训练迭代中选择一个子网络，其中只有这个子网络中的参数可以被更新。</p><p><img src="../../images/20240418-01/image-20240419161545898.png" alt="image-20240419161545898" /></p><p>图7：两种参数掩模方法示意图。蓝色代表冷冻，黄色代表可训练。</p><p>然而，在实现PEFT时，上述非结构化参数掩码会导致非零掩码分布不均，降低硬件效率。如图7所示，结构化掩码以规则的方式组织参数掩码，而非结构化掩码随机应用，因此可以提高训练过程中的计算和硬件效率。因此，各种结构化的选择性PEFT技术得到了广泛的研究。<strong>Diff剪枝</strong>提出了一种结构化剪枝策略，通过将权重参数划分为局部组，并策略性地将它们一起消除。类似地，<strong>FAR</strong> [ 174 ]对BERT模型进行微调，将Transformer块中FFN的权重分组为节点，然后使用L1范数对学习器节点进行排序和选择。为了进一步降低内存访问频率，他们还通过将学习器节点分组来重新配置FFN。<strong>Bitfit</strong> [ 207 ]提出只对每个DNN层的偏置参数进行微调，对于小模型取得了有竞争力的结果。然而，该方法无法处理大型模型。文献[ 99 ]的工作将NAS应用到Bitfit中，其中<strong>S-BitFit</strong>保持了Bitfit的结构特性，限制了NAS算法必须为每个偏置模块选择是否为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi><mi>b</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\delta b = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>。与Bitfit在Transformer中对特定模块进行微调类似，<strong>Xattn Tuning</strong> [ 54 ]只对交叉注意力层进行微调。<strong>SPT</strong> (灵敏度感知的视觉参数高效微调) [ 66 ]首先确定了由调谐时的损耗减少量测量的敏感参数。这种灵敏度是使用一阶泰勒展开式计算的，它来源于单触发中微调前的单次前向和后向传递。接下来，SPT找到敏感参数数量超过预定义阈值的权重矩阵，然后将选定的PEFT技术(如LoRA、Adapter等)应用于这些目标权重，以实现结构的微调。</p><h3 id="C-重新参数化PEFT"><strong>C.重新参数化PEFT</strong></h3><p>再参数化是指通过变换模型的参数，将模型的结构从一个模型等价地变换到另一个模型。在PEFT的背景下，这往往意味着构建一个低秩的参数化，以实现训练过程中参数效率的目标。对于推理，可以将模型转换为其原始的权重参数化，保证推理速度不变。这个过程在图4 ( c )中描述。</p><p><img src="../../images/20240418-01/image-20240419161628953.png" alt="image-20240419161628953" /></p><p>图8：3种具有代表性的重参数化PEFT算法示意图。蓝色代表冷冻，黄色代表可训练。</p><p>早期的研究[ 1 ]表明，常见的预训练模型表现出异常低的内在维度。换句话说，可以找到一个低维的重新参数化，作为整个参数空间的微调是有效的。<strong>Intrinsic SAID</strong> [ 1 ]是研究LLMs微调过程中本征维度特征的开创性工作。然而，最被广泛认可的再参数化技术是<strong>LoRA</strong> (低秩适应) [ 76 ]，如图8 ( a )所示。对于给定的预训练权重矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_0 \in  \mathbb{R}^ {d \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span>，LoRA引入了两个可训练的权重矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>r</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_{up} \in  \mathbb{R}^ {d \times r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>r</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_{down} \in  \mathbb{R}^ {r \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span>，其中秩<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>≪</mo><mi>m</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>k</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">r  \ll min(d,k)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">min</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mclose">)</span></span></span></span> ，与<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">W_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>并联运行。令<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">h_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示输入。在正常情况下，通过<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">W_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的输出为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>o</mi><mi>u</mi><mi>t</mi></mrow></msub><mo>=</mo><msub><mi>W</mi><mn>0</mn></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">h_{out} = W_0h_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。相反，LoRA通过引入一个封装任务特定知识的增量更新<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mi>W</mi></mrow><annotation encoding="application/x-tex">\triangle W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>来修改这个输出：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>h</mi><mrow><mi>o</mi><mi>u</mi><mi>t</mi></mrow></msub><mo>=</mo><msub><mi>W</mi><mn>0</mn></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo>+</mo><mfrac><mi>α</mi><mi>r</mi></mfrac><mi mathvariant="normal">△</mi><mi>W</mi><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo>=</mo><msub><mi>W</mi><mn>0</mn></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo>+</mo><mfrac><mi>α</mi><mi>r</mi></mfrac><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mspace width="2em"/><mo stretchy="false">(</mo><mn>12</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h_{out} = W_0h_{in} +\frac{\alpha}{r} \triangle W h_{in} = W_0 h_{in}+ \frac{\alpha}{r}W_{up}W_{down}h_{in} \qquad (12)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.7936em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.7936em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">12</span><span class="mclose">)</span></span></span></span></span></p><p>式中：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span>为缩放因子。在训练开始时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>使用随机高斯分布初始化，而<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>初始化为零，以确保<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>最初保持为零的值。LoRA的实现非常简单，并且已经在具有高达1750亿参数的模型上进行了评估。图8 ( c )以单个解码器为例，冻结的和可学习的成分分别用灰色和红色突出。一旦微调完成，LoRA的自适应权重与预训练的骨干权重无缝集成。这种整合保证了LoRA保持了模型的效率，在推理过程中不会增加额外的负担。</p><p>在LoRA训练中，选择合适的秩一直是一个具有挑战性的问题。为了解决这个问题，<strong>DyLoRA</strong> [ 171 ]，如图8 ( b )所示，在预定义的训练预算范围内对LoRA模块进行一系列秩的训练，而不是坚持单一的固定秩。具体来说，对于给定的秩范围<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mo>=</mo><mrow><msub><mi>r</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow></msub><mo separator="true">,</mo><msub><mi>r</mi><mrow><mi>m</mi><mi>i</mi><mi>n</mi></mrow></msub><mo>+</mo><mn>1</mn><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>r</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi></mrow></msub></mrow></mrow><annotation encoding="application/x-tex">R ={r_{min},r_{min}+1,...,r_{max}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span>，DyLoRA在训练过程的每一次迭代中动态地选择一个秩<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>∈</mo><mi>R</mi></mrow><annotation encoding="application/x-tex">r \in R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span></span></span></span>。因此，矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></mrow><annotation encoding="application/x-tex">W{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">u</span><span class="mord mathnormal">p</span></span></span></span></span>被裁剪为选定的秩<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span>，从而产生截断版本<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi><mo>↓</mo><mi>r</mi></mrow></msub><mo>=</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo stretchy="false">[</mo><mn>1</mn><mo>:</mo><mi>r</mi><mo separator="true">,</mo><mo>:</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">W_{down \downarrow r} = W_{down}[1:r,:]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span><span class="mrel mtight">↓</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mclose">]</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi><mo>↓</mo><mi>r</mi></mrow></msub><mo>=</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo stretchy="false">[</mo><mo>:</mo><mo separator="true">,</mo><mn>1</mn><mo>:</mo><mi>r</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">W_{up \downarrow r} = W_{up}[:,1:r]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span><span class="mrel mtight">↓</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mrel">:</span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mclose">]</span></span></span></span>，并且在此迭代过程中，后续的前向和后向传递将被限制在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi><mo>↓</mo><mi>r</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down \downarrow r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span><span class="mrel mtight">↓</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi><mo>↓</mo><mi>r</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up \downarrow r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span><span class="mrel mtight">↓</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>上，而不是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>。通过这种动态和免搜索的方法，DyLoRA显著减少了为特定任务寻找最优和固定的LoRA秩所需的训练时间。AdaLoRA [ 217 ]用奇异值分解( Singular Value Decomposition，SVD )重新计算了<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mi>W</mi></mrow><annotation encoding="application/x-tex">\triangle  W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>，记为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mi>W</mi><mo>=</mo><mi>P</mi><mo>∧</mo><mi>Q</mi></mrow><annotation encoding="application/x-tex">\triangle  W = P \wedge Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>r</mi></mrow></msup></mrow><annotation encoding="application/x-tex">P \in \mathbb{R}^{d \times r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span></span></span></span></span>且<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>r</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">Q \in \mathbb{R}^{r \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span>是正交矩阵，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∧</mo></mrow><annotation encoding="application/x-tex">\wedge</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5556em;"></span><span class="mord">∧</span></span></span></span>是包含奇异值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>λ</mi><mi>i</mi></msub><msub><mo stretchy="false">}</mo><mrow><mn>1</mn><mo>≤</mo><mi>i</mi><mo>≤</mo><mi>r</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\lbrace\lambda_i\rbrace _{1 \leq i \leq r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">λ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">}</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mrel mtight">≤</span><span class="mord mathnormal mtight">i</span><span class="mrel mtight">≤</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2452em;"><span></span></span></span></span></span></span></span></span></span>的对角矩阵。所有的三个权重矩阵都是可学习的。在训练过程中，奇异值根据其重要性得分进行迭代剪枝，这些奇异值是由梯度权重乘积大小的移动平均值构造的。为了保证<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>之间的正交性，即<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>P</mi><mi>T</mi></msup><mi>P</mi><mo>=</mo><mi>Q</mi><msup><mi>Q</mi><mi>T</mi></msup><mo>=</mo><mi>I</mi></mrow><annotation encoding="application/x-tex">P^TP = QQ^T = I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8413em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0358em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span></span></span></span>，在损失函数中加入了一个额外的正则项：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>R</mi><mo stretchy="false">(</mo><mi>P</mi><mo separator="true">,</mo><mi>Q</mi><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∥</mi><msup><mi>P</mi><mi>T</mi></msup><mi>P</mi><mo>−</mo><mi>I</mi><msubsup><mi mathvariant="normal">∥</mi><mi>F</mi><mn>2</mn></msubsup><mo>+</mo><mi mathvariant="normal">∥</mi><mi>Q</mi><msup><mi>Q</mi><mi>T</mi></msup><mo>−</mo><mi>I</mi><msubsup><mi mathvariant="normal">∥</mi><mi>F</mi><mn>2</mn></msubsup><mi mathvariant="normal">.</mi><mspace width="2em"/><mo stretchy="false">(</mo><mn>13</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R(P,Q) = \Vert P^TP - I \Vert ^2_F + \Vert QQ^T - I \Vert ^2 _F. \qquad (13)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">Q</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∥</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1413em;vertical-align:-0.25em;"></span><span class="mord">∥</span><span class="mord mathnormal">Q</span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-2.453em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">F</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mspace" style="margin-right:2em;"></span><span class="mopen">(</span><span class="mord">13</span><span class="mclose">)</span></span></span></span></span></p><p>这种自适应方法使模型能够动态调整每个LoRA模块内的秩，有效地根据权重矩阵的重要性管理其参数计数。然而，根据<strong>SoRA</strong> [ 39 ]<strong>，AdaLoRA</strong>中使用的重要性评分是启发式构造的，缺乏严谨的理论动机。此外，移动平均运算和式( 5 )的计算也是如此。公式13在训练过程中引入了额外的计算开销。为了解决这个问题，<strong>SoRA</strong>消除了<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi></mrow><annotation encoding="application/x-tex">P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>的正交性前提，取而代之的是在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>之间直接应用和优化一个门控单元<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mi>r</mi></msup></mrow><annotation encoding="application/x-tex">g \in \mathbb{R}^r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6889em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span></span></span></span></span></span></span>：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>h</mi><mrow><mi>o</mi><mi>u</mi><mi>t</mi></mrow></msub><mo>=</mo><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow><mo stretchy="false">(</mo><mi>g</mi><mo>⊙</mo><mo stretchy="false">(</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo separator="true">,</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>14</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h_{out} = W{up}(g \odot (W_{down}h_{in})), \qquad (14)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">u</span><span class="mord mathnormal">p</span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">))</span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord">14</span><span class="mclose">)</span></span></span></span></span></p><p>式中：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊙</mo></mrow><annotation encoding="application/x-tex">\odot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊙</span></span></span></span>为Hadamard积。门<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi></mrow><annotation encoding="application/x-tex">g</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span></span></span></span>的更新采用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">l_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>损失的近端梯度迭代变化[ 7 ]，[ 13 ]，具有明确的数学意义，不需要启发式前提。训练完成后，通过移除<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>中对应的列和行，对归零门单元进行剪枝。</p><p>随后的几项研究旨在从多个方面提高LoRA的性能。例如，<strong>Laplace-LoRA</strong> [ 197 ]注意到微调后的LLMs往往表现出过度自信。为了加强微调后的LLMs的校准，Laplace-LoRA使用贝叶斯方法，特别是事后Laplace近似[ 127 ]，[ 5 ]，对LoRA参数进行后验估计。<strong>LoRA+</strong> [ 65 ]提出对LoRA矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>设置不同的学习率，使得<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>η</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo>=</mo><mi>λ</mi><msub><mi>η</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\eta_{up} = \lambda \eta _{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">λ</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>且<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>λ</mi><mo>&gt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\lambda &gt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">λ</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>固定，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>η</mi><mrow><mi>u</mi><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\eta_{udown}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">η</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可调。LoRAHub [ 80 ]和MOELoRA [ 119 ]都从多任务学习中得到启发。<strong>LoRAHub</strong>聚合了在不同任务上训练的各种LoRA模块。LoRAHub在给定一个新任务的少量实例的情况下，通过无梯度的方法Shiwa [ 117 ]，可以在没有人工干预的情况下自主地组成兼容的LoRA模块。<strong>MOELoRA</strong>采用混合专家( Mixture-of-Experts，MOE )方法在多任务环境下训练LoRA，产生多个专家LoRA模块。为了检索特定任务的参数，MOELoRA使用任务驱动的门函数，该门函数根据任务ID为每个专家分配贡献权重，通过所有专家的加权求和计算最终的参数。</p><p>除了LoRA外，其他几种再参数化技术也在不断涌现，具有很大的潜力。例如，Compacter[ 91 ]通过将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>参数化为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>b</mi></msubsup><msub><mi>A</mi><mi>i</mi></msub><mo>⊗</mo><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">W = \sum^b_{i=1} A_i \otimes B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.2887em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.989em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，引入了一个轻量级的适配器模块，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>m</mi><mo>×</mo><mi>n</mi></mrow></msup></mrow><annotation encoding="application/x-tex">A_i \in \mathbb{R}^{m \times n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7713em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7713em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mfrac><mi>r</mi><mi>n</mi></mfrac><mo>×</mo><mfrac><mi>d</mi><mi>n</mi></mfrac></mrow></msup></mrow><annotation encoding="application/x-tex">B_i \in \mathbb{R} ^{\frac{r}{n} \times \frac{d}{n}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.979em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.979em;"><span style="top:-3.363em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6915em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.2255em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span><span class="mbin mtight">×</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.88em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span style="top:-3.2255em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⊗</mo></mrow><annotation encoding="application/x-tex">\otimes</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">⊗</span></span></span></span> 表示Kronecker积。他们通过将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>指定为共享参数，并利用两个低秩矩阵的乘积对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>进行重新参数化，进一步减少了参数个数，有效地将参数复杂度从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi>r</mi><mi>d</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{O}(rd)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">d</span><span class="mclose">)</span></span></span></span>降低到了<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">O</mi><mo stretchy="false">(</mo><mi>r</mi><mo>+</mo><mi>d</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{O}(r+d)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathcal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mclose">)</span></span></span></span>​。相关研究如<strong>KronA</strong> [ 42 ]、<strong>KAdaptation</strong> [ 71 ]等也采用Kronecker积对适配器权重进行重新参数化，以实现参数约简。<strong>HiWi</strong> [ 111 ]提出了一种适配器微调方法，将适配器直接应用于预训练的参数，而不是隐藏表示为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>W</mi><mo mathvariant="normal">′</mo></msup><mo>=</mo><mi>W</mi><mo>+</mo><mi>σ</mi><mo stretchy="false">(</mo><mi>W</mi><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><mo separator="true">,</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>15</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">W^\prime = W + \sigma(WW_{down})W_{up}, \qquad (15)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8019em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0361em;vertical-align:-0.2861em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord">15</span><span class="mclose">)</span></span></span></span></span></p><p>其中W表示Transformer块前馈层中的权重或偏置。值得注意的是，在推理过程中，该方法提前计算<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>W</mi><mo mathvariant="normal">′</mo></msup></mrow><annotation encoding="application/x-tex">W^\prime</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span>，保证了模型的推理延迟与传统完全微调的推理延迟相当。<strong>DoRA</strong> (权重分解的低秩适应) [ 120 ]提出了一种新颖的方法，如图8 ( c )所示，将模型权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W_0 \in \mathbb{R}^{d \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span>分解为大小和方向：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub><mo>=</mo><mi>m</mi><mfrac><mi>V</mi><mrow><mi mathvariant="normal">∥</mi><mi>V</mi><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub></mrow></mfrac><mo>=</mo><mi mathvariant="normal">∥</mi><msub><mi>W</mi><mn>0</mn></msub><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub><mfrac><msub><mi>W</mi><mn>0</mn></msub><mrow><mi mathvariant="normal">∥</mi><msub><mi>W</mi><mn>0</mn></msub><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub></mrow></mfrac><mo separator="true">,</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>16</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">W_0 = m \frac{V}{\Vert V \Vert _c} = \Vert W_0 \Vert _c \frac{W_0}{\Vert W_0 \Vert _c}, \qquad (16)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2963em;vertical-align:-0.936em;"></span><span class="mord mathnormal">m</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2963em;vertical-align:-0.936em;"></span><span class="mord">∥</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3603em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">∥</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord">16</span><span class="mclose">)</span></span></span></span></span></p><p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>l</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">m \in \mathbb{R}^{l \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em;">l</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span> 是震级向量，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>d</mi><mo>×</mo><mi>k</mi></mrow></msup></mrow><annotation encoding="application/x-tex">V \in \mathbb{R}^{d \times k}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8491em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span></span></span></span></span></span></span></span></span>是方向矩阵，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∥</mi><mo>⋅</mo><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub></mrow><annotation encoding="application/x-tex">\Vert \cdot \Vert_c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∥</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是矩阵在每一列上的向量值范数。随后，DoRA对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span>采用独特的微调策略。虽然两者都是可调的，但只有<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>V</mi></mrow><annotation encoding="application/x-tex">V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span>经历了LoRA再参数化，定义为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>W</mi><mo mathvariant="normal">′</mo></msup><mo>=</mo><munder accentunder="true"><mi>m</mi><mo stretchy="true">‾</mo></munder><mfrac><mrow><mi>V</mi><mo>+</mo><mi mathvariant="normal">△</mi><mi>V</mi></mrow><mrow><mi mathvariant="normal">∥</mi><mi>V</mi><mo>+</mo><munder accentunder="true"><mrow><mi mathvariant="normal">△</mi><mi>V</mi></mrow><mo stretchy="true">‾</mo></munder><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub></mrow></mfrac><mo>=</mo><munder accentunder="true"><mi>m</mi><mo stretchy="true">‾</mo></munder><mfrac><mrow><msub><mi>W</mi><mn>0</mn></msub><mo>+</mo><munder accentunder="true"><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><mo stretchy="true">‾</mo></munder></mrow><mrow><mi mathvariant="normal">∥</mi><msub><mi>W</mi><mn>0</mn></msub><mo>+</mo><munder accentunder="true"><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><msub><mi mathvariant="normal">∥</mi><mi>c</mi></msub></mrow><mo stretchy="true">‾</mo></munder></mrow></mfrac><mo separator="true">,</mo><mspace width="2em"/><mo stretchy="false">(</mo><mn>17</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">W^\prime = \underline{m} \frac{V + \triangle V}{\Vert V + \underline{\triangle V}\Vert_c} = \underline{m} \frac{W_0 + \underline{W_{up}W_{down}}}{\Vert W_0 + \underline{W_{up}W_{down}\Vert_c}}, \qquad (17)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8019em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.4519em;vertical-align:-1.0804em;"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.4306em;"><span style="top:-2.84em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2em;"><span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em;"><span style="top:-2.6456em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3944em;"><span></span></span></span></span></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0804em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.7315em;vertical-align:-1.1721em;"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.4306em;"><span style="top:-2.84em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2em;"><span></span></span></span></span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5594em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">∥</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.75em;"><span style="top:-2.5539em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4861em;"><span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.8761em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord underline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6833em;"><span style="top:-2.5539em;"><span class="pstrut" style="height:3em;"></span><span class="underline-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4861em;"><span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1721em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:2em;"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord">17</span><span class="mclose">)</span></span></span></span></span></p><p>其中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mi>V</mi></mrow><annotation encoding="application/x-tex">\triangle V</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span></span></span></span>是LoRA学习到的增量方向更新，下划线参数表示可训练参数。通过这种方法，DoRA在各种任务和模型中始终优于LoRA，证明了其优越性。</p><h3 id="D-混合PEFT">D. 混合PEFT</h3><p>不同的PEFT方法在不同任务中的效能存在显著差异。因此，许多研究旨在结合不同PEFT方法的优点，或者通过分析这些方法之间的相似性来建立统一的视角。例如，<strong>UniPELT</strong> [ 133 ]将LoRA、前缀调整和适配器集成到每个Transformer模块中。为了控制哪些PEFT子模块应该被激活，他们还引入了门控机制。该机制由三个小的FFN组成，每个FFN产生一个标量值<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">G</mi><mo>∈</mo><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal{G} \in (0,1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7805em;vertical-align:-0.0972em;"></span><span class="mord mathcal" style="margin-right:0.0593em;">G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>，然后分别应用于LoRA、前缀和适配器矩阵。在各种设置下，UniPELT一直表现出从1 %到4 %不等的精度提升。<strong>S4</strong> [ 16 ]探索了几种PEFT方法(即Adapter ( A)、Prefix ( P )、BitFit ( B )和LoRA ( L )的设计空间，以揭示潜在的设计模式。经过一系列的实验，他们的研究结果包括：( 1 )对Transformer层进行主轴分组划分，得到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>∈</mo><mn>1...4</mn></mrow><annotation encoding="application/x-tex">i \in {1...4}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6986em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord"><span class="mord">1...4</span></span></span></span></span>的四层组<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>G</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">G_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。一个组中的层与层之间具有相似的行为，也就是说应该采用相似的PEFT策略。( 2 )将可训练参数的个数均匀分配到层。( 3 )对所有组进行调优。( 4 )在不同组别中分配不同的PEFT策略。由此得到的设计空间具有最佳的性能：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>G</mi><mn>1</mn></msub><mo>:</mo><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>L</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>G</mi><mn>2</mn></msub><mo>:</mo><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>P</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>G</mi><mn>3</mn></msub><mo>:</mo><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>P</mi><mo separator="true">,</mo><mi>B</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><msub><mi>G</mi><mn>4</mn></msub><mo>:</mo><mo stretchy="false">(</mo><mi>P</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>L</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">G_1 : (A,L), G_2:(A,P),G_3:(A,P,B),G_4:(P,B,L)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">L</span><span class="mclose">)</span></span></span></span></span></p><p><strong>MAM Adapter</strong> [ 67 ]探索了三种加性PEFT方法之间的内在相似性：适配器，前缀调优和LoRA，这导致了三种变体的发展：Parallel Adapter，它将适配器层放在特定层( SA或FFN)的旁边，而不是在它们之后；<em>多头并行适配器</em>，它将并行适配器分为多个头，每个头影响SA中头注意力的输出；和<em>Scaled Parallel Adapter</em>，即在并行适配器层之后增加一个缩放项，类似于LoRA。大量的实验表明，最有效的配置包括在SA层使用前缀调整和在FFN层使用缩放的并行适配器，称为MAM Adapter。<strong>LLM- Adapters</strong> [ 78 ]构建了一个易于使用的框架，将各种PEFT技术集成到LLM中。通过跨多个数据集的全面对标，本研究揭示了几个关键的见解：( 1 )串联适配器、并联适配器和LoRA的最有效位置分别在MLP层之后、MLP层旁边以及同时跟随Attention层和MLP层。( 2 )与较大的LLMs相比，使用PEFT的较小的LLMs可以在某些任务上取得有竞争力的甚至更好的结果。( 3 )在合适的分布内微调数据下，较小的模型能够在特定任务的性能上超越较大的模型。</p><p>一些研究利用神经结构搜索( NAS )来寻找更好的PEFT组合方法。例如，<strong>NOAH</strong> [ 222 ]发现不同的PEFT配置是专门为不同的任务量身定做的。为了解决这个问题，NOAH使用NAS来确定每个数据集最有效的PEFT配置。具体来说，NOAH的搜索空间包含3种PEFT方法：Adapter、LoRA和Visual Prompt Tuning ( VPT )。它使用一次性NAS算法自耦变压器[ 20 ]来有效地发现最优提示模块。在一个相关的脉络中，<strong>AUTOPEFT</strong> [ 231 ]首先建立了一个搜索空间，其中包括串行适配器，并行适配器和前缀调谐。之后，他们提出了一种基于高维多维贝叶斯优化的有效NAS方法[ 47 ]。NOAH和AUTOPEFT都证明了NAS在各种任务中增强PEFT配置的能力。</p><h2 id="Ⅳ-高效的PEFT设计">Ⅳ.高效的PEFT设计</h2><p>处理延迟和峰值内存开销是从计算角度考虑的关键因素。这一部分介绍了LLMs中的一个关键特性，旨在平衡延迟和内存使用之间的(第四节- A)。接下来，我们探索开发高效的PEFT方法来应对计算挑战的策略，包括PEFT剪枝(第四节- B)、PEFT量化(第四节- C)和存储高效PEFT技术(第四节- D)，它们都旨在提高模型性能的同时最小化资源消耗。值得注意的是，量化本质上解决了内存开销问题。然而，鉴于其独特的特性，我们将这些量化方法分开处理，而不是在存储高效PEFT部分下合并它们。</p><h3 id="A-面向Peft效率的KV-Cache管理">A.面向Peft效率的KV-Cache管理</h3><p>LLMs模型的核心是自回归Transformer模型，如图2所示。当我们考虑自回归特性时，这就成为设计一个推理系统的主要挑战，因为每产生一个新的令牌，整个LLM模型就必须将所有来自不同内存的权重转移到图形处理器的内存中，这对单用户任务调度或多用户负载均衡是非常不友好的。服务于自回归范式的挑战性部分是所有先前的序列都必须被缓存并保存以备下一次进行迭代，先前序列产生的缓存激活被存储为Key-Value Cache ( KV-cache )。</p><p>KV - cache的存储会消耗存储空间和IO性能，导致工作负载内存受限和系统的计算能力没有得到充分利用。之前的工作提出了一系列解决方案，如KV-cache控制管理[ 98 ]或KV-cache压缩[ 159 ]，以提高吞吐量或降低延迟。在设计PEFT方法时，考虑KV-cache的特性以补充其特性是至关重要的。例如，当在推理阶段应用软提示时，有效地利用这些额外输入的KVcache可以通过确保提示相关的数据容易获得来加速响应时间。</p><h3 id="B-PEFT的剪枝策略">B. PEFT的剪枝策略</h3><p>剪枝的加入可以大幅提高PEFT方法的效率。特别地，<strong>AdapterDrop</strong> [ 154 ]在<strong>AdapterFusion</strong> [ 145 ]中探讨了从下层转换层和多任务适配器中移除适配器的问题，表明剪枝可以在性能下降最小的情况下提高训练和推理效率。<strong>SparseAdapter</strong> [ 69 ]研究了不同的剪枝方法，发现高稀疏率( 80 % )可以优于标准的适配器。此外，<strong>Large-Sparse</strong>配置在保持参数预算(例如,在稀疏度为50 %的情况下,将维度加倍)不变的情况下增加了瓶颈维度，大幅提升了模型的容量，从而提升了性能。<strong>SPLoRA</strong> [ 72 ]对LoRA权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></mrow><annotation encoding="application/x-tex">W{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">n</span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></mrow><annotation encoding="application/x-tex">W{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">u</span><span class="mord mathnormal">p</span></span></span></span></span>采用基于通道的剪枝。这种剪枝不仅影响源权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">W_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，而且影响LoRA参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。同理，<strong>LoRAPruning</strong> [ 216 ]不仅对预训练的模型权重进行了结构化剪枝，而且对LoRA权重也进行了结构化剪枝。与非结构化的LoRA剪枝方法相比，LoRA剪枝方法主要关注模型权重的稀疏化，而LoRA权重的稠密化使得权重的合并变得困难，而<strong>LoRAPruning</strong>方法使得权重的合并变得容易。此外，本文还引入了一种新的准则，该准则利用LoRA的梯度作为预训练权重的梯度的近似，从而实现权重重要性的估计。<strong>ProPETL</strong> [ 210 ]构造了一个跨层和跨任务的共享原型(例如,适配器、前缀或LoRA)。此外，ProPETL通过学习二进制掩码，在不同的层和任务中剪枝不同的子网络。因此，参数可以在跨层和跨任务中重用，大大提高了参数的使用效率。</p><h3 id="C-PEFT的量化策略">C. PEFT的量化策略</h3><p>量化是另一种流行的提高计算效率和减少内存使用的技术。例如，<strong>BI-Adapter</strong> [ 87 ]通过考察适配器的损失情况，发现适配器在参数空间中具有抗噪性。基于这一认识，本文提出了一种基于聚类的量化方法。值得注意的是，他们证明了适配器的1-bit量化不仅最小化了存储需求，而且在所有精度设置中实现了卓越的性能。PEQA (参数高效和量化感知的自适应) [ 94 ]使用两级流水线来实现参数高效和量化感知的微调。在第一阶段，将预训练的FFN权重矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi><mo>∈</mo><msup><mi mathvariant="double-struck">R</mi><mrow><mi>n</mi><mo>×</mo><mi>m</mi></mrow></msup></mrow><annotation encoding="application/x-tex">W \in \mathbb{R}^{n \times m}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7224em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7713em;"></span><span class="mord"><span class="mord mathbb">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7713em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight">m</span></span></span></span></span></span></span></span></span></span></span></span> 被量化为$W - s \cdot \overline{W} <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>，其中</mtext></mrow><annotation encoding="application/x-tex">，其中</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">，其中</span></span></span></span>s \in \mathbb{R}^{n \times l}<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>表示每通道尺度，</mtext></mrow><annotation encoding="application/x-tex">表示每通道尺度，</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">表示每通道尺度，</span></span></span></span>\overline{W}<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>表示量化权重。在第二阶段，</mtext></mrow><annotation encoding="application/x-tex">表示量化权重。在第二阶段，</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">表示量化权重。在第二阶段，</span></span></span></span>\overline{W}<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>保持固定，仅对</mtext></mrow><annotation encoding="application/x-tex">保持固定，仅对</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">保持固定，仅对</span></span></span></span>s$进行微调。这种方法既保证了内存效率，又提高了参数效率。<strong>QLoRA</strong> [ 37 ]提出了一些新的技术，包括4-bit NormalFloat，Double Quantization和Paged优化的，将4-bit量化的预训练语言模型反向传播到LoRA中。这些技术实现了在单个48GB GPU上对65B语言模型的微调，同时保持了与全量16bit微调相似的性能。类似于最初的实现[ 76 ]，QLoRA将固定的零初始化LoRA权重附加到量化的预训练模型中作为训练起点。然而，当采用极低比特(例如, 2-bit)量化时，巨大的量化误差会对LoRA微调的初始化产生不利影响，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi><mi>u</mi><mi>a</mi><mi>n</mi><mi>t</mi><mi>i</mi><mi>z</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo stretchy="false">(</mo><msub><mi>W</mi><mn>0</mn></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow><mo mathvariant="normal">≠</mo><msub><mi>W</mi><mn>0</mn></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">quantization(W_0)+W_{down}W{up} \neq W_0 = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mord mathnormal">u</span><span class="mord mathnormal">an</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord mathnormal">a</span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">u</span><span class="mord mathnormal">p</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">W_{down} = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，这将损害微调性能，如文献[ 112 ]所示。为了解决这个问题，提出了几种量化策略来消除量化误差。例如，<strong>LoftQ</strong> ( LoRA - -微调感知量化) [ 108 ]提出了一个创新的框架，为后续的LoRA微调提供了量化的骨干权重和LoRA权重的优越初始化点。该方法通过在网络初始化过程中优化一个Frobenius范数目标来解决量化带来的差异，该目标同时考虑了LoRA权重和量化的预训练骨干。与QLoRA相比，LoftQ在2-bit量化方面表现出更优异的性能，并且对下游任务具有更好的泛化性。LQ-LoRA [ 60 ]采用了一种基于鲁棒主成分分析[ 234 ]，[ 183 ]的迭代算法来分解权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">W_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，使得$W_0 \approx Q + L_1 L_2 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>来解决由量化误差引起的不准确性，其中</mtext></mrow><annotation encoding="application/x-tex">来解决由量化误差引起的不准确性，其中</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">来解决由量化误差引起的不准确性，其中</span></span></span></span>Q<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>是保持固定不变的量化分量，</mtext></mrow><annotation encoding="application/x-tex">是保持固定不变的量化分量，</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">是保持固定不变的量化分量，</span></span></span></span>L_1L_2<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>是可训练的低秩分量。此外，该方法利用整数线性规划来确定混合量化策略，在遵循预定的总比特率限制的同时，为每个权重矩阵提供动态量化配置。</mtext><mo>∗</mo><mo>∗</mo><mi>Q</mi><mi>A</mi><mo>−</mo><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mo>∗</mo><mo>∗</mo><mo stretchy="false">[</mo><mn>195</mn><mo stretchy="false">]</mo><mtext>解决了</mtext><mi>Q</mi><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mtext>的另一个局限性，即难以在微调后保持其量化性质。在</mtext><mi>Q</mi><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mtext>中，量化的预训练权重</mtext><mo stretchy="false">(</mo><mi>N</mi><mi>F</mi><mn>4</mn><mo stretchy="false">)</mo><mtext>必须在权重合并过程中恢复到</mtext><mi>F</mi><mi>P</mi><mn>16</mn><mtext>，以匹配</mtext><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mtext>的权重精度</mtext><mo stretchy="false">(</mo><mi>F</mi><mi>P</mi><mn>16</mn><mo stretchy="false">)</mo><mtext>。与</mtext><mi>Q</mi><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mtext>相比，</mtext><mi>Q</mi><mi>A</mi><mo>−</mo><mi>L</mi><mi>o</mi><mi>R</mi><mi>A</mi><mtext>使用</mtext><mi>I</mi><mi>N</mi><mi>T</mi><mn>4</mn><mtext>量化，并在推理阶段引入了分组操作符来实现量化，从而提高了效率和准确性。</mtext><mo>∗</mo><mo>∗</mo><mi>B</mi><mi>i</mi><mi>t</mi><mi>D</mi><mi>e</mi><mi>l</mi><mi>t</mi><mi>a</mi><mo>∗</mo><mo>∗</mo><mo stretchy="false">[</mo><mn>118</mn><mo stretchy="false">]</mo><mtext>介绍了一种新颖的</mtext><mn>1</mn><mo>−</mo><mi>b</mi><mi>i</mi><mi>t</mi><mtext>训练后量化方法，作用于微调模型与其底层预训练模型之间的权重</mtext><mi>d</mi><mi>e</mi><mi>l</mi><mi>t</mi><mi>a</mi><mtext>。具体地，给定微调模型和基准模型的权重矩阵</mtext></mrow><annotation encoding="application/x-tex">是可训练的低秩分量。此外，该方法利用整数线性规划来确定混合量化策略，在遵循预定的总比特率限制的同时，为每个权重矩阵提供动态量化配置。**QA-LoRA** [ 195 ]解决了QLoRA的另一个局限性，即难以在微调后保持其量化性质。在QLoRA中，量化的预训练权重( NF4 )必须在权重合并过程中恢复到FP16，以匹配LoRA的权重精度( FP16 )。与QLoRA相比，QA-LoRA使用INT4量化，并在推理阶段引入了分组操作符来实现量化，从而提高了效率和准确性。**BitDelta** [ 118 ]介绍了一种新颖的1-bit训练后量化方法，作用于微调模型与其底层预训练模型之间的权重delta。具体地，给定微调模型和基准模型的权重矩阵</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">是可训练的低秩分量。此外，该方法利用整数线性规划来确定混合量化策略，在遵循预定的总比特率限制的同时，为每个权重矩阵提供动态量化配置。</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord">∗</span><span class="mord mathnormal">Q</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∗</span><span class="mopen">[</span><span class="mord">195</span><span class="mclose">]</span><span class="mord cjk_fallback">解决了</span><span class="mord mathnormal">Q</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">的另一个局限性，即难以在微调后保持其量化性质。在</span><span class="mord mathnormal">Q</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">中，量化的预训练权重</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">NF</span><span class="mord">4</span><span class="mclose">)</span><span class="mord cjk_fallback">必须在权重合并过程中恢复到</span><span class="mord mathnormal" style="margin-right:0.13889em;">FP</span><span class="mord">16</span><span class="mord cjk_fallback">，以匹配</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">的权重精度</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">FP</span><span class="mord">16</span><span class="mclose">)</span><span class="mord cjk_fallback">。与</span><span class="mord mathnormal">Q</span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">相比，</span><span class="mord mathnormal">Q</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">使用</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.13889em;">NT</span><span class="mord">4</span><span class="mord cjk_fallback">量化，并在推理阶段引入了分组操作符来实现量化，从而提高了效率和准确性。</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">∗</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">De</span><span class="mord mathnormal">lt</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∗</span><span class="mopen">[</span><span class="mord">118</span><span class="mclose">]</span><span class="mord cjk_fallback">介绍了一种新颖的</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">bi</span><span class="mord mathnormal">t</span><span class="mord cjk_fallback">训练后量化方法，作用于微调模型与其底层预训练模型之间的权重</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal">lt</span><span class="mord mathnormal">a</span><span class="mord cjk_fallback">。具体地，给定微调模型和基准模型的权重矩阵</span></span></span></span>W_{fine}<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>和</mtext></mrow><annotation encoding="application/x-tex">和</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">和</span></span></span></span>W_{base}$，将权重delta <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mo>=</mo><msub><mi>W</mi><mrow><mi>f</mi><mi>i</mi><mi>n</mi><mi>e</mi></mrow></msub><mo>−</mo><mi>W</mi><mrow><mi>b</mi><mi>a</mi><mi>s</mi><mi>e</mi></mrow></mrow><annotation encoding="application/x-tex">\triangle = W_{fine} - W{base}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em;">f</span><span class="mord mathnormal mtight">in</span><span class="mord mathnormal mtight">e</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal">ba</span><span class="mord mathnormal">se</span></span></span></span></span>二值化为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">△</mi><mo>=</mo><mi>α</mi><mo>⊙</mo><mrow><mi mathvariant="normal">S</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">g</mi><mi mathvariant="normal">n</mi></mrow><mo stretchy="false">(</mo><mi mathvariant="normal">△</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\triangle = \alpha \odot \mathrm{Sign} (\triangle)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord">△</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathrm">Sign</span></span><span class="mopen">(</span><span class="mord">△</span><span class="mclose">)</span></span></span></span>。这里，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span>是一个高精度的标量，根据平均绝对delta值$\alpha = \frac{1}{nm} \sum_{ij} \vert W_{ij}\vert <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>初始化，</mtext></mrow><annotation encoding="application/x-tex">初始化，</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">初始化，</span></span></span></span>\mathrm{Sign}(\cdot)<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>表示</mtext></mrow><annotation encoding="application/x-tex">表示</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">表示</span></span></span></span>\triangle$的符号。BitDelta在一个紧凑的校准数据集上通过蒸馏进一步校准缩放因子，而二元矩阵保持不变。该方法通过使用一个奇异的全精度基模型和高效批处理的1-bit delta，显著简化了多个微调模型在共享服务器上的部署。</p><h3 id="D-存储高效PEFT方法">D.存储高效PEFT方法</h3><p>微调完整的LLMs需要大量的训练内存，因为它们相当大。虽然大多数PEFT方法主要以参数效率为目标，但它们在训练过程中仍然会产生显著的内存开销，因为梯度计算和反向传播仍然是这些方法所必需的。例如，流行的PEFT技术，如适配器和LoRA，根据一些文献[ 167 ]，[ 88 ]，与全模型微调相比，只能减少大约70 %的内存使用。从计算的角度来看，内存效率也是一个不可忽视的关键因素。</p><p>为了提高内存效率，已经开发了各种技术来最小化整个LLM在微调过程中对缓存梯度的需求，从而减少内存使用。例如，<strong>Side-Tuning</strong> [ 213 ]和<strong>LST</strong> (阶梯-边微调) [ 167 ]都引入了平行于骨干模型的可学习网络分支。通过将反向传播仅通过该并行分支进行通道化，避免了对主模型权重存储梯度信息的需求，从而显著降低了训练过程中的内存需求。类似地，<strong>Res-Tuning</strong> [ 85 ]将PEFT微调器(例如,提示微调,适配器)从主干模型中分离出来。在解耦的基础上，提出了一种内存高效的微调框架<strong>Res-Tuning-Bypass</strong>，通过移除解耦的调谐器到主干网的数据流，生成与主干网模型并行的旁路网络。这消除了在反向传播过程中对骨干模型内梯度缓存的要求。<strong>MEFT</strong> [ 112 ] (存储高效fine-tuning )是一种受可逆模型[ 55 ]启发的方法。在可逆模型的训练过程中，中间激活不需要缓存在前向通道中。在反向传播过程中，它们可以从最终的输出中重新计算。为了节省微调过程中的内存，MEFT研究了如何在不增加额外预训练的情况下将LLM转换为可逆LLM。这种转换的一个关键方面是对预训练模型中新引入的参数进行仔细的初始化。MEFT证明了参数初始化的重要性，并建议这些参数必须以保留预训练模型起点的方式进行初始化，以确保修改后的模型的微调达到与完全微调方法相同的性能。基于这一关键考虑，MEFT引入了三种不同的方法，每种方法都显著地减少了传统上存储激活所需的内存需求。<strong>LoRA-FA</strong> [ 215 ]解决了LoRA微调中内存开销的限制。在训练过程中，LoRA模块仍然需要较高的激活内存消耗。这是因为在反向传播过程中，必须在前向传递过程中存储大量的输入激活来计算梯度。LoRA - FA通过同时冻结预训练权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">W_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和向下投影权重<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi></mrow></msub><mi>n</mi></mrow><annotation encoding="application/x-tex">W_{dow}n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">n</span></span></span></span>，只更新向上投影权<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>u</mi><mi>p</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{up}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">p</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>来解决这一问题。因此，输入激活<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">h_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>不再需要存储，因为中间激活<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi></mrow></msub><msub><mi>h</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{down}h_{in}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">d</span><span class="mord mathnormal mtight">o</span><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>足够用于Wup的梯度计算。考虑到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>≪</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">r \ll d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span>，LoRAFA中激活的内存需求可以显著降低。</p><p>为了进一步减少微调过程中的内存使用，一些方法试图通过规避LLM中的反向传播来解决这个问题。<strong>HyperTuning</strong> [ 146 ]使用HyperModel仅使用少量样本生成PEFT参数。该方法得到的结果与全模型微调得到的结果相当。<strong>PEFT Plug-in</strong> [ 88 ]首先在小型语言模型上训练PEFT模块，与在大型语言模型上训练相比，具有更高的内存效率。随后，本研究介绍了一套在推理过程中将这些训练好的PEFT模块无缝集成到LLM中的技术。该策略有效地避免了直接在较大模型上进行梯度优化的必要性，从而节省了大量的内存。但需要注意的是，无论是Hyper Model还是PEFT Plug-n都需要额外的模型训练，这种训练成本不能被完全忽略。<strong>MeZO</strong> [ 131 ]为LLMs引入了具有记忆效率的零阶( ZO )优化器。与传统的PEFT技术依赖反向传播计算梯度更新模型参数不同，MeZO仅通过前向通道微调LLMs。它通过使用ZO梯度估计器来计算梯度来实现。值得注意的是，MeZO实现了经典ZO梯度估计器的原位解决方案，有效地减轻了推理执行过程中的内存消耗。这种创新的方法允许在具有80GB内存的单个GPU上对包含300亿参数的LLM进行有效的微调，同时保持与使用反向传播进行微调相当的性能。此外，与传统的PEFT方法(如LoRA和Adapter )相比，它可以大幅降低存储需求。</p><h2 id="V-PEFT对于深度神经网络的其他应用">V. PEFT对于深度神经网络的其他应用</h2><p>在第三节中，我们概述了四类PEFT方法及其改进。尽管如此，我们的讨论并没有完全延伸到传统架构(例如, LLMs)或标准基准(例如, GLUE数据集)之外的PEFT技术的使用或适应，其中大多数讨论的PEFT方法都应用于这些领域。因此，在这一部分中，我们将重点介绍和讨论几个最具代表性的工作，这些工作将为各种下游任务使用PEFT策略。在这一部分中，我们的目标并不是覆盖所有的PEFT应用场景。我们的目标是展示PEFT在不同研究领域中的重要影响，并展示如何优化和裁剪通用的PEFT方法，以在特定的模型或任务中实现增强的性能。</p><p>通常，微调发生在将预训练的骨干模型适配到专门的下游任务时。为此，本部分围绕各种模型架构展开讨论，其中包括：LLM、Vison Transfomer( ViT )、视觉-语言对齐模型( VLA )和扩散模型。在每个架构类别内部，根据不同的下游任务进一步分类讨论。</p><h3 id="A-PEFT-for-LLMs-超越基础">A. PEFT for LLMs--超越基础</h3><p>与NLP中的通用任务如NLU和NLG相比，PEFT技术在不同的场景中具有广泛的应用。PEFT已经成功应用于常识问答[ 82 ]，[ 229 ]，多层隐式篇章关系识别[ 227 ]，超分布检测[ 141 ]，隐私保护[ 142 ]，[ 190 ]，联邦学习[ 15 ]和社会偏见缓解[ 106 ]。在这一部分中，我们重点关注了三个具有代表性的下游任务：视觉指令跟随、持续学习、上下文窗口扩展。</p><p>1 )视觉指令跟随：一些研究，包括VL-BART [ 26 ]，MiniGPT-4 [ 237 ]和LLaVA [ 115 ]，已经成功地扩展了最初为纯文本设计的LLMs的能力，以理解和产生对视觉输入的反应。这些增强的模型，即视觉指令跟随LLMs，可以同时处理图像和文本以产生文本响应，可以在图像描述[ 152 ]，[ 204 ]，[ 172 ]，[ 74 ]和视觉问答( VQA ) [ 176 ]，[ 188 ]，[ 4 ]等任务上测试。然而，这些方法通过微调整个LLM来学习视觉表征，在时间和内存上都是低效的。因此，将PEFT技术应用于视觉指令跟随LLMs的微调是很自然的。较早的工作VL-Adapter [ 168 ]在VL-BART [ 26 ]上直接应用了几个PEFT方法(适配器、Hyperformer [129]  和Compacter[91])，然后在几个图像-文本和视频-文本任务上进行了测试。结果表明，vanilla适配器是其中最好的，它可以达到与全微调相当的性能。然而，考虑到VL-BART中编码器和解码器之间的功能差距，直接分配相同的模块修改将导致次优的性能。因此，VL-PET [ 79 ]选择性地将PEFT模块集成到编码器和解码器的不同组件中。他们还引入了粒度控制机制来进行更细粒度的控制。</p><p>为了适应最近流行的LLaMA模型，LLaMAAdapter [ 220 ]在LLaMA较高的变压器层中的输入令牌上预先设置了一组可学习的提示(类似于前缀微调)。为了避免在训练初期损失值较大时微调不稳定，LLaMA - Adapter采用零初始化注意力机制代替其他PEFT方法的随机初始化权重，学习一个零初始化门控因子自适应地控制自适应提示对单词令牌的贡献。这样可以保持微调起点与原模型相同，并逐步向模型中注入新的知识，类似的思路可以在前面讨论的MEFT [ 112 ]和LoftQ [ 108 ]中找到。为了表示视觉信息，LLaMA Adapter使用CLIP图像编码器提取多尺度全局图像特征，并将其投影到语言嵌入空间。之后，在所有插入的变压器层中，将该特征以元素的形式添加到适配提示中。LLaMA-Adapter在LLaMA-7B中仅引入1.2 M的可学习参数，在8块A100 GPU上进行微调的时间小于1小时。随后的一项工作LLaMA-Adapter V2 [ 52 ]表明，LLaMA Adapter中简单的多模态融合并不能推广到更具挑战性的开放式多模态推理任务中，视觉线索比语言指令数据更倾向于主导适应提示。为了解决这个问题，LLaMA-Adapter V2将指令跟随能力(为了产生长的语言反应)的学习与视觉-语言对齐解耦，以避免视觉和语言微调之间的干扰。具体来说，LLaMA-Adapter V2设置了不相交的参数组，分别从图像-文本对和语言指令数据中学习。视觉适应提示插入在LLM的早期阶段，而语言适应提示保持在与LLaMA Adapter相似的较高的转换层。此外，LLaMA- Adapter V2引入了更多可学习的参数和多个专家系统(例如,字幕,检测和OCR)来增强多模态性能。<strong>LayerNorm Tuning</strong> [ 225 ]只调整每个注意力块内LayerNorm的权重。这种直接的技术可以达到与微调相当甚至更好的性能，同时提供比LoRA多10倍左右的参数效率。</p><p>2 )持续学习( Continual Learning，CL )：持续学习旨在在单一模型中学习一系列随时间变化的新任务，在对话系统[ 100 ]、信息抽取系统[ 14 ]、问答系统[ 201 ]等场景中有着广泛的应用。CL的主要挑战是灾难性遗忘[ 95 ]。一种流行的做法，称为基于架构的方法，通过为每个新任务维护模型中特定任务的参数来解决CL。因此，在CL任务[ 128 ]，[ 238 ]，[ 33 ]，[ 110 ]中使用PEFT方法是很自然的。例如Adapter CL [ 128 ]使用残差适配器对每个新任务进行参数化。在测试过程中，由于没有提供任务标识，AdapterCL使用基于熵的分类器来选择使用哪个适配器来完成特定的任务。CPT (持续提示微调, Continual Prompt Tuning) [ 238 ]为每个任务训练一个软提示。与从头开始训练软提示不同，CPT提出了一系列技术(连续提示初始化、查询融合、内存回放和内存引导技术)来实现前后任务的知识迁移。O-LoRA (正交低秩自适应) [ 178 ]采用在相互正交的低秩向量子空间中学习不同任务的策略，以最小化干扰。这种方法可以有效减少新任务习得过程中的灾难性遗忘。</p><p>3 )上下文窗口扩展：LLMs通常使用预先定义的上下文大小进行训练。例如，LLaMA和LLaMA2预先定义的上下文大小分别为2048和4096个令牌。位置编码RoPE具有弱外推特性[ 22 ]，这意味着当输入长度超过预先定义的上下文长度时，性能会明显下降。为了解决这个问题，一个简单的解决方案是将预训练的LLM微调到更长的上下文。然而，这使得计算成本随着上下文大小、内存和处理资源的紧张而呈二次方增加。为了解决这个问题，<strong>Long LoRA</strong> [ 24 ]提出使用LoRA对预训练的LLM进行微调，以扩大上下文大小。为了减小LoRA调优与完全微调之间的困惑差距，Long LoRA还开放了嵌入层和归一化层进行训练。为了进一步提高在长上下文场景下的训练效率，Long LoRA进一步引入了一种新颖的移位稀疏注意力( S^2^-Attn )作为训练过程中标准自注意力的有效替代者。随后的一项研究Long QLoRA [ 198 ]将Long LoRA的优点与QLoRA和位置插值[ 165 ]相结合，以节省GPU内存。该工作成功地将LLaMA2-13B的上下文长度从4096扩展到了8192，并在32GB内存的单V100上实现。</p><p>除了有限的训练阶段序列长度外，现实世界的系统内存限制为上下文窗口引入了另一个关键瓶颈。具体来说，KV-cache的容量被可用的系统内存限制。例如，一个输入长度为1024、批处理大小为128的30B参数LLM可能需要高达180GB的KV-cache [ 223 ]，从而限制了上下文窗口的可行大小。针对这一点，一些策略已经诉诸于量化KV缓存[ 159 ]，[ 36 ]，但是量化肯定会损害性能。为了有效地解决这个问题，GEAR [ 90 ]提出了一种新的方法，通过使用一个低秩矩阵来捕获量化误差的大部分相干基，并辅以一个稀疏矩阵来处理来自异常值的误差，从而有效地最小化逼近误差。</p><h3 id="B-PEFT-for-Vits">B. PEFT for Vits</h3><p>ViT [ 40 ]在最近的计算机视觉领域已经成为一个强大的骨干模型。在ViT模型中，图像被视为固定大小的块序列，类似于LLM使用离散令牌的方式。这些补丁经过线性嵌入，然后接受位置编码。随后，通过标准的Transformer编码器进行处理。ViT的训练可以是有监督的[ 40 ]，[ 164 ]，也可以是自监督的[ 23 ]，[ 68 ]，并且当使用更多的数据和使用更大的模型大小进行训练时，ViT可以获得更优越的性能[ 35 ]。然而，这种规模的扩大不可避免地增加了训练和存储成本。因此，与LLMs类似，PEFT广泛地应用于各种下游任务，如稠密预测[ 25 ]，连续学习[ 182 ]，[ 53 ]，深度度量学习[ 151 ]等。在这里，我们主要关注两个典型的任务来展示PEFT的参与：图像分类和视频识别。</p><p>1 )图像分类：在目标视觉数据集上进行图像分类是一种非常普遍的需求，具有广泛的应用，而预训练再微调范式是一种广泛使用的策略。多种方法利用PEFT技术实现高效的模型调优[ 84 ]，[ 25 ]，[ 21 ]，[ 86 ]。例如，<strong>AdaptFormer</strong> [ 21 ]在原始ViT模型的FFN中并行插入适配器模块，用于视觉识别任务。<strong>VPT</strong> (视觉提示微调，Visual Prompt Tuning) [ 84 ]在每个Transformer层的输入序列中预先输入少量的任务相关参数。当将ViT应用于下游任务时，只有这些增加的参数和分类头被设置为可训练的。文献[ 203 ]注意到，与有监督的ViT相比，VPT往往表现不如自监督的ViT。进一步的分析表明，不同的预训练方法和下游任务对不同位置的变压器块具有不同程度的依赖性。为了解决这个问题，本研究引入了适用于ViT块的自适应门。这些门动态地调节提示令牌对ViT块的贡献，从而使模型更有针对性地适应当前的任务。</p><p>2 )视频识别：一些工作考虑了更具有挑战性的自适应问题，将ViT迁移到具有更大域间隙的下游任务中。例如，<strong>ST- Adapter</strong> (时空适配器) [ 143 ]和AIM [ 200 ]都是在预训练的ViT块中插入适配器层。它们的主要目标是对时空信息进行建模，从而实现从图像模型到视频任务的ViTs的有效适配。值得注意的是，这两种方法都表现出了优于传统全模型微调方法的性能。</p><h3 id="C-PEFT-for-VLAs">C. PEFT for VLAs</h3><p>视觉-语言对齐模型( Vision-Language Alignment Model，VLA )，如CLIP [ 149 ]、ALIGN [ 83 ]、DeCLIP [ 107 ]、FLAVA [ 162 ]等，旨在学习一个良好的图像和文本特征，可以在统一的表示空间内进行对齐。每个VLA通常由单独的图像和文本编码器组成，分别提取各自的特征。在这些模型中使用了对比学习来有效地对齐图像和文本特征。微调是为了提高VLA在特定数据集或任务中的性能，但对全模型进行微调是计算密集型的。例如，微调CLIP RN50x64要求32, 768的batch size并且需要在592个V100 GPU上进行18天的训练[ 149 ]。此外，在较小的数据集上进行全微调往往会导致灾难性的遗忘[ 95 ]。为了应对这些挑战，并从NLP中PEFT技术的成功中得到启发，一系列PEFT策略被提出并在VLA模型中实现，如语义分割[ 193 ]，[ 205 ]，[ 196 ]，点云理解[ 219 ]，[ 241 ]，[ 181 ]，[ 81 ]，视频理解[ 89 ]，[ 138 ]，[ 114 ]，视觉推理[ 63 ]，[ 41 ]，时序动作检测[ 137 ]等。本部分将重点介绍使用VLAs的一个共同任务：开放词汇图像分类。</p><p>1 )开放词汇图像分类(Open-vocabulary Image Classification)：在开放词汇图像分类中，早期的工作为每个类别设计了特定类别的提示，例如一个 [ CLASS ]的照片，并根据图像与这些文本描述的相似度对图像进行排序。<strong>CoOp</strong> ( 上下文优化，Context Optimization ) [ 233 ]将手工编写的文本提示替换为可学习的向量，同时在训练过程中保留整个VLA修复。<strong>Co CoOp</strong> (条件上下文优化，Conditional Context Optimization) [ 232 ]在此基础上克服了CoOp在泛化到看不见的类时的局限性。它引入了一个轻量级的神经网络，生成一个输入特定的上下文令牌，根据每个图像动态地调整提示，从而增强了泛化性，但由于实例感知操作而增加了计算需求。<strong>ProGrad</strong> [ 236 ]通过正则化梯度与一般知识一致的软提示更新，仅将梯度一致(或不冲突)的提示更新到原始提示提供的一般知识，解决了CoOp在小样本情况下的过拟合风险。<strong>MaPLe</strong> [ 93 ]指出，现有方法要么在CLIP的语言中学习提示，要么在CLIP的视觉分支中学习提示，不能有效利用VLAs的多模态特性。为了解决这个问题，MaPLe提出了分支感知的分层提示，同时适应语言和视觉分支，并取得了优异的性能。<strong>TPT</strong> (测试时间提示微调, test-time prompt tuning) [ 161 ]研究了在工作进程中没有额外训练样本的情况下进行提示微调。具体来说，在推理过程中，TPT首先将输入图像放大到各种视图中，然后利用这些视图来调整可学习的提示。主要的训练目标是确保VLA在面对这些不同的视图时能够产生一致的响应。随后的<strong>DiffTPT</strong> [ 44 ]通过扩散模型进一步增强了测试样本的数据多样性。</p><p>在另一个方向上，一些研究探索了适配器在VLA中的使用。例如，<strong>CLIP-Adapter</strong> [ 51 ]在CLIP的文本和视觉编码器之后集成了残差式适配器。因此，与CoOp和CoCoOp不同，CLIP-Adapter通过CLIP的编码器避免了梯度反向传播，从而降低了训练内存和时间方面的计算需求。<strong>Tip- Adapter</strong> [ 218 ]采用与CLIP-Adapter相同的设计。与CLIP - Adapter不同的是，适配器的权重是由查询键缓存模型[ 140 ] [ 57 ]以免训练的方式得到的，而查询键缓存模型[ 140 ] [ 57 ]是由少量的监督以非参数的方式构建的。因此，与CLIP-Adapter的SGD训练过程相比，Tip-Adapter表现出更高的效率。</p><h3 id="D-PEFT-for-Diffusion-Models">D. PEFT for Diffusion Models</h3><p>扩散模型[ 73 ]、[ 163 ]是一类生成式模型，通过渐进的去噪过程将随机噪声转化为结构化输出，从而学习生成数据。在训练过程中，扩散模型使用去噪网络学习反向添加到训练数据中的噪声，而在推断过程中，它们从噪声出发，使用去噪网络迭代地创建与训练样本相同分布的数据。扩散模型有各种各样的应用[ 62 ]，[ 199 ]，[ 32 ]，[ 38 ]，[ 155 ]，其中最引人注目的是稳定扩散（stable diffusion）[ 153 ]，它以其强大的能力在文本和图像之间架起桥梁，直接从文本描述中生成连贯和上下文相关的图像。许多研究利用PEFT技术为下游任务适配预训练的扩散模型，包括加快采样速度[ 125 ]，[ 11 ]，文像转换适配[ 186 ]，[ 191 ]，text-to-3D适配[ 209 ]等。本节主要关注两种场景：在单纯基于文本的条件化之外整合额外的输入模态，以及基于预训练的扩散模型定制内容生成。</p><p>1 )附加输入控制：为了在保留预训练模型中丰富知识的同时纳入额外的输入模态(例如,布局,关键点)，<strong>GLIGEN</strong>引入了一种新的方法，该方法保持了原始模型的权重不变，并集成了新的、可训练的门控Transformer层[ 2 ]，用于接收新的接地输入。由此得到的模型不仅能够准确地表示接地情况，而且能够生成高质量的图像。值得注意的是，该模型在推理过程中也能很好地泛化到看不见的对象。</p><p>ControlNet [ 214 ]在锁定其预训练的参数权重的同时，对Stable Diffusion的编码层的可训练副本进行微调。固定的原始模型和可训练的拷贝通过零卷积层进行桥接。这些层从零初始化权重开始设计，在训练过程中逐步自适应，确保有害噪声在训练开始时不影响预训练的稳定扩散特征。该精化模型能够对多种输入进行条件化，如Canny边缘、Hough直线、用户涂鸦、人体关键点、分割图、形状法线、深度等。Concept滑块[ 50 ]引入了即插即用的LoRA适配器，允许在扩散模型中对概念(例如,年龄、微笑)进行精确编辑。<strong>T2I- Adapter</strong> [ 136 ]引入了一个轻量级的适配器模型，旨在将外部控制信号与文本到图像扩散模型的内部知识进行对齐。该适配器通过结构控制(如草图、深度图、语义分割图、关键帧等)、颜色控制(例如,色调和颜色分布)实现精确操控，并通过组合多个适配器集成多种控制。</p><p>2 )定制化生成：文本到图像扩散模型的有效性受限于用户通过文字描述表达期望目标的能力。例如，很难描述在大规模模型训练中没有遇到的创新玩具车的精确特征。因此，定制生成的目标是使模型能够从用户提供的最小图像集合中掌握新的概念。<strong>Textual Inversion</strong> [ 49 ]通过在预训练的文本到图像扩散模型的文本嵌入空间中找到一个新的代表新的特定概念的伪词<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mo>∗</mo></msub></mrow><annotation encoding="application/x-tex">S_*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1757em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> (类似于第三节A2讨论的软提示 )来解决这个问题。在给定一个描述概念的小图像集(一般为3 ~ 5幅图像)的情况下，通过扩散模型中的原始优化目标对伪词<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mo>∗</mo></msub></mrow><annotation encoding="application/x-tex">S_*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1757em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 进行优化，并将预训练的模型保留下来。在推理过程中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mo>∗</mo></msub></mrow><annotation encoding="application/x-tex">S_*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1757em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>可以像其他词一样被处理，并与其他文本查询(例如, &quot;一张海滩上<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mo>∗</mo></msub></mrow><annotation encoding="application/x-tex">S_*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1757em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>的照片&quot;)组成。<strong>Custom Diffusion</strong> [ 97 ]解决了一个更具挑战性的问题：多个概念的组合微调。它仅在注意力层中微调从文本到潜在特征的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">W_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">W_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>映射，在多概念学习场景中获得了优越的性能。此外，在微调过程中，自定义扩散通过引入一组与目标相似的字幕的真实图像来防止模型遗忘，同时采用增强以加快收敛并改善结果。<strong>IP-Adapter</strong> [ 202 ]指出了当前方法(例如, controlnet网络和T2I-Adapter)将条件信号投影到交叉注意力模块中的局限性。这些方法在处理以控制内容为目的的图像条件时，无法生成忠实于提示图像的图像。该问题源于在交叉注意力层中融合图像特征和文本特征丢失了图像特定信息，导致只能粗粒度地可控生成图像风格而不是图像内容。为了克服这个问题，IP-Adapter引入了一种新颖的解耦交叉注意力机制来区分文本和图像特征。IP-Adapter在每个交叉注意力层中专门为图像特征增加一个额外的交叉注意力层，只训练新的交叉注意力层的参数。</p><h2 id="Ⅵ-系统设计对PEFT的挑战">Ⅵ.系统设计对PEFT的挑战</h2><h3 id="A-PEFT系统设计">A. PEFT系统设计</h3><p>在这一部分中，我们首先对基于云的PEFT系统进行了简要的概述。接下来，我们给出了用于评估系统性能的相应指标。此外，为了说明系统设计中的挑战，我们给出了3个预期的使用场景。</p><p><img src="../../images/20240418-01/image-20240419185746901.png" alt="image-20240419185746901" /></p><p>图10：( a )基于分布式的系统计算模式；( b )集中式PEFT查询推理</p><p>1 )集中式PEFT查询服务：云提供商最近推出了一系列LLM服务，旨在通过应用程序编程接口( API )为用户提供应用程序[ 139 ]，[ 170 ]。这些API可以方便地将许多ML功能无缝集成到应用程序中。云服务器通过API接收到一个特定下游任务的查询后，使用一个有特色的LLM模型进行处理。在该场景下，提出的处理多个PEFT查询的云解决方案涉及只存储LLM的单个副本和多个PEFT模块。这个单副本维护多个PEFT模块分支，每个分支都与不同的PEFT查询相关联。最新系统的案例研究可以在第VI - C节中找到。图10 ( b )说明了多查询PEFT推理的计算模式，其中打包PEFT查询根据其截止时间和当前系统条件进行调度和执行。</p><p>2 )服务度量：为了评估集中式PEFT查询服务的系统性能，本文提出了一套评价指标。</p><ul class="lvl-0"><li class="lvl-2"><p>**系统吞吐量：**将PEFT查询看作任务间和任务内，使用每秒令牌数来衡量系统吞吐量。</p></li><li class="lvl-2"><p>**内存占用：**查询服务期间的运行时内存消耗，内存利用率来自模型参数和KV-cache，如第IV - A节所述。</p></li><li class="lvl-2"><p><strong>准确性性能</strong>：真实世界的查询通常具有不同的上下文长度，并且具有变化长度的性能作为性能基准。</p></li><li class="lvl-2"><p>**服务质量：**查询与延迟要求相关联，截止时间缺失率被认为是另一个基准。</p></li></ul><p>3 )面向PEFT的分布式系统：然而，在现有的LLM模型中，个性化任务并没有得到预训练模型的充分支持，因此，需要使用前面章节中提到的方法进行额外的微调。然而，当我们考虑将数据集提供给云提供商时，会引起很大的关注，因为这些数据集是个性化的。</p><p>对于这个问题，我们假设我们的计算遵循模型集中和PEFT分布的范式。主干LLM存储在云端设备中，而个人PEFT权重和数据集存储在用户自己的设备中。如图10 ( a )所示。</p><p>4 )分布式度量：为了评估所提出方法的有效性，我们建立了一组评估度量。为了进行这种分析，并且不失一般性，我们采用语言模型作为我们度量定义的基础。</p><ul class="lvl-0"><li class="lvl-2"><p>**准确性性能：**微调后的模型在下游任务上的表现。</p></li><li class="lvl-2"><p>**计算成本：**在边缘设备上进行前向和后向传播操作时的计算成本。</p></li><li class="lvl-2"><p>**通信代价：**指的是在边缘设备和云端之间传输中间数据时涉及的数据量。</p></li></ul><p>通信成本：指的是在边缘设备和云端之间传输中间数据的过程中所涉及的数据量。</p><p>5 )多PEFT训练：与多PEFT服务不同，多定制PEFT的调优往往涉及不同的骨干LLM。当考虑LLM在各种下游任务中的使用时，预训练的模型通常表现出次优的性能。一种普遍的方法是使LLM适应不同的任务，包括制定微调的PEFT。然而，同时调节多个PEFT会带来相当大的挑战。如何管理内存梯度和模型权重存储，以及如何设计用于批量PEFT训练的高效内核等问题仍未解决。PEFTs将根据其PEFT算法和主干LLM模型进行分类。设计挑战涉及如何合并具有相同LLM骨干网的多个PEFT以及同时合并多个不同LLM骨干网。</p><h3 id="B-案例研究：-DLoRA">B.案例研究： DLoRA</h3><p>由于LLM的规模，PEFT操作通常在公共环境(例如,云服务器)中执行。这就需要在公共环境中共享敏感的用户数据，从而引起潜在的隐私问题。为了应对这些挑战，一种名为DLoRA的解决方案被提出。DLoRA使得可扩展的PEFT操作能够在云端和用户设备之间协同执行。评估结果表明，DLoRA可以显著减少用户设备上的计算和通信负载，同时实现更高的准确性和隐私保护。</p><p><img src="../../images/20240418-01/image-20240419190405131.png" alt="image-20240419190405131" /></p><p>DLoRA依靠一种名为Kill and Revive ( KR )的算法( 1 )来减少用户端的计算和云端与用户的通信。DLoRA在调优过程中记录了不同PEFT模块在不同译码器中的权重变化。图11显示了采样的PEFT模块在4个历元上的权重。我们观察到，有些PEFT模块变化较大，而有些模块保持稳定。DLoRA提出，当边侧PEFT模块的重量变化不明显时，可以将其杀死；当边侧PEFT模块的重量变化明显时，可以将其恢复。云端和用户端可以同时进行计算。用户设备接收到云端针对特定PEFT模块的激活后，会启动针对PEFT模块的计算输出激活。同时，云端可以继续计算其他块。用户和云之间的同步障碍是激活函数(例如. Relu )在每个解码器中。这是因为PEFT模块计算通常在每个激活层之前执行残差块。</p><p><img src="../../images/20240418-01/image-20240419190433007.png" alt="image-20240419190433007" /></p><p>图11：在多个下游任务上，包括( a ) Arc - Query，( b ) Social - QA，所选PEFT模块在训练迭代过程中的l2范数变化。</p><h3 id="C-案例研究：PetS">C.案例研究：PetS</h3><p>PEFT算法以其能够区分模型中可修改和不可改变的权重而著称。这一特性激励开发人员将不同的LLM与不同的PEFT技术融合到集体单元中。PetS在[ 235 ]中提出，通过提出一个统一的服务框架，主张采用一种综合的方法来管理多个PEFT任务。该框架的核心进步在于将不同的PEFT任务转换为集成计算内核以提高效率。此外，PetS还提出了一种编排的批处理方法和一种调度方法，分别用于提高系统的吞吐量和利用任务的并行性。</p><p><img src="../../images/20240418-01/image-20240419191731858.png" alt="image-20240419191731858" /></p><p>图12：PetS系统概述：( 1 )任务寄存器；( 2 )任务管理器( 3 )任务调度；( 4 )任务服务。(图像取自PetS[235] )</p><p>如图12所示，PetS框架开始于用户通过标准化的应用程序接口( Application Programming Interface，API )注册PEFT任务。注册后，开发人员需要提供预先训练好的模型标签(例如, LLaMA)、PEFT参数的压缩格式以及PEFT的具体算法(例如, LoRA , Adapter , Bitfit等。)。然后，这些任务被赋予唯一的标识符，推理机负责查询处理。PetS将主要的计算工作负载(例如,线性层计算)分成三个不同的计算操作：( 1 )使用通用的、预训练的权重的稠密矩阵-向量乘法( MVM )。( 2 )偏差向量相加( Vadd )，使用共同偏差或任务独占偏差。( 3 )采用任务特定PET参数的稀疏/密集MVM操作组合。在PetS中使用了一个统一的预训练权重矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex">W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>，以方便初始操作$X_t \times W $的批处理。然而，涉及PET参数的后续特定任务计算，尽管复杂度相对较低，但都是单独处理的。</p><p>以Adapter和Bitfit任务为例，两者都是针对LLMs的MLP成分。Adapter任务整合了额外的权重片段，而Bitfit则调整了偏置元素。Adapter操作被建模为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi><mo>=</mo><msub><mi>X</mi><mrow><mi>i</mi><mi>n</mi><mn>1</mn></mrow></msub><mo>×</mo><mo stretchy="false">(</mo><mi>W</mi><mo>+</mo><msub><mi>W</mi><mrow><mi>a</mi><mi>d</mi></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>b</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">Y = X_{in1} \times (W + W_{ad}) + b_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>X</mi><mrow><mi>i</mi><mi>n</mi><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">X_{in1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">in</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 代表Adapter任务的输入，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex">W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mrow><mi>a</mi><mi>d</mi></mrow></msub></mrow><annotation encoding="application/x-tex">W_{ad}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight">d</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>分别是原始的和适配器专用的PEFT权重，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">b_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为初始偏差。另一方面，Bitfit操作被定义为 ，用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">b_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示Bitfit可调偏差。这些操作被进一步综合为$\lbrace Y_1, Y_2 \rbrace = \lbrace X_{in1}, X_{in2} \rbrace \times W \rbrace + \lbrace X_{in1} \times W_{ad},0) + \lbrace b_0, b_1 \rbrace <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>，指出</mtext></mrow><annotation encoding="application/x-tex">，指出</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">，指出</span></span></span></span>\lbrace x_{in1},x_{in2} \rbrace \times W <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>部分可以通过</mtext><mi>M</mi><mi>V</mi><mi>M</mi><mtext>进行批处理，而</mtext></mrow><annotation encoding="application/x-tex">部分可以通过MVM进行批处理，而</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">部分可以通过</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mord cjk_fallback">进行批处理，而</span></span></span></span>\lbrace b_0, b_1 \rbrace$部分属于Vadd操作。</p><p>对于Diff-Pruning III - B这样的任务，与Bitfit和Adapter稍有不同。对于Diff - Pruning，关于共享权重和&quot;差异&quot;的计算是分开进行的。然后将结果相加，即</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>X</mi><mi>t</mi></msub><mo>×</mo><mo stretchy="false">(</mo><mi>W</mi><mo>=</mo><msub><mi>δ</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>X</mi><mi>t</mi></msub><mo>×</mo><mi>W</mi><mo>+</mo><msub><mi>X</mi><mi>t</mi></msub><msub><mi>δ</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">X_t \times (W = \delta_t) = X_t \times W + X_t \delta_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0379em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0379em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>这里，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex">W</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span></span></span></span>表示骨干模型权重，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>δ</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">\delta_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em;">δ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0379em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>表示剪枝后的权重，可表示为Sparse MVM。</p><p><img src="../../images/20240418-01/image-20240419191802267.png" alt="image-20240419191802267" /></p><p>图13：协调分批( CB )策略</p><p>PetS提出的另一个挑战是如何调度不同的PEFT请求以实现高性能。PetS调度器通过两级调度策略实现高并行性：如图13所示，协调批处理( CB )和宏批处理流( MS )。通过CB，输入查询将首先根据它们的输入长度进行聚类，然后根据它们的共享算子进行分组。这是为了确保在不浪费填充的情况下执行相同序列长度的查询。MS策略将协同批处理后的分组查询与不同操作符的理论延迟以及系统建模参数一起生成最佳执行顺序。</p><h3 id="D-平行PEFT训练框架">D.平行PEFT训练框架</h3><p>a )设计挑战：与PetS系统旨在容纳灵活的多PEFT算法不同，<strong>SLoRA</strong> [ 158 ]和Punica [ 19 ]只专注于为各种任务提供多个LoRA块。设计多个PEFT培训系统在两个主要方面提出了关键挑战：</p><ul class="lvl-0"><li class="lvl-2"><p>具有相同LLM骨干网的多个PEFT模型的高效并发执行。</p></li><li class="lvl-2"><p>设计一个高效的多租户服务于不同LLM骨干网的系统。</p></li></ul><p>b )高效的内核设计：Punica针对第一个挑战，使用现有的矩阵乘法进行主干计算，并引入新的CUDA内核Segmented Gather Matrix- Vector Multiplication ( SGMV )，以批处理的方式将PEFT加法器添加到主干计算中。该内核将批处理中不同请求的特征权重乘法和同一PEFT模型对应的组请求进行并行化，以增加运算强度，并使用GPU Tensor Cores进行加速。</p><p>第二个挑战是在计算成本之外，设计一个高效的系统架构，能够在尽可能小的GPU集合上有效地服务多租户PEFT模型工作负载，同时占用最少的GPU资源是另一个重大的挑战。Punica通过将用户请求调度到已经服务或训练PEFT模型的活动GPU上来解决这一问题，从而提高GPU利用率。对于较旧的请求，Punica周期性地迁移它们以合并工作负载，从而为新的请求腾出GPU资源。</p><p>C )多租户PEFT设计：为Punica框架中的多租户PEFT模型设计一个高效的系统，重点解决几个关键的挑战，以最大化硬件利用率和最小化资源消耗。该系统旨在将服务于工作负载的多租户LoRA整合到尽可能小的GPU集合上。这种合并是通过将用户请求策略性地调度给已经在服务或训练LoRA模型的活动GPU来实现的，从而提高GPU利用率。对于较旧的请求，Punica周期性地迁移它们以进一步合并工作负载，从而为新的请求腾出GPU资源。它融入了LoRA模型权重的按需加载，只引入毫秒级的延迟。该特性使Punica可以灵活地将用户请求动态地合并到一组小的GPU上，而不受那些已经在这些GPU上运行的特定LoRA模型的限制。此外，Punica指出解码阶段是模型服务成本的主要因素，Punica的设计主要集中在优化解码阶段的性能。模型服务的其他方面利用简单的技术，如按需加载LoRA模型权重，以有效地管理资源利用率。</p><h2 id="Ⅶ-结论与未来方向">Ⅶ.结论与未来方向</h2><p>在当前以大模型和大数据集为主导的时代，PEFT作为一种高效适应下游任务的极具吸引力的方法脱颖而出。该技术通过解决传统全模型微调带来的重大挑战而获得其吸引力，这些挑战往往给普通用户带来无法维持的计算和数据需求。本综述系统回顾了PEFT的最新进展，包括算法开发、计算和效率方面、应用和系统部署。它提供了一个全面的分类法和解释，是一个很好的指南和知识库，使不同层次和学科的读者能够迅速掌握PEFT的核心概念。</p><p>对于PEFT的进一步研究，我们从算法和系统两个角度提出了一系列可能的方向，希望能激发更多的研究者从事这些方面的进一步研究。</p><h3 id="A-简化超参数微调">A. 简化超参数微调</h3><p>PEFT的有效性往往对其超参数敏感，例如适配器的瓶颈维度<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span></span></span></span>，LoRA的秩，以及不同加法PEFT层的放置位置。手动调节这些超参数将花费大量的精力。因此，未来的工作可以集中在开发对这些参数的手动调整依赖性较小的方法，或者自动寻找最优的超参数设置。一些研究[ 171 ]，[ 217 ]，[ 39 ]，[ 16 ]，[ 222 ]，[ 231 ]已经开始解决这个问题，但是需要更简单高效的解决方案来优化这些超参数。</p><h3 id="B-建立统一的基准">B. 建立统一的基准</h3><p>尽管存在像HuggingFace的PEFT [ 132 ]和AdapterHub [ 147 ]这样的库，但仍然缺乏一个全面的PEFT基准。这种差距阻碍了公平比较不同PEFT方法的性能和效率的能力。一个被广泛接受的、最新的、类似于MMDetection [ 17 ]的目标检测基准将使研究人员能够根据一组标准的任务和度量来验证他们的方法，从而促进社区内的创新和协作。</p><h3 id="C-提高训练效率">C . 提高训练效率</h3><p>PEFT的假定参数效率与训练过程中的计算和内存节省并不总是一致的。考虑到可训练参数在预训练模型的架构中相互交织，在微调过程中往往需要计算和存储整个模型的梯度。这种疏漏需要重新思考什么是效率。如第四节所述，潜在的解决方案在于整合模型压缩技术，如剪枝和量化，以及在PEFT调优期间专门设计的优化内存的创新。进一步研究提高PEFT方法的计算效率势在必行。</p><h3 id="D-探索规模化规律">D. 探索规模化规律</h3><p>最初为较小Transformer模型开发的PEFT方法的设计和有效性并不一定与较大的模型相比拟。随着基础模型规模的增加，识别和调整有效的PEFT策略至关重要。这种探索将有助于为不断演化的大模型架构量身定制PEFT方法。</p><h3 id="E-提供更多的模型和任务">E. 提供更多的模型和任务</h3><p>跨领域大型基础模型的兴起为PEFT提供了新的机遇。设计针对模型独有特性的PEFT方法，如Sora [ 9 ]、Mamba [ 58 ]、LVM [ 6 ]等，可以打开新的应用场景和机会。</p><h3 id="F-增强数据隐私性">F. 增强数据隐私性</h3><p>信任集中式系统来服务或微调个性化PEFT模块仍然是系统开发人员的另一个问题。侧信道攻击者已经成功部署，通过劫持中间结果来重构用户数据。未来值得信任的LLM系统设计的一个角度是开发个人数据和中间训练和推理结果的加密协议。</p><h3 id="G-PEFT与模型压缩">G. PEFT与模型压缩</h3><p>模型压缩是使LLM在资源受限设备上可执行的最有效方法之一。然而，模型压缩技术对硬件上运行的PEFT算法性能的影响仍然是另一个系统性的挑战。常见的压缩技术，如量化和剪枝，需要专用的硬件平台来加速这一过程，而为压缩模型构建这样的硬件平台也是研究人员的另一个方向。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;索引术语- -大型语言模型、参数高效微调、计算机系统、分布式系统。&lt;/p&gt;
&lt;p&gt;原文链接: &lt;a href=&quot;https://arxiv.org/abs/2403.14608&quot;&gt;Parameter-Efficient Fine-Tuning for Large Model</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLMs" scheme="https://www.aweisite.top/tags/LLMs/"/>
    
    <category term="PEFT" scheme="https://www.aweisite.top/tags/PEFT/"/>
    
  </entry>
  
  <entry>
    <title>模型推理服务</title>
    <link href="https://www.aweisite.top/posts/477823d7.html"/>
    <id>https://www.aweisite.top/posts/477823d7.html</id>
    <published>2024-01-17T11:22:00.000Z</published>
    <updated>2026-06-11T09:31:37.286Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、推理服务概述">一、推理服务概述</h2><h3 id="深度学习模型的全生命周期">深度学习模型的全生命周期</h3><p><img src="../../images/20240117-01/image1.png" alt="" /></p><p>深度学习模型的全生命周期图，主要分为两大类任务，训练任务和推理任务。</p><h3 id="推理、部署和服务化">推理、部署和服务化</h3><p><img src="../../images/20240117-01/image2.png" alt="" /></p><ul class="lvl-0"><li class="lvl-2"><p>训练任务：通常需要执行数小时、数天，一般配置较大的 batch size 以实现较大的吞吐量，训练模型直到指定的准确度或错误率。</p></li><li class="lvl-2"><p>推理任务：执行 7 x 24 小时服务，此时模型已稳定无需训练，服务于真实数据进行推理预测，一般 batch size 较小。</p></li></ul><p>推理任务相比训练任务的挑战有如下几点：</p><ol><li class="lvl-3"><p>模型被部署为<strong>长期运行</strong>的服务（需要稳定可靠）；</p></li><li class="lvl-3"><p>推理时有更苛刻的<strong>资源约束</strong>（需要在有限算力下服务）；</p></li><li class="lvl-3"><p>推理不需要反向传播梯度下降；</p></li><li class="lvl-3"><p>部署的设备型号更加多样，意味着设备<strong>架构多样</strong>（需要具有通用性）。</p></li></ol><p><img src="../../images/20240117-01/image3.png" alt="" /></p><p><strong>训练过程</strong> 通过设计合适的 AI 模型以及损失函数、优化算法等，前向传播并计算损失函数，反向计算梯度，利用优化函数来更新模型，最终目标是使<strong>损失函数最小</strong>。</p><p><strong>推理过程</strong> 在训练好的模型上，进行一次前向传播得到输出，最终目标是将<strong>模型部署在生产环境中</strong>。</p><p><strong>测试过程</strong> 一般此阶段含有功能性测试（离线测试和在线 <u><a href="https://en.wikipedia.org/wiki/A/B_testing">A/B 测试</a></u>等）和非功能性测试（性能测试等），一旦模型达标则可以<strong>进行模型部署阶段</strong>。</p><p><strong>部署过程</strong> 需要针对的平台编译与代码生成，模型打包或者针对服务端制作镜像。一旦服务中出现问题，模型还可以通过一定策略进行回滚使用原来的模型。</p><p><strong>服务过程</strong> 封装成一个SDK，集成到APP或者服务中；封装成一个web服务，对外暴露接口（HTTP(S)，RPC等协议）。</p><p><img src="../../images/20240117-01/image4.png" alt="" /></p><h2 id="二、推理系统与推理服务">二、推理系统与推理服务</h2><h3 id="推理系统">推理系统</h3><p><img src="../../images/20240117-01/image5.png" alt="" /></p><p>**推理系统（Inference System）**是用于部署人工智能模型，执行推理预测任务的人工智能系统，类似传统 Web 服务或移动端应用系统的作用。通过推理系统，可以将深度学习模型部署到云（Cloud）端或者边缘（Edge）端，并服务和处理用户的请求。模型训练过程好比是传统软件工程中的代码开发的过程，而开发完的代码势必要打包，部署给用户使用，那么推理系统就负责应对模型部署和服务生命周期中遇到的挑战和问题。</p><p>当推理系统将完成训练的模型进行部署和服务时，需要考虑设计和提供模型压缩，负载均衡，请求调度，加速优化，多副本和生命周期管理等支持。相比深度学习框架等为训练而设计的系统，推理系统不仅关注低延迟，高吞吐，可靠性等设计目标，同时受到资源，服务等级协议（Service-Level Agreement），功耗等约束。</p><p>推理系统的作用可以理解为提供一个服务，服务的形式可以是 C/S 架构，也可以是微服务架构；服务的内容可以是推荐系统，也可以各种生成式模型。因此，系统的输入应通过 HTTP 或 gRPC 等请求发送，输出则根据业务需要进行定义。</p><p>推理系统需要考虑：</p><ul class="lvl-0"><li class="lvl-2"><p>低延迟 满足服务等级的延迟</p></li><li class="lvl-2"><p>高吞吐 暴增负载的吞吐需求</p></li><li class="lvl-2"><p>高效率 高效率，低功耗</p></li><li class="lvl-2"><p>扩展性 支持不断增长的用户或设备</p></li></ul><p>下图是推荐系统的架构图，请求响应与处理、监控和调度队列应该是高性能系统的常见组成部分，而推理系统的关键在于<strong>模型管理</strong>和<strong>推理引擎</strong>。</p><p><img src="../../images/20240117-01/image6.png" alt="" /></p><p><strong>模型管理</strong>可以选择合适的 AI 模型执行推理任务，<strong>推理引擎</strong>则将各个任务合理分配给各种处理单元（GPU、DCU、CPU）进行处理。</p><p><img src="../../images/20240117-01/image7.png" alt="" /></p><h3 id="推理引擎">推理引擎</h3><h4 id="推理系统与推理引擎">推理系统与推理引擎</h4><p><img src="../../images/20240117-01/image8.png" alt="" /></p><p>推理系统根据选取的模型选择对应的<strong>后端推理引擎</strong>，推理引擎会进行<strong>模型转换</strong>，通过一定策略对模型进行<strong>推理优化</strong>，提供模型<strong>运行时</strong>，以及提供对应的高性能算子。</p><p><img src="../../images/20240117-01/image9.png" alt="" /></p><h4 id="推理优化">推理优化</h4><p><strong>推理引擎</strong>常常可以通过以下几个方向进行模型推理的延迟优化：</p><ul class="lvl-0"><li class="lvl-2"><p><strong>模型优化</strong>，降低访存开销：</p><ul class="lvl-2"><li class="lvl-4"><p>层（Layer）间融合（Fusion）或张量（Tensor）融合</p></li><li class="lvl-4"><p>目标后端自动调优</p></li><li class="lvl-4"><p>内存分配策略调优</p></li></ul></li><li class="lvl-2"><p>降低一定的准确度，进而<strong>降低计算量</strong>，最终降低延迟：</p><ul class="lvl-2"><li class="lvl-4"><p>低精度推理与精度校准（Precision Calibration）</p></li><li class="lvl-4"><p>模型压缩（Model Compression）</p></li></ul></li><li class="lvl-2"><p><strong>自适应批尺寸</strong>（Batch Size）：动态调整需要进行推理的输入数据数量</p></li><li class="lvl-2"><p><strong>缓存</strong>（Caching）结果：复用已推理的结果或特征数据</p></li></ul><h5 id="常见的推理优化库：">常见的推理优化库：</h5><p><strong>DeepSpeed-Inference</strong></p><p>微软推出的DeepSpeed库的推理方案，通过推理定制内核和MoQ量化方法缩小模型并降低生产时的推理成本，为使用 DeepSpeed、Megatron 和 HuggingFace 训练的基于兼容 Transformer 的模型提供无缝推理模式。</p><p><strong>Accelerate</strong></p><p>Hugginface 推出的针对大模型的分布式并行优化解决方案，可简化分布式训练和推理过程。Accelerate集成了DeepSpeed的一些功能(DeepSpeed ZeRO)以实现推理阶段的性能优化。</p><p><strong>注</strong>：DeepSpeed 和 Accelerate也可为训练阶段提供加速优化。</p><h3 id="推理部署">推理部署</h3><p><img src="../../images/20240117-01/image10.png" alt="" /></p><p>与训练阶段不同，推理部署需要对模型进行转换，使得模型能够在落地时有更好的性能表现，并且不依赖于特定的python运行时环境，每个部署格式都需要对应的<strong>推理引擎</strong>或者运行时环境。</p><h4 id="模型转换与开放协议"><strong>模型转换与开放协议</strong></h4><p>模型可以通过**中间表达（IR）<strong>和相应的对应框架的</strong>模型解析器（Parser）**和对应框架的模型发射器（Emitter）实现跨框架转换。</p><p><img src="../../images/20240117-01/image11.png" alt="" /></p><p>不同的深度学习框架都有自己的IR，通过IR的形式可实现跨框架的模型训练和推理。如某模型文件是通过 TensorFlow 训练的，通过该方式进行模型转换， 就能使用PyTorch 对其进行迁移学习微调。</p><h4 id="常见的模型部署格式"><strong>常见的模型部署格式</strong></h4><h5 id="TorchScript-Module"><strong>TorchScript Module</strong></h5><p>使用Torch Script导出，Torch Script为PyTorch模型的中间表示形式， 是 Pytorch 的一个高性能子集，PyTorch JIT 编译器会对模型的计算执行运行时优化，也可以在 C++ 等高性能环境中运行。</p><h5 id="Tensorflow-SavedModel"><strong>Tensorflow SavedModel</strong></h5><p>包含一个完整的 TensorFlow 程序，包括训练的参数和计算。它不需要原始模型构建代码就可以运行，因此，对于使用 <a href="https://tensorflow.org/lite?hl=zh-cn">TFLite</a>、<a href="https://js.tensorflow.org/?hl=zh-cn">TensorFlow.js</a>、<a href="https://tensorflow.google.cn/tfx/serving/tutorials/Serving_REST_simple?hl=zh-cn">TensorFlow Serving</a> 或 <a href="https://tensorflow.org/hub?hl=zh-cn">TensorFlow Hub</a> 共享或部署非常有用。</p><h5 id="ONNX"><strong>ONNX</strong></h5><p><img src="../../images/20240117-01/image12.png" alt="" /></p><p>ONNX 是一种开放格式，旨在表示机器学习模型。ONNX 定义了一组通用运算符（机器学习和深度学习模型的构建块）和通用文件格式，使 AI 开发人员能够将模型与各种框架、工具、运行时和编译器结合使用。其对应的推理引擎为Onnx Runtime。</p><h5 id="TensorRT"><strong>TensorRT</strong></h5><p>TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架。Pytorch、TF或者其他框架训练好的模型，可以转化为TensorRT的格式，然后利用TensorRT推理引擎去运行。</p><h5 id="PaddlePaddle"><strong>PaddlePaddle</strong></h5><p>PaddlePaddle 用于推理的模型，通过动态图与静态图或高层API保存，也可通过 X2Paddle 工具将pytorch模型转换为 PadddlePaddle 格式。其对应的推理引擎为PaddleInference，此外还有移动端推理引擎Paddle Lite和前端推理引擎Paddle.js。</p><h5 id="OpenVINO"><strong>OpenVINO</strong></h5><p>是英特尔推出的一款全面的工具套件OpenVINO的专有格式，OpenVINO的IR，可以完全利用其全部功能。可以由TensorFlow、PyTorch、MXNet、Caffe、Kaldi等模型转换而来，一般用于CPU部署。</p><p>除此之外，大部分的推理服务器还支持使用Python + Python runtime推理，如pytorch的Eager模式，也就是使用Pythonic的编程方式。</p><h3 id="推理服务化">推理服务化</h3><h4 id="可靠性（Reliability）和可扩展性（Scalability）"><strong>可靠性（Reliability）和可扩展性（Scalability）</strong></h4><p>通过底层的部署平台（例如，Kubernetes）的支持，用户可以通过配置方便地描述和自动部署多个推理服务的副本，并通过部署前端负载均衡服务达到负载均衡，进而达到高扩展性提升了吞吐量，同时更多的副本也使得推理服务有了更高的可靠性。</p><p><img src="../../images/20240117-01/image13.png" alt="" /></p><h4 id="部署灵活性"><strong>部署灵活性</strong></h4><p>训练的过程中模型使用的框架类型和版本多样，推理系统需要支持多样的深度学习框架所保存的模型文件，并和其他系统服务进行交互。在部署模型后，整个推理的流水线需要做一定的数据处理或者多模型融合，推理系统也需要支持与不同语言接口和不同逻辑的应用结合。</p><p>为了提供部署灵活性，推理系统提供了以下解决方法：</p><ul class="lvl-0"><li class="lvl-2"><p>深度学习模型开放协议：通过 ONNX 等模型开放协议和工具，将不同框架的模型进行通过标准协议转换，优化和部署。</p><ul class="lvl-2"><li class="lvl-4">跨框架模型转换。</li></ul></li><li class="lvl-2"><p>接口抽象：将模型文件封装并提供特定语言的调用接口。</p><ul class="lvl-2"><li class="lvl-4"><p>提供构建不同应用逻辑的灵活性。</p></li><li class="lvl-4"><p>提供不同框架的通用抽象。</p></li></ul></li><li class="lvl-2"><p>远程过程调用（Remote Procedure Call）：可以将不同的模型或数据处理模块封装为<strong>微服务</strong>，通过远程过程调用（RPC）进行推理流水线构建。</p><ul class="lvl-2"><li class="lvl-4">跨语言，远程过程调用。</li></ul></li><li class="lvl-2"><p>镜像和容器技术：通过镜像技术解决多版本与部署资源隔离问题。</p><ul class="lvl-2"><li class="lvl-4">运行时环境依赖与资源隔离。</li></ul></li></ul><h4 id="常用的推理服务"><strong>常用的推理服务</strong></h4><ul class="lvl-0"><li class="lvl-2"><p>服务端推理系统</p><ul class="lvl-2"><li class="lvl-4"><p>Triton Inference Server：Nvidia发布的高性能推理服务器，支持<strong>多种推理引擎后端</strong>，够部署来自多个深度学习和机器学习框架的 AI 模型，包括 TensorRT、TensorFlow、PyTorch、ONNX、OpenVINO、Python、RAPIDS FIL 等。</p></li><li class="lvl-4"><p><u><a href="https://www.tensorflow.org/tfx/guide/serving">TensorFlow Serving（TFX）</a></u>：专为生产环境而设计灵活、高性能的机器学习模型推理，对基于 TensorFlow 训练的模型原生支持较好，同时工具链完善，经过多年考验较为成熟。</p></li><li class="lvl-4"><p>Multi-model-server：aws推出的针对模型部署的模型服务器，可以做到跨机器学习框架。HTTP Server部分基于Java服务框架Netty实现，server部分性能和C++实现基本对齐。但是推理计算时直接调用相应运行框架的python接口，不如C++接口高效。另外，用户需要自定义预处理，推理，后处理handler。虽然一方面增加了灵活性，支持跨平台特性，但是易用性不足。</p></li><li class="lvl-4"><p><u><a href="https://pytorch.org/serve/">TorchServe</a></u>：一种高性能、灵活且易于使用的工具，用于在生产中服务和扩展 PyTorch 模型。基于Multi-model-server框架添加了针对Torch的特性发展而来，对基于 PyTorch 训练的模型原生支持较好。</p></li><li class="lvl-4"><p>DJL-Serving：基于Deep Java Library的高性能服务系统，提供多引擎支持，支持包括PyTorch TorchScript 、TensorFlow SavedModel、MXNet、ONNX、TensorRT等模型的推理，除此外还支持Java和二进制推理。</p></li></ul></li></ul><h4 id="针对LLM的推理服务"><strong>针对LLM的推理服务</strong></h4><p><strong>Deepspeed-MII</strong></p><p><img src="../../images/20240117-01/image14.png" alt="" /></p><p>由 DeepSpeed 设计的开源 Python 库，旨在实现强大的模型推理大众化，底层由DeepSpeed-Inference提供支持，重点关注高吞吐量、低延迟和成本效益。除了语言模型之外，还支持加速text2image 模型，例如 Stable Diffusion。</p><p><strong>vLLM</strong></p><p>vLLM 是一个快速且易于使用的 LLM 推理和服务库，无缝支持许多 Hugging Face 模型。vLLM提供一系列的LLM推理优化策略，同时可以部署为 LLM 服务，通过HTTP对外提供服务。除此之外，vLLM 可以部署为<strong>模仿 OpenAI API 协议</strong>的服务器。vLLM可以单独部署，docker容器部署，也可以<strong>与Triton一起部署</strong>。</p><p><strong>text-generation-inference(TGI)</strong></p><p><img src="../../images/20240117-01/image15.png" alt="" /></p><p>文本生成推理 (TGI) 是一个用于部署和提供大型语言模型 (LLM) 服务的工具包，包含了大量的LLM优化方法和CUDA内核支持，同时支持利用针对特定任务的微调来实现更高的准确性和性能。借助Dynamic Batching技术，TGI的模型服务能力(QPS)可达Faster Transformer的两倍以上，即使Faster Transformer的算子优化做的更好，并且可以提供更高的模型吞吐量。</p><p><strong>OpenLLM</strong></p><p><strong>PPL LLM Serving</strong></p><p><img src="../../images/20240117-01/image16.png" alt="" /></p><p>汤商科技推出的模型服务器，适用于各种大型语言模型 (LLM)。包含一个基于 gRPC 的服务器专为大语言模型设计的自研高性能推理引擎。</p><h2 id="三、推理服务解决方案">三、推理服务解决方案</h2><h3 id="Kubeflow-K-Serve">Kubeflow/K-Serve</h3><p><img src="../../images/20240117-01/image17.png" alt="" /></p><p>K-Serve是Kubeflow社区提供的构建在Kubernetes之上的推理服务解决方案。</p><p>K-Serve支持Tensorflow, Triton, XGBoost, SKLearn, ONNX, Pytorch等预置的模型服务器，同时也支持用户自定义服务器，因此K-Serve可以支持所有主流机器学习模型的服务部署。</p><h3 id="Seldon-Core">Seldon Core</h3><p><img src="../../images/20240117-01/image18.png" alt="" /></p><p>Seldon Core目前是在 Kubernetes 上运行机器学习推理负载方面最受欢迎的项目之一,是构建在Kubernetes上的机器学习模型部署的一整套解决方案。</p><p>Seldon Core有很多预装备的模型服务器，如TF-Serving Server, Triton Server, XGBoost Server, SKLearn Server等。Seldon Core也支持用户自定义Server，扩展性好。通过这种机制，Seldon Core可以支持所有主流的机器学习模型的部署。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、推理服务概述&quot;&gt;一、推理服务概述&lt;/h2&gt;
&lt;h3 id=&quot;深度学习模型的全生命周期&quot;&gt;深度学习模型的全生命周期&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../../images/20240117-01/image1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;深</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>djl-serving deepspeed模型部署流程(python模式)</title>
    <link href="https://www.aweisite.top/posts/65c33970.html"/>
    <id>https://www.aweisite.top/posts/65c33970.html</id>
    <published>2024-01-03T19:34:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<h1>djl-serving deepspeed模型部署流程(python mode)</h1><h2 id="相关介绍">相关介绍</h2><h3 id="DeepSpeed">DeepSpeed</h3><p><a href="https://github.com/microsoft/DeepSpeed">deepspeed</a> 是一款微软发布的深度学习优化软件套件，能提供一键深度学习加速推理和训练能力。</p><p>DeepSpeed 为使用 DeepSpeed、Megatron 和 HuggingFace 训练的基于兼容 Transformer 的模型提供无缝推理模式，无需修改模型即可实现高效推理。</p><h3 id="djl-serving">djl-serving</h3><p>DJL Serving 是由DJL提供支持的高性能通用独立模型服务解决方案。它将深度学习模型或工作流程包装成服务，并通过 HTTP 提供它们。</p><p><img src="../../images/20240103-01/image.png" alt="image" /></p><p><strong>djl-serving python mode</strong></p><p>djl-serving推理服务支持python模式，用户只需准备一个Python脚本文件即可执行，除此之外，djl-serving还提供如下支持：</p><p>Java模式：用户需要准备Java前/后处理脚本和模型文件。</p><p>二进制模式：用户只需要准备一个模型文件，我们就可以运行tensor-in，tensor out操作。</p><h3 id="相应关系">相应关系</h3><p><img src="../../images/20240103-01/image-1.png" alt="image" /></p><p><strong>对应的推理服务流程：</strong></p><p>用户向DJL-Serving请求--&gt;DJL-serving将请求定位到模型并将输入交给推理引擎（DeepSpeed）--&gt;DeepSpeed对pytorch模型进行自动优化，进行推理，推理结果返还给DJL-Serving--&gt;DJL-Serving响应用户请求</p><h3 id="测试模型">测试模型</h3><p>使用的测试模型为<code>Qwen-1.8B </code></p><p><strong>通义千问-1.8B（Qwen-1.8B</strong> 是阿里云研发的通义千问大模型系列的18亿参数规模的模型。Qwen-1.8B是基于Transformer的大语言模型, 在超大规模的预训练数据上进行训练得到。预训练数据类型多样，覆盖广泛，包括大量网络文本、专业书籍、代码等。</p><h2 id="docker部署">docker部署</h2><p>首先拉取<code>djl-serving:0.19.0-deepspeed</code>镜像</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull deepjavalibrary/djl-serving:0.19.0-deepspeed</span><br></pre></td></tr></table></figure><h3 id="使用docker-compose">使用docker compose</h3><p>首先创建<code>model</code>目录</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> model</span><br></pre></td></tr></table></figure><p>建立使用gpu的容器</p><p>创建<code>docker-compose.yaml</code>文件并添加如下文本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">version: <span class="string">&quot;2.1&quot;</span></span><br><span class="line">services:</span><br><span class="line">  djl_deepspeed:</span><br><span class="line">    image: deepjavalibrary/djl-serving:0.19.0-deepspeed</span><br><span class="line">    container_name: djl_deepspeed</span><br><span class="line">    environment:</span><br><span class="line">      - PUID=1000</span><br><span class="line">      - PGID=1000</span><br><span class="line">      - TZ=Etc/UTC</span><br><span class="line">      - WEBUI_PORT=8080</span><br><span class="line">      - NVIDIA_DRIVER_CAPABILITIES=all</span><br><span class="line">      - NVIDIA_VISIBLE_DEVICES=0</span><br><span class="line">    deploy:</span><br><span class="line">      resources:</span><br><span class="line">        reservations:</span><br><span class="line">            devices:</span><br><span class="line">                - driver: <span class="string">&quot;nvidia&quot;</span></span><br><span class="line">                  device_ids: [<span class="string">&quot;0&quot;</span>]</span><br><span class="line">                  capabilities: [<span class="string">&quot;gpu&quot;</span>]</span><br><span class="line">    volumes:</span><br><span class="line">      - ./models:/opt/ml/model</span><br><span class="line">    ports:</span><br><span class="line">      - 8080:8080</span><br><span class="line">    restart: no</span><br></pre></td></tr></table></figure><h2 id="构建模型结构">构建模型结构</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> models &amp; <span class="built_in">mkdir</span> Qwen</span><br></pre></td></tr></table></figure><p>创建<code>serving.properties</code>并写入如下配置项</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">engine=DeepSpeed</span><br><span class="line">option.model_id=Qwen/Qwen-1-8B</span><br><span class="line">option.tensor_parallel_degree=1</span><br><span class="line">option.enable_streaming=<span class="literal">true</span></span><br></pre></td></tr></table></figure><p>创建<code>model.py</code>，写入代码如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> modelscope <span class="keyword">import</span> AutoModelForCausalLM, AutoTokenizer</span><br><span class="line"><span class="keyword">from</span> transformers <span class="keyword">import</span> pipeline</span><br><span class="line"><span class="keyword">import</span> deepspeed</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"><span class="keyword">from</span> djl_python <span class="keyword">import</span> Input, Output</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_model</span>():</span><br><span class="line">    model_name = <span class="string">&#x27;Qwen-1_8B-Chat&#x27;</span></span><br><span class="line">    tokenizer = AutoTokenizer.from_pretrained(model_name, revision=<span class="string">&#x27;master&#x27;</span>, trust_remote_code=<span class="literal">True</span>)</span><br><span class="line">    model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=<span class="literal">True</span>)</span><br><span class="line">    tensor_parallel = <span class="built_in">int</span>(os.getenv(<span class="string">&#x27;TENSOR_PARALLEL_DEGREE&#x27;</span>, <span class="string">&#x27;1&#x27;</span>))</span><br><span class="line">    local_rank = <span class="built_in">int</span>(os.getenv(<span class="string">&#x27;LOCAL_RANK&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line"></span><br><span class="line">    generator = pipeline(<span class="string">&#x27;text-generation&#x27;</span>, model=model, tokenizer=tokenizer,</span><br><span class="line">                        device=local_rank)</span><br><span class="line"></span><br><span class="line">    generator.model = deepspeed.init_inference(generator.model,</span><br><span class="line">                                        mp_size=tensor_parallel,</span><br><span class="line">                                        dtype=torch.<span class="built_in">float</span>,</span><br><span class="line">                                        replace_method=<span class="string">&#x27;auto&#x27;</span>,</span><br><span class="line">                                        replace_with_kernel_inject=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> generator</span><br><span class="line"></span><br><span class="line">predictor =  get_model()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle</span>(<span class="params">inputs: Input</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="keyword">global</span> predictor</span><br><span class="line">    <span class="keyword">if</span> predictor <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        predictor = get_model()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> inputs.is_empty():</span><br><span class="line">        <span class="comment"># Model server makes an empty call to warmup the model on startup</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    data = inputs.get_as_string()</span><br><span class="line">    result = predictor(data, do_sample=<span class="literal">True</span>, min_length=<span class="number">50</span>)</span><br><span class="line">    <span class="keyword">return</span> Output().add(result)</span><br></pre></td></tr></table></figure><h2 id="下载模型">下载模型</h2><p>模型文件为使用<code>snapshot_download</code>从modelscope/huggingface中下载的快照</p><p>模型下载脚本如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># from huggingface_hub import snapshot_download # 使用huggingface</span></span><br><span class="line"><span class="keyword">from</span> modelscope <span class="keyword">import</span> snapshot_download <span class="comment"># 使用modelscope</span></span><br><span class="line">snapshot_download(<span class="string">&quot;Qwen/Qwen-1_8B-Chat&quot;</span>,local_dir=<span class="string">&quot;./models/Qwen&quot;</span>, revision=<span class="string">&#x27;master&#x27;</span>)</span><br></pre></td></tr></table></figure><h2 id="安装依赖">安装依赖</h2><p>进入容器中，进入<code>/opt/ml/model/Qwen</code>模型目录</p><h3 id="自动化安装">自动化安装</h3><p>正常情况下，容器在启动时会自动检测模型目录和存在的<code>requirements.txt</code>依赖文件，如果出现异常需要移除该文件，并手动进入容器内安装依赖。</p><h3 id="手动安装">手动安装</h3><p><code>pip install -r requirements.txt</code></p><h2 id="测试">测试</h2><p>容器内服务启动成功后，<code>docker logs djl_deepspeed</code>应该会有如下输出</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[INFO ] PyProcess - [1,0]&lt;stdout&gt;:Python engine started.</span><br><span class="line">[INFO ] PyProcess - Model [Qwen] initialized.</span><br><span class="line">[INFO ] PyModel - Qwen model loaded <span class="keyword">in</span> 24574 ms.</span><br><span class="line">[INFO ] FolderScanPluginManager - scanning <span class="keyword">for</span> plugins...</span><br><span class="line">[INFO ] FolderScanPluginManager - scanning <span class="keyword">in</span> plug-in folder :/opt/djl/plugins</span><br><span class="line">[INFO ] PropertyFilePluginMetaDataReader - Plugin found: console/jar:file:/opt/djl/plugins/management-console-0.19.0.jar!/META-INF/plugin.definition</span><br><span class="line">[INFO ] PropertyFilePluginMetaDataReader - Plugin found: static-file-plugin/jar:file:/opt/djl/plugins/static-file-plugin-0.19.0.jar!/META-INF/plugin.definition</span><br><span class="line">[INFO ] FolderScanPluginManager - Loading plugin: &#123;console/jar:file:/opt/djl/plugins/management-console-0.19.0.jar!/META-INF/plugin.definition&#125;</span><br><span class="line">[INFO ] PluginMetaData - plugin console changed state to INITIALIZED</span><br><span class="line">[INFO ] FolderScanPluginManager - Loading plugin: &#123;static-file-plugin/jar:file:/opt/djl/plugins/static-file-plugin-0.19.0.jar!/META-INF/plugin.definition&#125;</span><br><span class="line">[INFO ] PluginMetaData - plugin static-file-plugin changed state to INITIALIZED</span><br><span class="line">[INFO ] PluginMetaData - plugin console changed state to ACTIVE reason: plugin ready</span><br><span class="line">[INFO ] PluginMetaData - plugin static-file-plugin changed state to ACTIVE reason: plugin ready</span><br><span class="line">[INFO ] FolderScanPluginManager - 2 plug-ins found and loaded.</span><br><span class="line">[INFO ] ModelServer - Initialize BOTH server with: EpollServerSocketChannel.</span><br><span class="line">[INFO ] ModelServer - BOTH API <span class="built_in">bind</span> to: http://0.0.0.0:8080</span><br></pre></td></tr></table></figure><p>此时从宿主机可以通过<code>curl</code>命令进行测试</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -X POST http://localhost:8080/predictions/Qwen --header <span class="string">&#x27;content-type: text/string&#x27;</span> --data-raw <span class="string">&#x27;通义千问是&#x27;</span></span><br></pre></td></tr></table></figure><p>预期响应</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="string">&quot;generated_text&quot;</span>:<span class="string">&quot;通义千问是阿里云研发的超大规模语言模型，具有什么样的能力？\nA. A:理解自然语言、生成人类对话\nB. B:理解复杂文本、总结文本内容\nC. C:生成艺术作品、写故事\nD. D:写作诗歌、歌词\n\n答案：A\n&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;djl-serving deepspeed模型部署流程(python mode)&lt;/h1&gt;
&lt;h2 id=&quot;相关介绍&quot;&gt;相关介绍&lt;/h2&gt;
&lt;h3 id=&quot;DeepSpeed&quot;&gt;DeepSpeed&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/m</summary>
      
    
    
    
    <category term="摸鱼日记" scheme="https://www.aweisite.top/categories/%E6%91%B8%E9%B1%BC%E6%97%A5%E8%AE%B0/"/>
    
    
  </entry>
  
  <entry>
    <title>AutoBangumi 密码重置方法</title>
    <link href="https://www.aweisite.top/posts/5ce70843.html"/>
    <id>https://www.aweisite.top/posts/5ce70843.html</id>
    <published>2023-12-07T00:32:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h2 id="关于-AutoBangumi">关于 AutoBangumi</h2><p><img src="../images/20231-01207-01/img-2.png" alt="upload successful" /></p><p><a href="https://github.com/EstrellaXD/Auto_Bangumi/tree/main">AutoBangumi</a>是一个根据订阅自动下载番剧的工具，最近进行了升级并且更加好用了。但是在丰富了番剧订阅管理的同时增加了认证功能，对我这种密码太多记不住的人来说不是很友好。</p><h2 id="解决方案">解决方案</h2><h3 id="官方解决方式">官方解决方式</h3><p>果不其然今天想登陆进去看管理番剧却发现怎么也记不起来密码了，于是去翻看<a href="https://www.autobangumi.org/faq/">官方faq</a>，却发现官方并不支持重置密码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">修改和忘记密码</span><br><span class="line">修改密码：在登录后点击右上角···，点击 Profile，修改用户名和密码。</span><br><span class="line">目前没有简单的忘记密码的重置方法，如果忘记密码，可以删除 data/data.db 文件，然后重启。</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>官方推荐直接删除数据库，我（备份之后）删除之后登录出现没有提示的报错，并且担心这样做会导致番剧管理设置被清除，于是就开始研究如何手动重置密码。</p><h3 id="手动重置密码">手动重置密码</h3><p>翻看源码后发现，密码管理模块位于<code>Auto_Bangumi/backend/src/module /security/</code>的<code>jwt.py</code>文件，于是写了个脚本来替换对应的hashed_passd。</p><p>脚本内容如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"><span class="keyword">from</span> passlib.context <span class="keyword">import</span> CryptContext</span><br><span class="line"></span><br><span class="line"><span class="comment"># 这里设置要修改的密码</span></span><br><span class="line">passwd = <span class="built_in">input</span>(<span class="string">&quot;input new password: &quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Hashing 密码</span></span><br><span class="line">app_pwd_context = CryptContext(schemes=[<span class="string">&quot;bcrypt&quot;</span>], deprecated=<span class="string">&quot;auto&quot;</span>)</span><br><span class="line"></span><br><span class="line">pwd =  app_pwd_context.<span class="built_in">hash</span>(passwd)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(pwd)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 连接到数据库文件</span></span><br><span class="line">conn = sqlite3.connect(<span class="string">&#x27;data.db&#x27;</span>)  <span class="comment"># 建议先备份</span></span><br><span class="line">cursor = conn.cursor()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新表中的数据</span></span><br><span class="line">cursor.execute(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">    UPDATE user</span></span><br><span class="line"><span class="string">    SET password = ?</span></span><br><span class="line"><span class="string">    WHERE username = ?</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span>, (pwd, <span class="string">&#x27;admin&#x27;</span>))</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提交更改</span></span><br><span class="line">conn.commit()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭连接</span></span><br><span class="line">conn.close()</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">&quot;your password has been changed&quot;</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>强烈建议执行脚本之前建议先备份 <code>data.db</code>!</p><h2 id="结果">结果</h2><p><img src="../images/20231-01207-01/img-1.png" alt="upload successful" /></p><p>如此一来就能成功登录进管理界面了！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;关于-AutoBangumi&quot;&gt;关于 AutoBangumi&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../images/20231-01207-01/img-2.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http</summary>
      
    
    
    
    <category term="摸鱼日记" scheme="https://www.aweisite.top/categories/%E6%91%B8%E9%B1%BC%E6%97%A5%E8%AE%B0/"/>
    
    
    <category term="私人影视库" scheme="https://www.aweisite.top/tags/%E7%A7%81%E4%BA%BA%E5%BD%B1%E8%A7%86%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>Reasoning Implicit Sentiment with Chain-of-Thought Prompting</title>
    <link href="https://www.aweisite.top/posts/88df9069.html"/>
    <id>https://www.aweisite.top/posts/88df9069.html</id>
    <published>2023-11-30T10:51:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>用思想链提示推理隐式情感</h1><h2 id="摘要">摘要</h2><p>虽然情感分析系统试图根据输入文本中的关键观点表达来确定给定目标的情感极性，但在隐式情感分析(ISA)中，观点线索是以隐式和模糊的方式出现的。因此，检测隐式情感需要常识和多跳的推理能力来推断观点的潜在意图。受最近的思想链(CoT)思想的启发，在这项工作中，我们引入了三跳推理(THOR) CoT框架来模拟ISA的类人推理过程。我们设计了THOR的三步提示原则，一步一步地诱导出隐含的方面、观点，最后是情感极性。我们的THOR + Flan-T5 (11B)在有监督的情况下将最新的SoTA(state-of-the-art)推进了超过6 %的F1。更引人注目的是，THOR+GPT3(175B)在零样本下将SoTA提升了50 %以上的F1。我们的代码公开在  <a href="https://github.com/scofield7419/THOR-ISA">https://github.com/scofield7419/THOR-ISA</a> 。</p><h2 id="1-引言">1. 引言</h2><p>情感分析( SA )旨在根据输入文本检测对给定目标的情感极性。SA可以分为显式SA ( ESA )和隐式SA ( ISA )，其中前者是当前的主流任务，其情感表达显式地出现在文本( Pontiki et al , 2014)中。与ESA不同，ISA更具有挑战性，因为ISA中的输入只包含事实描述，而没有直接给出( Russo et al , 2015)的显式意见表达。例如，给定一个没有显著线索词的文本'Try the tandoori salmon! '，几乎所有现有的情感分类器都对'the tandoori salmon'预测中性极性。人类可以很容易地准确地判断文本的情感状态，因为我们总能把握文本背后的真实意图或观点。因此，如果不真正理解情绪是如何被唤起的，传统的SA方法对ISA是无效的。</p><p>事实上，首先发现隐藏的意见情境对于实现准确的ISA是至关重要的。对于图1中的显性案例# 1，它不容易捕捉到整体的情感图片(例如, &quot;环境&quot;是方面, &quot;伟大&quot;是意见)，因此可以精确地推断对给定目标酒店的正极性。受这种细粒度情感精神(薛峰、李晓萍, 2018 ;张杰等, 2021 ; Xu et al , 2020)的启发，我们考虑挖掘隐含的方面和观点状态。对于图1中的隐式情况#2，如果一个模型可以首先推断关键的情感成分，例如，潜在的方面&quot;味道&quot;，潜在的意见&quot;好的和值得尝试&quot;，那么最终极性的推断可以大大缓解。为了达到这个目标，常识推理(也就是说,推断什么是'tandoori salmon')和多跳推理(即,先推断出方面,然后再推断出意见)的能力是必不可少的。</p><p>幸运的是，最近预训练大规模语言模型( LLMs )的巨大成功提供了一个很有前途的解决方案。一方面，LLMs被发现携带着非常丰富的世界知识，表现出非凡的常识理解能力( Paranjape et al , 2021 ; Liu et al , 2022)。另一方面，最新的思维链( CoT )思想揭示了LMs的多跳推理( Wei et al . , 2022 ; Zhou et al , 2022 ;张杰等, 2023)的巨大潜力，其中带有一些提示的LLM可以出色地进行链式推理。在所有这些成功的基础上，本文实现了一个面向ISA的三跳推理CoT框架( THOR )。在LLM的基础上，我们设计了3个提示语进行3步推理，每个提示语分别推断1 )给定目标的细粒度方面，2 )对该方面的潜在观点，3 )最终的极性。通过这种由易到难的增量推理，可以一步一步地引出整体情感图片的隐藏上下文，从而更容易地实现最终极性的预测，有效地缓解了任务预测的困难。</p><p>为了保证每个推理步骤的正确性，我们考虑了一种基于Wang等人( 2022b )启发的CoT自一致性机制，即选择具有推断方面和观点的高投票一致性的候选答案(在每一步中)。对于有监督的微调设置，我们进一步提出了一种推理修正方法。我们使用中间推理答案作为模型输入来预测最终的标签，其中来自黄金标签的监督将教导LLM产生更正确的推理。在有监督的微调设置下，我们的基于Flan - T5的THOR在F1得分上将当前最好的基线提高了6 %以上，并且在零样本设置下，这种差距被进一步放大。最引人注目的是，我们基于GPT3的175B参数的THOR将基线提高到了F1得分的51.10 %。</p><p>综上所述，这项工作为隐式情感检测贡献了一种多跳推理解决方案，有助于实现对传统非推理方法的显著改进。据我们所知，这是将CoT思想成功扩展到情感分析领域的首次尝试。我们的方法简单而有效，可以广泛地应用到其他类似的NLP问题中，而无需付出太多的努力。</p><h2 id="2-Three-Hop推理框架">2. Three-Hop推理框架</h2><p>SA (无论是ESA还是ISA)的任务定义为：给定一个带有目标项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mo>⊂</mo><mi>X</mi></mrow><annotation encoding="application/x-tex">t \subset X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6542em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">t</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⊂</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的句子  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> ，模型确定对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> 的情感极性 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> ，即积极、中性或消极。我们使用带有提示的现成LLM来解决任务。对于标准的基于提示的方法，我们可以构造如下的提示模板作为LLM的输入：</p><p><code>给定句子X，对t的情感极性是什么?</code></p><p>LLM应通过<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>y</mi><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mi>y</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mi>f</mi></mrow><annotation encoding="application/x-tex">(y = argmaxp( y | X , t) )f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">t</span><span class="mclose">))</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span></span></span></span>返回答案。</p><h3 id="2-1-思维链提示">2.1 思维链提示</h3><p>现在考虑CoT式提示( Wei et al . , 2022 ; Fu et al , 2022)方法进行多步推理。在我们的THOR( cf.图2)中，我们并不是直接询问LLM关于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的最终结果，而是希望LLM在回答 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的最终结果之前推断潜在的方面和观点信息。这里我们定义了中间方面项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 和潜在意见表达 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi></mrow><annotation encoding="application/x-tex">o</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">o</span></span></span></span> 。我们构造three-hop提示如下。</p><p><strong>步骤1</strong>。我们首先询问LLM在下面的模板中提到了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span> 的哪些方面：</p><p><code>C1[给定的句子X]，t 的哪个具体方面可能被提及?</code></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">C_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 是第一个hop的提示上下文。这个步骤可以表述为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mi>a</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A=argmaxp( a | X , t)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> ，其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 是输出文本，明确提到了方面 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 。</p><p><strong>步骤2</strong>。现在基于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> ，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> ，我们要求LLM详细回答关于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 的潜在观点是什么：</p><p><code>C2[ C1 , A]。基于常识，对于t的上述方面，隐含的看法是什么，以及为什么?</code></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">C_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 是连接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">C_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span> 的第二个hop提示语境，这一步可以写成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mi>m</mi><mi>a</mi><mi>x</mi><mi>p</mi><mo stretchy="false">(</mo><mi>o</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo separator="true">,</mo><mi>t</mi><mo separator="true">,</mo><mi>a</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O = argmaxp( o | X , t , a)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">o</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">t</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">a</span><span class="mclose">)</span></span></span></span> ，其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi></mrow><annotation encoding="application/x-tex">O</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span></span></span></span> 是包含可能意见表达 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi></mrow><annotation encoding="application/x-tex">o</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">o</span></span></span></span> 的答案文本。</p><p><strong>步骤3</strong>。以完整的情感骨架( X , t , a和o)为上下文，最后请LLM推理出极性t的最终答案：</p><p><code>C3[ C2 , O]。基于这种观点，什么是对t的情感极性?</code></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">C_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为第三提示语境。记这一步为 ( y_\hat = argmaxp( y | X , t , a , o) ) 。</p><h2 id="2-通过自洽增强推理">2. 通过自洽增强推理</h2><p>我们进一步利用自洽机制( Wang et al. , 2022b ; Li et al., 2022b)来巩固推理的正确性。具体来说，对于3个推理步骤中的每一个步骤，我们设置LLM解码器来生成多个答案，每个答案都可能给出方面 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> 、观点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi></mrow><annotation encoding="application/x-tex">o</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">o</span></span></span></span> 和极性 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的不同预测。在每一步中，保留那些推断 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span> ，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>o</mi></mrow><annotation encoding="application/x-tex">o</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">o</span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的投票一致性高的答案。我们选择置信度最高的那个作为下一步的上下文。</p><h3 id="2-3-有监督的推理修正">2.3 有监督的推理修正</h3><p>我们还可以在按需训练集可用的情况下对THOR进行微调，即有监督的微调设置。我们设计了一种推理修正方法。技术上，在每个步骤中，我们通过连接 1)初始上下文，2)本步骤的推理答案文本和 3)最终问题来构建提示，并将其输入LLM来预测情感标签，而不是去进行下一步的推理。例如，在步骤-1的最后，我们可以组装一个提示：<code>[ C1 , A , &quot;对t的情感极性是什么? &quot;]</code>。在金标签的监督中，LLM会被教导产生更多正确的中间推理，有助于最终的预测。</p><p><img src="../images/20231130-01/img-0.png" alt="upload successful" />表1：有监督微调设置下的F1结果。最好的结果用粗体标出。表1中带&quot;的模型得分复制自Li et al. ( 2021 )。</p><h2 id="3-实验">3. 实验</h2><p><strong>设置</strong>  我们在基准的Sem Eval14 Laptop和Restaurant数据集( Pontiki et al , 2014)上进行实验，其中所有的实例都按照Li等( 2021 )的方法分为显式情感和隐式情感。由于编码器风格的BERT不能生成支持CoT的文本，我们使用编码器-解码器风格的FlanT52作为我们的主干LLM。我们还用GPT3 (布朗等, 2020)和ChatGPT ( Ouyang et al , 2022)进行了测试。我们使用了Flan - T5的四个版本：250M ( base )，780M ( large )，3B ( xl )和11B ( xxl )，以及GPT3的四个版本：350M，1.3B，6.7 B和175B。注意，GPT3没有发布模型参数，我们通过API以提示的方式使用。这也意味着我们无法用GPT3进行有监督的微调。我们与目前表现最好的基线进行了比较，包括：BERT + SPC ( Devlin et al , 2019)，BERT + ADA ( Rietzler et al , 2020)，BERT + RGAT ( Wang et al , 2020)，BERTAsp + CEPT ( Li et al , 2021)，BERT + ISAIV ( Wang et al , 2022a)和BERTAsp + SCAPT ( Li et al , 2021)。我们同时考虑有监督的微调和零样本设置。我们采用F1作为评价指标。在小样本设置下，我们通过它们的源代码重新实现了基线。我们的实验在4块NVIDIA A100 GPU上进行。</p><p><img src="../images/20231130-01/img-1.png" alt="upload successful" />表2：零样本学习设定的模型结果。我们重新实现了零样本性能的最先进的基线。&quot; ZeroCoT '表示用零样本学习CoT提示LLM，'让我们一步一步思考' (Brown 等, 2020)。</p><p><strong>有监督的Fine-Tuning结果</strong>  比较结果见表1。有趣的是，快速学习的BERT性能低于SoTA基线BERTAsp+SCAPT，即使是双参数的Flan-T5-base(250M)也未能战胜SoTA。BERTAsp + SCAPT在大规模情感方面感知标注数据上进行预训练，在SA上表现出较强的能力。但在我们的THORCoT提示下，Flan-T5-base明显优于SoTA。进一步，当使用较大的LLM，即11B参数时，我们可以发现基于香草提示的FlanT5超过了最佳基线。更值得注意的是，Flan-T5-11B搭配THOR对ISA有显著提升，Restaurant上提升7.45%(=79.73~72.28)，Laptop上提升5.84%(=82.43~77.59)，平均提升6.65%(7.45+5.84)/2 F1。此外，自我一致性和推理修正机制的消融也表明了它们在THOR方法中的重要性。</p><p><strong>零样本推理的结果</strong> 在表2中，我们比较了零样本的表现。我们可以发现，与当前的SoTA基线相比，基于提示和基于CoT的方法的改进都显著增加。但总的来说，基于CoT的方法和我们的THOR在ISA上显示出更显著的改进。例如，我们的Flan-T5-11B THOR系统在两个数据集上比性能最好的基线(BERTAsp+SCAPT)的F1值平均提高了30 %以上。最引人注目的是，当THOR装备于超大型LLM，即GPT3-175B时，我们可以观察到令人印象深刻的改善，接近Flan-T5-11B THOR在监督环境下的水平，如表1所示。具体而言，在Restaurant和Laptop上分别提升了51.94%(=81.96~30.02 )和50.27%(=76.04~25.77 )的SoTA结果，平均51.10%(51.94+50.27)/2个F1跳跃。</p><p><strong>不同模型尺寸对Llms的影响</strong> 在表1和表2中，我们看到了使用(非常)大LLM的功效。在图3中，我们研究了不同LLM尺度的影响。我们看到，随着模型规模的增大，我们的多跳推理提示的功效呈指数级放大。这与已有的CoT提示方法( Wei et al . , 2022 ; Zhou et al , 2022 ; Fu et al , 2022)的发现非常吻合，即LM越大，CoT的改善效果越显著。因为当LLM足够大时，常识推理和多跳推理的能力得到了极大的发展和加强。</p><p><strong>用Thor改进Chatgpt</strong> ChatGPT的最新诞生带来了NLP和AI社区的革命性进步。在这里，我们比较了我们的THOR on GPT3 (175B)和ChatGPT的改进。图4给出了100个测试实例的测试结果。我们可以看到，两种LM在ESA上都表现出了非常高的性能，而THOR的增强效果非常有限。但是，基于提示的GPT3和ChatGPT在ISA上仍然失败很多，而我们的THOR在ISA上有了很大的改进。</p><p><img src="../images/20231130-01/img-2.png" alt="upload successful" /></p><p>图3：Llm标度的影响。图4：Gpt3和Chatgpt在随机选取的50个Esa和50个ISA实例上的比较。</p><p><img src="../images/20231130-01/img-3.png" alt="upload successful" />图5：误差分析。</p><p><strong>故障分析</strong> 在图5中，我们展示了使用THOR时失败案例的错误率，其中我们总结了三种错误类型。Flan-T5-11B LLM在零样本下的错误率为48.27 %，而在有监督微调下的错误率为12.79 %。无监督的GPT3 (175B)与有监督的T5具有相似的低错误率，而有监督的T5由于无法推理而失败的次数较多。与Supervised-T5相比，无监督GPT3的大部分错误来自于有问题的数据标注。由于Supervised-T5对&quot;假&quot;标签的监督进行了微调，因此它实际上可以学习到虚假的相关性，但具有更高的测试精度。</p><h2 id="4-相关工作">4. 相关工作</h2><p>情感分析长期以来一直是NLP社区( Pang和Lee , 2007 ; Dong et al . , 2014 ;施炳展等, 2022)的研究热点。虽然显式SA模型可以轻松地根据意见表达进行预测，但是由于隐式意见特征( Li et al , 2021 ; Wang et al , 2022a)的存在，使得隐式SA变得更加棘手。和在现实场景中，ISA往往更为普遍。尽管已经对ISA ( Li et al , 2021 ; Wang et al , 2022a)做出了努力，但现有的工作仍然可以局限于传统的推理范式。如前所述，ISA应该通过推理来解决，即常识和多跳推理。因此，本工作遵循这种直觉，以多跳推理机制解决ISA为目标。</p><p>作为SA的一个关键分支，细粒度SA已经得到了很好的探索( Wang et al. , 2017; Li et al, 201, 2022a)。细粒度情感分析的思想是将情感分析分解成若干个关键的情感要素，包括目标、方面、观点和情感极性，它们在细节( Peng et al. , 2020;Fei 等, 2022)上共同构成完整的情感图。这项工作吸取了同样的细粒度SA的精神。我们认为隐式情感的推理应该是一个渐进的过程，一步一步地推断出情感元素，最终以由易到难的方式理解情感极性。</p><p>语言模型预训练在增强下游应用(Raffel et al, 2020)的实用性方面受到了越来越多的研究关注。最近，大规模语言模型(LLMs)在人类智能方面表现出了巨大的潜力，例如ChatGPT (Ouyang et al, 2022)。LLMs已被广泛证明在常识理解(Paranjape et al, 2021;Liu et al,2022)和多跳推理(Wei et al.,2022;Zhou et al, 2022)上表现出非凡的能力。本文基于最新提出的思想链( CoT )思想，实现了基于LMs的隐式情感推理。CoT提示是一种无梯度的技术，它诱导大的LM产生中间推理步骤，从而得出最终的答案。Wei等人( 2022 )正式研究了语言模型中的CoT提示，他们诱导LM产生一系列连贯的中间推理步骤，这些步骤直接指向原始问题的最终答案。</p><h2 id="5-结论">5. 结论</h2><p>在本文中，我们提出了一个three-hop推理提示框架来实现隐式情感分析的思维链推理过程。基于现有的LLM，我们设计了三个提示进行三个步骤的推理，每个步骤分别推断细粒度方面、潜在观点和最终极性。在ISA数据集上，配备我们THOR的不同LLM在有监督和零样本设置上都表现出了比现有最好的基线更好的性能。我们表明，LLMs越大，我们的THOR方法的改进越显著。</p><h2 id="局限性">局限性</h2><p>THOR只有在集成到足够大的模型中时才有助于释放LLMs的全部能量，而在中等或较小尺寸的LLMs上，由于LLMs的涌现性，THOR的提升会受到一定程度的限制。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;用思想链提示推理隐式情感&lt;/h1&gt;
&lt;h2 id=&quot;摘要&quot;&gt;摘要&lt;/h2&gt;
&lt;p&gt;虽然情感分析系统试图根据输入文本中的关键观点表达来确定给定目标的情感极性，但在隐式情感分析(ISA)中，观点线索是以隐式和模糊的方式出现的。因此，检测隐式情感需要常识和多跳的推理能力来推断观</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>Parameter-Efficient Transfer Learning for NLP</title>
    <link href="https://www.aweisite.top/posts/798b9f4.html"/>
    <id>https://www.aweisite.top/posts/798b9f4.html</id>
    <published>2023-11-29T17:30:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>面向Nlp的参数高效迁移学习</h1><p>原始论文：《Parameter-Efficient Transfer Learning for NLP》<a href="http://arxiv.org/abs/1902.00751">http://arxiv.org/abs/1902.00751</a></p><h2 id="摘要">摘要</h2><p>微调大型预训练模型是NLP中一种有效的迁移机制。然而，在存在许多下游任务的情况下，微调是参数无效的：每个任务都需要一个全新的模型。作为替代，我们提出了带有适配器模块的传输。适配器模块产生一个紧凑且可扩展的模型；它们每个任务只添加少量可训练的参数，并且可以在不重访以前的任务的情况下添加新的任务。原始网络的参数保持固定，产生高度的参数共享。为了证明适配器的有效性，我们将最近提出的BERT Transformer模型迁移到26个不同的文本分类任务中，包括GLUE基准测试。适配器获得接近最先进的性能，同时每个任务只增加几个参数。在GLUE上，我们实现了0.4%以内的全微调性能，每个任务仅增加3.6%的参数。相比之下，微调训练每个任务100%的参数。</p><h2 id="1-引言">1. 引言</h2><p>从预训练的模型中迁移在许多NLP任务( Dai &amp; Le , 2015 ; Howard &amp; Ruder , 2018 ;雷德福et al , 2018)上都有很强的性能。BERT是一个在无监督损失的大型文本语料上训练的Transformer网络，在文本分类和抽取式问答( Devlin等, 2018)上取得了先进的性能。在本文中我们处理在线设置，其中任务到达一个流。目标是构建一个在所有任务上都表现良好的系统，但不为每个新任务训练一个全新的模型。</p><p>在本文中我们处理在线设置，其中任务到达一个流。目标是构建一个在所有任务上都表现良好的系统，但不为每个新任务训练一个全新的模型。任务之间的高度共享对于诸如云服务之类的应用特别有用，这些应用需要训练模型来解决许多按顺序从客户到达的任务。为此，我们提出了一种迁移学习策略，以产生紧凑且可扩展的下游模型。紧凑型模型是指在每个任务中使用少量的额外参数来解决许多任务的模型。可扩展模型可以通过增量训练来解决新的任务，而不会遗忘先前的任务。我们的方法在不牺牲性能的情况下产生这样的模型。</p><p><img src="../images/20231127-01/img-14.png" alt="upload successful" /></p><p>NLP中最常见的两种迁移学习技术是基于特征的迁移和微调。相反，我们提出了一种基于适配器模块(雷布菲等, 2017)的替代传输方法。基于特征的迁移涉及到预训练的实值嵌入向量。这些嵌入可能是词(米科洛夫等, 2013)、句( Cer et al , 2019)，也可能是段落层面的( Le &amp; Mikolov , 2014)。然后将这些嵌入信息传递给自定义的下游模型。微调包括从预训练的网络中复制权重，并在下游任务上进行微调。最近的工作表明，微调往往比基于特征的迁移(霍华德&amp;鲁德, 2018)具有更好的性能。</p><p>基于特征的迁移和微调都需要为每个任务设置新的权重。如果网络的下层在任务之间共享，则微调更有效。然而，我们提出的适配器调优方法更具有参数效率。图1展示了这种权衡。x轴表示每个任务训练的参数个数；这对应于解决每一个额外任务所需的模型规模的边际增加。基于适配器的调优需要训练少两个数量级的参数进行微调，同时获得相似的性能。</p><p>适配器是在预训练网络的层与层之间添加的新模块。基于适配器的调优与基于特征的迁移和微调的方式不同。考虑一个参数为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span>的函数(神经网络)：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ϕ</mi><mi>w</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\phi_w(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> 。基于特征的迁移将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mi>h</mi><msub><mi>i</mi><mi>w</mi></msub></mrow><annotation encoding="application/x-tex">phi_w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">h</span><span class="mord"><span class="mord mathnormal">i</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和一个新的函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>χ</mi><mi>v</mi></msub></mrow><annotation encoding="application/x-tex">χ_v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">χ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>结合起来，得到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>χ</mi><mi>v</mi></msub><mo stretchy="false">(</mo><msub><mi>ϕ</mi><mi>w</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">χ_v(\phi_w(x))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">χ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">))</span></span></span></span> 。然后只训练新的Taskspecific参数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 。微调包括调整每个新任务的原始参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span>，以限制紧凑性。对于适配器调优，定义了一个新的函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ψ</mi><mi>w</mi></msub><mtext>，</mtext><mi>v</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\psi_w，v ( x )</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> ，其中参数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 是从预训练中复制过来的。设置初始参数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">v_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，使新函数与原函数相似：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ψ</mi><mi>w</mi></msub><mtext>，</mtext><msub><mi>v</mi><mn>0</mn></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>≈</mo><msub><mi>ϕ</mi><mi>w</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\psi_w，v_0(x)≈\phi_w(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">ψ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal">ϕ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em;">w</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span> 。在训练过程中，只对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 进行调整。对于深度网络，定义<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ψ</mi><mi>w</mi><mtext>，</mtext><mi>v</mi></mrow><annotation encoding="application/x-tex">\psi w，v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">ψ</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord cjk_fallback">，</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 通常需要在原始网络中增加新的层，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ϕ</mi><mi>w</mi></mrow><annotation encoding="application/x-tex">\phi w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">ϕw</span></span></span></span>。如果选择 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∣</mi><mi>v</mi><mi mathvariant="normal">∣</mi><mo>≪</mo><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">|v| \ll |w|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mord">∣</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≪</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord">∣</span></span></span></span> ，则对于许多任务，所得到的模型要求 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∣</mi><mi>w</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">|w|</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord">∣</span></span></span></span> 参数。由于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span></span></span></span> 是固定的，因此模型可以扩展到新的任务而不影响以前的任务。</p><p>基于适配器的调节涉及多任务和持续学习。多任务学习也会产生紧凑的模型。然而，多任务学习需要同时访问所有任务，而基于适配器的调优则不需要。持续学习系统旨在从层出不穷的任务中学习。这种范式具有挑战性，因为网络在重新训练( McCloskey&amp; Cohen , 1989 ; French , 1999)后忘记了先前的任务。适配器的不同之处在于任务不交互，共享参数被冻结。这意味着模型使用少量的任务特定参数对先前任务进行完美记忆。</p><p>我们在一组大型且多样化的文本分类任务上演示了适配器对NLP进行参数高效调优。关键创新点在于设计了有效的适配器模块及其与基础模型的集成。我们提出了一个简单而有效的瓶颈体系结构。在GLUE基准上，我们的策略几乎匹配了完全微调的BERT的性能，但只使用了3%的任务特定参数，而微调使用了100%的任务特定参数。我们在另外17个公开的文本数据集和SQuAD抽取式问答上观察到类似的结果。总之，基于适配器的调优产生了一个单一的、可扩展的模型，在文本分类中达到了接近最先进的性能。</p><h2 id="2-针对NLP的适配器调优">2. 针对NLP的适配器调优</h2><p>我们提出了一种在多个下游任务上调优大型文本模型的策略。我们的策略有三个关键特性：(i)它获得了良好的性能；(ii)它允许对任务进行顺序训练，即它不需要同时访问所有的数据集；(iii)它只在每个任务中添加少量的额外参数。这些特性在云服务的背景下特别有用，其中许多模型需要在一系列下游任务上进行训练，因此高度共享是可取的。</p><p>为了实现这些特性，我们提出了一个新的瓶颈适配器模块。使用适配器模块进行调优需要在模型中添加少量新参数，这些参数在下游任务(雷布菲等, 2017)上进行训练。在对深度网络进行初始微调时，对网络的顶层进行了修改。这是因为上下游任务的标签空间和损失是不同的。适配器模块执行更一般的架构修改，以便为下游任务重新使用预训练的网络。特别地，适配器调优策略涉及向原始网络中注入新的层。原始网络的权值是不接触的，而新的适配器层是随机初始化的。在标准微调中，新的顶层和原始权重共同训练。相反，在适配器调整中，原始网络的参数被冻结，因此可能被许多任务共享。</p><p>适配器模块主要有两个特点：少量的参数和一个拟恒等的初始化。与原有网络的各层相比，适配器模块需要更小。这意味着当增加更多的任务时，模型的总规模增长相对缓慢。为了适应模型的稳定训练，需要一个拟恒等初始化；我们在3.6节中对此进行了实证研究。通过将适配器初始化为拟恒等函数，原始网络在训练开始时不受影响。在训练过程中，适配器可能会被激活，从而改变激活在整个网络中的分布。如果不需要，适配器模块也可能被忽略；在3.6节中，我们观察到一些适配器对网络的影响大于其他适配器。我们还观察到，如果初始化偏离恒等函数太远，模型可能无法训练。</p><h2 id="2-1-变压器网络实例化">2.1 变压器网络实例化</h2><p>我们实例化了基于适配器的文本转换器调优。这些模型在许多NLP任务中取得了先进的性能，包括翻译、抽取式问答和文本分类问题( Vaswani et al , 2017 ;Devlin et al , 2018 ; Devlin et al , 2018)。我们考虑Vaswani等( 2017 )提出的标准Transformer结构。</p><p><img src="../images/20231127-01/img-16.png" alt="upload successful" /></p><p>适配器模块提供了许多架构选择。我们提供了一个简单的设计，获得了良好的性能。我们对一些更复杂的设计进行了实验，见3.6节，但我们发现在许多数据集上，以下策略与我们测试的任何其他策略一样。</p><p>图2展示了我们的适配器架构，以及它在Transformer上的应用。Transformer的每一层包含两个主要的子层：注意力层和前馈层。这两层后面紧接着一个投影，将特征大小映射回层输入的大小。在每个子层之间应用跳跃连接。每个子层的输出被送入层归一化。我们在每个子层之后插入两个串行适配器。适配器总是直接应用于子层的输出，在投影后回到输入大小，但在加入跳过连接之前回来。然后将适配器的输出直接传入下一层归一化。</p><p>为了限制参数的数量，我们提出了瓶颈架构。适配器首先将原始的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 维特征投影到一个更小的维度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> ，施加一个非线性，然后再投影回 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span> 维。每层增加的参数总数，包括偏差，为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>m</mi><mi>d</mi><mo>+</mo><mi>d</mi><mo>+</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">2md + d + m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span>。通过设置<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>d</mi></mrow><annotation encoding="application/x-tex">m d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">m</span><span class="mord mathnormal">d</span></span></span></span> ，我们限制了每个任务添加的参数数量；在实际操作中，我们使用了原模型参数的0.5-8%左右。瓶颈维度 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 提供了一种简单的方法来权衡性能和参数效率。适配器模块本身内部存在跳接。通过跳跃连接，如果投影层的参数初始化为近零，则模块初始化为近似恒等函数。</p><p>除了适配器模块中的层外，我们还在每个任务中训练新的层标准化参数。该技术类似于条件批归一化( De Vries et al , 2017)、FiLM (Perez等, 2018)和自调制( Chen et al. , 2019)，同样可以实现网络的参数有效自适应；每层只有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>d</mi></mrow><annotation encoding="application/x-tex">2d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">2</span><span class="mord mathnormal">d</span></span></span></span> 个参数。然而，仅训练层归一化参数不足以获得良好的性能，见3.4节。</p><h2 id="3-实验">3. 实验</h2><p>我们展示出了适配器实现文本任务的参数高效传递。在GLUE基准(Wang et al. , 2018)上，适配器调优在BERT完全微调的0.4%以内，但仅增加了微调训练参数数量的3%。我们在进一步的17个公开分类任务和SQuAD问题回答上证实了这一结果。分析表明，基于适配器的调优自动聚焦于网络的高层。</p><h3 id="3-1-实验设置">3.1 实验设置</h3><p>我们使用公开的、预训练的BERT Transformer网络作为我们的基础模型。为了使用BERT进行分类，我们遵循Devlin et al . ( 2018 )的方法。每个序列中的第一个标记是一个特殊的&quot;分类标记&quot;。我们在这个令牌的嵌入上附加一个线性层来预测类标签。</p><p>我们的训练过程也遵循Devlin et al( 2018 )。我们使用Adam ( Kingma &amp; Ba , 2014)进行优化，其学习速率在前10%的步骤中线性增加，然后线性衰减到零。所有运行均在4个批处理大小为32的Google Cloud TPU上训练。对于每个数据集和算法，我们运行一个超参数扫描，根据验证集上的准确率选择最佳模型。对于GLUE任务，我们报告了提交网站提供的测试指标。对于其他分类任务，我们报告了测试集准确率。</p><p>我们与目前大型预训练模型迁移的标准--微调--以及BERT成功使用的策略进行了比较。对于N个任务，完全微调需要N×预训练模型的参数个数。我们的目标是达到等同于微调的性能，但总参数较少，理想情况下接近于1×。</p><h3 id="3-2-GLUE基准">3.2 GLUE基准</h3><p>我们首先在GLUE上进行评估。对于这些数据集，我们从预先训练好的BERTLARGE模型转移而来，该模型包含24层，共330M个参数，详见Devlin et al ( 2018 )。我们执行一个小的超参数扫描来调整适配器：我们扫描{ $3·10^{-5}，3·10^{-4}，3·10^{-3} $}中的学习率和{ 3，20 }中的历元数。我们使用固定的适配器大小(瓶颈中的单元数量)进行测试，并从{ 8，64，256 }中选择每个任务的最佳大小。适配器大小是我们唯一调整的适配器特定的超参数。最后，由于训练不稳定，我们使用不同的随机种子重新运行5次，在验证集上选择最佳模型。</p><p>表1总结了结果。适配器实现了80.0的平均GLUE评分，而完全微调实现了80.4。每个数据集的最佳适配器大小不同。例如，MNLI选择256，而对于最小的数据集，选择RTE，8。始终限制为64，导致平均准确率小幅下降到79.6。为了求解表1中的所有数据集，微调需要BERT参数总数的9倍。相比之下，适配器只需要1.3倍的参数。</p><h3 id="3-3-额外的分类任务">3.3 额外的分类任务</h3><p>为了进一步验证适配器产生紧凑的、性能良好的模型，我们在额外的、公开的文本分类任务上进行测试。该套件包含多样化的任务集：训练样本数量从900到330k不等，类数量从2到157不等，平均文本长度从57到1.9 k个字符不等。所有数据集的统计和参考文献见附录。</p><p>对于这些数据集，我们使用了32的批处理大小。数据集具有多样性，因此我们扫描了广泛的学习率范围：{ $ 1·10^{-5}，3·10^{-5}，1·10^{-4}，3·10^^{-3}$  }。由于数据集较多，我们从验证集学习曲线的检验中，手动从集合{ 20，50，100 }中选择训练历元数。我们为微调和适配器都选择了最优值；具体数值见附录。</p><p>我们在{ 2，4，8，16，32，64 }中测试适配器的大小。由于部分数据集较小，对整个网络进行微调可能是次优的。因此，我们运行一个额外的基准：变量微调。为此，我们只微调顶层的n层，并冻结其余层。我们扫描n∈{ 1，2，3，5，7，9，11，12 } .在这些实验中，我们使用了12层的BERTBASE模型，因此，当n = 12时，变量微调包含了完全微调。</p><p>与GLUE任务不同的是，这类任务没有全面的最先进的数字集。因此，为了确认我们的基于BERT的模型是有竞争力的，我们收集了自己的基准性能。为此，我们在标准网络拓扑上运行大规模超参数搜索。具体来说，我们运行了与Zoph &amp; Le ( 2017 )类似的单任务Neural AutoML算法；Wong等( 2018 )。该算法在前馈和卷积网络的空间上搜索，堆叠在通过TensorFlow Hub公开可用的预训练文本嵌入模块上。来自TensorFlow Hub模块的嵌入可以被冻结或微调。全文的搜索空间在附录中进行了说明。对于每个任务，我们在CPU上运行AutoML一周，使用30台机器。在这段时间里，算法平均每个任务探索超过10k个模型。我们根据验证集准确率为每个任务选择最佳的最终模型。</p><p>表2报告了AutoML基准(&quot;无BERT基线&quot;)、微调、变量微调和适配器微调的结果。AutoML基线表明BERT模型是有竞争力的。这个基线探索了成千上万个模型，但BERT模型的平均表现更好。我们看到了与GLUE类似的结果模式。适配器调整性能接近全微调(落后0.4% )。微调需要17×BERTBASE的参数数量才能解决所有任务。变量微调的表现略好于微调，而训练层数更少。变量微调的最优设置使得每个任务平均训练52%的网络，总共减少为9.9×个参数。然而，适配器提供了一个更紧凑的模型。他们在每个任务中引入1.14%的新参数，导致所有17个任务的1.19 ×参数。</p><h3 id="3-4-参数-性能权衡">3.4 参数/性能权衡</h3><p>适配器的大小控制着参数效率，较小的适配器引入较少的参数，以可能的代价换取性能。为了探索这种权衡，我们考虑了不同的适配器尺寸，并与两种基线进行了比较：(i)仅对BERTBASE的前k层进行微调。(ii)仅对层归一化参数进行微调。学习率采用3.2节给出的范围进行调节。</p><p><img src="../images/20231127-01/img-17.png" alt="upload successful" /></p><p><img src="../images/20231127-01/img-18.png" alt="upload successful" /></p><p>图3显示了每个套件( GLUE和&quot;附加&quot;)中所有分类任务的参数/性能权衡。在GLUE上，当微调层数较少时，性能急剧下降。一些额外的任务受益于更少的训练层数，因此微调的性能衰减更少。在这两种情况下，适配器在小于微调两个数量级的尺寸范围内都具有良好的性能。</p><p>图4展示了MNLIm和CoLA两个GLUE任务的更多细节。对于所有的k &gt; 2，调整顶层训练更多的任务特定参数。当使用相当数量的任务特定参数进行微调时，与适配器相比，性能大幅下降。例如，仅对顶层进行微调就可以获得约9M的可训练参数和77.8 % ± 0.1 %的MNLIm验证精度。相比之下，尺寸为64的适配器调优产生了大约2M的可训练参数和83.7 % ± 0.1 %的验证精度。作为对比，全微调在MNLIm上达到84.4 % ± 0.02 %。我们在Co LA上也观察到类似的趋势。</p><p>作为进一步的比较，我们单独调整层归一化的参数。这些层只包含逐点加法和乘法，因此引入了很少的可训练参数：40k for BERTBASE。然而，该策略表现不佳：在CoLA上性能下降约3.5 %，在MNLI上性能下降约4 %。</p><p>总而言之，适配器调优是高参数效率的，并且产生了一个紧凑的模型，具有强大的性能，可与完全微调相媲美。训练尺寸为原始模型的0.5 - 5 %的适配器，性能在BERTLARGE上公开的竞争结果的1 %以内。</p><p><img src="../images/20231127-01/img-19.png" alt="upload successful" />图3. 准确性与训练参数的数量，跨任务聚合。我们比较了不同大小的适配器(橙色)和微调前n层，对于不同的n (蓝色)。线条和阴影区域表示跨任务的第20、50和80百分位数。针对每一个任务和算法，为曲线上的每一个点选择最佳模型。对于GLUE，报告了验证集准确率。对于额外的任务，我们报告了测试集的准确率。为了消除评分中的任务内差异，我们通过减去在相应任务上的完全微调的性能来归一化每个模型和任务的评分。</p><p><img src="../images/20231127-01/img-20.png" alt="upload successful" /></p><p>图4. 三种方法的验证集精度与训练参数数量的关系：(i)适配器调优，其中n = 0 ..，适配器大小为2n。9 (橙色)。(ii)对k = 1的前k层进行微调.. 12 (蓝色)。(iii)仅调整图层归一化参数(绿色)。误差条表示三个随机种子的± 1 s.e.m 。</p><h3 id="3-5-小队抽取式问答">3.5 小队抽取式问答</h3><p>最后，我们通过在SQuAD v1.1 ( Rajpurkar et al , 2018)上运行，确认适配器工作在分类以外的任务上。给定一个问题和维基百科段落，该任务要求从该段落中选择问题的答案跨度。图5展示了微调和适配器在SQuAD验证集上的参数/性能权衡。对于微调，我们扫描了{ $3·10 ^{-5}，5·10^{-5}，1·10^{-4} $ }中的训练层数，学习率和{ 2，3，5 }中的迭代次数。对于适配器，我们在{ <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn><mo separator="true">⋅</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>5</mn></mrow></msup><mtext>，</mtext><mn>1</mn><mo separator="true">⋅</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>4</mn></mrow></msup><mtext>，</mtext><mn>3</mn><mo separator="true">⋅</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>4</mn></mrow></msup><mtext>，</mtext><mn>1</mn><mo separator="true">⋅</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>3</mn></mrow></msup></mrow><annotation encoding="application/x-tex">3·10^{-5}，1·10^{-4}，3·10^{-4}，1·10^{-3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">3</span><span class="mpunct">⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">5</span></span></span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord">1</span><span class="mpunct">⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">4</span></span></span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord">3</span><span class="mpunct">⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">4</span></span></span></span></span></span></span></span></span><span class="mord cjk_fallback">，</span><span class="mord">1</span><span class="mpunct">⋅</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">3</span></span></span></span></span></span></span></span></span></span></span></span> }中扫描适配器大小，学习率，以及{ 3，10，20 }中的历元个数。在分类方面，适配器获得了与完全微调相当的性能，同时训练了更少的参数。尺寸为64的适配器(2 %的参数)达到了90.4 %的最佳F1，而微调达到了90.7。SQuAD即使在非常小的适配器下也表现良好，大小为2 (0.1%参数)的适配器的F1达到了89.9。</p><h3 id="3-6-分析与讨论">3.6 分析与讨论</h3><p>我们执行消融来确定哪些适配器是有影响力的。为此，我们删除了一些训练好的适配器，并在验证集上重新评估模型(不需要重新训练)。图6显示了从所有连续层跨中移除适配器时性能的变化。实验在MNLI和CoLA上的适配器大小为64的BERTBASE上进行。</p><p>首先，我们观察到移除任何单层的适配器对性能的影响很小。热图对角线上的元素显示了从单层移除适配器的性能，其中最大性能下降为2 %。相比之下，当所有适配器从网络中移除时，性能大幅下降：在MNLI上达到37 %，在预测多数类所获得的CoLA-score上达到69%。这表明虽然每个适配器对整体网络的影响较小，但整体效应较大。</p><p><img src="../images/20231127-01/img-21.png" alt="upload successful" />图5. 验证SQuAD v1.1的准确性与训练参数的数量。使用最佳超参数，误差条表示跨越三个种子的s.e.m.</p><p>其次，图6表明低层的适配器比高层的适配器具有更小的影响。从MNLI的0-4层移除适配器对性能几乎没有影响。这表明适配器性能良好，因为它们自动优先处理较高的层。事实上，聚焦上层是微调( Howard &amp; Ruder , 2018)的流行策略。一种直觉是，低层提取任务间共享的低层特征，而高层构建不同任务所特有的特征。这与我们的观察有关，对于某些任务，只有顶层的微调优于完全微调，见表2。</p><p>接下来，我们研究了适配器模块对神经元数量和初始化规模的鲁棒性。在我们的主要实验中，适配器模块中的权重来自一个标准差为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>10</mn><mrow><mo>−</mo><mn>2</mn></mrow></msup></mrow><annotation encoding="application/x-tex">10^{-2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span>的零均值高斯，截断为两个标准差。为了分析初始化规模对性能的影响，我们在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>7</mn></mrow></msup><mo separator="true">,</mo><mn>1</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[10^{-7},1]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">7</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mclose">]</span></span></span></span> 区间内进行标准差检验。图6总结了结果。我们观察到，在两个数据集上，适配器的性能对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>10</mn><mrow><mo>−</mo><mn>2</mn></mrow></msup></mrow><annotation encoding="application/x-tex">10^{-2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span>以下的标准差都是稳健的。然而，当初始化太大时，性能下降，在CoLA上表现得更明显。</p><p>为了考察适配器对神经元数量的鲁棒性，我们重新审视了3.2节的实验数据。我们发现跨适配器大小的模型质量是稳定的，并且在所有任务中使用固定的适配器大小对性能的损害很小。通过选择最优的学习率和迭代次数，我们计算了在八个分类任务中的平均验证精度。对于适配器尺寸为8、64和256，平均验证精度分别为86.2%、85.8 %和85.7 %。图4和图5进一步证实了这一点，它们在几个数量级上都表现出稳定的性能。</p><p>最后，我们尝试了一些对适配器架构的扩展，并没有带来性能上的显著提升。为完整起见，我们将其记录在案。我们进行了以下实验：(i)在适配器中添加批/层归一化，(ii)增加每个适配器的层数，(iii)不同的激活函数，如tanh，(iv)只在注意力层内插入适配器，(v)添加与主层平行的适配器，并且可能具有乘法交互。在所有情况下，我们观察到产生的性能与2.1节中提出的瓶颈相似。因此，由于其简单性和强大的性能，我们推荐原始的适配器架构。</p><h2 id="4-相关工作">4. 相关工作</h2><p><strong>预训练的文本表示</strong> 预训练的文本表示被广泛用于提高NLP任务的性能。这些表示在大型语料库(通常是无监督的)上进行训练，并作为特征输入到下游模型。在深度网络中，这些特征也可能在下游任务上进行微调。基于分布信息训练的布朗簇是预训练表示( Brown et al , 1992)的经典例子。Turian等人( 2010 )的研究表明，预训练的词嵌入比从零开始训练的词嵌入效果更好。自深度学习流行以来，词嵌入得到了广泛的应用，出现了许多训练策略( Mikolov et al . , 2013 ;Pennington et al . , 2014 ;Bojanowski et al . , 2017)。更长的文本、句子和段落的嵌入也被开发出来( Le &amp; Mikolov , 2014 ; Kiros et al , 2015 ;科诺et al , 2017 ; Cer et al , 2019)。</p><p>为了在这些表示中编码上下文，从序列模型的内部表示中提取特征，如ELMo (彼得斯等, 2018)中使用的MT系统( McCann等, 2017)和Bi LSTM语言模型。与适配器一样，ELMo利用预训练网络顶层以外的层。然而，这种策略只从内层读取。相反，适配器写入内层，通过整个网络重新配置对特征的处理。</p><p><strong>微调</strong> 微调整个预训练模型已经成为一种流行的特征替代方法。在NLP中，上游模型通常是神经语言模型( Bengio et al , 2003)。通过对Transformer网络( Vaswani et al , 2017)和隐形语言模型损失( Devlin等, 2018)进行微调，在问答( Rajpurkar等, 2016)和文本分类( Wang et al . , 2018)上取得了最新的研究成果。抛开性能不谈，微调的一个优点是不需要任务特定的模型设计，不像基于表征的迁移。然而，初始精调确实需要为每一个新的任务设置一组新的网络权重。</p><p><img src="../images/20231127-01/img-22.png" alt="upload successful" />图6.  左，中心：从连续层跨中烧蚀训练好的适配器。热图显示了验证精度相对于充分训练的适应模型的相对下降。y和x轴分别表示第一层和最后一层消融(包括在内)。在绿色中突出的对角线细胞表明单层适配器的消融。右上角的单元格表示所有适配器的消融。下三角形中的细胞是没有意义的，并且设置为0 %，相对性能最好。正确：使用不同初始权重大小的适配器的BERTBASE的性能。x轴是初始化分布的标准差。</p><p><strong>多任务学习</strong> 多任务学习( MTL )是同时对任务进行训练。早期的工作表明，在任务间共享网络参数利用了任务的规律性，产生了改进的性能(Caruana、1997)。作者在网络的低层共享权重，并使用专门的高层。许多NLP系统已经开发了MTL。例如：文本处理系统(词性,组块,命名实体识别等。) (Collobert&amp; Weston , 2008)、多语言模型( Huang et al . , 2013)、语义解析( Peng et al , 2017)、机器翻译(Johnson等, 2017)、问答( Choi et al , 2017)等。MTL产生一个单一的模型来解决所有问题。然而，与我们的适配器不同，MTL需要在训练过程中同时访问任务。</p><p><strong>持续学习</strong> 作为同时训练、持续学习或终身学习的替代方法，学习旨在从一系列任务( Thrun , 1998)中学习。然而，当重新训练时，深度网络往往会忘记如何执行先前的任务；一个挑战被称为灾难性遗忘(McCloskey &amp; Cohen , 1989 ;French, 1999)。已经提出了一些技术来减轻(Kirkpatrick et al , 2017 ; Zenke et al , 2017)的遗忘，然而，与适配器不同的是，存储器是不完善的。渐进网络通过为每个任务(Rusu 等, 2016)实例化一个新的网络&quot;列&quot;来避免遗忘。然而，参数的数量随着任务数量的增加而线性增长，因为适配器非常小，所以我们的模型具有更好的可扩展性。</p><p><strong>视觉中的迁移学习</strong> 在构建图像识别模型( Yosinski et al , 2014 ; Huh等, 2016)时，在ImageNet ( Deng et al , 2009)上预训练的微调模型无处不在。该技术在许多视觉任务上获得了最先进的性能，包括分类(Kornblith等, 2018)，细粒度分类(Hermans 等, 2017)，分割( Long 等 , 2015)和检测( Girshick等, 2014)。在视觉方面，对卷积适配模块(Rebuffi  et al , 2017 ; 2018 ; Rosenfeld &amp; Tsotsos , 2018)进行了研究。这些工作通过在ResNet ( He et al , 2016)或VGG Net (Simonyan &amp; Zisserman,  2014)中添加小卷积层来进行多域的增量学习。使用1 × 1卷积限制了适配器的大小，而原始网络通常使用3 × 3。这使得每个任务的整体模型大小增加了11 %。由于无法进一步减小核尺寸，因此必须使用其他权重压缩技术来进一步节省核尺寸。我们的瓶颈适配器可以小得多，并且仍然表现良好。</p><p>并行的工作为BERT ( Stickland &amp; Murray , 2019)探索了类似的思路。作者介绍了投影注意力层( Projected Attention Layers，PALs )，它是与我们的适配器具有类似作用的小层。主要区别在于：( 1 ) Stickland &amp; Murray ( 2019 )采用了不同的架构，( 2 )进行多任务训练，在所有GLUE任务上联合微调BERT。新浪塞姆纳尼( 2019 )在SQuAD v2.0 ( Rajpurkar et al , 2018)上对我们的瓶颈Adpaters和PALs进行了实证比较。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;面向Nlp的参数高效迁移学习&lt;/h1&gt;
&lt;p&gt;原始论文：《Parameter-Efficient Transfer Learning for NLP》
&lt;a href=&quot;http://arxiv.org/abs/1902.00751&quot;&gt;http://arxiv.org/a</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
    <category term="nlp" scheme="https://www.aweisite.top/tags/nlp/"/>
    
    <category term="finetune" scheme="https://www.aweisite.top/tags/finetune/"/>
    
  </entry>
  
  <entry>
    <title>Chain-of-Thought Prompting Elicits Reasoning in Large Language Models</title>
    <link href="https://www.aweisite.top/posts/c0250395.html"/>
    <id>https://www.aweisite.top/posts/c0250395.html</id>
    <published>2023-11-27T14:09:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>思维链提示在大型语言模型中引发推理</h1><h2 id="摘要">摘要</h2><p>我们探索了如何生成一个思想链--一系列中间推理步骤--显著提高大型语言模型执行复杂推理的能力。特别地，我们展示了这种推理能力是如何在足够大的语言模型中通过一种简单的方法--思维链提示--自然产生的，其中提供了几个思维链演示作为提示的例子。</p><p>在三个大型语言模型上的实验表明，在一系列算术、常识和符号推理任务上，思维链提示提高了性能。经验上的收益可能是惊人的。例如，仅用8个思维链示例就提示一个PaLM 540B，在数学应用题的GSM8K基准上达到了最先进的精度，甚至超过了用验证器微调的GPT-3。</p><p><img src="../images/20231127-01/img-0.png" alt="upload successful" />图1：思想链提示使大型语言模型能够处理复杂的算术、常识和符号推理任务。突出了思维链推理过程。</p><h2 id="1-Introduction-引言">1. Introduction 引言</h2><p>NLP领域最近被语言模型(Peters等,2018;Devlin等,2019;Brown等, 2020)所革命化。扩大语言模型的规模已经被证明可以带来一系列的好处，例如提高性能和样本效率(Kaplan等,2020;Brown等,2020)。然而，在诸如算术、常识和符号推理(Rae等,2021)等具有挑战性的任务上，仅仅扩大模型大小并不足以实现高性能。</p><p><img src="../images/20231127-01/img-1.png" alt="upload successful" /></p><p>图2：在GSM8K数学应用题测试集上，PaLM 540B使用了链式思维提示以达到最新的性能。精细调整后的GPT-3和先验最优来自Cobbe等(2021 )。</p><p>这项工作探索了在两种思想的激励下，如何通过简单的方法解锁大型语言模型的推理能力。首先，算术推理技术可以从生成导致最终答案的自然语言理由中受益。除了使用形式语言代替自然语言(罗伊和罗斯,2015;蒋殿春、陈斌开,2019;Amini等,2019;Chen等,2019)的神经符号方法外，先前的工作已经赋予模型通过从头训练(Ling等,2017)或微调预训练模型(Cobbe等,2021)生成自然语言中间步骤的能力。其次，大型语言模型提供了通过提示进行语境内小样本学习的令人兴奋的前景。也就是说，不是为每个新任务微调一个单独的语言模型检查点，而是简单地用几个输入-输出示例来&quot;提示&quot;模型。值得注意的是，这对于一系列简单的问答任务(布朗等, 2020)来说是成功的。</p><p>然而，上述两种思路都存在关键的局限性。对于原理增强训练和微调方法，创建大量高质量的原理是昂贵的，这比普通机器学习中使用的简单输入-输出对要复杂得多。对于Brown et al.(2020)中使用的传统的小样本提示方法，在需要推理能力的任务上效果不佳，且往往不会随着语言模型规模(Rae et al, 2021)的增加而有实质性的提升。在本文中，我们结合了这两种思想的长处，避免了它们的局限性。具体来说，给定一个由三元组〈输入，思维链，输出〉组成的提示，我们探讨语言模型对推理任务进行小样本提示的能力。思维链是导致最终输出的一系列中间自然语言推理步骤，我们将这种方式称为思维链提示。示例提示如图1所示。</p><p>我们对算术、常识和符号推理基准进行了实证评估，发现思维链提示优于标准提示，有时甚至达到惊人的程度。图2展示了这样一个结果--在数学应用题(Cobbe et al, 2021)的GSM8K测试集上，使用PaLM 540B的思维链提示大大优于标准提示，取得了新的性能。仅提示的方法很重要，因为它不需要大型的训练数据集，而且单个模型检查点可以执行许多任务而不失一般性。这项工作强调了如何通过几个关于任务( c.f.通过一个大型的训练数据集自动学习输入和输出的模式)的自然语言数据的例子来学习大型语言模型。</p><h2 id="2-Chain-of-Thought-Prompting-思维链提示">2. Chain-of-Thought Prompting 思维链提示</h2><p>在解决复杂的推理任务如多步数学应用题时，考虑自己的思维过程。在给出最终答案之前，将问题分解成中间步骤并逐一解决是典型的做法：&quot;简给妈妈2朵花后，她有10朵...给爸爸3朵花后，她有7朵...所以答案是7 &quot;。本文的目标是赋予语言模型生成类似思想链的能力--一系列连贯的中间推理步骤，从而得出问题的最终答案。我们将证明，足够大的语言模型可以产生思维链，如果在示例中提供思维链推理的演示，以进行少量的提示。</p><p>图1展示了一个模型的例子，它产生了一个解决数学应用题的思想链，否则它就会变得不正确。这种情况下的思维链类似于一个解决方案，可以这么解释，但我们仍然选择称之为思维链，以更好地捕捉这样的想法，即它模仿了一个逐步的思维过程来得出答案(此外,解决方案/解释通常在最终答案之后(Narang et al, 2020 ; Wiegreffe et al, 2022 ;兰皮宁et al, 2022))。</p><p>作为一种促进语言模型中推理的方法，思想链提示具有几个吸引人的特性。</p><ol><li class="lvl-3"><p>首先，原则上，链式思维允许模型将多步问题分解为中间步骤，这意味着额外的计算可以分配给需要更多推理步骤的问题。</p></li><li class="lvl-3"><p>其次，一连串的思想为模型的行为提供了一个可解释的窗口，表明它可能是如何到达一个特定的答案，并提供机会来调试推理路径出错的地方。</p></li><li class="lvl-3"><p>第三，思维链推理可以用于数学应用题、常识推理、符号操作等任务，对于人类可以通过语言解决的任何任务都具有潜在的适用性。</p></li><li class="lvl-3"><p>最后，在足够大的现成语言模型中，只需将思维链序列的例子放入少量提示的例子中，就可以很容易地引出思维链推理。</p></li></ol><p>在实证实验中，我们将观察思维链提示对算术推理(第3节)、常识推理(第4节)和符号推理(第5节)的效用。</p><h2 id="3-Arithmetic-Reasoning-算术推理">3. Arithmetic Reasoning 算术推理</h2><p>我们首先考虑图1形式的数学应用题，它衡量语言模型的算术推理能力。虽然对于人类来说很简单，但是算术推理是语言模型经常要面对的任务。令人惊讶的是，当与540B参数语言模型一起使用时，链式提示在多个任务上表现出与特定任务微调模型相当的性能，甚至在具有挑战性的GSM8K基准程序(Cobbe et al, 2021)上达到了新的水平。</p><h3 id="3-1-实验设置">3.1 实验设置</h3><p>我们在多个基准上探索了不同语言模型的思维链提示。</p><p><strong>基准</strong>  我们考虑以下五个数学应用题基准：( 1 )数学应用题GSM8K基准题( Cobbe等人, 2021年)，( 2 )变结构数学应用题SVAMP数据集( Patel等人, 2021年)，( 3 )不同类型数学应用题ASDiv数据集( Miao等人, 2020年)，( 4 )代数应用题AQuA数据集，( 5 ) MAWPS基准题( Koncel - Kedziorski等人, 2016年)。附录表12给出了示例问题。</p><p><strong>标准提示</strong> 对于基线，我们考虑标准的小样本提示，由Brown et al ( 2020 )推广，其中一个语言模型在输出一个测试时间示例的预测之前给出了输入-输出对的语境范例。范例被格式化为问题和答案。模型直接给出答案，如图1 (左)所示。</p><p>** 思想链的提示** 我们提出的方法是在少量提示的情况下，以一个关联答案的思路链来增加每个示例，如图1 (右)所示。由于大多数数据集仅有一个评估片段，我们手工组成了一组带有提示思想链的8个小样本示例-图1 (右)显示了一个思想链示例，全集示例在附录表20中给出。(这些特殊的例子没有经过及时的工程;稳健性研究见3.4节和附录A.2。)为了考察这种形式的思维链提示能否成功地在一系列数学应用题中引发成功的推理，我们使用了这套8个思维链示例，用于除AQuA以外的所有基准测试，这是多项选择，而不是自由反应。对于AQuA，我们从训练集中使用了4个示例和解决方案，如附录表21所示。</p><p>语言模型。我们评估了5个大型语言模型。第一种是GPT-3 (Brown等, 2020)，我们使用了text-ada-001、text-babbage-001、text-curie-001和text-davinci-002，它们大概对应InstructGPT模型的350M、1.3B、6.7B和175B参数(Ouyang等, 2022)。第二个是La MDA (Thoppilan等, 2022)，它有422M、2B、8B、68B和137B参数的模型。第三种是PaLM，它具有8B、62B和540B参数的模型。第四种是UL2 20B (Tay等, 2022)，第五种是Codex(Chen等, 2021, OpenAI API中的code-davinci-002)。我们通过贪婪解码(尽管后续工作表明,通过在许多抽样世代中采取大多数最终答案,可以改善思维链提示(Wang 等,2022a) )从模型中采样。对于LaMDA，我们报告了五个随机种子的平均结果，其中每个种子具有不同的随机洗牌顺序。由于LaMDA实验在不同种子之间没有表现出较大的差异，为了节省计算，我们报告了所有其他模型的单个样本顺序的结果。</p><h3 id="3-2-结果">3.2 结果</h3><p>最强烈的思维链提示结果汇总在图4中，每个模型集合、模型大小和基准的所有实验输出如附录中表2所示。有三个关键的点。首先，图4表明，思维链提示是模型尺度( Wei et al , 2022b)的一种涌现能力。也就是说，对于较小的模型，思维链提示并不会对性能产生积极影响，只有在使用了~100B参数的模型时才会产生性能增益。我们定性地发现，较小规模的模型产生了流畅但不合逻辑的思维链，导致了比标准提示更低的性能。</p><p>第二，对于更复杂的问题，思维链提示具有更大的绩效增益。例如，对于GSM8K (基线性能最低的数据集)，最大的GPT和PaLM模型的性能提高了一倍以上。另一方面，对于MAWPS最简单的子集SingleOp (仅需一个步骤即可解决)，性能改进要么是负面的，要么是很小的(见附录表3)。</p><p>第三，通过GPT - 3 175B和PaLM 540B的思想链提示优于现有技术，这通常在标记的训练数据集上微调特定任务的模型。图4展示了PaLM 540B在GSM8K、SVAMP和MAWPS (虽然注意到标准提示对于SVAMP已经通过了优先选择)上如何利用链式提示实现新的技术状态。在另外两个数据集上，AQuA和ASDiv，具有链式思维提示的PaLM达到了最先进的(附录表2)的2%以内。为了更好地理解&quot;思维链提示&quot;为什么起作用，我们手工检查了La MDA 137B为GSM8K制作的模型生成的&quot;思维链&quot;。在模型返回正确最终答案的50个随机例子中，除了2个巧合地得到正确答案(见附录D.1 ,表8为正确的模型生成思想链的例子)之外，所有生成的思维链在逻辑上和数学上都是正确的。我们还随机检查了50个随机样本，其中模型给出了错误的答案。这一分析的总结是，除去(计算器错误,符号映射错误,或者一个推理步骤缺失)的微小错误，46%的思维链是几乎正确的，另外54%的思维链在语义上发生了重大错误。为了观察为什么缩放可以提高思维链推理能力，我们对PaLM 62B产生的错误进行了类似的分析，以及这些错误是否通过缩放到PaLM 540B来修复。总结起来，将PaLM缩放到540B修正了62B模型(见附录A.1)中一步法缺失和语义理解错误的很大一部分。</p><p><img src="../images/20231127-01/img-2.png" alt="upload successful" /></p><h3 id="3-3-消融研究">3.3 消融研究</h3><p>使用思想链提示的观察到的好处提出了一个自然的问题，即是否可以通过其他类型的提示来赋予相同的性能改进。图5显示了下面描述的三种不同思路的消融研究。</p><p><strong>仅有方程</strong> 思维链提示可能有帮助的一个原因是它产生了要评估的数学方程，因此我们测试了一个变式，即在给出答案之前，提示模型只输出一个数学方程。图5显示，仅有提示的公式对于GSM8K来说帮助不大，这暗示了GSM8K中问题的语义太具有挑战性，无法直接转化为公式，而不需要思路链中的自然语言推理步骤。然而，对于一步法或两步法问题的数据集，我们发现只提示方程确实可以提高性能，因为方程可以很容易地从问题(见附录表6)推导出来。</p><p><strong>仅变量计算</strong> 另一个直觉是，思维链允许模型在更难的问题上花费更多的计算(即中间token)。为了将变量计算的影响从思维链推理中分离出来，我们测试了一个配置，在这个配置中，模型被提示输出一个仅有的点序列(...)，等于解决问题所需的方程中的字符数。这一变体的表现与基线大致相同，说明变量计算本身并不是思维链提示成功的原因，通过自然语言表达中间步骤似乎有效用。</p><p><strong>回答之后的思路链</strong> 思维链提示的另一个潜在好处可能是，这种提示可以让模型更好地获取预训练过程中获得的相关知识。因此，我们测试了一个备选配置，其中思想链提示仅在答案后给出，隔离了模型是否实际依赖于产生的思想链给出最终答案。这个变体的表现与基线大致相同，这表明思想链中体现的顺序推理对于不仅仅是激活知识的原因是有用的。</p><p><img src="../images/20231127-01/img-3.png" alt="upload successful" />图5. 为La MDA 137B和Pa LM 540B对不同提示变化的消融研究。其他数据集的结果见附录表6和表7。</p><h3 id="3-4-思维链的健壮性">3.4 思维链的健壮性</h3><p>对样例的敏感性是提示方法的一个重要考虑因素，例如，改变少样本样例的排列可以使GPT-3在SST-2上的准确率从近机会(54.3 %)到近状态(93.4 %) (Zhao et等, 2021)不等。在这最后一小节中，我们对不同注释者撰写的思想链进行了稳健性评估。除了上述使用注释者A撰写的思维链的结果外，本文的另外两位合著者(注释者B和C)也独立为同一篇少量的例证(如附录H所示)撰写了思维链。注释者A还遵循Cobbe等( 2021)给出的解的风格，写出了比原文更简洁的另一条思路链。</p><p>图6为LaMDA 137B在GSM8K和MAWPS (其他数据集的消融结果见附录表6 /表7)上的结果。尽管不同的思维链注释之间存在差异，但正如使用样例提示( Le Scao和Rush , 2021年; Reynolds和McDonell, 2021年; Zhao等人, 2021年)时所预期的那样，所有的思维链提示都比标准基线有很大的提升。这一结果表明，思维链的成功使用并不依赖于特定的语言风格。</p><p><img src="../images/20231127-01/img-4.png" alt="upload successful" />图6：思维链提示对不同提示样例有差异(如预期)，但对不同注释者和不同示例都优于标准提示。</p><p>为了证实成功的思维链提示对其他组样例同样有效，我们还从GSM8K训练集中随机抽取了3组共8个样例进行实验，独立来源(在这个数据集中的例子已经包括了像思想链一样的推理步骤)。图6显示这些提示与我们手工编写的样例表现相当，也明显优于标准提示.</p><p>除了对注释者、独立编写的思维链、不同的样例和不同的语言模型具有鲁棒性外，我们还发现，算术推理的思维链提示对不同的样例顺序和不同数量的样例(见附录A.2)具有鲁棒性。</p><h2 id="4-Commonsense-Reasoning-常识推理">4. Commonsense Reasoning 常识推理</h2><p>虽然思维链特别适用于数学应用题，但思维链基于语言的性质实际上使其适用于广泛的一类常识性推理问题，涉及在一般背景知识的假设下对物理和人类互动的推理。常识推理是与世界交互的关键，目前的自然语言理解系统(Talmor等,2021)还无法实现。</p><p><strong>基准</strong> 我们考虑了五个涵盖不同常识推理类型的数据集。流行的CSQA ( Talmor等, 2019)提出了关于世界的常识性问题，涉及复杂的语义，往往需要先验知识。StrategyQA ( Geva等, 2021)需要模型推断多跳策略来回答问题。我们从BIG - bench工作( BIG-bench协作, 2021)中选择了两个专门的评估集：日期理解( Date Understanding )和体育理解( Sports Understanding )，其中Date Understanding涉及从给定的上下文中推断日期，Sports Understanding涉及判断与体育相关的句子是否合理或不合理。最后，Say Can数据集( Ahn等, 2022)涉及将自然语言指令从离散集合映射到机器人动作序列。图3展示了所有数据集的思想链标注示例。</p><p><strong>提示</strong> 我们遵循与上一部分相同的实验设置。对于CSQA和StrategyQA，我们从训练集中随机选择示例，并为它们手工组成思路链，以使用少量示例。两个BIG-bench任务没有训练集，因此我们选择前十个示例作为评估集中的示例，作为少样本示例，并在剩余的评估集中报告编号。对于SayCan，我们使用了Ahn等人( 2022 )中使用的训练集的六个例子，并手工组成了思维链。</p><p><strong>结果</strong> 图7突出了PaLM (表4给出了LaMDA、GPT-3和不同模式尺度的完整结果)的这些结果。对于所有任务，模型规模的扩大都提高了标准提示的性能；&quot;思维链&quot;的推动带来了进一步的收益，PaLM 540B的改进幅度最大。在&quot;思维链&quot;的推动下，PaLM 540B取得了相对于基线的强劲表现，在Strategy QA ( 75.6 %比69.4 %)上超过了现有技术，在运动理解( 95.4 %比84 %)上超过了一个独立的运动爱好者。这些结果表明，在需要一系列常识推理能力的任务(虽然注意到在CSQA上增益是最小的)上，思维链提示也能提高绩效。</p><p><img src="../images/20231127-01/img-5.png" alt="upload successful" />图7：思维链提示也提高了语言模型的常识推理能力。这里展示的语言模型是PaLM。先前最好的数字来自CSQA ( Talmor等, 2019)和StrategyQA ( Geva等, 2021) (仅限单模型,截至2022年5月5日)的排行榜。使用不同大小的La MDA、GPT - 3和Pa LM的附加结果如表4所示。</p><h2 id="5-Symbolic-Reasoning-符号推理">5. Symbolic Reasoning 符号推理</h2><p>我们最终的实验评估考虑了符号推理，这对于人类来说很简单，但对于语言模型来说却具有潜在的挑战性。我们表明，思维链提示不仅使语言模型能够执行在标准提示设置中具有挑战性的符号推理任务，而且还能促进长度泛化到比少样本示例中更长的推理时间输入。</p><p>任务。我们使用以下两个玩具任务：</p><p>•  <strong>最后一个字母的拼接</strong> 该任务要求模型拼接一个名字(比如 'Amy Brown'→'yn')中单词的最后一个字母。这是一个更具挑战性的首字母拼接版本，语言模型已经可以在没有思维链的情况下执行。我们通过从名字普查数据( <a href="https://namecensus.com/">https://namecensus.com/</a>).</p><p>•  <strong>硬币翻转</strong>  该任务要求模型回答人们翻转或不翻转硬币后硬币是否人头面朝上(例如, '一枚硬币人头面朝上。菲比翻转硬币。奥斯瓦尔多不抛硬币。硬币还在是人头面朝上吗? '→'不')。</p><p>由于这些符号推理任务的构造是定义良好的，对于每个任务，我们考虑一个域内测试集，其中示例具有与训练/少样本示例相同的步数，以及一个域外测试集，其中评估示例具有比示例示例更多的步数。对于末尾字母拼接，模型只看到两个单词的人名示例，然后对3个和4个单词的人名进行末尾字母拼接。4对于硬币翻转任务中的潜在翻转次数，我们也做了同样的处理。我们的实验设置使用与前两部分相同的方法和模型。我们再次手工合成了每个任务的小样本样本的思维链，如图3所示。</p><p><img src="../images/20231127-01/img-6.png" alt="upload successful" /></p><p><strong>结果</strong> PaLM的域内和OOD评估结果如图8所示，LaMDA的结果如附录表5所示。在PaLM 540B中，思维链提示导致几乎100%的解决率(值得注意的是,标准提示已经解决了硬币翻转与PaLM 540 ,虽然不是为LaMDA 137B)。需要注意的是，这些领域内的评估是&quot;玩具任务&quot;，因为在少量的示例中，完美的解决方案结构已经由思维链提供；所有模型所要做的就是用测试时实例中的新符号重复相同的步骤。然而，小模型仍然失效--对这三个任务中看不见的符号进行抽象操作的能力只出现在100B模型参数的规模上。</p><p>对于OOD评估，两种任务的标准提示都失败了。通过思想链的提示，语言模型实现了向上缩放曲线(尽管性能低于域内设置)。因此，对于足够规模的语言模型，思想链的提示促进了超出所见思想链的长度泛化。</p><h2 id="6-Discussion-讨论">6. Discussion 讨论</h2><p>我们探索了思维链提示作为一种简单的机制，用于在大型语言模型中诱导多步推理行为。我们首先看到，在算术推理方面，思维链的提示大大地提高了性能，产生了比消融更强大的改进，并对不同的注释器、范例和语言模型具有鲁棒性(第3节)。接下来，关于常识推理的实验强调了思维链推理的语言学性质如何使其普遍适用(第4节)。最后，我们证明了对于符号推理，思想链提示有助于OOD泛化到更长的序列长度(第5节)。在所有的实验中，通过提示一个现成的语言模型来简单地引出思维链推理。在本文的写作过程中没有对语言模型进行微调。</p><p>作为模型规模结果的思想链推理的出现一直是流行的主题(Wei等,2022b)。对于许多标准提示具有平坦缩放曲线的推理任务，思想链提示导致缩放曲线急剧增加。思想链提示似乎扩展了大型语言模型能够成功执行的任务集--换句话说，我们的工作强调标准提示只提供了大型语言模型能力的一个下界。这种观察可能会提出比它所回答的更多的问题--比如，随着模型规模的进一步增加，我们还能期望推理能力提高多少?其他的提示方法可能会扩大语言模型所能解决的任务范围?</p><p>至于局限性，我们首先限定，虽然思维链模仿了人类推理者的思维过程，但这并不能回答神经网络是否真的是&quot;推理&quot;，我们将其作为一个开放性问题留下。其次，尽管在小样本的情况下，人工增加带有思维链的样本的成本是最小的，但是这种注释成本对于微调(虽然这可以通过合成数据生成或零样本泛化来克服)来说可能是高昂的。第三，没有正确推理路径的保证，既可能导致正确答案，也可能导致错误答案；改进语言模型的事实生成是未来工作(Rashkin等, 2021 ; Ye和Durrett, 2022 ; Wiegreffe等, 2022)的开放方向。最后，仅在大模型规模下的思想链推理的出现使得服务于现实世界的应用代价高昂；进一步的研究可以探索如何在更小的模型中进行推理。</p><h2 id="7-Related-Work-相关工作">7. Related Work 相关工作</h2><p>这项工作受到许多研究领域的启发，我们在一个扩展的相关工作部分(附录C )中进行了详细介绍。在这里我们描述两个方向和相关的论文，也许是最相关的。</p><p>第一个相关的方向是使用中间步骤来解决推理问题。Ling等人( 2017 )开创性地提出了通过一系列中间步骤使用自然语言理据来解决数学应用题的思想。他们的工作与使用形式语言对(Roy等, 2015 ;蒋殿春、陈斌开,2019;Amini等,2019;Chen等,2019)进行推理的文献形成了鲜明对比。Cobbe等(2021)对Ling等(2017)进行了扩展，创建了一个更大的数据集，并使用它来微调预训练的语言模型，而不是从头开始训练模型。在程序合成领域，Nye等人( 2021 )利用语言模型，通过对中间计算结果的逐行预测来预测Python程序的最终输出，并表明他们的分步预测方法比直接预测最终输出效果更好。</p><p>当然，本文也与最近大量有关激励的工作密切相关。自Brown等(2020 )提出的小样本提示推广以来，几种通用的方法提高了模型的提示能力，如自动学习提示(李斯特等, 2021)或给出描述任务(Wei等, 2022a ; Sanh等, 2022 ; Ouyang等, 2022)的模型说明。虽然这些方法改进或增加了提示(例如,预先附加到输入的指令)的输入部分，但我们的工作采取了用一个思路链来增加语言模型输出的正交方向。</p><h2 id="8-Conclusions-结论">8. Conclusions 结论</h2><p>我们探索了思想链提示作为一种简单且广泛适用的增强语言模型推理的方法。通过对算术、符号和常识推理的实验，我们发现思想链推理是模型规模的一个涌现性质，它允许足够大的语言模型执行否则具有平坦缩放曲线的推理任务。拓宽语言模型所能执行的推理任务的范围，有望启发基于语言的推理方法的进一步工作。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;思维链提示在大型语言模型中引发推理&lt;/h1&gt;
&lt;h2 id=&quot;摘要&quot;&gt;摘要&lt;/h2&gt;
&lt;p&gt;我们探索了如何生成一个思想链--一系列中间推理步骤--显著提高大型语言模型执行复杂推理的能力。特别地，我们展示了这种推理能力是如何在足够大的语言模型中通过一种简单的方法--思维链提</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>Reflexion: Language Agents with Verbal Reinforcement Learning</title>
    <link href="https://www.aweisite.top/posts/dd4362ac.html"/>
    <id>https://www.aweisite.top/posts/dd4362ac.html</id>
    <published>2023-11-24T10:40:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>反射：言语强化学习的语言代理</h1><p>原论文：<a href="http://arxiv.org/abs/2303.11366">Reflexion: Language Agents with Verbal Reinforcement Learning</a></p><h2 id="摘要">摘要</h2><p>大型语言模型( Large Language Models，LLMs )作为目标驱动的智能体被越来越多地用于与外部环境(例如,游戏、编译器、API等)进行交互。然而，由于传统的强化学习方法需要大量的训练样本和昂贵的模型微调，这些语言智能体快速有效地从试错中学习仍然具有挑战性。我们提出了一种新的框架Reflex，它不是通过更新权重来加强语言代理，而是通过语言反馈来加强语言代理。具体来说，反应主体会对任务反馈信号进行言语反思，然后在情景记忆缓冲器中保持自己的反射性文本，以便在随后的试次中诱发更好的决策。反射足够灵活，可以包括各种类型(标量值或自由形式的语言)</p><h2 id="1-引言">1. 引言</h2><p>最近的工作如ReAct[ 30 ]、SayCan[ 1 ]、Toolformer[ 22 ]、HuggingGPT[ 23 ]、生成式Agent[ 19 ]、WebGPT[ 17 ]等已经证明了构建在大型语言模型(large language model，LLM)内核之上的自主决策Agent的可行性。这些方法使用LLM生成可用于API调用并在环境中执行的文本和&quot;动作&quot;。由于它们依赖于具有大量参数的大规模模型，因此这些方法迄今为止仅限于使用语境样本作为教授代理的方式，因为更多的传统优化方案，如梯度下降的强化学习需要大量的计算和时间。</p><p>在这篇文章中，我们提出了一种替代方法，称为&quot;反射&quot; (Reflex)，它使用语言强化来帮助代理人从先前的失败中学习。回应将来自环境的二元或标量反馈以文本摘要的形式转换为言语反馈，并在下一集作为LLM施动者的附加语境添加。这种自我反思反馈作为一种&quot;语义&quot;梯度信号，通过为智能体提供一个具体的改进方向，帮助其从先前的错误中学习，从而更好地完成任务。这就类似于人类如何迭代地学习以少数次的方式完成复杂的任务--通过反思他们之前的失败，以便为下一次尝试形成改进的攻击计划。例如，在图1中，反射代理通过尝试、错误和自我反思来学习优化自己的行为，以解决决策、编程和推理任务。</p><p>生成有用的反思性反馈是具有挑战性的，因为它需要很好地理解模型在哪里犯了错误(即信用分配问题)，以及生成包含可操作的改进见解的摘要的能力。我们探索了三种方法--简单的二进制环境反馈，针对常见失败案例的预定义启发式，以及自我评估，如使用LLMs (决策)或自我编写的单元测试(编程)进行二分类。在所有的实现中，评价信号被放大为自然语言经验总结，这些经验总结可以存储在长时记忆中。</p><p>与更传统的RL方法(如策略或基于值的学习)相比，Reflex有几个优点：1)它是轻量级的，不需要对LLM进行微调；2)它允许更细微的反馈形式(例如,有针对性地改变行动)，而不是那些难以执行准确的信用分配的标量或向量奖励；3)它允许在过去的经验中使用更明确和可解释的情景记忆形式；4)它为未来的情节提供更明确的行动暗示。同时，它也存在依赖LLM的自我评价能力(或启发式)的力量和不具备成功的正式保证的缺点。然而，随着LLM能力的提高，我们只预期这种范式会随着时间的推移而变得更好。</p><p>我们在(1)决策任务上测试长轨迹上的顺序动作选择，(2)推理任务上测试知识密集型的单步生成改进，(3)编程任务上教会智能体有效地使用外部工具，如编译器和解释器。在所有三类任务中，我们都观察到Reflex Agent是更好的决策者、推理者和程序员。具体而言，在12个迭代学习步骤中，Reflex Agent在决策AlfWorld [ 24 ]任务上比强基线方法提高了22%，在HotPot QA [ 28 ]中的推理问题上提高了20%，在HumanEval [ 6 ]上的Python编程任务上提高了11%。</p><p>综上所述，我们的贡献有以下几点：</p><p>• 我们提出了一种新的&quot;言语&quot;强化范式Reflex，将政策参数化为代理人的记忆编码和LLM参数的选择。</p><p>•我们在LLMs中探索了自我反思的这种涌现特性，并通过实验证明了自我反思对于学习复杂任务是非常有用的。</p><p>•我们介绍了LeetcodeHardGym，一个由19种编程语言中的40个具有挑战性的Leetcode问题(&quot;硬水平&quot;)组成的代码生成RL训练环境。</p><p>•我们展示了Reflex在多个任务上实现了对强基线的改进，并在各种代码生成基准上取得了最先进的结果。</p><h2 id="2-相关工作">2. 相关工作</h2><p><img src="../images/20231123-01/pasted-3.png" alt="upload successful" /></p><p>图1：反思任务包括决策4.1、编程4.3和推理4.2。</p><p><img src="../images/20231123-01/pasted-4.png" alt="upload successful" /></p><p><strong>推理和决策</strong> Self-Refine [ 15 ]使用迭代的框架进行自我修正，通过自我评估来自主地改进生成。这些自我评价和自我完善的步骤是以给定的任务限制为条件的，例如&quot;这一代人如何以更积极的方式写作&quot;。自求精是有效的，但仅限于单代推理任务。Pryzant等人[ 21 ]进行了类似的语义提示书写优化，但也仅限于单代任务。Paul等人[ 20 ]微调评价模型，在轨迹中提供中间反馈，以提高推理反应。Xie等人[ 27 ]使用随机束搜索来执行一个更有效的决策搜索策略，该策略允许智能体由于其自我评价成分而使用预见优势。Yoran等人[ 31 ]和Nair等人[ 16 ]使用判定模型在几代人中进行推理。Kim等人[ 10 ]使用固定步数的重试模式，没有评估步。Goodman [ 9 ]执行了对上一代提出优化的定性评估步骤。在本文中，我们证明了这些概念中的一些可以通过自我反思来增强，以建立对自我反思经验的持久记忆，这使得代理可以识别自己的错误，并自我暗示随着时间的推移从错误中吸取教训。</p><p><strong>编程</strong>  过去和最近的一些工作采用了测试驱动开发或代码调试实践的变体。AlphaCode [ 14 ]在评估了一组在隐藏测试用例上的生成。CodeT [ 5 ]使用自生成的单元测试，用于对生成的函数实现进行打分。自调试[ 7 ]使用了一个调试组件，该组件用于在给定代码执行环境反馈的情况下改进现有的实现。CodeRL [ 12 ]将问题设置在RL框架中，使用行动者评论家设置来调试程序，并给出执行环境的反馈。AlphaCode、Self-Debugging和CodeRL在修复复杂度较低的程序错误时是有效的，但它们依赖于无效的通过 @1 合格性的真实测试用例，并且没有使用自我反思来弥合错误识别和实现改进之间的鸿沟。CodeT不访问隐藏的测试用例，但没有实现自学习步骤来改进代码编写。</p><h2 id="3-反射性：通过言语反射进行强化">3. 反射性：通过言语反射进行强化</h2><p>我们开发了一个Reflex的模块化公式，使用了三个不同的模型：一个Actor，记为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">M_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，它生成文本和动作；以Me为代表的Evaluator模型对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">M_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>产生的输出进行打分；以及一个自我反思模型，记为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>e</mi></msub></mrow><annotation encoding="application/x-tex">M_e</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，它产生言语强化线索来辅助Actor进行自我提升。我们对每个模型进行了详细的描述，并随后在Reflex框架内阐明了它们的协同作用。</p><p><img src="../images/20231123-01/pasted-5.png" alt="upload successful" /></p><p>图2：( a ) Reflex图。( b )反射增强算法</p><p><strong>Actor</strong> Actor是建立在一个大语言模型( LLM )的基础上的，该模型专门提示生成以状态观测为条件的必要文本和动作。类似于传统的基于策略的RL设置，我们在t时刻从当前策略π θ中采样一个动作或生成，从环境中接收一个观测。我们探索了各种行动者模型，包括思想链(Chain of Thought)[ 26 ]和ReAct [ 30 ]。这些不同的生成模型允许我们在Reflex框架内探索文本和动作生成的不同方面，为它们的性能和有效性提供了有价值的见解。此外，我们还添加了一个记忆组件mem，为这个agent提供了额外的上下文。这种适应性是受Brooks等人[ 3 ]的启发，他们提出了一个策略迭代算法ap</p><p><strong>Evaluator</strong> Reflex框架中的Evaluator组件在评估Actor产生的输出的质量中起着至关重要的作用。它将生成的轨迹作为输入，并计算在给定任务环境下反映其性能的奖励分数。定义适用于语义空间的有效值和奖励函数是困难的，因此我们考察了Evaluator模型的几种变体。对于推理任务，我们探索了基于精确匹配(EM)评分的奖励函数，以确保生成的输出与期望解紧密对齐。在决策任务中，我们使用预先定义的启发式函数，这些函数是根据特定的评价标准定制的。此外，我们还尝试使用LLM本身的不同实例化作为评估器，为决策和编程任务生成奖励。这种对评价者设计的多方位方法允许我们检查不同的策略来对生成的输出进行评分，以了解它们在一系列任务中的有效性和适用性。</p><p><strong>自反射</strong> 自我反思模型作为LLM的一个实例，通过产生言语上的自我反思，为未来的试验提供有价值的反馈，在反思框架中起着至关重要的作用。给定一个稀疏的奖励信号，例如一个二进制的成功状态(成功/失败)，当前的轨迹和它的持久记忆，自反射模型会产生细致入微和特定的反馈。然后，这种比标量奖励更有信息的反馈存储在智能体的记忆(mem)中。例如，在多步决策任务中，当智能体接收到故障信号时，它可以推断一个特定的动作<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">a_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>导致了随后的不正确动作<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">a_{i+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mrow><mi>i</mi><mo>+</mo><mn>2</mn></mrow></msub></mrow><annotation encoding="application/x-tex">a_{i+2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>。然后，代理可以口头陈述，它应该采取不同的行动，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>a</mi><mtext>′</mtext></mrow><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">{a′}_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="mord">′</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，这将导致<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>a</mi><mtext>′</mtext></mrow><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">{a′}_{i+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7639em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="mord">′</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>a</mi><mtext>′</mtext></mrow><mrow><mi>i</mi><mo>+</mo><mn>2</mn></mrow></msub></mrow><annotation encoding="application/x-tex">{a′}_{i+2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7639em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="mord">′</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>,并将这种经验存储在其记忆中。在随后的试次中，代理可以利用过去的经验，通过选择行动<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mrow><mi>a</mi><mtext>′</mtext></mrow><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">{a′}_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="mord">′</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>来调整自己在<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>时刻的决策方式。这种尝试、错误、自我反思和持久记忆的迭代过程使智能体能够利用信息性的反馈信号迅速提高其在各种环境中的决策能力。</p><p><strong>记忆</strong> Reflex过程的核心成分是短期和长期记忆的概念。在推理时，行动者将其决策条件限定在短时记忆和长时记忆上，类似于人类记忆细粒度近期细节的方式，同时也会回忆从长时记忆中提炼出来的重要经验。在强化学习装置中，轨迹历史作为短时记忆，自反射模型的输出存储在长时记忆中。这两个记忆成分共同提供了特定的情境，但同时也受到了几个试次的经验教训的影响，这也是Reflex Agent相对于其他LLM动作选择作品的一个关键优势。</p><p><strong>Reflexion过程</strong></p><p>在过过程1中，反射被形式化为一个迭代优化过程。在第一个试次中，Actor通过与环境交互产生一个轨迹<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>τ</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">τ_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em;">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。然后，Evaluator产生一个得分<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">r_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">r_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>计算为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>t</mi></msub><mo>=</mo><msub><mi>M</mi><mi>e</mi></msub><mo stretchy="false">(</mo><msub><mi>τ</mi><mn>0</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">r_t = M_e(τ_0)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">e</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em;">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">r_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>只是对试验<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>的一个标量奖励，它随着特定任务性能的增加而增加。在第一次试次后，为了将<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">r_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>放大为LLM可以改进的反馈形式，自我反思模型对{<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>τ</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">τ_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em;">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">r_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>}集合进行分析，产生摘要<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">sr_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord mathnormal">s</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，存储在记忆记忆中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><msub><mi>r</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">sr_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord mathnormal">s</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>为试次<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>的言语经验反馈。Actor、Evaluator和自反思模型通过循环往复的试验共同工作，直到Evaluator认为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>τ</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">τ_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1132em;">τ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.1132em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>是正确的。如3所述，Reflexion的记忆成分对其有效性至关重要。在每次试验后，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6151em;"></span><span class="mord mathnormal">t</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><msub><mi>r</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">sr_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord mathnormal">s</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，被加入到记忆中。在实际应用中，我们通过最大数量的存储经验，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Ω</mi></mrow><annotation encoding="application/x-tex">Ω</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord">Ω</span></span></span></span> (通常设置为1 ~ 3)来约束mem，以遵守最大上下文LLM限制。</p><h2 id="4-实验">4. 实验</h2><p>我们在决策、推理和代码生成任务上评估了各种自然语言RL设置。具体来说，我们在HotPotQA [ 28 ]，AlfWorld [ 24 ]中常见的家庭环境中的多步任务，以及HumanEval [ 6 ]，MBPP [ 2 ]中的解释器和编译器，以及一个新的基准测试程序LeetcodeHard上挑战一个代理执行基于搜索的问答任务。最值得注意的是，在AlfWorld上，Reflex在强基线上的性能提升了22 %，在HotPotQA上提升了20 %，在HumanEval上提升了11 %。</p><h3 id="4-1-序列决策：ALFWorld">4.1 序列决策：ALFWorld</h3><p>AlfWorld是一套基于文本的环境，它基于TextWorld [ 8 ]，在各种交互环境中挑战Agent解决多步骤任务。遵循Yao等[ 30 ]的方法，我们在134个AlfWorld环境中跨6个不同的任务运行该代理，包括寻找隐藏对象(例如,在抽屉里找到一个铲刀)、移动对象(例如,将一把小刀移到切割板上)和用其他对象操作对象(例如,在冰箱里冷却一个番茄)。我们使用ReAct [ 30 ]作为动作生成器，因为Yao等人[ 30 ]在使用显式中间思想的长轨迹决策中显示出了成功。AlfWorld任务自然需要一个自我评价步骤，因为只有当任务完成时，环境才能发出信号。为了实现完全自主的行为，我们实现了两种自我评估技术：使用LLM的自然语言分类和手写启发式。启发式是简单的：如果智能体执行相同的动作并收到相同的响应超过3个周期，或者如果当前环境中采取的动作数量超过30 (低效的规划)，我们进行自我反思。在基线运行中，如果建议进行自我反思，则跳过自我反思过程，重新设置环境，开始新的试次。在Reflex运行中，代理使用自我反思来发现其错误，更新其记忆，重置环境，并开始新的尝试。为了避免可能超过最大限制的很长的提示窗口，我们将代理的记忆截断到最后3次自我反射(经验)。</p><p>为了避免句法错误，我们为agent提供了两个特定领域的小样本轨迹。对于LLM，我们使用与Yao等[ 30 ]相同的小样本轨道例子和GPT-3。附录中包括AlfWorld任务、ReAct小样本提示和Reflex示例。</p><p><strong>结果</strong> ReAct+Reflexion 在134个任务中完成了130个任务，使用简单的启发式方法来检测幻觉和低效的计划，明显优于ReAct。进一步，ReAct+Reflexion 通过连续12个试次的学习来解决额外任务。在ReAct-only方法中，我们发现在进行到6至7尝试时，性能增加就停止了。</p><p><img src="../images/20231123-01/pasted-6.png" alt="upload successful" />图3：( a ) AlfWorld在134个任务中的表现，显示了使用启发式( Heuristic )和二分类( GPT )的自我评估技术解决任务的累积比例。( b )按故障原因对AlfWorld轨迹进行分类。</p><p><strong>分析</strong> 在基线失败的AlfWorld轨迹中，一个常见的错误是当代理认为自己拥有一个物品，但实际上并不拥有该物品。代理在一个较长的轨迹中执行若干动作，并且不能回溯其动作以发现错误。Reflexion通过自我反思将长期的、失败的轨迹提炼为相关经验，并在未来作为&quot;自我暗示&quot;，几乎可以消除所有这些情况。在AlfWorld中，长时记忆帮助施动者的情况主要有两种：1)长轨迹中的早期错误很容易被识别。代理人可以提出新的行动选择，甚至是新的长期计划。2)检查物品的表面/容器太多。代理可以利用其在多个试验中的经验记忆来彻底搜索一个房间。在3中，学习曲线表明学习过程发生在多个经验上，这意味着代理人成功地平衡了案例1和2，表现在前两个试验之间的改进的立即尖峰，然后在接下来的11个试验中稳步增加，以达到近乎完美的性能。另一方面，3显示了一个ReAct-only agent收敛于22%的幻觉率，并且没有长期恢复的迹象。</p><h3 id="4-2-推理：HotpotQa">4.2 推理：HotpotQa</h3><p>HotPotQA [ 28 ]是一个基于维基百科的数据集，包含113k个问答对，这些问答对要求代理人解析多个支持文档的内容和推理。为了测试推理能力的提高，我们实现了Reflexion+Chain-of-Thought (CoT) [ 26 ]，用于逐步<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">Q→A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>和Q，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>g</mi><mi>t</mi></mrow></msub><mo>→</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">C_{gt}→A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>的实现，其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>是问题，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>g</mi><mi>t</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{gt}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>是来自数据集的背景真值，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>是最终答案。由于CoT不是一种多步决策技术，因此我们给Agent赋予<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>g</mi><mi>t</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{gt}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.03588em;">g</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>，以便我们可以在提供的文本的大段上隔离推理行为。为了测试需要推理和行动选择的整体问答能力，我们实现了一个Reflexion+ReAct [ 30 ]代理，该代理可以使用维基百科API检索相关上下文，并使用逐步显式思维推断答案。对于CoT的实现，我们使用6-shot提示；对于ReAct，我们使用2-shot提示，而对于Self-Reflexion，我们使用2-shot提示。所有的例子都可以在附录中找到。</p><p>鲁棒地评估自然语言答案是NLP中一个长期存在的问题。因此，在试验之间，我们使用精确匹配答案评分使用环境给代理一个二进制成功信号。每次试次结束后，采用自反射循环放大二进制信号，类似于AlfWorld中的决策设置4.1，内存大小为3次经验。</p><p><strong>结果</strong> 在几个学习步骤中，Reflexion 优于所有基线方法，具有显著的优势。此外，ReAct-only，CoT-only和CoT(GT)-only的实现在任何任务上都不能概率性地改进，这意味着从任何基线方法的第一个试验中没有失败的任务能够在随后的试验中使用0.7的温度来解决。在RReflexion 运行中，我们允许代理收集经验并重新尝试失败的任务，直到它在特定任务上产生连续3次失败的尝试。自然地，由于CoT(GT)能够接触到问题的基本真值背景，因此获得了更高的正确率分数。尽管如此，CoT(GT)智能体仍有39 %的问题无法正确推理出正确答案，但Reflex帮助智能体在没有获得真实答案的情况下改正其错误，使其准确率提高了14%。</p><p><img src="../images/20231123-01/pasted-7.png" alt="upload successful" /></p><p>图4：思想链(COT)与ReAct。在100个HotPotQA问题上，Reflexion提高了搜索、信息检索和推理能力。(a) Reflexion ReAct vs Reflexion CoT (b)只进行推理的Reflexion CoT(GT) (c) Reflexion vs情景记忆消融。</p><h3 id="4-3-编程">4.3 编程</h3><p>我们在MBPP[ 2 ]，HumanEval [ 6 ]和我们的新数据集LeetcodeHardGym上评估了在Python和Rust代码上编写的基线和Reflex方法。MBPP和HumanEval度量函数给出了人体生成精度的自然语言描述。我们使用基准语言编译器，MultiPL-E [ 4 ]将Human Eval和MBPP的子集翻译成Rust语言。MultiPL-E是一个小型编译器的集合，可用于将Python基准题翻译成18种其他语言。我们包括Rust代码生成的实验，以证明Reflexion代码生成的实现是语言无关的，可以用于解释和编译语言。最后，我们介绍了一个新的基准测试程序LeetcodeHardGym，它是一个交互式编程训练器，包含40个Leetcode硬评分问题，这些问题在2022年10月8日之后发布，这也是GPT-4的预训练截止日期[ 18 ]。</p><p>编程的任务提供了一个独特的机会，可以使用更接地气的自我评估实践，如自我生成的单元测试套件。因此，我们基于Reflexion的编程任务实现可以满足pass@1的准确性报告。为了生成测试集，我们使用思维链提示[ 26 ]来产生多样化的、广泛的测试以及相应的自然语言描述。然后，我们通过尝试为每个测试构造一个有效的抽象语法树(AST)来过滤语法上有效的测试语句。最后，从生成的单元测试集合中采样n个测试，生成一个测试集T，记为{ t0，t1，..，tn }。我们将n设置为最多6个单元测试。除了单元测试套件组件外，Reflexion编程代理的学习循环设置与最大内存限制为1经验的推理和决策代理完全相同。</p><p><img src="../images/20231123-01/pasted-8.png" alt="upload successful" /></p><p>表1：各种模型-策略-语言组合的Pass@1准确率。基本策略是单个代码生成样本。所有基于指令的模型都遵循零样本代码生成。</p><p><img src="../images/20231123-01/pasted-9.png" alt="upload successful" />表2：HumanEval和MBPP的总体精度和测试生成性能。对于Rust问题，从HumanEval Python翻译成Rust问题的MultiPL-E[ 4 ]中，HumanEval是最难的50个问题。TP：单元测试合格，解决方案合格；FN：单元测试失败，解决方案通过；FP：单元测试通过，解决方案失败；TN：单元测试失败，解决方案失败。</p><p><strong>结果</strong> 除了MBPP Python 1外，Reflex在Python和Rust的所有基准上都超过了所有基线精度，并制定了新的最先进的标准。我们进一步研究了Reflexion在MBPP Python上的性能劣势。</p><p><strong>分析</strong> 我们承认，自我反思的代码生成代理势必会影响他们编写多样化、综合测试的能力。因此，在模型生成片状测试集的情况下，有可能所有的测试都传递了错误的解决方案，并导致代码补全上的假阳性标签[ 11 ]。另一方面，如果模型产生了错误编写的测试套件，则有可能导致部分测试在正确的解决方案上失败，从而导致以假阴性代码补全为条件的自我反思的产生。考虑到Reflexion的实现，假阴性比假阳性更受欢迎，因为代理可以使用自我反思来识别错误的测试，并提示自己保持原始代码的完整性。另一方面，如果一个无效的测试集返回一个假阳性完成(内部测试用例全部通过,但执行不正确)，则代理将过早地报告一个无效的提交。在2中，测量了各种条件，以分析超过pass@1精度的性能。之前，我们在MBPP Python上展示了Reflexion相对于基准GPT-4的劣势。在2中，我们观察到由内部测试执行产生的假阳性标签之间的显著差异，P(未通过@1次生成正确|通过)。它表示一个提交通过了所有的单元测试之后失败的概率。对于HumanEval和MBPP Python，基线pass@1准确率比较接近，分别为82%和80%。然而，MBPP Python的假阳性测试执行率为16.3%，而HumanEval Python的假阳性测试执行率仅为1.4%，总体准确率为91% (1)。</p><p><img src="../images/20231123-01/pasted-10.png" alt="upload successful" />表3：以GPT-4为基准模型的Reflexion方法在Human Eval Rust - 50最难问题上各种折衷方法的Pass@1精度</p><p><strong>消融研究</strong> 我们在50个最难的Human Eval Rust问题的子集上测试了测试生成的Reflexion和自反思合作的复合方法。我们的Rust编译环境提供了冗长的错误日志和有用的调试提示，因此为妥协方法提供了一个很好的场地。首先，我们省略了内部测试的生成和执行步骤，即在没有当前实现的指导下测试代理进行自我反思。3的准确率低于52% vs 60% (基线)，这表明在没有单元测试的情况下，代理无法确定当前的实现是否正确。因此，代理必须参与运行的所有迭代，而没有提前返回的选项，对实现进行有害的编辑。</p><p>接下来，我们通过省略单元测试集评估失败后的自然语言解释步骤来检验自我反思的贡献。直观地说，这挑战了代理在所有失败的单元测试中结合错误识别和实现改进的任务。有趣的是，被妥协的代理并没有在基线运行时提高性能。我们观察到，测试生成和代码编译步骤能够捕捉到语法和逻辑错误，但实现修复并不能反映这些迹象。这些实证结果表明，最近提出的一些没有自我反思的盲目试错调试技术的工作，对于诸如在Rust中编写复杂程序等更难的任务是无效的。</p><h2 id="5-局限性">5. 局限性</h2><p>Reflexion 是一种使用自然语言进行策略优化的优化技术。策略优化是一种通过经验来改进行动选择的有力方法，但它仍然可能屈从于非最优的局部极小值解。在这项研究中，我们将长期记忆限制在具有最大容量的滑动窗口中，但我们鼓励未来的工作用更高级的结构来扩展Reflexion 的记忆组件，例如向量嵌入数据库或传统的SQL数据库。具体到代码生成，测试驱动开发在指定精确的输入输出映射方面存在许多实际限制，例如非确定性的生成器函数、与API交互的不纯函数、根据硬件规格改变输出的函数，或者调用可能难以预测的并行或并发行为的函数。</p><h2 id="6-更广泛的影响">6. 更广泛的影响</h2><p>大型语言模型越来越多地被用来与外界环境(例如互联网、软件、机器人等。)和人类进行交互。我们的工作具有加强和增强这些代理的潜力，以提高自动化程度和工作效率，但同时也放大了这些代理被误用时的风险。我们相信，这一方向的研究将需要在安全和伦理方面付出更多的努力。</p><p>另一方面，强化学习受到其黑盒策略和优化设置的影响，其中可解释性和对齐一直是具有挑战性的。我们提出的&quot;口头&quot;强化学习可能会解决一些问题，并使自主代理更具可解释性和可诊断性。例如，在人类难以理解的工具使用情况下，可以在使用工具之前监测自我反思，以确保正确的意图。</p><h2 id="7-结论">7. 结论</h2><p>在这项工作中，我们提出了一种利用言语强化的方法--Reflexion，它可以教代理从过去的错误中学习。我们的经验表明，通过利用自我反思，Reflexion 代理显著优于目前广泛使用的决策方法。在未来的工作中，Reflexion 可以用来使用在传统RL环境中被深入研究的更先进的技术，例如自然语言中的值学习或非策略探索技术。</p><h2 id="8-重复性">8. 重复性</h2><p>我们强烈建议其他人在运行自主代码编写实验时使用孤立的执行环境，因为生成的代码在执行之前没有经过验证。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;反射：言语强化学习的语言代理&lt;/h1&gt;
&lt;p&gt;原论文：&lt;a href=&quot;http://arxiv.org/abs/2303.11366&quot;&gt;Reflexion: Language Agents with Verbal Reinforcement Learning&lt;/a&gt;&lt;/</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond</title>
    <link href="https://www.aweisite.top/posts/7417c6fb.html"/>
    <id>https://www.aweisite.top/posts/7417c6fb.html</id>
    <published>2023-11-23T19:51:00.000Z</published>
    <updated>2026-06-11T09:31:37.278Z</updated>
    
    <content type="html"><![CDATA[<h1>在实践中利用LLMs的能力：对Chatgpt和更大范围的调研</h1><p>原论文：<a href="http://arxiv.org/abs/2304.13712"><em>Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond</em> </a></p><p>本文为从事大型语言模型( Large Language Models，LLMs )工作的从业者和最终用户在其下游自然语言处理( Natural Language Processing，NLP )任务中提供了一个全面而实用的指南。我们从模型、数据和下游任务的角度对LLMs的使用提供了讨论和见解。首先，我们对现有的GPT型和BERT型LLM进行了简单的介绍和总结。然后，我们讨论了预训练数据、训练数据和测试数据的影响。最重要的是，我们对各种自然语言处理任务的大型语言模型的使用和非使用情况进行了详细的讨论，例如知识密集型任务、传统的自然语言理解任务、自然语言生成任务、突现能力和注意事项</p><h2 id="1-INTRODUCTION-导语">1. INTRODUCTION 导语</h2><p>近年来，大语种模型的快速发展使自然语言处理领域发生了革命性的变化。这些强大的模型在解决各种各样的NLP任务方面表现出了巨大的潜力，从自然语言理解( NLU )到生成任务，甚至为人工智能( AGI )铺平了道路。然而，有效和高效地利用这些模型需要对它们的能力和局限性以及NLP中涉及的数据和任务有实际的了解。</p><p>为了给分区者和最终用户提供指导，本工作重点关注在下游NLP任务中使用LLM的实际方面。该指南旨在为给定任务为什么选择LLM或为什么不选择LLM提供实用的建议，并就如何选择最合适的LLM提供指导，同时考虑到模型大小、计算要求和特定领域预训练模型的可用性等因素。这项工作从实践的角度提供了对LLMs的透彻理解，因此，为实践者和最终用户提供了成功利用LLMs的力量来完成自己的NLP任务所需的实用知识。</p><p>本文的结构如下。首先，本文通过讨论最重要的模型（例如 GPT 类和 BERT 类架构）来简要介绍 LLM。然后，我们从数据角度深入研究影响模型性能的关键因素，包括预训练数据、训练/调优数据和测试数据。最后也是最重要的是，我们深入研究各种具体的 NLP 任务，深入了解LLMs对知识密集型任务、传统 NLU 任务和生成任务的适用性，以及这些模型拥有的新兴能力和挑战现实场景的能力。我们提供详细的示例来强调LLMs在实践中的成功用例和局限性。</p><p>为了分析大型语言模型的能力，我们将它们与微调模型进行比较。截至目前，LLMs和微调模型还没有普遍认可的定义。考虑到实用性，在我们的文章中，它们的定义是：LLM是在大量数据集上预训练的巨大语言模型，无需针对特定任务调整数据；微调模型通常是较小的语言模型，它们也经过预训练，然后在较小的特定于任务的数据集上进一步调整，以优化其在该任务上的性能1。</p><p>本文总结了以下使用LLMs的主要实用指南：</p><p>• 自然语言理解。当面对分布外数据或训练数据很少时，可以利用LLMs卓越的泛化能力。</p><p>• 自然语言生成。利用LLMs的能力为各种应用程序创建连贯、上下文相关且高质量的文本。</p><p>• 知识密集型任务。利用LLMs中存储的广泛知识来完成需要特定领域专业知识或一般世界知识的任务。</p><p>• 推理能力。理解并利用LLMs的推理能力来改善各种情况下的决策和问题解决。</p><h2 id="2-PRACTICAL-GUIDE-FOR-MODELS-模型实用指南">2. PRACTICAL GUIDE FOR MODELS 模型实用指南</h2><p>本节简要介绍最先进的LLMs。这些模型的训练策略、模型架构和用例有所不同。为了更清楚地了解 LLM 轮廓，我们将它们分为两种类型：编码器-解码器（encoder-decoder)或仅编码器(decoder-only)语言模型和仅解码器语言模型。在图1中，我们展示了语言模型的详细演化过程。从进化树中，我们得出以下有趣的观察：</p><p><img src="../images/20231123-01/pasted-1.png" alt="upload successful" /></p><p>图1. 现代LLMs的进化树追溯了近年来语言模型的发展，并重点介绍了一些最著名的模型。同一分支上的模型关系更密切。基于 Transformer 的模型以非灰色显示：仅解码器模型在蓝色分支中，仅编码器模型在粉色分支中，编码器-解码器模型在绿色分支中。模型在时间线上的垂直位置代表其发布日期。开源模型由实心方块表示，而闭源模型由空心方块表示。右下角的堆积条形图显示了来自各个公司和机构的模型数量。</p><p>a) 仅解码器模型已逐渐主导LLMs的发展。在LLMs发展的早期阶段，仅解码器模型并不像仅编码器和编码器-解码器模型那么流行。然而，2021 年之后，随着改变游戏规则的 LLM - GPT-3 的引入，仅解码器模型经历了显着的繁荣。与此同时，在 BERT 带来最初的爆炸性增长之后，仅编码器的模型逐渐开始消失。</p><p>b) 无论是当前还是未来，OpenAI 始终保持其在LLMs领域的领先地位。其他公司和机构正在努力赶上 OpenAI 开发与 GPT-3 和当前 GPT-4 相当的模型。这一领先地位可能归功于 OpenAI 对技术道路的坚定承诺，即使最初并未得到广泛认可。</p><p>c) Meta 对开源LLMs做出了重大贡献，并促进了LLMs的研究。在考虑对开源社区的贡献，特别是与LLMs相关的贡献时，Meta 脱颖而出，成为最慷慨的商业公司之一，因为 Meta 开发的所有LLMs都是开源的。</p><p>d) LLMs表现出闭源的趋势。在LLM发展的早期阶段（2020年之前），大多数模型都是开源的。然而，随着 GPT-3 的引入，越来越多的公司选择闭源他们的模型，例如 PaLM、LaMDA 和 GPT-4。因此，学术研究人员对LLM培训进行实验变得更加困难。因此，基于 API 的研究可能成为学术界的主要方法。</p><h3 id="2-1-BERT类的语言模型：编码器-解码器或仅编码器">2.1 BERT类的语言模型：编码器-解码器或仅编码器</h3><p>自然语言数据很容易获得，并且无监督训练范例也已被提出以更好地利用极大的数据集，这促进了自然语言的无监督学习。一种常见的方法是在考虑周围上下文的同时预测句子中被掩盖的单词。这种训练范例被称为“掩码语言模型”。这种类型的训练使模型能够更深入地理解单词及其使用上下文之间的关系。这些模型使用 Transformer 架构等技术在大型文本语料库上进行训练，并在许多 NLP 任务（例如情感分析和命名实体识别）中取得了最先进的结果。掩码语言模型的著名示例包括 BERT [28]、RoBERTa [65] 和 T5 [84]。由于在广泛的任务中取得的成功，MLM 已成为自然语言处理领域的重要工具。</p><h3 id="2-2-GPT类的语言模型：仅解码器">2.2 GPT类的语言模型：仅解码器</h3><p>尽管语言模型在架构上通常与任务无关，但这些方法需要对特定下游任务的数据集进行微调。研究人员发现，扩展语言模型可以显着提高少样本甚至零样本的性能[16]。实现更好的少镜头和零显示性能的最成功的模型是自回归语言模型，它是通过在给定前面的单词的情况下生成序列中的下一个单词来训练的。这些模型已广泛用于文本生成和问答等下游任务。自回归语言模型的示例包括 GPT-3 [16]、OPT [126]、PaLM [22] 和 BLOOM [92]。游戏规则改变者 GPT-3 首次通过提示和上下文学习展示了合理的少样本/零样本性能，从而展示了自回归语言模型的优越性。</p><p>还有一些模型，例如针对代码生成等特定任务进行优化的 CodeX [2]，以及针对金融领域的 BloombergGPT [117]。最近的突破是 ChatGPT，它专门针对对话任务改进了 GPT-3，从而为各种现实世界的应用程序提供了更具交互性、连贯性和上下文感知能力的对话。</p><h2 id="3-PRACTICAL-GUIDE-FOR-DATA-数据实用指南">3. PRACTICAL GUIDE FOR DATA 数据实用指南</h2><p>在本节中，我们将讨论数据在为下游任务选择适当模型时所发挥的关键作用。数据对模型有效性的影响从预训练阶段开始，一直持续到训练和推理阶段。</p><pre><code>注1. (1) 在面对分布外数据的下游任务（例如对抗性示例和领域转移）中，LLM 比微调模型具有更好的泛化能力。 (2) 当处理有限的注释数据时，LLM 比微调模型更可取，并且当有丰富的注释数据可用时，根据具体任务要求，两者都是合理的选择。 (3) 建议选择在与下游任务相似的数据领域进行预训练的模型。</code></pre><h3 id="3-1-预训练数据">3.1 预训练数据</h3><p>预训练数据在大型语言模型的开发中起着至关重要的作用。作为LLMs卓越能力的基础[5, 47]，预训练数据的质量、数量和多样性显着影响LLMs的表现[124]。常用的预训练数据由大量文本源组成，包括书籍、文章和网站。这些数据经过精心整理，以确保全面代表人类知识、语言细微差别和文化观点。预训练数据的重要性在于它能够为语言模型提供对单词知识、语法、句法和语义的丰富理解，以及识别上下文和生成连贯响应的能力。预训练数据的多样性在塑造模型性能方面也起着至关重要的作用，LLM 的选择很大程度上取决于预训练数据的组成部分。例如，PaLM [22] 和 BLOOM [92] 在多语言任务和机器翻译方面表现出色，拥有丰富的多语言预训练数据。此外，PaLM 在问答任务中的表现通过纳入大量社交媒体对话和书籍语料库得到了增强 [22]。同样，GPT-3.5 (code-davinci-002) 的代码执行和代码完成功能通过将代码数据集成到其预训练数据集中而得到增强。简而言之，在为下游任务选择LLM时，建议选择在类似数据领域预训练的模型。</p><h3 id="3-2-数据微调">3.2 数据微调</h3><p>在为下游任务部署模型时，必须根据注释数据的可用性考虑三个主要场景：零样本、少样本和富样本。在本节中，我们简要概述了每种场景所采用的适当模型。</p><p><strong>零标注数据</strong>：在标注数据不可用的场景下，在零样本环境下使用LLMs被证明是最合适的方法。LLMs已经被证明优于以前的零样本方法[ 120 ]。此外，由于没有参数更新过程，避免了灾难性遗忘[ 49 ]，因为语言模型参数保持不变。</p><p><strong>少量标注数据</strong>：在这种情况下，少量样本直接被纳入LLMs的输入提示中，命名为语境学习，这些样本可以有效地指导LLMs泛化到任务中。正如文献[ 16 ]所报道的那样，单样本和少样本的性能获得了显著的提升，甚至与SOTA微调的开放域模型的性能相当。和通过缩放可以进一步提高LLMs的零/小样本能力[ 16 ]。另外，一些小样本学习方法被发明来增强微调模型，如元学习[ 56 ]或迁移学习[ 88 ]。然而，由于微调模型的规模较小和过拟合，与使用LLMs相比，性能可能较差。</p><p><strong>丰富的标注数据</strong>：对于一个特定的任务，有大量的标注数据，可以考虑微调模型和LLMs。在大多数情况下，对模型进行微调可以很好地拟合数据。虽然，LLMs可以用来满足隐私等一些约束[ 99 ]。在这种场景中，使用微调模型或LLM之间的选择是任务特定的，也取决于许多因素，包括期望的性能、计算资源和部署约束。</p><p>简言之：LLMs在数据可用性方面更具通用性，而微调模型可以考虑使用丰富的标注数据。</p><h3 id="3-3测试数据-用户数据">3.3测试数据/用户数据</h3><p>在为下游任务部署LLM时，由于测试/用户数据与训练数据的分布差异，我们经常面临挑战。这些差异可能包括域转移[ 132 ]，分布外变化[ 31 ]，甚至是对抗样本[ 82 ]。这些挑战严重阻碍了微调模式在实际应用中的有效性。它们拟合成特定的分布，对OOD数据的泛化能力较差。然而，面对这样的场景，LLMs表现得相当不错，因为它们没有明确的拟合过程。不仅如此，最近的进展也进一步增强了语言模型在这方面的能力。基于人类反馈的强化学习( RLHF )方法显著增强了LLMs的泛化能力[ 77 ]。例如，InstructGPT能够熟练地按照各种指令完成广泛的任务，偶尔遵守不同语言的指令，即使这样的指令很少。类似地，ChatGPT在大多数对抗和非分布( out-of- distribution，OOD )分类和翻译任务上表现出一致的优势[ 109 ]。其在理解对话相关文本方面的优势使其在用于OOD评估的医学诊断数据集DDXPlus [ 101 ]上获得了令人印象深刻的性能。</p><h2 id="4-PRACTICAL-GUIDE-FOR-NLP-TASKS-NLP任务实践指南">4. PRACTICAL GUIDE FOR NLP TASKS NLP任务实践指南</h2><p>在这一部分，我们详细讨论了LLM在各种下游NLP任务中的用例和无用例以及相应的模型能力。在图2中，我们将所有的讨论归纳为一个决策流。它可以作为面对任务时快速决策的指南。</p><h3 id="4-1-传统NLU任务">4.1 传统NLU任务</h3><p>传统的NLU任务是NLP中的一些基础任务，包括文本分类、命名实体识别( NER )、蕴含预测等。其中许多被设计为在更大的人工智能系统中充当中间步骤，例如用于知识图谱构建的NER。</p><p><img src="../images%5C20231123-01/pasted-2.png" alt="upload successful" /></p><p>图2 .用户NLP应用选择LLM或微调模型的决策流程( 2 )。决策流帮助用户评估其手头的下游NLP应用是否满足特定条件，并根据该评估确定LLM或微调模型是否最适合其应用。图中决策过程中，Y表示满足条件，N表示不满足条件。最后一个条件的Y的黄圈表示在这种应用中没有模型能很好地工作。</p><pre><code>注2. 在传统的NLU任务中，微调模型通常是比LLMs更好的选择，但LLMs在要求强泛化能力的同时可以提供帮助。</code></pre><h4 id="4-1-1-无使用案例">4.1.1 无使用案例</h4><p>在大多数自然语言理解任务中，如GLUE [ 106 ]和SuperGLUE[ 105 ]中的任务，如果这些任务具有丰富的标注数据，并且在测试集上包含非常少的非分布示例，那么微调后的模型仍然具有更好的性能。对于不同的任务和数据集，小的微调模型和LLM之间的差距是不同的</p><p>在文本分类中，在大多数数据集上，LLMs的表现略差于微调模型。对于情感分析，例如在IMDB [ 69 ]和SST [ 94 ]上，微调模型和LLM同样表现良好。对于另一个标志性的文本分类任务--毒性检测，差距要大得多。所有的LLM都不能很好地完成这个任务，在Civil Comments [ 13 ]上即使是最好的也只比随机猜测好[ 59 ]。另一方面，大多数受欢迎的微调模型可以获得更好的性能[ 33 ]，而Perspective API 3仍然是检测毒性的最佳方法之一。该API由基于BERT的多语言模型驱动，该模型基于公开的毒性数据和从该模型中提取的几个较小的单语言CNN进行调优。这可能是由于毒性是通过语言表达中的细微差别来定义的，而大型语言模型无法仅根据提供的输入准确地理解这项任务。</p><p>在其他一些任务中，性能差距的趋势也类似。对于自然语言推理( Natural Language Inference，NLI )任务，在大多数数据集上，如RTE [ 106 ]和SNLI [ 14 ]上，微调模型表现优于LLMs，而在一些数据集上，如CB [ 105 ]，LLMs获得了与微调模型相当的性能[ 22 ]。</p><p>对于问答( QA )，在SQuADv2 [ 86 ]、QuAC [ 21 ]等数据集上，微调模型具有优越的性能，而在CoQA [ 87 ]上，LLMs表现与微调模型相当[ 22 ]。</p><p>在信息检索( Information Retrieval，IR )任务中，LLMs尚未得到广泛的应用。其中一个主要原因是IR任务与其他任务有着根本的不同。没有一种自然的方法可以将成千上万的候选文本转换成LLMs所要求的少量/零样本形式。现有关于MS MARCO ( Regular / TREC ) [ 73 ]的评估结果表明，基于微调模型的方法具有更好的性能[ 59 ]。在这种评估中，LLMs以一种非正统的方式对通道进行排序，这要求LLMs逐个为通道产生概率。</p><p>对于一些不针对普通用户而是针对高层任务的低层次中间任务，如命名实体识别( NER )、依存句法分析等，LLMs的结果并不充分，因为目前对LLMs的评价大多集中于实际任务。根据现有的评估结果，对于NER任务，Co NLL03 [ 89 ]仍然是LLMs的一个挑战[ 81 ]，其中微调模型的性能大约是LLMs的两倍。这些中间任务可能很快消失，因为LLMs可以在没有这些中间任务(例如,编码任务的依存句法分析;一些文本生成任务的NER)的帮助下接管高级任务。</p><p>总之，对于大多数传统的NLU任务，从基准数据集上的性能和计算成本来看，微调模型是一个更好的选择。LLMs的尺度通常比微调模型大10 ×甚至100 ×。LLMs在某些任务上表现不佳的一个可能原因是指令/提示的设计。将IR和句子标注等任务的输入转化为少/零短指令形式是非平凡的。未来可能有更好的方法将语言模型适配到传统的NLP任务中。另一方面，微调模型的能力上限尚未达到，一些方法如FLAN - tuning [ 67 ]可以进一步提升NLU任务的性能。另一个有趣的发现是，在NLU任务上，经过微调后，</p><h4 id="4-1-2-使用案例。然而，仍有一些NLU任务适用于LLMs">4.1.2 使用案例。然而，仍有一些NLU任务适用于LLMs</h4><p>其中一个代表性的任务是杂项文本分类[ 59 ]。与经典的特定领域文本分类任务(如情感分析)不同，繁杂的文本分类处理的是各种各样的主题和类别，这些主题和类别之间可能没有明确或强烈的关系。使用微调后的模型更接近真实世界的情况，并且难以格式化。另一个是对抗的Nli ( Anli ) [ 74 ]。它是由3轮( R1、R2、R3)中对抗式挖掘的自然语言推理问题组成的困难数据集。LLMs在ANLI上表现出了优越的性能，尤其是在R3和R2上。这两个例子都证明了LLMs在传统NLP任务中对分布外和稀疏标注数据的良好泛化能力，超过了微调模型。我们在3.3节以上对此进行了讨论。</p><h3 id="4-2生成任务">4.2生成任务</h3><p>自然语言生成大致包括两大类任务，其目标是创建连贯的、有意义的和上下文相关的符号序列。第一类方法侧重于将输入文本转换为新的符号序列，例如段落摘要和机器翻译等任务。第二类是&quot;开放式&quot;生成，旨在从头开始生成文本或符号，以准确匹配输入描述，如制作电子邮件、撰写新闻文章、创建虚构故事和编写代码。</p><pre><code>注3. 由于LLMs具有较强的生成能力和创造力，在大多数生成任务上表现出优势。</code></pre><h4 id="4-2-1用例。生成任务要求模型对输入内容或需求有全面的理解，并具有一定的创造性。这正是LLMs擅长的">4.2.1用例。生成任务要求模型对输入内容或需求有全面的理解，并具有一定的创造性。这正是LLMs擅长的</h4><p>对于摘要任务，虽然在传统的自动评价指标下，如ROUGE [ 60 ]，LLMs与微调模型相比并没有明显的优势，但是人类的评价结果表明，与微调模型相比，人类更倾向于使用LLMs [ 38、127 ]生成的结果。例如，在CNN / Daily Mail [ 71 ]和XSUM [ 72 ]上，Brio [ 66 ]和Pegasus [ 125 ]等微调模型的性能远远优于其他LLM。ROUGE，但是像OPT [ 126 ]这样的LLMs在人的评价方面表现得更好，包括忠实性，连贯性和相关性[ 127 ]。这说明了LLMs在摘要任务中的优越性。另一方面，这也意味着当前的摘要基准并不包含高质量的摘要，或者自动度量指标不适合摘要的评价。</p><p>在机器翻译( MT )中，LLMs可以执行有能力的翻译，尽管平均性能略差于一些商业翻译工具[ 45 ]，考虑到一些自动度量，如BLEU [ 78 ]。LLMs特别擅长将一些低资源语言文本翻译成英文文本，如在WMT'16的罗马尼亚语-英文翻译中[ 11 ]，零样本或少样本的LLMs比SOTA微调模型表现更好[ 22 ]。这主要是由于英语资源构成了预训练数据的主要部分。BLOOM [ 92 ]在更多的多语种数据上进行预训练，在资源丰富和资源匮乏的翻译中都取得了更好的翻译质量。另一个有趣的发现是，BLOOM在罗曼司语言中取得了很好的翻译质量，即使是来自加利西亚语的翻译，也没有包含在预训练数据中。一个合理的解释是，来自同一语言组的一些语言的文本可以帮助LLM从相似性中学习更多。如果能在预训练数据中加入更多的多语种文本，翻译能力可能会进一步提高。</p><p>此外，LLMs在开放式一代中具有很高的技能。一个例子是LLMs生成的新闻文章与人类真实的新闻文章几乎无法区分[ 16 ]。LLMs也非常适合于代码合成。无论是在文本代码生成方面，如HumanEval [ 18 ]和MBPP [ 7 ]，还是在代码修复方面，如DeepFix [ 39 ]，LLMs都能取得很好的效果。GPT-4甚至可以通过Leetcode中25 %的问题，这对于大多数人类编码员来说已经足够称道[ 76 ]。随着对更多编码数据的训练，LLMs的编码能力可以进一步提高[ 22 ]。在这些任务上表现良好的同时，LLMs生成的代码应该经过仔细的测试，以找出任何细微的错误，这也是LLMs应用于代码合成的主要挑战之一。</p><h4 id="4-2-2-无用例。">4.2.2 无用例。</h4><p>经过微调的模型，如DeltaLM + Zcode [ 118 ]，在大多数资源丰富的翻译和资源极低的翻译任务上仍然表现最好。在资源丰富的机器翻译中，微调模型略优于LLMs [ 22、92 ]。而在资源极低的机器翻译中，如英语-哈萨克语翻译，微调模型的表现明显优于LL</p><h3 id="4-3-知识密集型任务">4.3 知识密集型任务</h3><p>知识密集型NLP任务是指对背景知识、特定领域专业知识或一般现实世界知识具有较强依赖性的一类任务。这些任务超越了简单的模式识别或语法分析。并且它们高度依赖于对特定实体、事件和我们现实世界的常识的记忆和正确利用。</p><pre><code>注4. (1) LLMs因其海量的真实世界知识而擅长知识密集型任务。(2)当知识需求与学习到的知识不匹配时，或者当他们面对只需要上下文知识的任务时，LLMs就会挣扎，在这种情况下，微调模型可以和LLMs一样工作。</code></pre><h4 id="4-3-1-用例。一般而言，在数十亿的训练token和参数下，LLMs比微调模型拥有更多的真实世界知识。">4.3.1 用例。一般而言，在数十亿的训练token和参数下，LLMs比微调模型拥有更多的真实世界知识。</h4><p>封闭式问答任务要求模型在没有任何外部信息的情况下回答关于事实性知识的给定问题。它确实需要对模型中的真实世界知识进行记忆。LLM在几乎所有的数据集上都有较好的表现，比如在NaturalQuestions [ 52 ]、WebQuestions [ 9 ]和TriviaQA [ 46 ]上。在Trivia QA上，即使是零样本的LLM也要好很多[ 22 ]。</p><p>大规模多任务语言理解( MMLU ) [ 40 ]也是知识密集型的。它包含跨越57个不同科目的多项选择题，要求具备模型的一般知识。尽管新发布的GPT - 4 [ 76 ]在英语中比现有模型有相当大的提升，达到了令人满意的86.5 %的准确率，但即使对于LLMs也是相当具有挑战性的。</p><p>此外，Big-bench [ 96 ]中的一些任务严重依赖于对现实世界知识的记忆，这些任务旨在探测LLM并推断其未来能力。在此类任务中，部分LLM的表现优于人类平均水平，甚至与人类最佳表现相当。例如，任务Hindu _ knowledge需要模型给出有关印度教神话的事实，Periodic Elements需要从元素周期表中预测元素名称的能力，Physical通过询问解决给定物理问题所需的公式来测试模型的物理知识。</p><h4 id="4-3-2-无用例。还有一些任务需要的知识与LLM学习的知识不同。所需的知识并不是LLM学习到的关于真实世界的知识。在这类任务中，LLMs并不具有显著优势。">4.3.2 无用例。还有一些任务需要的知识与LLM学习的知识不同。所需的知识并不是LLM学习到的关于真实世界的知识。在这类任务中，LLMs并不具有显著优势。</h4><p>有些任务只需要模型捕获上下文中自包含的知识。来自输入的上下文中的知识足以让模型做出预测。对于这些任务，小的微调模型可以很好地工作。其中之一就是机器阅读理解( MRC )。MRC任务提供若干个段落，并要求模型根据这些段落预测问题的答案。我们在上一节已经讨论了MRC，因为它也是一个传统的NLU任务。</p><p>另一种情况是LLMs内关于真实世界的知识对任务无用，甚至所需知识对真实世界是反事实的。因此，LLMs不能很好地完成这些任务。在某些情况下，不一致的知识甚至会使LLMs比随机猜测更糟糕。例如，在Big - Bench中，Mnist ascii任务要求模型说出ASCII艺术所代表的数字。这项任务所需要的能力与真实世界的知识无关。此外，在逆尺度现象竞赛[ 70 ]中，任务重新定义数学重新定义了一个共同的符号，并要求模型在原始意义和重新定义衍生的意义之间进行选择。它所要求的与LLMs的知识形成对比，因此LLMs的表现甚至比随机猜测更差。</p><p>作为LLMs中真实世界知识的替代，允许获取额外的知识，模型可以通过检索增强获得足够的任务知识。检索增强的基本思想是在进行预测之前增加一个额外的信息检索步骤，在这个步骤中，一些与任务相关的有用文本将从大型语料库中检索出来。然后，模型将根据输入的上下文和检索到的文本进行预测。有了检索到的额外信息，闭卷任务可以变成&quot;开卷&quot;。在这样的场景下，微调的模型以更小的尺寸非常好，因为所需的知识可以通过检索获得。例如，在NaturalQuestions [ 52 ]上，在有额外语料的情况下，检索增强模型[ 44、48]明显优于其他方法。</p><h3 id="4-4-规模化能力">4.4 规模化能力</h3><p>LLMs (例如参数、训练计算等。)的扩展可以极大地增强预训练语言模型的能力。随着模型规模的扩大，一个模型通常在一系列任务中变得更有能力。反映在一些度量指标上，性能表现出与模型规模的幂律关系。例如，用于衡量语言建模性能的交叉熵损失随着模型规模的指数增长而线性下降，也被称为&quot;定标关系&quot; [ 41、47 ]。对于一些至关重要的能力，如推理，模型的扩展使这些能力从非常低的状态逐渐转化为可用状态，甚至接近人类的能力。在本节中，我们从LLMs的能力和行为随尺度变化的角度概述了LLMs的使用情况。</p><pre><code>注5. (1)随着模型规模的指数增长，LLMs变得特别具有推理能力，如算术推理和常识推理。(2)随着LLMs规模的扩大，涌现能力成为使用的偶然性，如单词操纵能力和逻辑能力。(3)在很多情况下，由于对大型语言模型的能力随着规模的扩大而变化的理解有限，性能并没有随着规模的扩大而稳步提高。 </code></pre><h4 id="4-4-1-推理用例。">4.4.1 推理用例。</h4><p>推理是人类智能的重要方面之一，涉及信息的感知、推理和决策。这对于NLP来说是一个挑战。现有的许多推理任务可以分为常识推理和算术推理。</p><p><strong>算术推理/问题解决。</strong>  LLMs的算术推理能力很大程度上得益于模型规模的缩放。对于GPT-3来说，只有当参数个数超过13B时，两位加法的能力才变得明显[ 16 ]。测试算术推理的任务对于人类来说是微不足道的，旨在挑战将自然语言转化为数学符号和多步推理的能力。在GSM8k [ 26 ]，SVAMP [ 79 ]和AQuA [ 61 ]上，LLMs作为通才，与大多数具有特定任务设计的方法具有竞争性的性能。和GPT-4超越了任何其他方法[ 76 ]，甚至是一些专门针对算术问题的大型模型[ 104 ]。然而，值得注意的是，在没有外部工具干预的情况下，LLMs在执行基本计算时可能偶尔会出错，尽管思维链( CoT )提示[ 115 ]可以显著提高LLMs的计算能力。</p><p><strong>常识性推理。</strong> 常识性推理不仅要求LLM记忆事实性知识，还要求LLM对事实做若干推理步骤。常识推理随着模型规模的增长而逐渐增加。相比于微调模型，LLMs在大多数数据集上保持了优势，如Strategy QA [ 36 ]和ARC - C [ 25 ]。特别是在3 - 9年级理科考试中包含较难题目的ARC - C上，GPT - 4的成绩已经接近100 % ( 96.3 % ) [ 76 ]。</p><h4 id="4-4-2-具有突现能力的用例。">4.4.2 具有突现能力的用例。</h4><p>模型的尺度化也赋予了模型超越幂律法则的一些前所未有的、奇妙的能力。这些能力被称为&quot;突现能力&quot;。正如[ 113 ]中定义的，LLMs的突现能力是指在小规模模型中不存在的能力，但在大规模模型中存在的能力。这意味着这种能力无法通过外推较小规模模型的性能提升来预测，一旦规模超过一定范围，模型在某些任务上突然获得了良好的性能。突现能力通常是不可预测和令人惊讶的，导致任务随机或意外地出现。我们考察了LLMs突现能力的具体实例，并将其作为决定是否利用LLMs突现能力的重要参考。</p><p>处理单词操作是一种典型的涌现能力。它指的是学习符号操作的能力，例如反向单词[ 16 ]，其中模型被赋予一个反向拼写的单词，并且必须输出原始单词。例如。GPT-3 [ 16 ]显示了对单词排序和单词解读任务的突现能力。PaLM [ 22 ]在ASCII词识别4和倒装法5任务上表现出了突现能力。语言模型的逻辑能力往往会随着模型规模的扩大而显现出来，如逻辑推理、逻辑序列、逻辑网格之谜等。此外，其他任务，如高级编码(例如,自动调试、代码行描述等)、概念理解(例如,新颖的概念、简单的图灵概念等)等，也是具有大型语言模型涌现能力的用例。</p><h4 id="4-4-3-无用例与理解。尽管在大多数情况下，如前所述，较大的模型带来更好的性能，但在选择合适的模型时仍有许多例外情况需要考虑。">4.4.3 无用例与理解。尽管在大多数情况下，如前所述，较大的模型带来更好的性能，但在选择合适的模型时仍有许多例外情况需要考虑。</h4><p>在某些任务上，随着LLMs规模的增加，性能开始下降，如Redefine-math：测试语言模型在被重新定义为其他含义时，是否能够与普通符号一起工作；Intothe-unknown：要求模型选择哪条信息有助于回答某个问题；Memo-trap：要求LM以类似名言的方式开始写短语，但以不同的方式结束。这也被称为逆标度现象(inverse scaling phenomenon)。在LLMs的缩放过程中观察到的另一个有趣的现象被称为U型现象[ 114 ]。顾名思义，这种现象指的是随着LLM规模的增加，他们在某些任务上的表现最初提高，然后开始下降，最后再提高，例如：Hindsight-neglect：它测试语言模型是否能够根据其期望值来评估赌注是否值得采取；NegationQA：该任务采用现有的多项选择数据集，对每个问题的一部分进行否定，看语言模型是否对否定敏感；Quote-repetition：它要求模型重复提示中给出的句子，用少量的例子来帮助它识别任务。因此，应该注意到绩效递减的风险，如果任务与我们刚才讨论的类似，则需要仔细考虑是否使用大型的LLM。</p><p>深入理解LLMs中的涌现能力、逆标度现象和U型现象(inverse scaling phenomenon)对于推进该领域的研究至关重要。从某种意义上说，&quot; U &quot;形现象表明，小尺度模型和大尺度模型的预测具有不同的内在机制。从这个角度来看，U型现象可以被看作是逆标度现象的一种转化，这是由于足够大的模型具有某种突现能力[ 114 ]。GPT-4 [ 76 ]在某些情况下表现出逆标度现象的反转，例如在一个名为Hindsight Neglect的任务上。对于LLMs在尺度缩放过程中的这些行为的解释仍然是一个开放的问题。已有研究提出了几个假设。对于突现能力，一种解释是一个任务可能有多个关键步骤，LLM不能处理这个任务，直到它足够大来处理每个步骤；另一种解释是集中在评估度量的粒度上[ 113 ]。对于逆尺度现象和&quot; U &quot;形现象，解释主要集中在模型过度依赖先验信息而非输入提示、有效但误导性的小样本、分心困难任务中较容易的任务等方面[ 114 ]。</p><h3 id="4-5-杂项任务">4.5 杂项任务</h3><p>本部分探讨了以往讨论中无法涉及的杂项任务，以更好地理解LLMs的优势和劣势。</p><pre><code>注6 (1)微调模型或指定模型在距离LLMs预训练目标和数据较远的任务中仍有空间。(2) LLMs在模拟人类、数据标注和生成方面表现优异。它们也可以用于NLP任务中的质量评估，并具有可解释性等优点。</code></pre><p>尽管LLMs在各种自然语言处理任务中取得了显著的成功，但其在回归任务中的表现却不尽如人意。例如，ChatGPT在评价句子相似度的回归任务GLUE STS-B数据集上的表现不如微调后的罗伯塔[ 130 ]。回归任务通常涉及预测连续值而不是离散标签，这对LLMs提出了独特的挑战。导致他们表现不佳的一个主要原因是语言建模目标和回归任务目标之间的固有差异。LLMs旨在预测序列中的下一个单词或生成连贯的文本，其预训练侧重于捕获语言模式和关系。因此，它们的内部表示可能不适合于建模连续的数值输出。此外，LLMs主要在文本数据上进行训练，侧重于捕获自然语言处理的复杂性。因此，它们在处理文本、图像、音频、视频、动作和机器人等多种数据类型的多模态数据方面的性能仍有待探索。而经过微调的多模态模型，如BEiT [ 110 ]和PaLI [ 19 ]，仍然主导着视觉问答( VQA )和图像描述等任务。尽管如此，最近推出的GPT - 4 [ 76 ]已经迈出了多模态融合的步伐，但仍缺乏对其能力的详细评估。</p><h4 id="4-5-2用例。LLMs特别适用于某些任务。">4.5.2用例。LLMs特别适用于某些任务。</h4><p>LLMs非常擅长模仿人类，充当聊天机器人，执行各种任务。LLMs驱动的ChatGPT以其在与人类的多次对话中的一致性、可靠性、信息性和鲁棒性而令人惊讶。人的反馈过程在这种能力的获得中起着重要的作用。</p><p>LLMs既可以作为良好的注释器，也可以作为数据生成器进行数据扩充，如in [ 27,29,99,121,122]。在一些任务中，一些LLM已经被发现和人类注释器一样好[ 37 ]。并且从GPT3.5 ( text-davinci技术- 003 )中收集的文本已经被用作类似人类的指令跟随演示来训练其他语言模型[ 100 ]。</p><p>LLMs还可以用于一些NLG任务的质量评估，如摘要和翻译。在摘要任务中，GPT - 4作为评价者与人类的相关度比其他方法高，且具有较大的裕度[ 64 ]。其他一些基于LLMs [ 34、50、64、108]的评估者在更多的NLG任务中也表现出良好的人体对齐效果，尤其是与传统的自动度量相比。但LLM评价者可能对LLM生成的文本存在偏见[ 64 ]。</p><p>此外，正如我们上面所讨论的，LLMs的一些能力除了性能提升之外还带来了额外的好处，比如可解释性。LLMs的CoT推理能力可以展示一个LLM是如何达到预测的，这在实例层面上是一个很好的解释，同时也提高了性能。</p><h3 id="4-6-现实世界的-任务">4.6 现实世界的&quot;任务&quot;</h3><p>在本节的最后一部分，我们想讨论LLMs和微调模型在现实&quot;任务&quot;中的使用。我们松散地使用&quot;任务&quot;一词，因为现实世界的场景往往缺乏像学术界那样格式良好的定义。许多对模型的请求甚至不能作为NLP任务处理。模型从三个角度在现实世界中面临挑战：</p><p>• <strong>噪声/非结构化输入。</strong> 真实世界的输入来自真实世界的非专家。他们对如何与模型交互知之甚少，甚至不能流利地使用文本。因此，与那些用于预训练或微调的格式良好的数据不同，现实世界的输入数据可能是杂乱的，包含错字、口语化和混合语言。</p><p>• <strong>学术界未形式化的任务。</strong> 在现实世界的场景中，任务往往被学术界定义得很模糊，并且比学术环境中的任务更加多样化。用户频繁地提出不整齐地属于预定义类别的查询或请求，有时多个任务在一个查询中。</p><p>• <strong>遵循用户指令。</strong> 一个用户的请求可能包含多个隐式意图(例如对输出格式的特定要求)，或者在没有后续问题的情况下，他们的期望预测可能不明确。模型需要理解用户意图并提供与这些意图一致的输出。</p><p>本质上，现实世界中的这些挑战来自于用户的请求与任何为特定任务设计的NLP数据集的分布存在显著的偏离。公开的NLP数据集并不反映模型的使用方式[ 77 ]。</p><pre><code>注7与微调模型相比，LLMs更适合处理真实世界场景。然而，评估模型在真实世界中的有效性仍然是一个开放的问题。</code></pre><p>处理这样的真实世界场景需要应对歧义、理解上下文和处理噪声输入。与微调的模型相比，LLMs更好地适应了这一点，因为它们在包含各种写作风格、语言和领域的不同数据集上进行了训练。此外，LLMs显示出强大的生成开放域响应的能力，使其非常适合这些场景。另一方面，微调的模型往往针对特定的、定义良好的任务，可能难以适应新的或意想不到的用户请求。它们在很大程度上依赖于明确的目标和结构良好的训练数据，这些数据指定了模型应该学习遵循的指令类型。微调后的模型由于对特定分布和结构化数据的关注较窄，可能会与噪声输入相抗争。通常需要一个额外的系统作为微调模型的辅助，以处理非结构化的上下文，确定可能的意图，并相应地细化模型响应。</p><p>此外，一些机制，如指令调整[ 91、112 ]和人体对齐调整[ 77 ]，进一步增强了LLMs更好地理解和遵循用户指令的能力。这些方法在保持[ 77、91、112]的连贯性和一致性的同时，提高了模型生成有用、无害和诚实响应的能力。虽然这两种方法都可以使LLMs更好地泛化到不可见的任务和指令中，但人们注意到，虽然人类标记者更喜欢为人类对齐而调整的模型[ 77 ]，而不是由公共NLP任务的指令调整的模型，例如FLAN [ 112 ]和T0 [ 91 ]。其原因可能与微调模型的劣势相似：公开的NLP任务/数据集是为了简单和自动的评估而设计的，它们只能覆盖现实世界使用的一小部分。</p><p>在现实场景中，一个主要的问题是如何评估模型的好坏。在没有任何形式化任务或度量的情况下，模型有效性的评估只能依赖于人工标注者的反馈。考虑到人为评估的复杂性和成本，目前还没有大量的、系统的微调模型与LLM的比较。尽管如此，ChatGPT等LLMs的巨大成功和普及在一定程度上证实了LLMs的优越性。</p><h3 id="5-1-其他考虑">5.1 其他考虑</h3><p>在实际部署中，性能、成本和延迟都是重要的考虑因素，而不仅仅是模型的性能。在一些参数有效的方法被开发出来的同时，实践者必须在效率和有效性之间取得平衡。</p><p><strong>成本。</strong> 近年来，LLMs的规模越来越大，如GPT-1、GPT-2和GPT-3的模型参数分别为1.17亿、15亿和1750亿。训练一个LLM的成本受其大小的影响很大，据估计，训练T5的11B参数变体的单次运行成本远远超过130万美元，而训练GPT-3 175B的单次运行需要460万美元[ 3 ]。训练大型模型的能耗同样令人印象深刻。训练一个具有6B个参数的变压器模型到完成时的总能耗估计约为103.5 MWh [ 30 ]。谷歌报告称，在大约2个月的时间里，训练PaLM消耗了大约3.4 GWh [ 6 ]。此外，数据集的规模也随着模型的规模而迅速扩大，GPT-3 175B在4990亿个令牌上训练[ 16 ]。另一个反映计算成本的关键指标是Flops，GPT-3 175B需要3.14×10^23个Flops，而T5 11B模型只需要3.30×10^22个，减少了10倍。除了这些成本外，对硬件的要求也很高。OpenAI与微软合作，在微软Azure云端托管的超级计算机上运行，该超级计算机由285k个CPU核心和10k个高端GPU组成，支持大型模型的训练。对于OpenAI API的用户，定价根据模型和使用情况而不同，如GPT-3.5-turbo每1k token收取0.002美元的选项用于聊天服务。然而，对于需要定制模型的用户来说，每1k个token需要花费0.03美元的训练成本，而每1k个token需要花费0.12美元的使用成本[ 4 ]。因此，对于无法承担如此大成本的用户，如小型创业公司、个人用户等，一个小型的、微调的模型是一个更好更合理的选择。</p><p><strong>延迟。</strong> 延迟是LLMs在实际应用中需要考虑的一个重要因素。推理时间是一种常用的度量延迟的指标，它高度依赖于模型大小、体系结构和token大小。例如，当最大token大小设置为2、8和32时，GPT-J 6B模型的推理时间分别为0.077 s、0.203 s和0.707 s。此外，当最大token大小固定为32时，InstructGPT模型( davinci v2 )的推理时间为1.969s。由于LLM通常过于庞大，无法在单个用户的机器上运行，因此企业通过API提供LLM服务。API延迟可以根据用户的位置而变化，单个请求的OpenAI API服务的平均延迟可以从几百毫秒到几秒不等。在高延迟不可接受的场景中，较大的LLM可能并不合适。例如，在许多信息检索应用中，可扩展性至关重要。为了在Web上部署信息检索系统，搜索引擎需要非常有效的推理才能使系统有用。InstructGPT davinci v2 (175B*)模型的理想化去噪推理时间为0.21s/请求(即,一个待评分的查询-段落对)，对于Web搜索引擎来说过于缓慢。</p><p>**参数高效调优。**在实际应用中，我们可以在一些特定的数据集上对模型进行调优。参数有效调优( Parameter-Efficient Tuning，PET )是一种有效的技术，可以在冻结预训练LLMs的大部分参数的同时调整模型参数(或额外的参数)的小部分。PEFT的主要目标是在保持原有模型性能的前提下，大幅降低计算和存储成本。常用的PET技术有LoRA [ 42 ]、Prefix Tuning [ 58 ]、P-Tuning [ 62、63 ]等。作为示例，LoRA方法保持了预训练模型的权重，并将低秩矩阵融入Transformer架构的每一层。该方法极大地减少了后续任务需要训练的参数数量，从而提高了整体效率。Alpaca-LoRA提出将低秩自适应(Low-Rank Adaption，LoRA)集成到LLaMA-Alpaca中，使得LLaMA可以在单个RTX 4090上运行数小时。所有这些PFT方法都有助于将模型微调到特定的任务，或者调整LLM以满足人类对齐等特殊要求。</p><h3 id="5-2可信性">5.2可信性</h3><p>考虑到LLMs现在涉及医疗、金融和法律等敏感领域，确保它们是可信的并且能够产生可靠的输出至关重要。</p><p><strong>稳健性与校准</strong> LLMs的准确性和鲁棒性被证明具有很强的相关性[ 59 ]。场景上精度较高的模型也具有较好的鲁棒性。然而，在额外的应用特定任务数据上进行调整后，零样本的鲁棒性变差[ 116 ]。这可能是由于过拟合导致的，由于模型的复杂度极高，且来自下游任务的训练样本有限，导致泛化性较差[ 43 ]。类似地，人们观察到，由于过参数化[ 51 ]，微调模型会导致显著的错误校准。</p><p>因此，当稳健性和校准是至关重要的考虑因素时，微调模型可能不是最佳选择。然而，人类对齐已经被发现是增强模型鲁棒性的潜在解决方案。InstructGPT davinci v2 (175B*)已被证明在鲁棒性方面优于其他模型。另一方面，实现模型的最优校准取决于所采用的场景和适应过程。</p><p><strong>公平与偏见。</strong> LLMs已被证明表现出不同的治疗和影响，延续了社会偏见，并可能导致歧视[ 10、17]。为了保证所有用户的公平和公正，在NLP模型的开发和部署中解决这些问题是至关重要的。人口统计学群体之间的绩效差异可以作为公平问题的指标。LLMs特别容易受到公平问题的影响，因为在方言、宗教、性别和种族等人口统计学类别中观察到了显著的绩效差异[ 59 ]。然而，然而，研究表明，与人类指令对齐的模型可以提高LLM的性能，而与它们的大小无关，其中InstructGPT模型(davinci v2)表现出比其他LLM更小的性能差异[ 23 ]。</p><p><strong>虚假偏见。</strong> 在预训练和微调范式下的各种自然语言理解任务中都观察到了捷径学习问题，其中模型在预测[ 31、35、98]时严重依赖于微调数据中输入和标签之间的虚假相关性。例如，在阅读理解任务中，微调模型往往关注问题与原文之间单词的词汇匹配，忽略了预期的阅读理解任务本身[ 53 ]。相比之下，大型语言模型并不直接在微调数据集上进行训练，这使得它们不太可能学习微调数据集中存在的捷径特征，从而增强模型的泛化能力。然而，LLMs并非万无一失，在语境学习过程中可能表现出一些捷径学习。例如，最近的初步研究已经开始调查基于提示的方法在大规模语言模型[ 111、129]中的鲁棒性。其中一项研究评估了GPT-3在文本分类和信息提取任务上的少样本学习性能[ 129 ]，发现被考察的LLMs容易受到多数标签偏差和位置偏差的影响，他们倾向于根据答案在训练数据中的频率或位置来预测答案。此外，这些LLMs表现出共同的标记偏向，倾向于在其预训练语料库中普遍存在的答案。最近的研究表明，这种位置偏差可以通过选择适当的提示来缓解[ 68 ]。总之，虽然LLMs显著减少了微调模型中普遍存在的捷径学习问题，但它们仍然表现出一些捷径学习问题，在下游应用中部署时应该谨慎对待。</p><h3 id="5-3-安全挑战">5.3 安全挑战</h3><p>LLMs在推理、知识保持和编码等多个领域展示了其极强的能力。随着它们变得更加强大和人性化，它们以重要方式影响人们的观点和行动的潜力也在增长。因此，在最近的工作[ 75,76]中，一些对我们社会的新的安全挑战应该被考虑并引起了广泛的关注。</p><p><strong>幻觉。</strong> LLMs可能&quot;幻觉&quot;，或产生无意义或不真实的内容，在各种应用中可能对信息的质量和可靠性产生重大负面影响。随着LLMs变得越来越有说服力和可信度，用户可能会过度依赖它们，并相信它们能够在他们所熟悉的领域提供准确的信息。如果模型产生的内容完全是错误的或误导性的，导致基于该信息做出不正确的决定或采取不正确的行动，这可能特别危险。这种结果可能在许多领域产生严重后果，如医疗保健、金融或公共政策，其中信息的准确性和可靠性至关重要。为了缓解这些问题，强化学习应运而生</p><p><strong>有害内容。</strong> 由于LLMs生成的文本具有较高的连贯性、质量和可读性，LLMs中的有害内容会造成重大危害，包括仇恨言论、歧视、煽动暴力、虚假叙述，甚至是社会工程学攻击。为检测和纠正这些内容而实施的保障措施是可以缓解的[ 97 ]。这些LLM还可以通过提供所需的非法信息而具有双重用途潜力，导致武器扩散[ 75 ]甚至恐怖主义袭击计划等风险。关键是要确保负责任地使用这些LLM，并制定保障措施以防止伤害。此外，在现有的工作中，来自人类的反馈在消除有害输出方面起着重要作用。</p><p><strong>隐私性。</strong> LLMs可能面临严重的安全问题。例如，用户隐私问题。据报道，三星员工在无意中泄露了绝密数据，包括新程序的源代码、与硬件相关的内部会议纪要等，使用ChatGPT处理工作。意大利数据保护机构宣布ChatGPT的开发者OpenAI非法收集个人用户数据，导致意大利成为第一个因隐私问题而禁止ChatGPT的政府[ 1 ]。</p><h2 id="6-CONCLUSION-AND-FUTURE-CHALLENGES-结论与未来挑战">6. CONCLUSION AND FUTURE CHALLENGES 结论与未来挑战</h2><p>近年来，随着大型语言模型的发展，自然语言处理领域发生了革命性的变化。有效地使用LLMs需要了解它们的能力，以及各种NLP任务的局限性。本文为LLMs在下游NLP任务中的应用提供了实践指导。我们首先讨论GPT式和BERT式架构等显著模型及其性能影响因素。然后，我们探讨了将LLMs用于下游任务，包括知识密集型任务、NLU和NLG任务，并提供了成功和局限性的具体实例。该实践指南为LLMs提供了见解，并为在NLP任务中使用LLMs提供了最佳实践。我们希望它能使研究人员和实践者发挥他们的潜力，推动语言技术的创新。</p><p>接下来，我们对LLMs的未来挑战进行了展望：</p><p>· 在真实世界的&quot;数据集&quot;上对提出的模型进行评估。而现有的深度学习模型主要在标准的学术数据集上进行评估，如ImageNet，这些数据集已经成为深度学习发展的里程碑。然而，标准学术数据集的局限性并不能准确地反映真实世界的性能。随着模型的发展，在更多样、更复杂和更现实的数据上评估它们是至关重要的，这些数据反映了现实世界的需求。在真实世界的&quot;数据集&quot;上评估模型，除了学术上的模型外，还将对它们的能力进行更严格的测试，并更好地理解它们在真实世界应用中的有效性。这确保了模型能够解决现实世界的挑战并提供实际的解决方案。</p><p>· 模型对齐。确保日益强大和自主的模式与人类的价值观和优先事项保持一致至关重要。必须制定方法，以确保这些模型按照预期的行为进行，并且不会对不理想的结果进行优化。从模型开发过程开始就集成对齐技术是至关重要的。模型的透明性和可解释性也是评估和确保一致性的重要因素。此外，当我们展望未来时，一个更加艰巨的挑战也随之而来：超人对齐系统(aligning superhuman systems)。虽然这项任务目前超出了我们的需求，但重要的是要考虑和准备调整这种先进系统的潜在影响，因为它们可能会呈现独特的复杂性和伦理问题[ 8、15 ]。</p><p>· 安全对齐。虽然讨论人工智能存在的风险很重要，但需要进行具体的研究，以确保高级人工智能的安全发展。这包括可解释性、可扩展的监督和治理以及模型属性的形式化验证等技术。安全不应仅仅被视为模型建立过程中的一个附加部分，而应被视为模型建立过程中不可或缺的一部分。</p><p>· 规模性能预测。很难预料随着模型规模和复杂度的急剧增加，模型性能会发生怎样的变化。在扩大规模或开发新的架构后，开发更好地预测模型性能的方法，将有助于更有效地利用资源和加快进展。一些可能性包括：训练一个较小的&quot;种子&quot;模型并外推其生长，模拟尺度增加或模型调整的影响，以及在不同尺度下对模型的迭代进行基准测试以构建缩放规律。这些可以在模型建立之前就能洞察模型的性能。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;在实践中利用LLMs的能力：对Chatgpt和更大范围的调研&lt;/h1&gt;
&lt;p&gt;原论文：&lt;a href=&quot;http://arxiv.org/abs/2304.13712&quot;&gt;&lt;em&gt;Harnessing the Power of LLMs in Practice: A Sur</summary>
      
    
    
    
    <category term="从零开始的paper生活" scheme="https://www.aweisite.top/categories/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%9A%84paper%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="LLM" scheme="https://www.aweisite.top/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>ac平台在Jupyter Notebook中使用自定义conda环境</title>
    <link href="https://www.aweisite.top/posts/12ede4e.html"/>
    <id>https://www.aweisite.top/posts/12ede4e.html</id>
    <published>2023-10-22T17:38:00.000Z</published>
    <updated>2026-06-11T09:31:37.282Z</updated>
    
    <content type="html"><![CDATA[<h2 id="基本步骤">基本步骤</h2><p>本文使用的dtk版本为22.10.1，其他版本应该也可用。</p><h3 id="使用conda">使用conda</h3><p>本文默认已经配置好了conda环境（要求python==3.7，与jupyter环境一致)</p><p>使用命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda <span class="built_in">env</span> list</span><br></pre></td></tr></table></figure><p>列出当前存在的conda环境，如果不包含需要的环境需要根据<code>超算ac平台使用conda搭建pytorch环境</code>自行创建和配置。</p><p>推荐使用平台上存在的预置conda环境，这样可以节省很多手动下载安装依赖的时间。</p><p>本文选取的是当前平台上存在的预置环境pytorch1.10.0a0-py37-dtk22.04.2</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 本文选取当前平台上存在的预置环境pytorch1.10.0a0-py37-dtk22.04.2</span></span><br><span class="line">[xxxxx@login08]$ conda activate pytorch1.10.0a0-py37-dtk22.04.2</span><br><span class="line">(pytorch1.10.0a0-py37-dtk22.04.2) [xxxxxx@login08]$ </span><br></pre></td></tr></table></figure><h3 id="创建Jupyter-Notebook-环境">创建Jupyter Notebook 环境</h3><p>在ac平台创建Notebook环境，选择适合的框架版本（dtk)，和加速器数量进行创建，等待部署完成之后进入jupyter环境。</p><p>该过程不再赘述。</p><h3 id="添加python系统路径">添加python系统路径</h3><p>默认情况下该环境内只能加载该jupyter容器环境中包含的版本python包，但是可以通过下面的方式来调用其他环境下的python包：</p><p>创建一个新的notebook并在新建单元格中执行下面的代码</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="comment"># 该路径是conda虚拟环境的包目录</span></span><br><span class="line"><span class="comment"># 可以通过 conda env list 查看</span></span><br><span class="line">sys.path.append(<span class="string">&quot;/public/software/apps/anaconda3/5.2.0/envs/pytorch1.10.0a0-py37-dtk22.04.2/lib/python3.7/site-packages&quot;</span>)</span><br><span class="line"><span class="comment"># 下面再导入别的包</span></span><br><span class="line"><span class="keyword">import</span> pkgs</span><br></pre></td></tr></table></figure><p>这样就可以随意调用自己自定义虚拟环境中的包了，需要安装新的包，只需要在eshell中（不能在jupyter环境的shell中执行，计算节点没有网络）执行<code>pip install</code>即可。</p><p><strong>仅当使用预置环境时</strong></p><p>预置conda环境目录不在当前用户目录，因此普通用户会有写入权限问题，直接在预置环境下执行<code>pip install pkg</code>会将对应的包写入到<code>.local/lib/pyhon3.x/site-packages</code> 下，因此在使用预置conda环境时需要在脚本中添加</p><p><code>sys.path.append(&quot;/public/home/uname/.local/lib/python3.x/site-packages&quot;)</code> (其中uname为当前用户名)</p><p>即最终应该为</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="comment"># 该路径是conda虚拟环境的包目录</span></span><br><span class="line"><span class="comment"># 可以通过 conda env list 查看</span></span><br><span class="line">sys.path.append(<span class="string">&quot;/public/software/apps/anaconda3/5.2.0/envs/pytorch1.10.0a0-py37-dtk22.04.2/lib/python3.7/site-packages&quot;</span>)</span><br><span class="line">sys.path.append(<span class="string">&quot;/public/home/$uname$/.local/lib/python3.x/site-packages&quot;</span>)</span><br><span class="line"><span class="comment"># 下面再导入别的包</span></span><br><span class="line"><span class="keyword">import</span> pkgs</span><br></pre></td></tr></table></figure><h2 id="其他问题">其他问题</h2><p>·待补充</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;基本步骤&quot;&gt;基本步骤&lt;/h2&gt;
&lt;p&gt;本文使用的dtk版本为22.10.1，其他版本应该也可用。&lt;/p&gt;
&lt;h3 id=&quot;使用conda&quot;&gt;使用conda&lt;/h3&gt;
&lt;p&gt;本文默认已经配置好了conda环境（要求python==3.7，与jupyter环境一致)&lt;</summary>
      
    
    
    
    <category term="摸鱼日记" scheme="https://www.aweisite.top/categories/%E6%91%B8%E9%B1%BC%E6%97%A5%E8%AE%B0/"/>
    
    
  </entry>
  
</feed>
