LLMs基础学习(五)模型微调专题(中)

原视频链接

Adapter 类的微调

  • 解释 Adapter 即适配器,Adapter Tuning 思想源自 2019 年发表的《Parameter-Efficient Transfer Learning for NLP》 ,当时主要基于 BERT 改进。

1 背景

  • 指出预训练模型参数量增多,全量微调训练下游任务昂贵且耗时。
  • 作者提出 Adapter Tuning,在预训练模型每层插入针对下游任务的参数(仅增加 3.6% 参数 ),微调时冻结模型主体,只训练特定任务参数,减少算力开销

2 技术原理

在这里插入图片描述

  • 设计与嵌入:设计新的 Adapter 结构并嵌入 Transformer 结构。
  • 插入位置:在每个 Transformer 层,于多头注意力投影后和第二个 feed - forward 层后,各增加一个 Adapter 结构。
  • 训练方式:训练时固定预训练模型参数,仅微调新增的 Adapter 结构和 Layer Norm 层。
  • 任务扩展:有新下游任务时,添加 Adapter 模块生成易扩展的下游模型,避免全量微调和灾难性遗忘。
  • 配有两张图(Figure 2) ,左图展示在 Transformer 层两次插入适配器模块的位置;右图介绍适配器模块核心是参数少的瓶颈结构,含跳跃连接(skip - connection),微调时绿色部分(适配器模块、层归一化参数、最终分类层 )基于下游任务数据训练。

3 具体细节

  • 模块构成:每个 Adapter 模块由两个前馈(Feed forward)子层组成。
    • 降维:第一个前馈子层(down - project)将 Transformer 块输出从高维特征 d 投影到低维特征 m(m << d ) ,控制 m 限制 Adapter 模块参数量。
    • 非线性变换:经非线性层(Nonlinearity ) 。
    • 升维:第二个前馈子层(up - project)将 m 维特征还原为 d 维,作为 Adapter 模块输出。
  • 跳跃连接:通过跳跃连接(skip - connection)将 Adapter 输入加到最终输出,使参数初始化接近 0 时也近似恒等映射,确保训练有效性。
  • 实验表明,Adapter 方法少量参数训练效果媲美全量微调,引入 0.5% - 5% 模型参数可达全量微调模型 99% 性能。

4 Adapter 类其他方法的微调

  • Adapter Fusion
    • 将适配器训练分为知识提取和知识组合,解决灾难性遗忘、任务干扰和训练不稳定问题。
    • 但增加模型参数量,降低推理性能。
  • Adapter Drop
    • 从较低 Transformer 层删除可变数量 Adapter 提升推理速度。
    • 多任务推理时,动态减少计算开销,一定程度保持任务性能。

Prefix 类的微调

  • Prefix 类微调包括 Prefix Tuning、Prompt Tuning、P - tuning、P - Tuning v2 等内容。

1 Prefix Tuning

在这里插入图片描述

  • 背景:在 Prefix Tuning 之前,相关工作主要是人工设计离散的模版或自动化搜索离散的模版。人工设计的模版对模型最终性能影响极为敏感,增加或减少一个词、变动词的位置,都会使模型性能产生较大变化。自动化搜索模版成本较高,且此前离散化 token 搜索出的结果往往并非最优。此外,传统微调范式利用预训练模型处理不同下游任务时,需为每个任务保存一份微调后的模型权重,不仅微调整个模型耗时久,还会占用大量存储空间。
  • 技术原理:Prefix Tuning 源于论文《Prefix-Tuning: Optimizing Continuous Prompts for Generation》。该方法提出固定预训练语言模型,为语言模型添加可训练、任务特定的前缀。具体而言,在输入 token 之前构造一段与任务相关的 virtual tokens 作为 Prefix,训练时仅更新 Prefix 部分的参数,而预训练语言模型(PLM)中的其他部分参数保持固定。配有示意图,展示了在不同任务(如翻译、摘要生成、表格转文本 )中,Prefix - tuning 与传统 Fine - tuning 的差异。在 Prefix - tuning 中,Transformer(预训练)模型接收带有特定 Prefix(针对不同任务,如 Translation、Summarization、Table - to - text )的输入,而传统 Fine - tuning 则是针对不同任务分别训练独立的 Transformer 模型(如 Transformer (Translation)、Transformer (Summarization)、Transformer (Table - to - text) ) 。

