各种微调Fine-Tuning方法
微调 Fine-Tuning
比起从零开始训练,使用预训练模型进行微调是更经济的做法。
全量微调(Full fine-tuning)是指模型所有参数参与到微调。这种简单粗暴的方法并不高效,但也许能获得其他微调方法达不到的效果。
参数高效微调 PEFT
PEFT(Parameter Efficient Fine Tuning)的思路是,固定原模型权重,仅引入少量额外可学习参数来控制模型表达。
LoRA 和其变体 QLoRA 就属于 PEFT。
LoRA
低阶适应 LoRA(Low-Rank Adaptation),是一种参数高效微调方法。
LoRA 假设模型权重更新时有一个较低的本征秩(intrinsic rank)。对于一个输入维度 \(d\) 输出维度 \(k\) 的权重矩阵 \(W_0\in R^{d\times k}\),该权重的更新可以简单地表达为:
LoRA 则使用一个低秩分解来表达这个 \(\Delta W\):
其中,\(B\in R^{d\times r},A \in R^{r\times k}\),且 \(r\) 远小于 \(d\) 和 \(k\)。\(BA\) 相当于将 \(d\) 维的输入映射到 \(r\) 维,然后再映射回 \(k\) 维。
进行微调时,只更新 \(A\) 和 \(B\) 的权重即可。开始训练时,对 A 使用随机高斯初始化,对 B 使用零初始化。
在 Transformer 中,LoRA 主要作用在 attention 过程的四个权重矩阵,即 \(W_0\) \(W_q\) \(W_k\) \(W_v\)。
参考来源:
- LLLM-Lab,“深入浅出 LoRA”,https://zhuanlan.zhihu.com/p/650197598
- 北方的郎,“使用 LoRA 和 QLoRA 微调LLM的深入指南”,https://zhuanlan.zhihu.com/p/690739797
QLoRA
QLoRA 核心是使用量化进行微调。其成果有三个。
- 4 位标准浮点数量化(4-bit NormalFloat Quantization)
- 双重量化(Double Quantization)
- 分页优化(Paged Optimizer)
- 就是显存不足时将部分梯度检查点转移到内存上。后文不赘述
为了降低极端的量化对微调造成的不利影响,QLoRA 借助 LoRA 对原模型权重进行更新,且 LoRA 侧的权重保持高精度。这就是 QLoRA 与 LoRA 的关系。
本节参考来源:
- Young,“详解 QLoRA 原理 (附源码剖析)”,https://zhuanlan.zhihu.com/p/638927564
- 北方的郎,“使用 LoRA 和 QLoRA 微调LLM的深入指南”,https://zhuanlan.zhihu.com/p/690739797
关于模型量化
模型内的值通常保存为 float32 类型。模型量化的目标是使用像是 float16、int8 等甚至更小的数据类型,以一定的精度损失为代价,成倍减少模型推理的内存和时间消耗。
根据量化过程是否线性,可以将量化分为 线性量化 与 非线性量化 两种。
线性量化,其特点是相邻两个量化值之间的差距固定。以 fp32 量化到 int8 为例,其式子如下:
其中 \(c\) 是量化常数,通常是 tensor 的绝对值的最大值。
非线性量化 的量化值间隔不固定。其间隔是根据网络中的值的分布选择出来的,值越密集的地方,量化间隔越小。所以非线性量化理论上比线性量化有更强的表达能力。
但在实际应用中考虑到量化难度,通常使用的是 线性量化。
4 位标准浮点数量化
分位数量化(Quantile Quantization)隶属于非线性量化。这是基于 tensor 值的分布符合标准正态分布的假设,依据标准正态分布的概率分布,等概率地划分 \(n\) 个区间,以此将值映射到 \(n+1\) 个量化值上。
分块 k 位量化(block-wise k-bit quantization)在 分位数量化 的基础上考虑到归一化操作。具体做法是将 tensor 分为若干块,每个块设置一个 量化常数 \(c\),用于将该块中的 tensor 的值限制在 1 以内。
QLoRA 中的 4 位标准浮点数量化为了让零值能正确地被量化到零,还有 offset 的说法。
双重量化
分块的量化常数 \(c\) 也需要占用空间。第二次量化就是将量化常数 \(c\) 从 float32 量化到 int8。
QA-LoRA
QLoRA 中引入的 NF4(4-bit NormalFloat)量化不会作用于 LoRA 侧的权重。LoRA 参数保持 fp16 会导致低精度推理的部署受阻:直接将 LoRA 与量化模型融合会令模型变回未量化的形式,若是反过来对 LoRA 进行 PTQ 量化又会造成较大性能影响。
QA-LoRA 不使用 NF4 量化模型,而是使用 GPTQ 将 fp16 直接转换为 int4。
GPTQ 是一个有着严谨理论支撑的量化方法,被开源社区广泛接受。像是 LLaMA 就有 GPTQ 量化实现。在此不赘述。
经过 GPTQ 量化后的权重可以表示为如下形式:
其中 \(\alpha=\frac{\text{max}(W)-\text{min}(W)}{2^N-1}\)、\(\beta=\text{min}(W)\),且 \(\alpha\) 和 \(\beta\) 使用 fp16 存储。
QA-LoRA 就在想,让 LoRA 权重参与到这个 \(\beta\) 运算中,不就巧妙地将 GPTQ 和 LoRA 融合了。
参考来源:
- 徐宇辉,“LLM高效微调、部署新方法QA-LoRA详解”,https://zhuanlan.zhihu.com/p/660310258