文章目录
- 一、LoRA的背景与原理
- (一)LoRA的原理
- (二)LoRA矩阵的初始化
- 二、LoRA与Stable Diffusion模型
- 三、AdaLora和QLora
- (一)AdaLora的原理
- (二)QLora的原理
- (三)用途上的区别
一、LoRA的背景与原理
在预训练大规模模型时,微调整个模型的参数可能会带来较大的计算和存储开销。对于像GPT-3这样的大型模型,直接微调所有参数不仅非常耗时,还需要大量的存储资源。
(一)LoRA的原理
LoRA的全称:Low-Rank Adaptation of Large Language Models。它通过引入低秩矩阵分解,在微调时不再调整原始模型的所有权重,而是通过将权重矩阵分解成两个较小的低秩矩阵来表示权重的变化。
对于主模型的权重矩阵W ∈ R d × k W \in \mathbb{R}^{d\times k}W∈Rd×k,LoRA不微调W WW本身,而是通过两个低秩矩阵A ∈ R d × r A\in \mathbb{R}^{d\times r}A∈Rd×r和B ∈ R r × k B\in \mathbb{R}^{r\times k}B∈Rr×k来近似微调权重矩阵。LoRA 的权重更新公式为:
W new = W 0 + α r Δ W = W 0 + α r ( A B T ) W_{\text{new}} =W_0+\frac{\alpha}{r}\Delta W=W_0+\frac{\alpha}{r}(AB^T)Wnew=W0+rαΔW=W0+rα(ABT)
- W new W_{\text{new}}Wnew为微调后的权重矩阵
- W WW为预训练模型的原始权重矩阵,保持不变
- α \alphaα是一个缩放因子,用于调节低秩矩阵的影响
- r rr是秩的大小,表示低秩矩阵A AA和B BB的维度,通常r ≪ d , k r\ll d,kr≪d,k,从而大大减少需要训练的参数数量
假设原来的是100x1024的参数矩阵,那么参数量为102400,LoRA模型将矩阵拆成了两个矩阵相乘,如果设置Rank=8,那么就是100x8的B矩阵与8x1024的A矩阵做矩阵乘法,参数量为800+8192=8992,整体参数量下降了约11.39倍。
LoRA可以应用在模型的多种层次结构(如自注意力层、前馈网络层等),广泛适用于各类Transformer模型。
(二)LoRA矩阵的初始化
在LoRA的实现中,矩阵B初始化为零矩阵,矩阵A使用随机高斯分布初始化,这样做的主要目的是在微调开始时确保权重调整Δ W = 0 \Delta W = 0ΔW=0是零矩阵,从而稳定训练过程并保持模型在初始阶段的表现与预训练模型一致。
使用随机高斯分布初始化矩阵A可以确保它具有丰富的表示能力,使得低秩矩阵A B T AB^TABT能够探索广泛的权重调整空间。同时也可以防止梯度更新过程中出现梯度消失的问题,初始化时提供的非零梯度信息可以加速收敛,帮助模型更快地找到适应任务的最优参数。
二、LoRA与Stable Diffusion模型
- LoRA可以作为stable diffusion模型的一种插件,用于满足一种特定的风格,或指定的人物特征属性;
- 我们可以使用SD模型+LoRA微调训练的方式,只训练参数量很小的LoRA模型,就能在下游细分任务中取得不错的效果;
- LoRA大幅降低了SD模型训练时的显存占用,因为并不优化主模型(SD),所以主模型对应的优化器参数不需要存储。但计算量没有明显变化,因为LoRA是在主模型的全参梯度基础上增加了“残差”梯度,同时节省了主模型优化器更新权重的过程。
训练逻辑:
- 步骤一:冻结训练好的SD模型的权重;
- 步骤二:在SD模型的U-Net结构中注入LoRA模块,并将其与CrossAttention模块结合,并只对这部分参数进行微调训练;
- 步骤三:训练好新的参数后,利用重参的方式,将新参数和老的模型参数合并。
三、AdaLora和QLora
(一)AdaLora的原理
AdaLoRA(Adaptive Low-Rank Adaptation)通过在微调模型时将权重矩阵分解为低秩矩阵,并且引入了自适应调整低秩(rank)的机制。在此过程中,模型在不同层可以根据梯度信息自适应地调整分配给每层的秩值。这个机制通过动态调整秩值,在保持模型性能的同时有效减少了计算和内存需求。
给定原始模型权重矩阵W WW。通过LoRA将其分解为两个低秩矩阵:
W ≈ W 0 + Δ W = W 0 + A B T W\approx W_0+\Delta W =W_0+AB^TW≈W0+ΔW=W0+ABT
其中,W 0 W_0W0是预训练模型的固定权重,A ∈ R m × r A\in \mathbb{R}^{m\times r}A∈Rm×r和B ∈ R n × r B\in \mathbb{R}^{n\times r}B∈Rn×r分别是低秩矩阵,r rr是低秩值。AdaLoRA引入的改进是通过自适应调整r rr来使得不同层的权重矩阵分解具有不同的秩值。具体来说,使用 Frobenius 范数等指标来动态调整:
Δ r = α ∥ ∇ W ∥ F ∑ i = 1 L ∥ ∇ W i ∥ F \Delta r = \alpha \frac{\| \nabla W\|_F}{\sum_{i=1}^L\| \nabla W_i\|_F}Δr=α∑i=1L∥∇Wi∥F∥∇W∥F
- Δ r \Delta rΔr:表示在某一层上,低秩分解矩阵的秩值r rr需要调整的量
- α \alphaα:是一个调整系数,用来控制变化量的比例
- ∥ ∇ W ∥ F \| \nabla W\|_F∥∇W∥F:表示某层权重的梯度的Frobenius范数,即对该层的权重矩阵W WW进行梯度更新时的变化量的度量,它衡量了在当前训练步骤中,这一层的权重矩阵被更新的程度
- ∑ i = 1 L ∥ ∇ W i ∥ F \sum_{i=1}^L\| \nabla W_i\|_F∑i=1L∥∇Wi∥F:表示某层权重的梯度的Frobenius范数的总和,用来归一化不同层之间的影响
优势:动态调整秩值减少了资源浪费,同时保留了模型的强大性能,适合用于大模型的微调过程。
(二)QLora的原理
QLoRA(Quantized Low-Rank Adaptation)结合了量化和 LoRA 的优势。它通过对模型进行4-bit 量化,将模型权重的精度降低,从而显著减少计算和存储需求。随后,QLoRA 在量化后的模型上应用 LoRA 微调技术,保持低秩矩阵分解的效率和适应性。
量化公式:量化的核心思想是将模型的权重W WW从高精度浮点数压缩到低精度表示。4-bit 量化的过程可以表示为:
W q = round ( W − W m i n W m a x − W m i n ⋅ ( 2 4 − 1 ) ) W_q = \text{round}(\frac{W-W_{min}}{W_{max}-W_{min}}\cdot (2^4-1))Wq=round(Wmax−WminW−Wmin⋅(24−1))
虽然基座模型是 4-bit 的,但为了保持训练效果,计算过程并非全程低精度。QLoRA 对模型的不同部分采用了不同的精度策略:
- 基座模型(冻结,不更新):以 4-bit NormalFloat (NF4) 格式存储。在前向和反向传播时,会临时反量化(Dequantize) 为 16-bit BrainFloat (BF16) 精度参与计算,但不计算针对基座权重的梯度;
- LoRA 适配器(可训练):始终保持 16-bit 精度。反向传播时,梯度仅计算并更新 LoRA 的权重(即低秩矩阵 A 和 B)。
NormalFloat(NF4):一种改进的 4-bit 量化数据类型,采用非对称的数据表示来优化量化精度。它将量化区间分为负数部分和正数部分,每部分分别使用2 k − 1 2^{k-1}2k−1个分位数来表示,其中k kk为位数(在此为4)。具体而言,NF4 将数据区间[ 0 , 1 ] [0,1][0,1]划分为8个部分,将[ 0 , 1 ] [0,1][0,1]分为9个部分,从而生成总共16个分位数。所以 NF4 有 16 个量化级别。
分位数的计算:
- 分位数用于定义每个量化区间的边界。NF4 量化通过分位数函数来计算这些边界,确保量化区间内的数据分布尽可能均匀。
- 对于标准正态分布,分位数函数Q X ( ⋅ ) Q_X(\cdot)QX(⋅)是标准正态分布的分位数函数。
q i = 1 2 ∗ Q X ( i 2 k + 1 ) + Q X ( i + 1 2 k + 1 ) q_i=\frac{1}{2}*Q_X(\frac{i}{2^k+1})+Q_X(\frac{i+1}{2^k+1})qi=21∗QX(2k+1i)+QX(2k+1i+1)NF4的优势:让每个量化区间包含等量权重
- 0 附近区间窄,量化更精细
- 两端区间宽,合理覆盖
理论保证:对于正态分布数据,NF4 是信息论最优的 4-bit 量化(分位数量化使量化误差最小)。
(三)用途上的区别
- AdaLoRA用于模型微调:适合用于训练阶段,尤其是在对大语言模型进行任务特定微调时,能够高效利用计算资源。通过动态调整秩值,它能够针对不同任务自适应地分配计算能力,提升微调效果。
- QLoRA 用于模型部署 : 主要用于模型的低资源部署场景。通过 4-bit 量化,它显著减少了大模型的计算和存储需求,允许在硬件限制较多的环境中运行大模型。同时,结合 LoRA 微调,QLoRA 保证了模型的任务性能不会因量化而大幅下降。
参考:
深入浅出完整解析LoRA(Low-Rank Adaptation)模型核心基础知识
什么是LoRA模型,如何使用和训练LoRA模型?你想要的都在这!
图像生成:SD LoRA模型详解