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

Learning to Prompt for Continual Learning

Abstract

持续学习背后的主流范式是使模型参数适应非平稳数据分布,其中灾难性遗忘是核心挑战。典型方法依赖于排练缓冲区或测试时已知的任务标识来检索已学知识并解决遗忘问题,而这项工作提出了一种持续学习的新范式,旨在训练一个更简洁的记忆系统,且在测试时无需访问任务标识。我们的方法学习动态提示(L2P)预训练模型,以便在不同任务转换下顺序学习任务。在我们提出的框架中,提示是可学习的小参数,保存在记忆空间中。目标是优化提示以指导模型预测,并在保持模型可塑性的同时,显式管理任务不变和特定于任务的知识。我们在流行的图像分类基准测试下,针对不同具有挑战性的持续学习设置进行了全面实验,L2P始终优于先前的最先进方法。令人惊讶的是,即使没有排练缓冲区,L2P也能取得与基于排练的方法相媲美的结果,并且可直接应用于具有挑战性的任务无关持续学习。

Introduction

与在独立同分布(i.i.d.)数据上进行训练的普通监督学习不同,持续学习旨在解决在非平稳数据分布上训练单个模型的问题,其中不同的分类任务是按顺序呈现的。然而,由于该模型在学习周期的单个阶段中仅能访问当前数据,它易于对当前可用数据过拟合,并且由于灾难性遗忘,在先前数据上会出现性能下降的情况。

先前工作的局限性在持续学习中提出了关键问题[13, 16]:(1) 情景记忆的形式能否超越对过往数据的缓冲,发展为更智能、简洁的情景记忆系统?(2) 如何在不知道任意样本的任务身份的情况下,自动为其选择相关的知识组件?
为了回答第一个问题,我们从基于提示的学习(提示法)[29] 的最新进展中汲取灵感,这是自然语言处理(NLP)领域的一种新的迁移学习技术。提示法通过包含额外特定任务信息的模板化或可学习的提示词来设计模型文本输入,以便预训练语言模型能够处理参数化输入,从而执行特定于提示的预测 [25, 27, 53]。直观地说,基于提示的学习将下游任务的学习从直接调整模型权重重新规划为设计提示,这些提示 “指导” 模型有条件地执行任务。提示编码了特定任务的知识,并且比普通的微调更能有效地利用预训练的冻结模型。因此,在持续学习的背景下,利用提示来学习知识,并进一步存储所学知识是很有前景的。
然而,目前尚不清楚如何直接应用提示来解决持续学习中上述的第二个问题。一方面,如果我们按顺序针对不同任务训练不同的提示,那么在测试时,仍需要知道任务标识,以便使用合适的特定任务提示进行预测。另一方面,作为一种迁移学习技术,提示的目标是让冻结的预训练模型在下游任务上各自表现良好,而不是按顺序表现良好。因此,如果我们改为对所有任务使用单一共享提示,灾难性遗忘的问题可能仍然存在。
为此,我们提出了一种新的持续学习方法,称为持续学习的提示学习(L2P),它与流行的基于排练的方法相互独立,并且适用于不知道任务身份或边界的实际持续学习场景。图1对我们的方法与典型的持续学习方法进行了对比概述。L2P利用预训练模型的代表性特征;然而,在持续学习过程中,L2P并不对参数进行微调,而是保持预训练模型不变,转而学习一组提示,这些提示可以动态指导模型解决相应的任务。具体来说,提示信息以键值对的形式组织在一个名为提示池的共享内存空间中,并且我们设计了一种查询机制,以便根据实例级输入特征动态查找与任务相关的提示信息子集。提示池与监督损失联合优化,确保共享提示对用于知识迁移的共享知识进行编码,而非共享提示对有助于维持模型可塑性的特定任务知识进行编码。我们的设计明确地将共享知识和特定任务知识解耦,从而在很大程度上减少了优化过程中特定任务知识之间的干扰,实现了最小化的灾难性遗忘,且无需使用重放缓冲区。实例级查询机制消除了了解任务身份或边界的必要性,使最具挑战性但研究不足的任务无关持续学习成为可能。然后,将选定的提示添加到输入嵌入之前(图2),这会隐式地将与任务相关的指令添加到预训练模型中,以便模型回忆起最相关的特征来执行相应的任务。

Learning to Prompt

From prompt to prompt pool

引入提示池有三个动机。首先,测试时的任务身份是未知的,因此训练与任务无关的提示是不可行的。其次,即使与任务无关的提示在测试时可以得知,它也会阻碍相似任务之间可能的知识共享。第三,虽然为所有任务学习单一共享提示的简单方法能够实现知识共享,但它仍然会导致严重的遗忘问题。理想情况下,人们希望学习一种模型,该模型能够在任务相似时共享知识,而在其他情况下保持知识的独立性。因此,我们建议使用提示池来存储编码后的知识,这些知识可以灵活地组合起来作为模型的输入。
提示池被定位为
P = P 1 , P 2 , P 3 . . . , P M , P = {P_1,P_2,P_3...,P_M} , P=P1,P2,P3...,PM,
其中, P j ∈ R L p × D P_j \in R^{L_p \times D} PjRLp×D是单个prompt,Lp为token长度,embedding size D与x相同。
我们分别令 x x x x e = f e ( x ) x_e = f_e(x) xe=fe(x)为输入和对应的embedding feature。请注意,我们在符号表示中省略了(x)的任务索引(t),因为我们的方法对于与任务无关的设置具有足够的通用性。

