各种微调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}\),该权重的更新可以简单地表达为:

\[W_0'=W_0+\Delta W \]

LoRA 则使用一个低秩分解来表达这个 \(\Delta W\)

\[\begin{split} W_0' &=W_0+\Delta W\\ &=W_0+BA \end{split} \]

其中,\(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\)

参考来源:

QLoRA

QLoRA 核心是使用量化进行微调。其成果有三个。

  • 4 位标准浮点数量化(4-bit NormalFloat Quantization)
  • 双重量化(Double Quantization)
  • 分页优化(Paged Optimizer)
    • 就是显存不足时将部分梯度检查点转移到内存上。后文不赘述

为了降低极端的量化对微调造成的不利影响,QLoRA 借助 LoRA 对原模型权重进行更新,且 LoRA 侧的权重保持高精度。这就是 QLoRA 与 LoRA 的关系。

本节参考来源:

关于模型量化

模型内的值通常保存为 float32 类型。模型量化的目标是使用像是 float16、int8 等甚至更小的数据类型,以一定的精度损失为代价,成倍减少模型推理的内存和时间消耗。

根据量化过程是否线性,可以将量化分为 线性量化 与 非线性量化 两种。

线性量化,其特点是相邻两个量化值之间的差距固定。以 fp32 量化到 int8 为例,其式子如下:

\[X^{\text{int8}}= \text{round}\left( \frac{127}{c}X^{\text{fp32}} \right) \]

其中 \(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 量化后的权重可以表示为如下形式:

\[\tilde{W}=\alpha\hat{W}+\beta \]

其中 \(\alpha=\frac{\text{max}(W)-\text{min}(W)}{2^N-1}\)\(\beta=\text{min}(W)\),且 \(\alpha\)\(\beta\) 使用 fp16 存储。

QA-LoRA 就在想,让 LoRA 权重参与到这个 \(\beta\) 运算中,不就巧妙地将 GPTQ 和 LoRA 融合了。

参考来源:

posted @ 2024-04-21 00:05  倒地  阅读(58)  评论(0编辑  收藏  举报