【昇思学习营第六期·五一篇】MindSpore LLM大模型原理和实践:高效参数微调(PEFT)
收藏回复举报
【昇思学习营第六期·五一篇】MindSpore LLM大模型原理和实践:高效参数微调(PEFT)
发表于2025-05-10 11:05:00
0 查看

大模型主要有两个方向,一是通用大模型,二是垂直领域大模型,比如医疗、金融、工业领域。后者可能是个伪命题,通常提及的大模型,希望这个模型适用于多个领域,否则充其量就是在某个具体领域参数量稍大点的模型。对于大多数人和公司,没有足够财力(数据、计算资源、人才)从零还是训练一个新的大模型。基本都是把现有的大模型作为基座,用相关领域的数据去进行模型的微调(Finetune)。

微调有两种方法,一是模型全部参数的微调,二是少量参数的高效微调。前者由于参与训练的参数多,所耗费的计算较大。并且全参微调可能有损原本模型的能力。后者只需要微调少量参数,需要的计算资源小,能达到不错的效果,大家基本都采用这种方法来进行大模型微调,而其中目前最流行的方法是LoRA。高效参数微调的英文是Parameter-Efficient Fine-Tuning,简称PEFT

1. PEFT分类

true

按照是否增加了额外参数,PEFT主要分为:

  • Additive类:在预训练模型基础上增加额外的参数和网络层,原模型是不参与训练的。包含两个子类:

    1)Adapter: 在Transformer子层后加入小的全连接层。微调时只学习新增加的全连接层参数。

    2)Soft Prompts: 常见的Prompts方法是在输入中构造Prompts,Soft Prompts直接在输入的embedding中加向量作为soft prompts,并对这些向量的参数进行微调,避免构造Prompts模板。

  • Selective类:选择模型中的部分层如最后几层,或偏置项进行微调。

  • Reparametrization-based类:利用低秩表征(low-rank representations)来最小化可训练的参数,本质上就是认为大量的参数中,仅仅一部分起到关键作用,在这个起关键作用的子空间中去寻找参数进行微调。

  • Hybrid类:混合了多种类别的方法。

2. PEFT方法效率统计

参数效率(Parameter Efficiency,PE)从广泛的概念讲,包括存储、内存、计算和性能的效率,其中计算效率主要包括微调时反向传播的计算和推理的计算效率。下面是对已收集的方法(论文)从这几个维度进行的统计:

true

其中,Type表示该方法属于Additive、Selective、Reparametrization-based哪一类,Storage、Memroy表示该方法和全部参数微调比较是否节约了存储、内存。Backprop表示是否减小了反向传播计算开销,Inference overhead表示推理时是否增加了开销,比如常见的增加了全连接层。

3. 具体方法介绍

按照以上分的PEFT类别进行介绍,对常用方法进行详细介绍。

3.1 Additive类:Adapters

3.1.1 Adapters

下图是一种Adapters的结构,在Transformer前馈神经网络后加入了右侧的Adapter层,Adapter是一个botteleneck结构,先把原本的维度d映射到更小的维度m(m<<d),然后层通过一个非线性层,最后映射回d维特征。Adapter包括偏置项的参数量为2md+m+d,由于m很小,起到了限制参数量的作用。模型微调的时候,学习的参数包含上图绿色部分,除了Adapter,还有Transformer本身的LayerNorm层。在BERT Large模型上Adapters用0.5-5%的参数微调,基本达到全参数微调性能,差距仅1%以内。在GLUE上,用3.6%的参数微调和全参数微调性能差距仅0.4%。

true

3.1.2 AdaMix

使用 mixture-of-experts(MoE)思路,对多个adapters采用模型选择具体的expert adapter。

3.2 Additive类:Soft Prompts

3.2.1 Prefix-Tuning

一般的Prompts需要根据任务构造Prompt模板,同一任务不同的Prompts模板可能导致模型性能差别很大,Prefix-Tuning在模型的输入里直接加上前缀向量进行微调,功能类似加Prompts,但加的是向量,让这些向量自行训练,不用人为去构造各种模板。下图中的上面部分是以Transformer结构为例全参数微调的情况,下面部分是Prefix-Tuning的方法,在每层的开头加了Prefix向量,微调只训练这部分对应的参数,其余Transformer固有的参数冻结不变。

true

下图更进一步说明了每层添加Prefix的方法,同一个source经过MLP全连接网络得到Prefix加入每一Transformer block。

true

自回归在开头加上Prefix,输出就是正常的输出,Encoder-Decoder在输入加上Prefix,输出有对应的内容。微调训练过程中模型原有的损失函数定义不变,不同的任务训练其特有的Prefix,推理时用自己训练得到的Prefix。 Prefix-Tuning在不同任务上微调0.1%参数的效果,和Adapters方法进行比较,同等训练0.1%参数量的情况下,普遍优于Adapters。

3.2.2 Prompt Tuning

概括起来就是把上面讲的Prefix-Tuning的简化版,碰巧和Prefix-Tuning同时做的工作,只把soft prompts加到模型的输入,不必加到中间层。

true

3.3 Selective类

3.3.1 BitFit

在Transformer结构中只微调所有偏置项bias参数。具体而言,Transformer过程如下,先是Q、K、V的计算:

true

然后根据Q、K、V计算attention:

true

然后做Layer-Norm:

true

上面的红色部分就是所有的bias项,只选择(Selective)这些bias项参数进行微调。

3.3.2 其他方法

DiffPruning:模型微调的时候学习参数的掩码mask。

3.4 Reparametrization-based类

3.4.1 LoRA

LoRA是目前最流行的PEFT方法。将要改变模型的参数部分压缩到一个很小的子空间,原本预训练模型的权重在微调时保持不变,将要学习的权重分解为两个低秩的矩阵A和B,一般情况下r<<min(d,k)。一般用高斯分布初始化A,B初始化为0。

true

LoRA和之前主要方法比较的优势:

  • 和Prefix-Tuning比,由于不用在输入上加额外的prompts,能支持更长的输入;
  • 和Adapters比,增加的参数和基座模型计算是并行的,不像Adapters是在网络中加了串行的层,所以推理时没有增加额外的延迟。在生产环境部署时,可以先计算好W,W的维度未 发生改变,推理时和原基座模型是一样的。对于不同的任务,替换BA即可。

对Transformer不同权重、不同r的情况对比,说明微调的权重越多越好,但r并不是越大越好。LoRA也有劣势,就是不能在同一个Batch里训练多个任务的A和B。

我要发帖子