分享
LoRA相关技术及要点
输入“/”快速插入内容
LoRA相关技术及要点
飞书用户2749
1.LoRA相关技术及要点
1.1 LoRA 简介
由于
GPU 内存
的限制,在训练过程中更新模型权重成本高昂。
🎉
例如,假设我们有一个
7B 参数的语言模型
,用一个
权重矩阵 W
表示。在反向传播期间,模型需要学习一个 ΔW 矩阵,旨在更新原始权重,让
损失函数值最小
。
权重更新如下:
W_updated = W + ΔW。
如果
权重矩阵 W
包含
7B 个参数
,则权重更新矩阵
ΔW
也包含 7B 个参数,计算矩阵 ΔW
非常耗费计算
和
内存
。
由 Edward Hu 等人提出的
LoRA
将权重变化的部分 ΔW 分解为低秩表示。确切地说,它不需要显示计算 ΔW。相反,
LoRA
在训练期间学习 ΔW 的分解表示,如下图所示,这就是 LoRA 节省计算资源的奥秘。
如上所示,ΔW 的分解意味着我们需要用两个较小的 LoRA 矩阵 A 和 B 来表示较大的矩阵 ΔW。如果 A 的行数与 ΔW 相同,B 的列数与 ΔW 相同,我们可以将以上的分解记为
ΔW = AB
。(
AB 是矩阵 A 和 B 之间的矩阵乘法结果
。)
🏆
这种方法节省了多少内存呢?还需要取决于秩 r,秩 r 是一个超参数。例如,如果 ΔW 有 10,000 行和 20,000 列,则需存储 200,000,000 个参数。如果我们选择 r=8 的 A 和 B,则 A 有 10,000 行和 8 列,B 有 8 行和 20,000 列,即 10,000×8 + 8×20,000 = 240,000 个参数,比 200,000,000 个参数少约 830 倍。
当然,A 和 B 无法捕捉到 ΔW 涵盖的所有信息,但这是
LoRA
的设计所决定的。在使用 LoRA 时,我们假设模型 W 是一个具有
全秩的大矩阵
,以收集预训练数据集中的所有知识。当我们微调
LLM
时,不需要更新所有权重,只需要更新比 ΔW 更少的权重来捕捉核心信息,低秩更新就是这么通过
AB 矩阵实现
的。
1.2 LoRA 的一致性
虽然
LLM
,
或者说在
GPU
上被训练的模型的随机性不可避免,但是采用 LoRA 进行多次实验,LLM 最终的基准结果在不同测试集中都表现出了
惊人的一致性
。对于进行其他比较研究,这是一个很好的基础。
请注意,这些结果是在默认设置下,使用较小的值 r=8 获得的。实验细节可以在我的另一篇文章中找到。
1.3 QLoRA 计算 - 内存权衡
QLoRA
是由
Tim Dettmer
s
等人提出的量化
LoRA
的缩写。QLoRA 是一种在微调过程中进一步减少内存占用的技术。在
反向传播
过程中,QLoRA 将预训练的权重量化为 4-bit,并使用分页优化器来处理内存峰值。
我发现使用 LoRA 时可以节省 33% 的 GPU 内存。然而,由于 QLoRA 中
预训练模型
权重的额外量化和去量化,训练时间增加了 39%。
默认 LoRA 具有 16 bit 浮点精度:
•
训练时长:1.85 小时
•
内存占用:21.33GB
具有 4 位正常浮点数的 QLoRA
•
训练时长为:2.79h
•
内存占用为:14.18GB
此外,我发现模型的性能几乎不受影响,这说明 QLoRA 可以作为 LoRA 训练的
替代方案
,更进一步解决常见
GPU 内存瓶颈问题。
1.4 学习率调度器
学习率调度器会在整个训练过程中降低学习率,从而优化模型的
收敛
程度,避免
loss
值过大。
余弦退火(Cosine annealing)
是一种遵循余弦曲线调整学习率的调度器。它以较高的学习率作为起点,然后平滑下降,以类似余弦的模式逐渐接近 0。一种常见的余弦退火变体是半周期变体,在训练过程中只完成半个余弦周期,如下图所示。
在实验中,我在 LoRA 微调脚本中添加了一个余弦退火调度器,它显著地提高了 SGD 的性能。但是它对 Adam 和 AdamW 优化器的增益较小,添加之后几乎没有什么变化。
在下一节中,将讨论
SGD
相对于
Adam
的潜在优势。