LoRA微调

LoRA

LORA是一种低资源微调大模型方法,出自论文LoRA: Low-Rank Adaptation of Large Language Models。 使用LORA,训练参数仅为整体参数的万分之一、GPU显存使用量减少2/3且不会引入额外的推理耗时。

自然语言处理的一个重要范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应。当预训练更大的模型时,重新训练所有模型参数的完全微调变得不太可行。以GPT-3 175B为例,部署经过精细调整的模型的独立实例(每个实例都有175B参数)成本高昂。论文提出了低秩(LOW-RANK)自适应(LoRA),它冻结了预训练的模型权重,并将可训练的秩分解矩阵注入Transformer架构的每一层,从而大大减少了下游任务的可训练参数数量。与用Adam微调的GPT-3175B相比,LoRA可以将可训练参数的数量减少10000倍,GPU内存需求减少3倍。LoRA在RoBERTa、DeBERTa、GPT-2和GPT-3上的模型质量方面表现相当或优于微调,尽管具有较少的可训练参数、较高的训练吞吐量,并且与适配器不同,没有额外的推理延迟。论文还对语言模型适应中的等级缺陷进行了实证研究,这揭示了LoRA的有效性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

普通玩家微调大模型的困境

最近,以ChatGPT为代表的大模型涌现出优秀的理解、代码和推理等能力,许多玩家也想微调自己的专属ChatGPT。但是微调大模型非常吃资源,以刚刚达到涌现能力边界的7B模型为例,微调7B模型需要3×28G的显存(SGD+Momentum),至少需要2张A100的显卡才能满足要求。因此,如何降低微调大模型所需的机器资源,是普通玩家最为关心的问题。

高效微调的基本原理

以语言模型为例,在微调过程中模型加载预训练参数Φ0进行初始化,并通过最大化条件语言模型概率进行参数更新Φ0+ΔΦ,即:

(1)𝑚𝑎𝑥Φ⁡Σ(𝑥,𝑦)∈𝑍)⁡Σ𝑡=1|𝑦|⁡𝑙𝑜𝑔(𝑃Φ(𝑦𝑡|𝑥,𝑦<𝑡))

这种微调方式主要的缺点是我们学习到的参数增量ΔΦ的维度和预训练参数Φ0是一致的,这种微调方式所需的资源很多,一般被称为full fine-tuing。
研究者认为能用更少的参数表示上述要学习的参数增量ΔΦ=ΔΦ(Θ),其中|Θ|≪|Φ0|,原先寻找ΔΦ的优化目标变为寻找Θ:

(2)𝑚𝑎𝑥Θ⁡Σ(𝑥,𝑦)∈𝑍)⁡Σ𝑡=1|𝑦|⁡𝑙𝑜𝑔(𝑝Φ0+ΔΦ(Θ)(𝑦𝑡|𝑥,𝑦<𝑡))

这种仅微调一部分参数的方法称为高效微调。针对高效微调,研究者有很多的实现方式(如Adapter、prefixtuing等)。本文作者旨在使用一个低秩矩阵来编码ΔΦ,相比于其他方法,LORA不会增加推理耗时且更便于优化

LORA的实现方式

Instrisic Dimension

我们先思考两个问题:为何用数千的样本就能将一个数十亿参数的模型微调得比较好?为何大模型表现出很好的few-shot能力?
Aghajanyan的研究表明:预训练模型拥有极小的内在维度(instrisic dimension),即存在一个极低维度的参数,微调它和在全参数空间中微调能起到相同的效果
同时Aghajanyan发现在预训练后,越大的模型有越小的内在维度,这也解释了为何大模型都拥有很好的few-shot能力。

LORA

img

受instrisic dimension工作的启发,作者认为参数更新过程中也存在一个‘内在秩’。对于预训练权重矩阵𝑊0∈𝑅𝑑×𝑘,我们可以用一个低秩分解来表示参数更新Δ𝑊,即:

(3)𝑊0+Δ𝑊=𝑊0+𝐵𝐴𝐵∈𝑅𝑑×𝑟,𝐴∈𝑅𝑟×𝑘𝑎𝑛𝑑𝑟≪𝑚𝑖𝑛(𝑑,𝑘)

训练过程中冻结参数𝑊0,仅训练A和B中的参数。如上图所示,对于ℎ=𝑊0𝑥,前向传播过程变为:

(4)ℎ=𝑊0𝑥+Δ𝑊𝑥=𝑊0𝑥+𝐵𝐴𝑥

LORA为何有效?

通过大量的对比实验,作者证明了LORA的有效性,但是作者希望进一步解释这种从下游任务中学到的低秩适应(low-rank adaptation)的特性。为此,作者提出了三个问题:

LORA应该作用于Transformer的哪个参数矩阵?

img