2 Prompt Tuning

在这里插入图片描述

  • 背景:大模型进行全量微调时,为每个任务训练一个模型,开销和部署成本都很高。离散的 prompts 方法不仅成本较高,而且效果欠佳。此外,之前的 Prefix Tuning 在更新参数时较为复杂。
  • 技术原理:Prompt Tuning 源于论文《The Power of Scale for Parameter-Efficient Prompt Tuning》 ,该方法通过反向传播更新参数来学习 prompts,而不是采用人工设计 prompts 的方式。同时,冻结模型原始权重,仅训练 prompts 参数,训练完成后,用同一个模型即可进行多任务推理。可以将其看作是 Prefix Tuning 的简化版本,它为每个任务定义各自的 prompt,然后拼接到数据上作为输入,且仅在输入层加入 prompt tokens,不需要加入多层感知器(MLP,Multilayer Perceptron)进行调整以解决难训练的问题。配有示意图对比 Model Tuning 和 Prompt Tuning:Model Tuning 需要为每个下游任务制作整个预训练模型的任务特定副本,并且必须分批进行推理;而 Prompt Tuning 只需为每个任务存储一个特定于任务的小提示,并使用原始预训练模型进行混合任务推理。
  • 延伸面试题:探讨 prompt tuning 和 prefix tuning 在微调上的区别。指出二者都是自然语言处理任务中对预训练模型进行微调的方法,但在实现细节和应用场景上存在差异。具体区别包括:
    • 参数更新位置:Prompt Tuning 通常只在输入层添加参数,而 Prefix Tuning 在每一层都添加了参数。
    • 参数数量:Prefix Tuning 通常比 Prompt Tuning 有更多的可学习参数,因为它为模型的每一层都添加了前缀。
    • 适用任务:Prompt Tuning 更适合于分类任务,而 Prefix Tuning 更适合于生成任务,因为它可以在不同层次上调整模型的行为。
    • 训练效率:Prompt Tuning 通常有更高的训练效率。

3 P - tuning

在这里插入图片描述

  • 背景:提出 P - tuning 方法同样是为了解决之前提到的两个问题:一是大模型的 Prompt 构造方式严重影响下游任务的效果,例如 GPT - 3 采用人工构造的模版来进行上下文学习(in context learning),但人工设计的模版变化特别敏感,增减一个词或变动位置都会造成较大影响;二是近来的自动化搜索模版工作成本较高,且之前离散化的 token 搜索出来的结果可能不是最优的,导致性能不稳定。
  • 技术原理:源于论文《GPT Understands, Too》 ,该方法设计了一种连续可微的 virtual token。具体是将 Prompt 转换为可以学习的 Embedding 层,并对 Prompt Embedding 进行一层处理。配有一个快速搜索 “英国首都是 [MASK]” 的例子图示,对比了 (a) Discrete Prompt Search 和 (b) P - tuning。在 (a) 中,提示生成器仅接收离散奖励;而在 (b) 中,连续提示嵌入和提示编码器可以以可微的方式进行优化。与 Prefix Tuning 相比,P - Tuning 加入了可微的 virtual token,但仅限于输入层,并非在每一层都添加;此外,virtual token 的位置不一定是前缀,插入的位置是可选的。

4 P - Tuning v2