x p = [ P s 1 ; . . . . ; P s N ; x e ] , 1 < = N < = M x_p = [P_{s1};....;P_{sN};x_e], 1<=N<=M xp=[Ps1;....;PsN;xe],1<=N<=M
其中;表示沿标记长度维度的连接。提示可以自由组合,因此它们可以联合编码知识(例如视觉特征或任务信息),以供模型处理。我们希望通过实例级别的提示组合来实现更细粒度的知识共享方案:相似的输入倾向于共享更多的通用
在这里插入图片描述

Instance-wise prompt query

我们设计了一种基于键值对的查询策略,以便为不同的输入动态选择合适的提示。这种查询机制与其他领域的方法有一些共同的设计原则,例如可微神经计算机[14]和矢量量化变分自编码器(VQ-VAE)[41],它们具有外部存储器,用于出于不同目的进行维护和使用。
我们将每个提示与一个可学习的键相关联,把提示作为值:
在这里插入图片描述
we denote the set of all keys by K = { k i } i = 1 M \mathbf{K} = \left\{ \mathbf{k}_i \right\}_{i=1}^{M} K={ki}i=1M
理想情况下,我们希望让输入实例本身通过查询-键匹配来决定选择哪些提示。为此,我们引入查询函数q
将输入x编码到和key相同的维度。 此外,q 对于不同任务应该是一个确定性函数,并且没有可学习参数。我们直接将整个预训练模型作为一个固定的特征提取器,以获取查询特征:q(x) = f(x)0,:.
Denote γ : R D k × R D k → R \gamma:R^{D_k} \times R^{D_k} \rightarrow R γ:RDk×RDkR作为一个对查询与提示键之间的匹配进行评分的函数。(我们发现余弦距离效果很好)。给定输入x,我们使用q(x)通过简单地求解目标来查找前N个键:
在这里插入图片描述
其中Kx代表从K中为专门为x选择的前N个key的子集。请注意,这种键值策略的设计将查询机制学习和提示学习过程解耦,实验表明这一点至关重要。此外,对提示的查询是以实例方式进行的,这使得整个框架与任务无关,也就是说,该方法在训练期间无需明确的任务边界,在测试时也无需任务标识即可运行。

可选择地使提示选择多样化。
虽然我们的方法不需要任务边界信息,但在现实场景和实验数据集中,任务转换通常是离散的,因此在训练时任务边界是已知的。我们发现,在我们的框架中加入这样一个先验知识,可以帮助模型学习到更好的特定任务提示,特别是当任务具有高度多样性时。为此,我们提出了一种简单的扩展方法,以添加任务边界先验,这对于L2P而言是可选的。
在任务t的训练过程中,我们维护一个提示频率表Ht = [h1, h2, ··· , hM],其中每个条目表示在任务t - 1之前提示Pi被选中的归一化频率。
为鼓励查询机制选择多样化的提示,我们修改了公式3为
在这里插入图片描述
h s i h_{si} hsi对频繁使用的提示进行惩罚,避免其被选中,以鼓励多样化选择。公式4只在训练中适用,在测试时间,公式3被使用。

Optimization objective for L2P

http://www.lryc.cn/news/576559.html

相关文章:

  • python基础21(2025.6.28)_全栈爬取_车168以及诗词名句案例
  • AUTOSAR图解==>AUTOSAR_AP_EXP_SOVD
  • Linux快速查找文件
  • JVM 之双亲委派机制与打破双亲委派
  • 【安卓Sensor框架-2】应用注册Sensor 流程
  • Everything
  • 深入解析 Electron 核心模块:构建跨平台桌面应用的关键
  • day45 Tensor board使用介绍
  • 【Bluedroid】蓝牙启动之BTM_reset_complete源码解析
  • 虚拟 DOM 与 Diff 算法
  • c++学习(五、函数高级)
  • 【AI智能体】Dify 核心组件从使用到实战操作详解
  • 设计模式-代理模式、装饰者模式
  • 【Java--SQL】${}与#{}区别和危害
  • git使用详解和示例
  • ByteMD+CozeAPI+Coze平台Agent+Next搭建AI辅助博客撰写平台(逻辑清楚,推荐!)
  • epitope3D: 精准预测蛋白表面的“抗原决定簇”
  • ABP VNext + 多数据库混合:SQL Server+PostgreSQL+MySQL
  • 【分布式机架感知】分布式机架感知能力的主流存储系统与数据库软件
  • 安卓应用启动页全版本兼容实战:从传统方案到Android 12+ SplashScreen API最佳实践
  • FPGA产品
  • 关于ubuntu 20.04系统安装分区和重复登录无法加载桌面的问题解决
  • KS值:风控模型的“风险照妖镜”
  • 北大肖臻《区块链技术与应用》学习笔记
  • 趣味数据结构之——数组
  • 给定一个整型矩阵map,求最大的矩形区域为1的数量
  • SRS WebRTC 入门
  • 【大模型】Query 改写常见Prompt 模板
  • 第27篇:SELinux安全增强机制深度解析与OpenEuler实践指南
  • uni-app项目实战笔记26--uniapp实现富文本展示