从上图我们可以看到:

  • 将所有微调参数都放到attention的某一个参数矩阵的效果并不好,将可微调参数平均分配到𝑊𝑞和𝑊𝑘的效果最好
  • 即使是秩仅取4也能在Δ𝑊中获得足够的信息

因此在实际操作中,应当将可微调参数分配到多种类型权重矩阵中,而不应该用更大的秩单独微调某种类型的权重矩阵。

LORA最优的秩r是多少?

img

从上述实验结论我可以看到,在秩小到1或者2的时候,LORA的仍有不错的效果。因此作者假设:更新参数矩阵Δ𝑊可能拥有极小的‘内在秩’。为求证此假设,作者需要计算不同秩对应的子空间之间的重叠程度,如下:
对于𝑟=8和𝑟=64两个秩,首先进行奇异值分解得到两个右奇异矩阵𝑈𝐴𝑟=8和𝑈𝐴𝑟=64。作者希望得到:𝑈𝐴𝑟=8的top-i奇异向量有多少被包含在𝑈𝐴𝑟=64的top-j个向量中。可用格拉斯曼距离来表示这种子空间之间的相似关系:

(5)𝜙(𝐴𝑟=8,𝐴𝑟=64,𝑖,𝑗)=‖𝑈𝐴𝑟=8𝑖𝑇𝑈𝐴𝑟=64𝑗‖𝐹2𝑚𝑖𝑛(𝑖,𝑗)=Σ𝑘𝑚𝑖𝑛(𝑖,𝑗)⁡Λ𝑘2𝑚𝑖𝑛(𝑖,𝑗)

img

从上图可以看出𝑟=8和𝑟=64中的top奇异向量重叠得最多(颜色越小表示相似程度越高),也就是说top奇异向量的作用最大,其他的奇异可能会引入更多的噪声。这证明了更新参数矩阵Δ𝑊存在极小的‘内在秩’

参数增量Δ𝑊𝑊的关系?

为揭示微调过程的内在原理,作者进行了如下实验:

img

从上图的对比结果,作者发现三个现象:

  • 相比于随机矩阵,Δ𝑊𝑊有强关联。从表中的0.32≫0.02可以看出
  • Δ𝑊仅放大了𝑊中任务相关的特征,并未放大头部特征。我们知道F范数的平方等于奇异值和的平方,因此从表中的0.32≪21.67可以看出Δ𝑊和𝑊的头部奇异向量并无关联。
  • r等于4时,Δ𝑊的放大系数已经很大了。计算6.91/0.32≈21.5可知Δ𝑊能将𝑊中相关的特征向量放大21.5倍。

因此我们可以得到结论:在训练过程中,低秩的适应矩阵Δ𝑊仅仅放大了对下游任务有用的特征,而不是预训练模型中的主要特征。

LoRA 是一个非常重要的可调优结构,简单来说,就是增加了一个额外可训练部分,比如原来的 Linear 的矩阵是 MxN 维,增加一个 LoRA,该 LoRA 会包含两个参数量较少的矩阵:Mxd, dxN,这两个矩阵相乘后仍然是 MxN 维的,训练时原 MxN 矩阵冻结,只训练 LoRA 的两个矩阵,参数量就会大大减少。

为什么模型本身的矩阵不使用这种形式?

一般大规模矩阵的非零特征值数量会远远小于矩阵的维度,这个非零特征值的数量叫做矩阵的秩(rank),秩决定了这个矩阵如何影响被乘的向量,为 0 或较小的特征值对传入 tensor 的影响也比较小,丢弃这些信息对精度的影响不大。

一个模型包含了多个大矩阵,这些大矩阵的秩不相等而且难以预测,因此不能对原模型应用 LoRA,但在 sft 时使用 LoRA 相对安全,虽然有精度损失,但可以使一个大模型在一个消费级显卡上进行训练。

也就是说,LoRA 的原理是假设所有矩阵的秩都是 d,进行了一定的有损压缩。基于 LoRA 也有很多升级版技术,如 AdaLoRA、SoRA 等,这些组件方案都是基于 LoRA,对不同算子的 LoRA 的 rank 进行动态调节以达到更好的效果。

LoRA 目前已经是训练 SD 模型和 LLM 模型的最常用技术。LoRA 的 weights 也非常小,只有几十兆,因此加载和使用都非常方便,且 LoRA 本身可以合并回原模型,推理时可以做到兼容原模型结构。

如果涉及到对模型的知识编辑,比如自我认知任务,LoRA 的目标 module 一般需要设置为ALL,因为 MLP 层对模型的知识获取是至关重要的,需要参与训练过程。

训练过程

CUDA_VISIBLE_DEVICES=0 \swift sft \    --model_id_or_path qwen/Qwen-7B-Chat \    --dataset blossom-math-zh \    --output_dir output \    --custom_train_dataset_path xxx.jsonl zzz.jsonl \    --custom_val_dataset_path yyy.jsonl aaa.jsonl \
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值