在这里插入图片描述

  • 背景:指出之前的 Prompt Tuning 和 P - Tuning 等方法存在两个主要问题。
    • 缺乏模型参数规模和任务通用性:从规模通用性看,Prompt Tuning 论文表明当模型参数规模超过 10B 时,提示优化可与全量微调媲美,但对于较小模型(100M - 1B ),提示优化和全量微调表现差异大,限制了提示优化适用性。从任务普遍性看,尽管 Prompt Tuning 和 P - tuning 在一些自然语言理解(NLU)基准测试中表现出优势,但提示调优对硬序列标记任务(即序列标注)的有效性尚未得到验证。
    • 缺少深度提示优化:在 Prompt Tuning 和 P - tuning 中,连续提示只被插入 transformer 第一层的输入 embedding 序列中。在后续 transformer 层中,插入连续提示位置的 embedding 由之前的 transformer 层计算得出,这可能导致两个优化挑战:一是由于序列长度限制,可调参数数量有限;二是输入 embedding 对模型预测只有相对间接的影响。
  • 技术原理:源于论文《P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》 ,P - Tuning v2 对 Prompt Tuning 和 P - Tuning 进行改进,作为跨规模和 NLU 任务的通用解决方案。该方法在每一层都加入了 Prompts tokens 作为输入,而非仅仅加在输入层,带来两方面好处:一是增加了更多可学习的参数(从 P - tuning 和 Prompt Tuning 的 0.01% 增加到 0.1% - 3% );二是加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响。配有示意图展示从 P - tuning 到 P - tuning v2 的变化,其中橙色块(即(h_0)、… 、(h_j) )表示可训练的 prompt embeddings,蓝色块是有冻结的预训练语言模型存储或计算的 embeddings。还通过图表展示在不同模型规模(330M、2B、10B )下,Fine - tuning、Lester et al. & P - tuning、P - tuning v2 在 SuperGLUE 的平均得分对比,表明 P - Tuning v2 在不同规模模型和多种任务中表现优异,是一种在不同规模和任务中都可与微调相媲美的提示方法,尤其在序列标注等困难的序列任务上大幅超过 Prompt Tuning 和 P - Tuning。

在这里插入图片描述

5 总结

对 Prefix 类微调方法进行总结:

  • Prefix Tuning:在每一个 Transformer 层都带上一些 virtual token 作为前缀,以适应不同的任务;通过优化多层 prefix,效果可与 fine - tuning 比肩。
  • Prompt Tuning:该方法可看作是 Prefix Tuning 的简化版本,针对不同的任务,仅在输入层引入 virtual token 形式的软提示(soft prompt);主要优化单层 prefix,在大尺寸模型下效果与 fine - tuning 相当。
  • P - Tuning:将 Prompt 转换为可以学习的 Embedding 层;相比 Prefix Tuning,仅在输入层加入可微的 virtual token,且 virtual token 的位置不一定是前缀,插入位置可选;通过优化单层 prefix,在大尺寸模型下与 fine - tuning 效果相当。
  • P - Tuning v2:在每一个 Transformer 层都加入了 prompt token 作为输入,引入多任务学习,针对不同任务采用不同的提示长度;通过优化多层 prefix,在小尺寸和大尺寸模型中均能达到与 fine - tuning 相当的效果。

LoRA 篇

a. 什么是 LoRA?

  • LoRA,英文全称为 Low - Rank Adaptation of Large Language Models,直译为大语言模型的低阶适应 ,是微软的研究人员为了解决大语言模型微调问题而开发的一项技术。其核心是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练

