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

大模型微调技术 --> IA3

IA3

1.摘要

我们引入了一种名为 ( I A ) 3 (IA)^3 (IA)3 (通过抑制和放大内部激活的注入适配器, Infused Adapter by Inhibiting and Amplifying Inner Activations)的新的PEFT方法,该方法通过学习向量缩放激活,在只引入相对少量的新参数的情况下获得更强的性能。我们还提出了一个基于 T0 模型的简单配方,称为T-Few,可以应用于新任务,而无需针对任务进行调优或修改。我们通过将T-Few应用于 RAFT 基准测试,验证了 T-Few 在完全未见的任务上的有效性,首次实现超人类表现,并超过现有技术 6% 的绝对值。

2.引言

在这里插入图片描述

图1: ( I A ) 3 (IA)^3 (IA)3 的图表 和 T-Few配方中使用的损失项。
左侧:(IA)3引入了学习向量 l k l_k lk l v l_v lv l f f l_{ff} lff,它们分别重新缩放(通过逐元素乘法)注意力机制中的键和值以及位置前馈网络中的内部激活。
右:除了标准的交叉熵损失LLM之外,我们还引入了降低错误输出概率的非似然损失 L U L L_{UL} LUL和将标准 softmax 交叉熵损失应用于所有输出选择的长度归一化对数概率的长度归一化损失LLN。

**上下文学习(ICL):**它通过输入提示示例诱导模型执行下游任务。Few-shot 提示将一小部分输入-目标对转换为(通常)人类可理解的指令和示例,以及需要预测的单个未标记示例。

值得注意的是,ICL不需要基于梯度的训练,因此允许单个模型立即执行各种任务。因此,执行ICL完全依赖于模型在预训练期间学习到的能力。这些特性导致了ICL方法近期的大量关注。

尽管ICL有实际的好处,但它有几个主要的缺点。

首先,每次模型进行预测时,处理所有提示的输入-目标对都会导致大量的计算成本。

其次,与微调相比,ICL通常产生较差的性能。

最后,提示符的确切格式(包括措辞和示例的顺序)对模型的性能会产生重大且不可预测的影响,远远超出了运行间微调的变化。最近的研究也表明,即使提供了不正确的标签,ICL也能表现良好,这引发了ICL到底有多少学习的疑问。

参数高效微调(PEFT):其中通过仅更新少量添加或选择的参数来对预训练的模型进行微调。最近的方法在只更新或添加一小部分(例如0.01%)完整模型参数的情况下,匹配了微调完整模型的性能。此外,某些PEFT方法允许混合任务批次,其中批次中的不同示例被不同地处理,使得PEFT和ICL都适用于多任务模型。

混合任务批次(mixed-task batches)是指在训练或推理过程中,将不同任务的数据混合在同一个批次中进行处理。与传统的单一任务批次相比,混合任务批次可以提高资源利用效率,尤其是在多任务学习(multi-task learning)或需要同时处理多个子任务的情况下。

虽然PEFT的优点解决了微调的一些缺点(与ICL相比),但相对而言,很少有人关注 PEFT 方法在可用的标记数据非常少的情况下是否有效

我们在本文中的主要目标是通过提出一种方法来缩小这一差距——即,一个模型、一个PEFT方法和一组固定的超参数——在只更新模型参数的一小部分的情况下,在新的、看不见的任务上获得强大的性能。

具体来说,我们的方法基于 T0 模型,这是 T5 的一个变体,对提示数据集的多任务混合进行了微调。

此外,我们开发了(IA)3,这是一种PEFT方法,一种通过学习向量将乘以中间激活的 PEFT 方法。(IA)3实现了比全模型微调更强的性能,同时更新的参数减少了10,000倍。

最后,我们展示了在微调之前对(IA)3参数进行预训练的好处。我们的整体配方,我们称之为“T-Few”,表现明显优于ICL(即使是针对16倍大的模型)

3.背景

1.ICL

