尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Qlora和Adalora的详细对比学习

Qlora和Adalora的详细对比学习 一、Adaloar学习1.1 引出问题1.1.1 原始 LoRA 的问题所有层都用同一个 rank1.1.2 更合理的做法非均匀分配 rank1.1.3 进一步演进AdaLoRA1.2 AdaLora的特点1.2.1 AdaLoRA 的核心总预算不变重新分配1.2.2 为什么要这样做1.2.3 真正的关键问题1.3 具体区别展示1.3.1 LoRA 和 AdaLoRA 的核心区别1.3.2 为什么要用 PΛQ1.3.3 AdaLoRA 怎么实现动态 rank1.4 训练流程1.4.1 Instruction Data 怎么训练1.4.2 Loss 怎么来的1.4.3 AdaLoRA 真正作用在哪里1.5 原理分析一1.5.1 LoRA → AdaLoRA 的结构变化1.5.2 为什么要加 Λ1.5.3 AdaLoRA 怎么实现动态 Rank1.6 原理分析二1.6.1 上半部分Loss 从哪里来1.6.2 下半部分为什么要引入 SVD1.6.3 SVD 怎么启发 AdaLoRA1.7 Adalora详细解析1.7.1 先算每个 Rank 方向的重要性1.7.2 所有 Rank 做“全局竞争”1.7.3 不重要的方向直接关闭1.8 Adalora的重要性评分计算1.8.1 先给“单个参数”打分1.8.2 再把参数分数聚合成 Rank 分数1.8.3 最后拿去做 Rank 剪枝二、Qlora学习2.1 引出问题2.1.1 为什么 LoRA 之后还需要 QLoRA2.2.2 QLoRA 的核心思路2.2.3 它主要解决什么2.2 QLoRA 的直接价值显存大幅下降2.2.1 传统微调为什么贵2.2.2 QLoRA 怎么把显存降下来2.2.3 效果有多明显2.3 QLoRA 显存优化从 16-bit Base Model 到 4-bit2.3.1 QLoRA 真正压缩的是 Base Model2.3.2 为什么显存能继续下降2.3.3 还有一个关键技术Paged Optimizer2.4 Full Fine-tuning 的显存成本70B 为什么约 840 GB2.4.1 每个参数不只要存“权重”2.4.2 70B 模型为什么变成 840 GB2.4.3 这就是 LoRA / QLoRA 出现的原因2.5 Quantization 基础Float32 怎么映射成 INT82.5.1 核心思路先缩放再取整2.5.2 两个最关键的公式2.5.3 量化真正的问题会产生误差2.6 Quantization 的 Outlier 问题为什么要做 Block-wise Quantization2.6.1 Global Quantization 的问题2.6.2 Block-wise Quantization 怎么解决2.6.3 为什么又会引出 Double Quantization2.7 Quantile为什么“等概率分箱”更适合低比特量化2.7.1 Quantile 不是“等距离”而是“等数量”2.7.2 数据越密集量化就越精细2.7.3 这就是 NF4 的重要铺垫2.8 Normal Distribution QuantileNF4 为什么要按概率分配量化区间2.8.1 神经网络权重通常集中在 0 附近2.8.2 Quantile 改成“等概率划分”2.8.3 这正是 NF4 的核心铺垫2.9 NF44-bit 的 16 个量化值到底怎么设计2.9.1 NF4 不是等距离量化2.9.2 为什么必须保留 Exact Zero2.9.3 实际怎么量化三、思维导图总结一、Adaloar学习1.1 引出问题1.1.1 原始 LoRA 的问题所有层都用同一个 rank例如统一设成 r 8。 但不同层、不同矩阵的重要性并不一样。 结果就是不重要的地方浪费参数关键位置又不够用。1.1.2 更合理的做法非均匀分配 rank例如ΔW_k^1 → r 20 ΔW_q^1 → r 12 ΔW^2 → r 2也就是重要模块多分一点不重要模块少分一点。1.1.3 进一步演进AdaLoRA在总参数预算基本不变的情况下动态调整不同模块的秩。 训练过程中把更多容量分给重要方向压缩不重要方向。一句话总结 普通 LoRA 是“大家平均分 rank”AdaLoRA 更像“谁重要谁多拿预算”让有限参数用在最关键的位置。1.2 AdaLora的特点1.2.1 AdaLoRA 的核心总预算不变重新分配标准 LoRA每个矩阵都用同一个r例如r 8。AdaLoRA允许不同矩阵使用不同的 rank。但总预算保持不变例如r₁ r₂ ... r₁₀₀ 8001.2.2 为什么要这样做不同层、不同矩阵对任务的重要性不同。如果平均分配 rank可能出现不重要的模块浪费参数重要模块容量不够所以更合理的是重要模块多分不重要模块少分。1.2.3 真正的关键问题AdaLoRA 最核心的问题其实变成了How to measure importance? —— 怎么判断谁更重要训练过程中先评估各模块/奇异方向的重要性再动态剪掉不重要的部分把预算留给更关键的方向。一句话总结AdaLoRA 本质上是在固定参数预算下做“动态资源调度”不是增加参数而是先判断重要性再把 rank 分到最值得的地方。1.3 具体区别展示1.3.1 LoRA 和 AdaLoRA 的核心区别LoRAΔW BArankr通常提前固定。AdaLoRAΔW PΛQ把低秩更新拆成“方向 重要程度 方向”。其中Λ的对角元素可以理解为各个低秩方向的重要性“开关”。1.3.2 为什么要用PΛQP、Q负责学习低秩更新的方向并通过正交约束让这些方向尽量独立。Λ diag(λ₁, λ₂, …, λᵣ)控制每个 rank-1 方向的贡献。如果某个λᵢ被裁剪为 0对应方向就基本不再参与更新。1.3.3 AdaLoRA 怎么实现动态 rankP、Q正常做梯度更新。Λ除了更新外还会结合重要性评分 总预算进行裁剪。于是不同矩阵最终可以拥有不同的有效 rank把更多预算留给重要模块。一句话总结LoRA 是“固定 rank 学 BA”AdaLoRA 是“用 PΛQ 把低秩方向拆开再动态决定哪些方向留下”。1.4 训练流程1.4.1 Instruction Data 怎么训练一条样本由Instruction Response拼接成 token 序列。Decoder 采用自回归方式预测下一个答案 tokenI O_t → Ō_t训练时使用Teacher Forcing即输入真实的历史答案 token。1.4.2 Loss 怎么来的模型对每个O_t输出整个词表的概率分布。再与真实 token 计算Cross-Entropy LossŌ_t ↔ O_t → CE Loss指令微调中通常主要对Response 部分计算 Loss。1.4.3 AdaLoRA 真正作用在哪里AdaLoRA不改变 CE Loss 和 Decoder 的生成方式。CE Loss 反向传播得到P、Λ、Q的梯度。再通过重要性评估 预算约束 Λ 裁剪动态调整各模块的有效 rank。一句话总结这一页主要讲“梯度从哪里来”Instruction → Decoder → CE Loss → GradientAdaLoRA 的创新发生在拿到梯度之后的动态 Rank 分配。1.5 原理分析一1.5.1 LoRA → AdaLoRA 的结构变化LoRAΔW BArankr一般提前固定。AdaLoRAΔW PΛQ把低秩更新拆成“方向 重要程度 方向”。1.5.2 为什么要加ΛΛ diag(λ₁, …, λᵣ)控制每个 rank-1 方向的贡献。P、Q通过正交约束尽量保持不同方向独立。某个λᵢ 0就相当于关闭对应的低秩方向。1.5.3 AdaLoRA 怎么实现动态 RankP、Q正常梯度更新。Λ还会结合重要性评分 Budget做裁剪。最终不同权重矩阵可以获得不同的有效 rank把更多参数留给重要模块。一句话总结LoRA 是“固定 rank 学 BA”AdaLoRA 是“用 PΛQ 把 rank 方向拆开再按重要性决定哪些方向留下”。1.6 原理分析二1.6.1 上半部分Loss 从哪里来Instruction Response送入 Decoder。模型做自回归预测并与真实O_t计算Cross-Entropy Loss。这个 Loss 反向传播后才会得到 AdaLoRA 需要的梯度。1.6.2 下半部分为什么要引入 SVDSVD 把矩阵写成A UΣVᵀ。每个σ_i u_i v_iᵀ都可以看成一个rank-1 方向。σ_i越大通常说明这个方向越重要因此可以通过保留大奇异值、舍弃小奇异值来做低秩近似。1.6.3 SVD 怎么启发 AdaLoRASVDA UΣVᵀAdaLoRAΔW PΛQ可以对应理解为U ↔ PΣ ↔ ΛVᵀ ↔ Q。AdaLoRA 再结合重要性评分把不重要方向的λ_i置零从而动态调整有效 Rank。一句话总结这页真正是在解释SVD 先告诉我们“不同 rank 方向的重要性不同”AdaLoRA 再把这个思想变成PΛQ让每个低秩方向都能被单独评估、保留或裁掉。1.7 Adalora详细解析1.7.1 先算每个 Rank 方向的重要性第k个矩阵写成ΔW_k P_kΛ_kQ_k。Λ_k中每个λ_{k,i}对应一个 Rank-1 方向。AdaLoRA 会为每个方向计算重要性分数S_{k,i}。1.7.2 所有 Rank 做“全局竞争”不是每个矩阵各自保留固定数量。而是把整个模型所有S_{k,i}放在一起排序。当前预算为b^(t)时只保留Global Top-b^(t)。1.7.3 不重要的方向直接关闭进入 Top-b^(t)对应λ_{k,i}保留。没进入λ_{k,i} → 0该 Rank 方向失效。因此不同矩阵最终会得到不同的有效 Rank。一句话总结AdaLoRA 的动态 Rank 分配就是先算重要性 → 全局排序 → 按预算保留 Top-b → 其余 λ 置零让所有层共同竞争有限的 Rank Budget。1.8 Adalora的重要性评分计算1.8.1 先给“单个参数”打分AdaLoRA 先计算参数敏感度I(w)|w·∇_wL|。再用 EMA 得到平滑敏感度Ī(w)同时计算波动程度Ū(w)。最终得到单参数重要性s(w)Ī(w)·Ū(w)。1.8.2 再把参数分数聚合成 Rank 分数一个 Rank 方向由三部分组成P的第 i 列 λ_{k,i}Q的第 i 行。所以 AdaLoRA 不只看|λ|而是把这三部分的重要性一起综合。得到S_{k,i}s(λ)Avg[s(P列)]Avg[s(Q行)]。1.8.3 最后拿去做 Rank 剪枝S_{k,i}越大说明这个 Rank 方向越重要。后续把所有S_{k,i}做全局排序。进入Top-b^(t)的方向保留其余对应λ_{k,i}→0。一句话总结AdaLoRA 的 Importance Score 就是先给参数打分再把参数的重要性聚合成整个 Rank 方向的分数最后用于全局 Budget 排序与剪枝。二、Qlora学习2.1 引出问题2.1.1 为什么 LoRA 之后还需要 QLoRALoRA已经大幅减少了“需要训练的参数”。但冻结的Base Model 仍然要加载进显存。模型越大光保存基础权重就已经非常昂贵。2.2.2 QLoRA 的核心思路LoRA高精度 Base Model 可训练 LoRAQLoRA4-bit 量化 Base Model 可训练 LoRA也就是Base Model 不训练就进一步把它压缩存储。2.2.3 它主要解决什么Quantization降低基础模型的显存占用。LoRA减少真正需要更新的参数量。两者结合后让大模型微调更容易在有限 GPU 显存下完成。一句话总结LoRA 解决“训练参数太多”QLoRA 进一步解决“冻结的大模型本身还是太占显存”核心就是4-bit Quantization LoRA。2.2 QLoRA 的直接价值显存大幅下降2.2.1 传统微调为什么贵全参数微调不仅要存模型权重还要保存梯度、优化器状态和激活值。模型越大显存需求增长非常快。课件示例中LLaMA2-70B 的传统微调显存达到840 GB。2.2.2 QLoRA 怎么把显存降下来Base Model4-bit 量化 冻结LoRA Adapter保持可训练这样既减少基础模型的存储又避免为全部参数保存完整训练状态。2.2.3 效果有多明显T5-11B132 GB → 6 GBMistral-7B84 GB → 5 GBLLaMA2-70B840 GB → 46 GB一句话总结LoRA 是“少训练参数”QLoRA 更进一步是“冻结的大模型也少占显存”最终实现4-bit Quantization LoRA → 更低显存的大模型微调。2.3 QLoRA 显存优化从 16-bit Base Model 到 4-bit2.3.1 QLoRA 真正压缩的是 Base Model普通 LoRA 仍然保存16-bit Frozen Base Model。QLoRA 把它进一步量化成4-bit而 LoRA Adapter 继续保持可训练。所以核心变化就是16-bit → 4-bitBase Model 的存储开销大幅下降。2.3.2 为什么显存能继续下降LoRA 已经减少了梯度和优化器状态的开销。QLoRA 再把最大的显存来源——冻结的基础模型权重压缩。课件示例中70B 模型从 LoRA 的约154 GB降到 QLoRA 的约46 GB。2.3.3 还有一个关键技术Paged OptimizerQLoRA 还通过CPU ↔ GPU 分页调度缓解训练时的显存峰值。它主要解决Memory Spike / OOM而不是负责 16-bit → 4-bit 的主体压缩。因此可以记成4-bit Quantization LoRA Paged Optimizer。一句话总结QLoRA 就是在 LoRA 的基础上把冻结的 Base Model 从16-bit 压到 4-bit再配合分页优化器进一步降低显存门槛。2.4 Full Fine-tuning 的显存成本70B 为什么约 840 GB2.4.1 每个参数不只要存“权重”按课件的简化估算全参数微调需要同时保存Weight16 bitGradient16 bitAdam Optimizer States64 bit所以每个参数大约需要16 16 64 96 bit 12 Byte2.4.2 70B 模型为什么变成 840 GB直接计算70B × 12 Byte ≈ 840 GB其中大约可以拆成权重140 GB梯度140 GB优化器状态560 GB这还没算 Activation、临时缓存等额外开销。2.4.3 这就是 LoRA / QLoRA 出现的原因Full FT整个模型都训练显存最高。LoRA冻结 Base Model只训练少量 Adapter。QLoRA进一步把冻结的 Base Model 量化到 4-bit。一句话总结Full Fine-tuning 真正贵的地方不只是模型权重大而是每个可训练参数还要额外配套梯度和优化器状态所以 70B 模型的训练状态可以迅速膨胀到数百 GB。2.5 Quantization 基础Float32 怎么映射成 INT82.5.1 核心思路先缩放再取整原始 Float32 是连续小数INT8 只能表示有限整数。所以先找最大绝对值a_max max|a|把数据缩放到[-1,1]。再映射到[-127,127]最后Round成整数。2.5.2 两个最关键的公式Scales max|a| / 127Quantizationq round(a / s)需要恢复时再做â s · q例如(-2.7,-3.8,5.7,6.1,6.8) → (-50,-71,106,114,127)2.5.3 量化真正的问题会产生误差Round 会丢掉一部分小数信息所以只能近似恢复原值。AbsMax 量化还容易受到Outlier影响一个极端值可能让大量普通权重挤在 0 附近。这正好引出后面的NF4当只有 4-bit、16 个表示位置时怎样安排这些位置才能让误差更小一句话总结量化就是把连续浮点数通过Scale → 映射 → Round变成低比特整数用更少存储换取可接受的近似误差。2.6 Quantization 的 Outlier 问题为什么要做 Block-wise Quantization2.6.1 Global Quantization 的问题全局量化时整个 Tensor 共用一个absmax和 Scale。如果出现很大的Outlier例如50其他正常值会被压到 0 附近。在 4-bit 这类低比特量化中很多正常权重甚至可能被映射成相同的离散值导致明显信息损失。2.6.2 Block-wise Quantization 怎么解决把大权重 Tensor 切成多个小 Block。每个 Block 单独计算自己的absmax和量化常数C_i。这样 Outlier只影响它所在的 Block不会把整个模型的量化范围都拉大。2.6.3 为什么又会引出 Double QuantizationBlock 越多就需要保存越多的C_1、C_2、C_3...。这些 Scale / Quantization Constants 本身也会占显存。所以 QLoRA 再进一步把这些C_i也量化这就是 Double Quantization。一句话总结Outlier 会把全局量化范围拉大 → Block-wise 用局部 Scale 把影响限制在小范围 → 但会产生大量 Scale → Double Quantization 再继续压缩这些 Scale。2.7 Quantile为什么“等概率分箱”更适合低比特量化2.7.1 Quantile 不是“等距离”而是“等数量”先把数据从小到大排序。再按照概率划分区间例如 800 个数据分成 8 组每组约100 个。所以每组的数据数量接近相同但数值区间宽度可以不同。2.7.2 数据越密集量化就越精细数据集中区域区间会更窄量化点更密。数据稀疏区域区间会更宽量化点更稀。相比等距离分箱可以把有限的 bit更多用在真正数据多的地方。2.7.3 这就是 NF4 的重要铺垫4-bit 只有16 个离散表示位置。NF4 利用近似正态分布的 Quantile 思想来设计这些量化位置。核心目的就是让常见权重区域获得更高表示精度减少量化误差。一句话总结Uniform Quantization 是“按距离平均分”Quantile 是“按概率平均分”对于分布不均匀的模型权重后者通常能更有效利用有限的量化位置。2.8 Normal Distribution QuantileNF4 为什么要按概率分配量化区间2.8.1 神经网络权重通常集中在 0 附近可以近似理解为Normal Distribution。中间权重多两侧大权重少。所以如果仍然“等距离切区间”有限的量化位置会被浪费。2.8.2 Quantile 改成“等概率划分”利用 CDFF(x)P(X≤x)。再通过q_pF⁻¹(p)找到不同分位点。结果就是中心数据密集 → 区间更窄两侧数据稀疏 → 区间更宽。2.8.3 这正是 NF4 的核心铺垫4-bit 只有16 个表示位置。NF4 根据权重的概率分布设计非均匀量化位置而不是简单平均铺开。目的就是把更多量化精度留给最常出现的权重区域。一句话总结Normal Distribution 决定“数据主要在哪”Quantile 决定“量化点该怎么放”两者结合就是 NF4 非均匀 4-bit 量化的重要直觉。2.9 NF44-bit 的 16 个量化值到底怎么设计2.9.1 NF4 不是等距离量化4-bit 只有16 个离散表示值。NF4 根据模型权重近似Normal Distribution的特点用Quantile来安排这些量化位置。因此0 附近更密两侧更疏比普通 INT4 更适合权重分布。2.9.2 为什么必须保留 Exact Zero神经网络中0很重要最好能够被精确表示。所以 NF4 会专门给0留一个编码位置。最终 16 个值呈轻微不对称可直观理解为7 个负值 0 8 个正值。2.9.3 实际怎么量化每个 Block 先通过absmax归一化到[-1,1]。再把每个权重映射到最近的 NF4 codebook 值。最终真正保存的是对应的4-bit index反量化时再乘回 Block 的 Scale。一句话总结NF4 的核心不是“只有 4 bit”而是这 16 个值按照正态分布的概率结构来设计并保留精确的 0从而用有限的 4-bit 表示尽可能减少量化误差。三、思维导图总结
返回列表