基础知识
QLoRA,这是一种高效的微调方法,可减少内存使用量,使得在单个 48GB GPU 上就可以微调 65B 的模型,而且所得模型的性能与全 16 比特微调相当。QLoRA 通过冻结 4 比特量化的预训练语言模型将梯度反向传播到低秩适配器 (LoRA) 中。我们最好的模型 (我们将其命名为 Guanaco) 仅需在单个 GPU 上进行 24 小时微调,就能在 Vicuna 基准测试中优于所有之前公开发布的模型,且达到了 ChatGPT 性能水平的 99.3%。
是什么能让QLoRA如此厉害了?
- 1, 4 位 NormalFloat (NF4),一种新的数据类型,在信息论意义上是正态分布权重的最佳表示
- 2, 双层量化,通过对量化系数进行二次量化来减少平均内存占用
- 3, 用于降低峰值内存占用的分页优化器。
就是上面三块新技术,保证我们使用QLoRA用较低成本训练我们特定的任务。
量化
量化是把一个输入从拥有更多信息的表示离散化为拥有更少信息表示的过程。这意味着常常把一个数据类型从更多位转换为更少位,例如:从32位浮点数转换为8位整数。
有一种不太准确的说法,量化后的整数都有一个对应浮点数,比如:
这也叫线性量化
正态分布
正态分布描述了一类数据的分布规律,在均值附近的数据集中度最高,随着数据远离均值,出现的概率逐渐减小,并且这种分布在统计图上呈现对称的钟形曲线。
如图:
在均值0处数据集中,随着数据远离均值,出现的概率逐渐减小,如同山峰一样。
什么是NF4
NF4(NormalFloat4)是一种专门用于量化符合正态分布数据的4比特量化数据类型。NF4的设计目的是对神经网络中参数值进行更高效的量化,同时减少量化误差,特别适用于参数值符合正态分布的情况。
在神经网络中,参数(如权重)通常呈现均值为0的正态分布,即:
- 数据的分布在零值附近非常密集。
- 数据的极大和极小值出现的概率较低。
传统的线性量化方法会将数据范围均匀地划分为多个区间,但这样会导致稀疏区间(极大和极小值处)浪费量化空间,而在密集区间(零值附近)引入较大误差。因此,NF4量化方法根据数据的正态分布特性,重新设计量化区间,使量化后的整数值分布更加符合实际数据分布(数据密集分布也就越系)。
如图:
图中换分的区域为什么16个区域了,这是因为4bit量化后的整数有16个。
这里的反量化会存在两个问题。
正态分布的范围是从负无穷到正无穷,反量化时,我们没有办法求最后一个区间的均值。
这里QLoRA采用了舍弃两端的极值,确保累计概率密度合理分配。
第二个问题
对于0值,不论它归属于左边的7,还是右边的8,它反量化后都不再是零了。
0在深度学习里是有特殊意义的。我们这里将0作为一个区间。
NF4预定义的16个值表格
将上图山峰数据做归一化后获得-1到1区间表格。这可以用于NF4 的量化参考。
双层量化
QLoRA中采用了分块量化,每64个值作为一个块进行NF4 4-bit量化。
那么64个值的一个块就是64*4=256bit,但每块中还需一个FP32的32位scale,那么32/256=12.5%。
那么就要对FP32的32位scale还需做一个8bit量化。这就是双层量化。