ICL:旨在通过输入连接和提示的输入目标示例(称为“shots”)以及未标记的查询示例来诱导模型执行任务。

ICL 的主要优点是,它使单个模型能够立即执行许多任务,而无需进行微调。这还支持混合任务批处理,其中一批数据中的不同示例通过使用输入中的不同上下文对应于不同的任务。

尽管有这些优点,但 ICL 在实际应用中也有明显的缺点:

首先,进行预测的成本要高得多,因为模型需要处理所有在上下文中标记的示例。具体来说,忽略Transformer语言模型中自注意操作的二次复杂度(与模型其余部分的成本相比通常很小),处理 k-shot ICL 的 k 个训练样例比单独处理未标记的样例增加了大约 k + 1 倍的计算成本。

类似地,内存成本随着 k 近似地线性增长,尽管在推理过程中,内存成本通常由存储模型的参数主导。

另外,存储给定任务的上下文示例需要少量磁盘存储空间。例如,为一个任务存储 32 个示例,其中每个示例的提示输入和目标长度为 512 个 token,则需要大约 66 kb 的磁盘存储空间(32个 示例× 512个 token × 32位)。

2.PEFT

参数高效微调,已经学了很多了

4.设计 T-Few 配方

鉴于 PEFT 允许模型以相对较小的存储需求和计算成本适应新任务,我们认为 PEFT 是 ICL 的一个有希望的替代方案。因此,我们的目标是开发一种配方,允许模型在具有 有限标记示例 的新任务上获得高精度,同时在推理期间允许混合任务批次,并产生最小的计算和存储成本。

1.非概率训练和长度正则化

对于评估,我们使用等级分类(在3.1节中描述),它取决于模型分配给正确选择的概率以及模型分配给错误选择的概率。为了在训练过程中考虑到这一点,我们考虑添加一个非概率损失:
在这里插入图片描述

这阻碍了模型从不正确的目标序列预测 token,其中,…我们假设添加 L U L L_{UL} LUL 将改善等级分类的结果,因为模型将被训练为将较低的概率分配给不正确的选择,从而提高正确选择排名最高的机会。

2.(IA)3 PEFT

为了与少样本 ICL 进行比较,我们需要一种 PEFT 方法,它具有以下属性:

首先,它必须添加或更新尽可能少的参数,以避免产生存储和内存成本。

其次,在新任务上进行几次训练后,要达到较强的准确率。

最后,它必须允许混合任务批处理,因为这是 ICL 的一种功能。

作为替代方案,我们探索了针对学习向量的模型激活的逐元素乘法(即重新缩放)。

具体地说,我们考虑对形式 l _ _ _ x 的适应,其中 l ∈ R d l∈R^d lRd 是一个特定于任务的学习向量,_ _表示逐元素乘法, x ∈ R T × d x∈R^{T×d} xRT×d 是一个长度为 t 的激活序列。我们使用“广播表示法”,因此第1个条目的 (i, j) 是 l j x i , j l_jx_{i,j} ljxi,j

在初步的实验中,我们发现没有必要为 Transformer 模型中的每一组激活引入一个学习的重新缩放向量

相反,我们发现在自我注意和编码器-解码器注意机制中的键和值以及位置前馈网络的中间激活上引入重新缩放向量就足够了。具体来说,使用Vaswani等人的符号,我们引入了三个学习向量 l k ∈ R d k , l_k∈R^{d_k}, lkRdk, l v ∈ R d v l_v∈R^{d_v} lvRdv, l f f ∈ R d f f l_{ff}∈R^{d_{ff}} lffRdff,它们被引入到注意机制中如下:

s o f t m a x ( Q ( l k ⊙ K T ) d k ) ( l v ⊙ V ) softmax(\frac{Q(l_k ⊙K^T)}{\sqrt d_k})(l_v⊙ V) softmax(d kQ(lkKT))(lvV)