在这里插入图片描述

  • 配有一张示意图(Figure 1: Our reparametrization. We only train A and B. ) ,图中展示了预训练权重(Pretrained Weights, ( W ∈ R d × d (W \in \mathbb{R}^{d \times d} (WRd×d) ) ,以及两个矩阵A( A = N ( 0 , σ 2 ) A = \mathcal{N}(0, \sigma^{2}) A=N(0,σ2),即 A A A服从均值为0,方差为 σ 2 \sigma^{2} σ2的正态分布 )和B((B = 0) ,初始化为零矩阵 ) 。输入 x x x经过预训练权重和这两个矩阵的运算得到隐藏层输出 h h h ,且仅训练 A A A B B B两个矩阵。
  • 进一步解释说明中提到,在 Transformer 架构里,LoRA 应用于前馈网络层和多头注意力层。此前研究发现,模型在针对特定任务进行调整时,参数矩阵往往是过参数化(Over - parametrized)的,存在冗余。为解决这一问题,LoRA 提出在预测的参数矩阵上添加低秩分解矩阵来近似每层参数更新,进而减少下游所需训练的参数。
  • 给定一个参数矩阵W ,其更新过程用以下公式表示: W = W 0 + Δ W W = W_0+\Delta W W=W0+ΔW ,其中 W 0 W_0 W0是原始参数矩阵, Δ W \Delta W ΔW是更新的梯度矩阵。原始矩阵 W 0 ∈ R H × H W_0 \in \mathbb{R}^{H \times H} W0RH×H ,通过低秩分解矩阵 A ∈ R H × R A \in \mathbb{R}^{H \times R} ARH×R B ∈ R R × H B \in \mathbb{R}^{R \times H} BRR×H来近似参数更新矩阵 Δ W = A ⋅ B T \Delta W = A \cdot B^T ΔW=ABT ,这里 R ≪ H R \ll H RH ,R是减少后的秩。在微调期间,原始的矩阵参数 W 0 W_0 W0不会被更新,低秩分解矩阵A和B则是可训练参数,用于适配下游任务。在向前传播过程中,原始计算中间状态 h = W 0 ⋅ x h = W_0 \cdot x h=W0x的公式修改为 h = W 0 ⋅ x + A ⋅ B T ⋅ x h = W_0 \cdot x + A \cdot B^T \cdot x h=W0x+ABTx 。在训练完成后,将原始参数矩阵 W 0 W_0 W0和训练得到的权重A和B进行合并,即 W = W 0 + A ⋅ B T W = W_0 + A \cdot B^T W=W0+ABT ,得到更新后的参数矩阵。因此,LoRA 微调得到的模型在解释时不会增加额外开销。

b. LoRA 的思路是什么?

  1. 旁路增加与低秩分解:在原模型的旁边增加一个额外的路径,这个额外路径被称为旁路,通过使用两个低秩矩阵分解来近似更新量。具体来说,首先将输入通过一个降维矩阵A ,然后通过一个升维矩阵B进行还原。这样的操作使得我们能够用更小的参数更新来捕捉必要的信息,从而减少计算开销。
  2. 训练策略:在微调过程中,原模型的参数保持不变,专注于训练降维和升维矩阵A和B 。这种方式避免了对所有模型参数进行训练,只更新额外的旁路,有效降低了计算复杂度和内存需求。
  3. 推理阶段整合:在推理时,将训练好的旁路矩阵BA与原模型参数进行相加,从而无需改变原有计算图,这种设计不会增加额外的实时计算开销。
  4. 初始化策略:降维矩阵A采用高斯分布(正态分布)来初始化,以赋予其随机特性;而升维矩阵B初始化为零矩阵,这样在开始训练时不会影响原有模型的输出,确保训练稳定性。
  5. 可插拔的任务切换:通过不同的A和B配置,可快速适应新的任务情境。当前任务可表示为 W 0 + B 1 A 1 W_0 + B_1A_1 W0+B1A1 ,只需移除或替换旁路中 LoRA 的部分(例如使用 B 2 A 2 B_2A_2 B2A2 )即可切换任务,实现快速的模型适应。

c. LoRA 的特点是什么?

  • 将B、A加到W上可以消除推理延迟。
  • 可以通过可插拔的形式切换到不同的任务。
  • 设计得比较好,简单且效果好。

d. 一句话描述一下 LoRA

  • LoRA 的实现思想很简单:就是冻结一个预训练模型的矩阵参数,并选择用A和B矩阵来替代,在下游任务时只更新A和B矩阵。

其他 LoRA 相关常见面试题

a. LORA 应该作用于 Transformer 的哪个参数矩阵(Q、K、V)?

在这里插入图片描述

  • 配有一张 Transformer 模型架构图,展示了 LoRA 类在 Transformer 架构中的作用位置。在多头注意力机制部分,涉及到用于生成查询向量的权重矩阵 W q W_q Wq、生成键向量的权重矩阵 W k W_k Wk、生成值向量的权重矩阵 W v W_v Wv ,此外还有用于将多头注意力的输出组合起来的输出投影权重矩阵 W o W_o Wo ,并将 LoRA 类与 Adapter 类、Prefix 类的位置进行了对比。

  • 一张表格展示了在对 GPT - 3 的不同注意力权重应用 LoRA 后,在 WikiSQL 和 MultiNLI 数据集上的验证准确率。表格上方标注了可训练参数为 18M ,表格中不同权重类型( W q W_q Wq W k W_k Wk W v W_v Wv W o W_o Wo 以及它们的不同组合 )在不同秩(rank )下,在两个数据集上的验证准确率表现。例如, W q W_q Wq在秩为 8 时,WikiSQL 数据集上的准确率为 70.4% ,MultiNLI 数据集上的准确率为 91.0% 。研究发现,调整 W q W_q Wq W v W_v Wv一起提供了最佳的整体性能。需要注意的是,仅调整 Δ W q \Delta W_q ΔWq Δ W k \Delta W_k ΔWk会导致性能显著下降,而同时调整 W q W_q Wq W v W_v Wv则能得到不错的结果。这说明即使秩设为 4 , Δ W \Delta W ΔW中也能捕获足够的信息,因此比起只调整单一类型的大秩权重,调整更多种类的权重矩阵效果更好。

在这里插入图片描述

  • 什么是 rank(秩)
    • 在机器学习中,rank通常指矩阵的秩,它表示矩阵中线性独立行或列的数量。在 LoRA 方法中,rank用于限制可训练参数的数量,通过低秩表示来高效调整模型。
    • 举例说明:假设你有一个大的权重矩阵W ,如果W的秩是 8 ,这意味着你能用 8 个线性独立的向量来表示这个矩阵,全部训练这样的矩阵会涉及许多参数;而如果使用秩为 4 的近似表示,你可以用 4 个向量来近似描述这个矩阵,这大大减少了需要训练的参数数量。通过降低秩,减少了参数空间的自由度,使得模型在训练时更加高效,而不会显著影响性能,这也是 LoRA 在权重矩阵上使用低秩表示的核心思想。表格中提到的rank为 8 或 4 时,表示的是对原始大的权重矩阵进行近似表示时所用的线性独立向量的数量,从而调整可训练参数数量。
    • 对 WikiSQL 和 MultiNLI 两个数据集进行介绍:
      • WikiSQL:这是一个用于自然语言处理(NLP)的数据集,专注于结构化查询语言(SQL)生成任务。具体来说,它提供了自然语言问题和相应 SQL 查询的对照,用于训练和评估能将自然语言转换为 SQL 查询的模型。
      • MultiNLI(Multi - Genre Natural Language Inference):这是一个用于自然语言推理的广泛数据集,包含不同体裁的文本对。任务是判断一个给定前提和假设之间的关系,比如判断是蕴含、矛盾还是中立关系,用于评估模型在跨领域推理任务中的表现。
  • 对表格结果分析
    • 对表格中涉及的权重矩阵进行解释:
      • 对表格中涉及的权重矩阵进行解释:
        • W q W_q Wq:用于生成查询向量的权重矩阵。
        • W k W_k Wk:用于生成键向量的权重矩阵。
        • W v W_v Wv:用于生成值向量的权重矩阵。
        • W o W_o Wo:用于将多头注意力的输出组合起来的输出投影权重矩阵。
      • 对表格描述内容进行翻译:表 5 展示了在对 GPT - 3 的不同注意力权重应用 LoRA 后,在 WikiSQL 和 MultiNLI 数据集上的验证准确率,这里使用的是相同数量的可训练参数。调整 W q W_q Wq W v W_v Wv一起提供了最佳的整体性能。需要注意的是,仅调整 Δ W q \Delta W_q ΔWq Δ W k \Delta W_k ΔWk会导致性能显著下降,而同时调整 W q W_q Wq W v W_v Wv则能得到不错的结果。这说明即使秩设为 4 , Δ W \Delta W ΔW中也能捕获足够的信息,因此比起只调整单一类型的大秩权重,调整更多种类的权重矩阵效果更好。
      • 从上表得出的结论:
        • 将所有微调参数都放到 attention 的某一个参数矩阵的效果并不好,将可微调参数分配到 W q W_q Wq W v W_v Wv的效果更好
        • 即使是秩仅取 4 也能在 Δ W \Delta W ΔW中获得足够的信息。
        • 因此在实际操作中,应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。

b. 如何在已有 LoRA 模型上继续训练?

主要探讨当已有的 LoRA 模型仅训练了一部分数据,而需要训练另一部分数据时的不同处理方式:

  • 直接在现有的 LoRA 模型上继续训练

    • 适用情况:当新的训练数据与之前用于训练 LoRA 模型的数据在特征、分布等方面较为相似,并且新任务与旧任务的性质、目标等也相近时适用。例如,之前用 LoRA 模型训练了一批新闻文本的情感分析任务,新数据依然是新闻文本的情感分析任务,且文本风格、主题等类似。
    • 操作步骤:直接将新的数据用于继续训练现有的 LoRA 模型。在训练过程中,模型会基于已有的权重,结合新数据进一步更新权重,从而融合新的知识。
    • 优点:这种方式能够保留模型在之前训练中所学到的知识,避免了重新训练带来的资源浪费,大大节省了训练时间和计算资源。比如在上述新闻文本情感分析任务中,模型之前学到的情感词特征等知识可以继续发挥作用。
    • 注意事项:由于模型持续在新数据上训练,可能会出现过拟合的问题,尤其是当新数据存在一些特殊的噪声或偏差时。为避免过拟合,可以适当使用正则化技术,如 L1 或 L2 正则化。同时,如果新的数据分布与之前有明显差异,可能需要调整学习率或其他超参数,以确保模型能够更好地适应新数据。
  • 将 LoRA 与基础模型合并后,再训练新的 LoRA

    • 适用情况:当希望在模型中稳固之前学习到的知识,同时又要在一个与之前有一定关联但又不完全相同的新任务上进行进一步微调时适用。例如,之前用 LoRA 在基础模型上针对医疗文本的命名实体识别任务进行了训练,现在要进行医疗文本的关系抽取任务,这两个任务都与医疗文本相关,但具体目标不同。
    • 操作步骤:首先,将现有的 LoRA 权重合并到基础模型中,得到一个融合了之前学习成果的新基础模型。然后,在这个新的基础模型上,使用新的数据训练新的 LoRA 层。
    • 优点:通过将原来的知识固化到基础模型中,新的 LoRA 层可以专注于学习新任务的独特特征。这种方式有助于模块化地管理不同任务的适应,使得模型在不同任务上的学习和应用更加清晰和有条理。
    • 缺点:由于将 LoRA 权重合并到基础模型以及再训练新的 LoRA 层,模型的整体大小可能会增加,从而占用更多的存储空间。
  • 从头开始训练一个新的 LoRA 模型

    • 适用情况:当新的任务与之前的任务在性质、领域等方面完全不同,或者担心之前学习到的知识会对新任务的学习产生干扰时适用。例如,之前使用 LoRA 模型进行图像描述生成任务,现在要进行金融市场趋势预测任务,这两个任务属于完全不同的领域。
    • 操作步骤:直接使用基础模型,在新的数据上重新训练一个全新的 LoRA 模型,不依赖之前 LoRA 模型的权重。
    • 优点:这种方式可以完全避免旧知识对新任务的干扰,使模型能够更加专注于新任务的特征学习。模型可以根据新任务的数据和目标,自由地学习和调整参数。
    • 缺点:由于没有利用之前训练中获得的知识,可能需要更多的训练数据和时间来达到较好的性能。而且,如果存在一些公共的知识或特征可以在不同任务间共享,这种方式就会浪费这些潜在的资源。
  • 总结:根据任务需求选择

    • 任务相似时:建议直接在现有的 LoRA 模型上继续训练。这样可以保留并强化之前学习到的知识,使模型在新数据上能够基于已有经验更好地表现。在操作时,为了防止模型遗忘之前学习的内容,需要在新的训练过程中,适当混合之前的一些数据,让模型不断回顾和巩固旧知识。
    • 任务不同但有相关性时:建议考虑合并 LoRA 与基础模型,然后训练新的 LoRA。因为基础模型可以固化之前的知识,而新的 LoRA 层能够专注于学习新任务的特征,这种方式有利于知识的模块化管理,提高模型在不同但相关任务上的适应性。
    • 任务完全不同时:建议从头开始训练一个新的 LoRA 模型。这可以避免旧任务的知识对新任务学习的干扰,使模型能够更加纯粹地专注于新任务的特征提取和学习。

c. LoRA 权重是否可以合入原模型?

明确指出 LoRA 权重是可以合入原模型的。具体的操作方式是将训练好的低秩矩阵( B ∗ A B * A BA)与原模型的权重进行合并(相加),通过这种方式计算出新的权重,从而实现 LoRA 权重与原模型的融合。

d. LoRA 微调方法为啥能加速训练?

详细分析了 LoRA 微调方法能够加速训练的原因:

  • 只更新了部分参数:LoRA 方法的核心在于只更新部分参数。例如在原论文中就选择只更新 Self Attention 的参数,在实际使用过程中,还可以根据具体需求灵活选择只更新部分层的参数。这种选择性更新参数的方式,大大减少了需要训练和调整的参数数量,从而降低了训练的复杂度和计算量。
  • 减少了通信时间:由于 LoRA 更新的参数量大幅减少,在多卡训练的场景下,需要在不同计算卡之间传输的数据量也相应变少。数据传输量的降低直接减少了通信时间,使得训练过程中数据传输不再成为瓶颈,从而加速了整体训练速度。
  • 采用了各种低精度加速技术:LoRA 微调采用了如 FP16、FP8 或者 INT8 量化等低精度加速技术。这些技术通过降低数据的精度表示,在一定程度上减少了计算量和内存占用,从而加快了计算速度,提升了训练效率。

不过,需要指出的是,这三方面加速训练的原因并非 LoRA 所独有的特性,事实上,几乎所有的参数高效微调方法都具备这些特点。但 LoRA 仍有其独特的优势:

  • 低秩分解的直观性:LoRA 使用低秩分解的方式来更新和表示参数。这种方式在很多场景中能够很好地保持与全量微调相同的效果,同时其原理和操作非常直观,易于理解和实现。
  • 预测阶段不增加推理成本:LoRA 的设计确保了在推理阶段不会增加额外的计算成本。因为微调的调整是通过低秩矩阵的形式添加的,并且在应用时已经被整合到模型参数中,不需要额外的运算,这有利于保持推理速度,使得模型在实际应用中能够高效运行。

e. Rank 如何选取?

关于 LoRA 中 Rank 的取值,作者通过对比 1 - 64 不同的取值进行实验。实验结果表明,在效果上 Rank 在 4 - 8 之间表现最好,当 Rank 取值再高时,并没有带来效果的进一步提升。不过需要注意的是,论文中的实验是面向下游单一监督任务进行的。因此,在指令微调场景下,由于指令分布的广度等因素的影响,Rank 的选择还需要在 8 以上的取值进行进一步测试,以确定最适合的 Rank 值。同时,通过表格展示了不同权重类型( W q W_q Wq W q W v W_qW_v WqWv W q W k W v W o W_qW_kW_vW_o WqWkWvWo )在不同 Rank 值( r = 1 r = 1 r=1 r = 2 r = 2 r=2 r = 4 r = 4 r=4 r = 8 r = 8 r=8 r = 64 r = 64 r=64 )下,在 WikiSQL 和 MultiNLI 数据集上的实验结果,直观地反映了不同 Rank 取值对模型性能的影响。

在这里插入图片描述

f. LoRA 高效微调 如何避免过拟合?

过拟合是在使用 LoRA 进行微调时常见的问题,指的是模型在训练数据上表现良好,但在未见过的数据上表现不佳。这通常是因为模型过度学习了训练数据的细节和噪声,而未能抓住数据的普遍规律。针对这一问题,提出了以下避免过拟合的方法:

  • 如何避免过拟合

    • 减小 r(秩)值:在 LoRA 中,低秩矩阵的秩(即 r 值)决定了新增参数的数量。较大的 r 值意味着更多的参数,会使模型的容量增大,从而可能导致过拟合现象的发生。通过减小 r 值,可以减少模型需要学习的参数数量,进而降低模型的复杂度,使其不易过度拟合训练数据中的噪声。
    • 增加数据集大小:更多的训练数据可以提供更全面的样本分布,使模型能够学习到更一般化的特征,而不是仅仅记住训练数据中的特殊情况。增加数据集大小可以让模型在更广泛的数据上进行训练,减少因数据不足导致的过拟合风险。
    • 增加优化器的权重衰减率(weight decay):权重衰减是一种正则化方法,它通过在损失函数中添加权重的 L2 正则化项,来防止模型参数过大。增加权重衰减率可以限制模型参数的大小,避免参数过度增长导致过拟合,鼓励模型学习到更简单的参数配置。
    • 增加 LoRA 层的 dropout 值:Dropout 是一种防止过拟合的技术,它通过在训练过程中随机忽略部分神经元,使模型不依赖于特定的神经元。在 LoRA 层增加 dropout,可以随机屏蔽部分 LoRA 层的参数,使模型更具鲁棒性,减少对特定参数的过度依赖,从而降低过拟合的风险。
  • 总结

    为了在使用 LoRA 进行高效微调时避免过拟合,可以从以下几个方面入手:

    • 模型复杂度:通过减小 r 值,降低模型的复杂度,使其不易出现过拟合现象。
    • 数据丰富度:增加训练数据的数量和多样性,提供更全面的学习素材,让模型能够学习到更通用的特征。
    • 正则化技术:使用权重衰减和 dropout 等正则化方法,防止模型参数过大或对特定神经元产生过度依赖。这些方法可以单独使用,也可以结合使用,以达到最佳的防止过拟合的效果。

g. LoRA 矩阵初始化相关问题

前面已经了解到在 LoRA 矩阵初始化中:降维矩阵A采用高斯分布(正态分布)来初始化,以赋予其随机特性;升维矩阵B初始化为零矩阵,这样在开始训练时不会影响原有模型的输出,确保训练稳定性。权重更新公式为 W = W 0 + A ⋅ B T W = W_0 + A \cdot B^T W=W0+ABT 。基于上述内容,进一步探讨以下问题:

  • 为什么不将 A 和 B 都初始化为 0?

    如果同时将A和B都初始化为零,那么权重更新 Δ W = A B T = 0 \Delta W = AB^T = 0 ΔW=ABT=0 这就意味着在训练开始时,模型的参数不会发生任何变化,会带来以下缺点:

    • 可能出现梯度消失和对称性问题:所有神经元的初始状态和更新方向都相同,这会导致网络无法打破对称性。在这种情况下,神经元无法学习到多样化的特征,从而影响模型的表达能力,使其难以对复杂的数据模式进行有效建模。
    • 训练困难:由于缺乏初始扰动,梯度更新可能会过于缓慢,导致训练过程的收敛速度变慢,甚至可能出现无法收敛的情况,使得模型难以达到理想的性能。
  • 为什么不将 A 和 B 都使用高斯初始化?

    如果同时将 A 和 B 都使用高斯随机初始化,此时初始的权重更新为 Δ W = A B T \Delta W = AB^T ΔW=ABT 。由于 A 和 B 都是随机初始化的,所以 Δ W \Delta W ΔW 也将是一个随机矩阵,并且这个随机矩阵可能具有较大的值。

    • 初始扰动过大:过大的 Δ W \Delta W ΔW会在训练开始时对原有的预训练模型参数造成过大的扰动。这可能导致模型的输出偏离预期,进而使得训练不稳定。例如,预训练模型在之前学习到的合理参数分布,会因为这种过大的扰动而被打乱,无法基于之前的知识正常地进行新任务的学习,使得模型在训练初期难以朝着正确的方向调整参数。
    • 收敛困难:过大的初始噪声(即由随机初始化带来的较大波动 )可能导致梯度爆炸问题。当梯度爆炸发生时,模型在参数更新过程中,梯度会变得过大,使得参数更新失去控制,难以找到正确的优化方向,从而严重影响训练效果,导致模型无法有效收敛到最优解,甚至可能使训练过程无法继续进行。
    1. 是否可以把 A 初始化为零矩阵,B 初始化为高斯分布(正态分布)?

    在理论上,LoRA 的矩阵初始化方式是可以对调的。因为 LoRA 的核心思想是通过低秩分解来更新预训练权重矩阵 W 0 W_0 W0,最终训练的效果取决于模型对 Δ W = A B T \Delta W = AB^T ΔW=ABT 的学习能力,而不是特定的初始化方式。然而,对调初始化可能会产生以下影响:

    • 优化过程:将B初始化为随机高斯分布,而A初始化为零,并不会改变预训练权重的初始状态。但在优化过程中,梯度对B和A的学习方向的影响可能会略有不同,这可能会影响模型的训练效率和最终性能。
    • 数值稳定性:论文中推荐的初始化方式可能经过了大量的实验验证,确保了在实际应用中具有较好的数值稳定性。如果对调初始化,可能需要重新调试超参数(如学习率),以保证模型在训练过程中的数值稳定性,避免出现诸如梯度爆炸或消失等问题。
    1. 总结

    通过将矩阵 A A A用高斯分布随机初始化,矩阵 B B B初始化为零,具有以下优点:

    • 可以保持模型初始输出与预训练模型一致,避免初始扰动过大,使得模型在训练初期能够平稳地进行参数更新。
    • 利用A的随机性打破对称性,为模型提供丰富的梯度信息,有助于神经元学习到多样化的特征,提升模型的表达能力。
    • 在训练过程中,B从零开始逐步学习,能够有效控制权重更新的幅度,促进模型稳定收敛,提高训练的效率和效果。
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