· 参数高效微调
LoRA 参数高效微调:低秩分解与关键配置
冻结原权重,只训练两个小矩阵 A(d×r) 与 B(r×k) 去逼近 ΔW,可训练参数从 dk 降到 r(d+k):挂在哪、秩 r 怎么选。
dk 降到 r(d+k)。01 先看这两段视频落在哪
这不是从零讲 LoRA,而是一次面向面试的重点回顾 —— 开场就把范围划死了:面试问什么就重点记什么。按这个标准筛下来,LoRA 这块真正要抓住的只有两件事:挂在哪些权重矩阵上、以及 秩 r 怎么选。
- 第一段(9:23)里用在“秩 → 低秩矩阵 → 低秩分解”上的时间接近 3 分 20 秒,占全片三分之一还多。理由很直接:不先把秩讲通,后面 ΔW ≈ AB 就只能死记。
- 同一段的后半部分(约 3:18–7:40)才是原理主线,7:40 之后讲训练与推理怎么落地。
- 第二段只有 3:15,但信息密度最高:前 2 分 05 秒全部用来数“大模型里到底有哪些线性层”,最后收敛成 7 个可用位置;随后约 50 秒讲 rank,剩下十几秒把 α 与 dropout 一句带过。
02 秩、低秩矩阵、低秩分解:三个概念一次串完
概念的推进顺序是“定义 → 判据 → 性质”,每一步都配一个能肉眼看出答案的矩阵。秩的定义是矩阵里线性无关的行 / 列向量的个数;判据可以用一句口语概括 ——矩阵的秩远小于它的形状时,就叫低秩矩阵,形式上写作 rank(W) ≪ min(d,k)。
接着是低秩矩阵的分解:低秩矩阵必然可以拆成两个小矩阵的乘积,这是 LoRA 后面唯一用到的那条性质。下面用一个 6×5 的矩阵,把“怎么拆”逐步演算一遍。
- 先定秩:这个 6×5 矩阵的秩是 2 —— 前两列线性独立,后面几列都能由这两列算出来。
- A 存的是独立方向(6×2),B 存的是系数(2×5)。B 的每一列回答的是:要凑出 W 的这一列,两个独立方向各取多少倍。
- 验算就是普通矩阵乘法:A 的某一行与 B 的某一列逐点相乘再相加,正好得到 W 的对应元素。
- 分解方式不止一种,记住“低秩矩阵可以分解成两个小矩阵的乘积”这个结论就够了。
03 原理主线:从 W = W₀ + ΔW 到 ΔW ≈ AB
全参微调会把线性层的权重矩阵更新成 W0 + ΔW,其中 ΔW 是一批批数据更新累积下来的变化量。把这个式子代进前向计算,就得到 LoRA 的出发点:
y = xW = x(W0 + ΔW) = xW0 + xΔW
它的意义是:更新后的模型在计算上等价于两条支路并行,再把结果相加 —— 一条走原始权重 W0,一条走增量 ΔW。落到模型结构图上,就是下面这三步变形。
- ① 原来的线性层是一整个 W;② 展开成 W0 与 ΔW 两条支路求和;③ 右侧那条增量支路再被换掉。
- 换的依据是:ΔW 往往是一个低秩矩阵,而低秩矩阵可以分解成两个小矩阵的乘积,于是 ΔW ≈ AB。
- 关键一句:A、B 的值不需要人为指定,让模型自己去学,学完之后 AB 就相当于 ΔW。
- 反过来问“为什么不直接学 ΔW”,答案很直白 —— 直接学 ΔW 要学的参数太多,拆成 A、B 之后要学的参数就很少。
差多少可以直接算:全参微调要更新 dk 个参数,LoRA 只训练 dr + rk = r(d+k) 个参数;因为 r 远小于 d、k,这个下降是数量级的,而不是几十个百分点。
04 训练时到底发生了什么
训练流程按顺序记下来就是标准答案:
- 前向:输入 x 分别与 W0、AB 做前向计算,两边结果相加得到这一层的输出。
- 继续层层往前传,最终得到 loss。
- 反向:W0 被冻结,所以不算 W0 的梯度,只计算 A、B 的梯度。
- 更新:用 A、B 的梯度更新 A、B —— 一轮训练里,动过的只有这两个小矩阵。
- 训练过程中,A、B 会逐渐“模拟出” ΔW 的效果。
- 收尾:把训好的 A、B 相乘得到 ΔW,再加回 W0,相当于恢复成最原本的线性层。
05 配置参数:真正会问的是前两项
四个参数的讲解时间极不均匀:target_modules 讲了 2 分多钟,rank 讲了约 50 秒,α 与 lora_dropout 只用了十几秒。这个时间分配本身就是重点提示 —— 前两项必须能答,后两项知道作用即可。
α 与 lora_dropout 的完整口径
- 缩放系数 α:权重增量实际写成
ΔW = (α/r)·AB。其中1/r负责对不同 rank 下的 LoRA 分支做归一化,α 则是人为设置的超参数,用来进一步调节 LoRA 分支的整体作用强度。 实际使用中 α 通常结合 r 一起设置,例如r=8, α=16或r=16, α=32。 - lora_dropout:表示 LoRA 分支中 Dropout 的丢弃概率,作用于“输入进入低秩矩阵之前”, 用来缓解训练过程中的过拟合。常用取值
0 / 0.05 / 0.1,一般从0.05起试; 训练数据较多或没有明显过拟合可设为 0,数据较少或明显过拟合可适当增大到 0.1。 - rank r:决定低秩矩阵的大小。常用取值是
4 / 8 / 16 / 32 / 64, 一般从 8 或 16 开始尝试;任务较简单可用较小的 r,任务较复杂或希望模型适应能力更强时可适当增大。 r 没法精确估算,选大了 AB 参数量变多、计算量变大,理论上效果一般会更好。 - target_modules 的命名坑:不同模型对线性层的命名可能不同, 实际配置时应根据具体模型的网络结构确定。
06 容易踩的坑
- 别把 LoRA 说成“和全参微调一样”:更可靠的表述是“效果不如全参微调,但资源开销低得多”。 “能实现相当的性能”指的是最先进的 PEFT 方法整体,不是随便配一组参数就能达到。
- LoRA 减少的是可训练参数,不是激活值:它不会按相同比例减少激活值, 较大的单卡 batch 或序列长度仍然可能导致显存不足。
- “7 个位置”的适用前提:这是对 LLaMA / Qwen 这类 Decoder-only Transformer 数出来的 (注意力 q/k/v/o 加 FFN 的 gate/up/down),换成别的模型命名就变。
- 别背“r 越大越好”:r 越大参数量越多、计算量也变大;经验取值是“复杂任务大一点、 简单任务小一点”,或者直接从 8、16 起试。
07 补充:显存到底怎么算
“LoRA 省显存”是常识,但这两段视频都没有展开。为了让这句话有个能算的数,这里补上静态显存的估计公式 —— 只算模型权重、梯度、优化器状态这部分。
全参微调的式子里,每个参数要额外存 FP32 副本、梯度和 AdamW 的一阶二阶动量,合计 18 字节;而 LoRA 的基础模型只存 BF16 权重(2 字节/参数),梯度和优化器状态只为新增的 T 个参数保存。所以 T 远小于 P 时,LoRA 的静态显存几乎只剩“把基础模型加载进来”这一项。
08 面试问答卡
取材与还原方式(可核对)
- 素材:本机两个 mp4(EV 录屏 5.5.6 输出,1364×768、30fps),内容是配套 Word 讲义 (.docx)的滚动浏览,无内嵌字幕,无官方章节。
- 结构还原:对每段视频做 1fps 采样并计算相邻帧差分,按差分阈值切出“静止屏”, 两段共得到 23 屏;讲义的页码与左侧导航(4.2 LoRA / 8.1 矩阵的秩)由此确认。 时间轴来自音频转写后的分段对齐。
- 讲解原话:用 faster-whisper(small / int8 / CPU)在本地转写,共 132 段。 中文识别对同音词有明显错字 —— 例如“秩”识别成“质”、“矩阵”识别成“举证”、 “线性层”识别成“现象层”、“系数”识别成“细数”,本文引用时已按上下文校正, 校正依据是画面上的讲义原文。
- 画面文字:23 屏画面均按原始分辨率读取,用于确认讲到哪里、停在哪个公式。 讲义截图只用于读取文字,正文所有配图都是按内容重绘的矢量 SVG, 未嵌入任何视频帧或截图。
- 配套讲义:术语与公式的核对基准是随视频放在同一目录的 Word 讲义 (4.2 LoRA、4.2.3 配置参数、8.1 LoRA 相关数学基础),直接解析自本机文件。
- 推算而非引用的数字:图 4 的参数量表与图 7、图 8 的显存数字,是按讲义公式 代入 LLaMA-7B(d=4096、FFN=11008、32 层、r=8)算出来的,视频里并没有给出这些数字, 各图注中已标注来源。