在位置前馈网络中为 ( l f f ⊙ γ ( W 1 x ) ) W 2 (l_{ff}⊙ γ(W_1x))W_2 (lffγ(W1x))W2,其中 γ γ γ为前馈网络的非线性。

我们在每个Transformer层块中引入一组单独的 l k l_k lk l v l_v lv l f f l_{ff} lff向量。这一共增加了 L ( d k + d v + d f f ) L(d_k + d_v + d_{ff}) L(dk+dv+dff) 个新参数在一个 L 层的 Transformer 编码器中 ,还有 L ( 2 d k + 2 d v + d f f ) L(2d_k+2d_v+d_{ff}) L(2dk+2dv+dff) (一个自注意力一个编码器解码器注意力)在 Transformer 解码器中。

l k , l v l_k, l_v lk,lv 被初始化为 1 以便当它们相加时,由模型计算的总函数不会改变。

我们称我们的方法为 ( I A ) 3 (IA)^3 (IA)3 ,它代表“通过抑制和放大内部激活注入适配器”

在这里插入图片描述

图二:在 T0-3B 上使用 L U L L_{UL} LUL L L N L_{LN} LLN 。具有可变参数预算的方法用更大或更小的标记表示更多或更少的参数。
图三:不同 few-shot 学习方法的准确率。T-few 使用 ( I A ) 3 (IA)^3 (IA)3 给 T0,
T0使用 零样本学习,
T5+LM 和 GPT3变体使用 少样本 ICL。
x轴对应推理成本

5.来自GPT(刚看论文的时候,我也没太看明白)

在 IA3 中, l k l_k lk l v l_v lv l f f l_{ff} lff 作为缩放向量,分别对注意力机制中的键(Key)、值(Value)以及前馈网络进行逐元素缩放,它们的作用是对这些部分的输出进行调节,从而对模型在不同任务、输入条件下的表现进行细粒度控制。

具体来说:

  1. l k l_k lk 对键矩阵的缩放
    键矩阵(Key)用于生成注意力分布,影响的是输入序列中每个位置相对于其他位置的重要性。通过对键矩阵进行缩放,IA3 可以动态调整注意力机制如何计算不同位置之间的相关性,从而影响模型对输入信息的理解。
  2. l v l_v lv 对值矩阵的缩放
    值矩阵(Value)决定了注意力分布中"选中"的信息是什么。当模型根据注意力得分确定哪些部分应该受到更多关注时,值矩阵的缩放可以调整最终输出的信息量大小。通过缩放值矩阵,IA3 能够控制注意力机制输出的细节程度,影响模型的生成或分类等任务。
  3. l f f l_{ff} lff 对前馈网络的缩放
    前馈网络部分主要用于在注意力机制后处理特征,通过缩放前馈网络的权重,IA3 可以控制模型的非线性变换能力,从而适应不同任务或输入的需求

为什么对这些矩阵进行缩放有用?

缩放操作的主要作用是通过对注意力机制关键部分的逐元素调整,赋予模型更强的灵活性和任务适应性:

  • 高效微调:相比直接修改完整的权重矩阵,使用缩放向量可以在减少参数更新量的同时,提供足够的表达能力。这意味着模型在适应新任务时不需要完全重新训练,只需更新少量参数就可以适应新场景。
  • 任务敏感性:通过逐元素缩放,IA3 能够对每个任务输入的不同特征进行细粒度控制,增强模型对任务间差异的感知。这在多任务学习或输入分布变化的情况下尤为重要。
  • 减少计算开销:缩放向量的维度远小于完整的矩阵,因此可以显著降低计算开销,同时保持较高的性能。

总之,缩放 l k l_k lk l v l_v lv l f f l_{ff} lff 使模型能以更轻量级的方式灵活调整注意力机制,增强适应不同任务和场景的能力。

6.超参数微调

1.超参数

  1. target_modules(目标层)

    • IA3 最关键的超参数,决定在那些位置注入缩放因子
    • 建议
      • 必选:key_proj(或 q_proj)、value_proj、FFN 中的 up_proj(或 intermediate 层)
      • 可选层:down_proj、out_proj
  2. init_scale(初始化范围)

    • 缩放因子的初始化范围
    • 建议
      • 默认 0
      • 范围:通常 [-0.5, 0.5] 之间
      • 可以考虑使用小的正值(如 0.1)开始
  3. scaling_layer_norm(是否缩放 LayerNorm)

    • 是否在 LayerNorm 后应用缩放
    • 建议:
      • 默认:False
      • 只在特定任务时开启
      • 开启可能带来轻微的性能提升但增加了复杂度
  4. 典型配置示例

    ia3_config = {"target_modules": ["key_proj","value_proj","up_proj"],"init_scale": 0.0,"scaling_layer_norm": False,"modules_to_not_convert": ["lm_head", "embed_tokens"],  # 通常不需要转换的层"fan_in_fan_out": False  # 权重矩阵的转置设置
    }
    

2.具体调参建议

  1. 不同规模模型的配置建议

    • 小型模型(7B以下):
      • 使用全部推荐层
      • 可以考虑更激进的init_scale
    • 中大型模型(7B-70B):
      • 从核心层开始
      • 使用保守的init_scale
    • 超大模型(70B+):
      • 仅使用最必要的层
      • 保持默认init_scale
  2. 模型结构特定建议

    • Dencoder-only 模型
      • 重点关注 self-attention 层
      • 通常不需要 scaling_layer_norm
    • Encoder-decoder 模型:
      • 需要通知考虑 encoder 和 decoder 部分
      • 可能要区别对待交叉注意力层
  3. 训练策略优化

    • 学习率设置 1e-4 ~ 5e-4
      • 使用线性预热预热
      • 考虑使用余弦衰减
    • 优化器选择
      • AdamW 首选
      • 较小的 weight decay (0.01 或 更小)
  4. 最佳实践总结

    • 基础配置建议

      basic_ia3_config = {"target_modules": ["key_proj","value_proj","up_proj"],"init_scale": 0.0
      }
      
    • 进阶配置建议

      advanced_ia3_config = {"target_modules": ["key_proj","value_proj","up_proj","down_proj","out_proj"],"init_scale": 0.1,"scaling_layer_norm": True
      }
      
  5. 常见问题

    • 如果训练不稳定
      • 减小 init_scale
      • 减少 target_modules
      • 增加预热步骤
    • 如果效果不够好
      • 增加 targetmodules
      • 尝试调整 initscale
      • 考虑开启 scaling_layer_norm

http://www.mrgr.cn/news/68746.html

相关文章:

  • Windows Update服务设置回自动启动
  • 设计模式之——观察者模式
  • 全同态加密基于多项式环计算的图解
  • 江协科技STM32学习- P36 SPI通信外设
  • SQL--查询连续三天登录数据详解
  • 12 Node.js API接口开发
  • LeetCode 每日一题 长度为 K 的子数组的能量值
  • 牛客小白月赛104-D小红开锁-模拟
  • c++:stack,queue,priority_queue模拟实现
  • 软件设计师中级 第9章 数据库技术基础
  • 从零开始学习python 7(持续更新ing)
  • 有趣的Midjourney作品赏析(附提示词)
  • Leetcode 长度最小的子数组
  • 06 Oracle性能优化秘籍:AWR、ASH、SQL trace与实时监控的实战指南
  • git基础操作
  • Python的函数
  • CDN到底是什么?
  • C++算法探索:从排序到动态规划
  • java卷上天,转行可以干什么?
  • 声纹识别中,向量距离那种计算方式最合适
  • aLoNg3x.2 | CrackMe
  • Servlet-Filter
  • Linux 常用操作指令大揭秘(上)
  • PaddleOCR安装教程
  • 一文读懂肖特基二极管
  • C#语言:现代软件开发的核心工具