你已经知道 SFT 要学习什么。LoRA 解决另一个问题:如果基座模型很大,能否用更少的可训练参数表示权重变化?从一个线性层开始看最清楚。
用两个小矩阵表示权重增量
假设原权重 W 的形状是 [out,in],完整更新需要调整其中每个元素。LoRA 用两个低秩矩阵 A 与 B 表示增量,形状分别是 [r,in] 和 [out,r],让有效权重包含一个经过缩放的 BA。
基座 W 可以冻结,训练的是这些增量参数。rank r 控制表示方式的容量和参数数量,不是“任务难度评分”。训练配置还包括目标层、缩放系数、dropout 等,不能只记住一个 rank。
手算一次参数数量
一个 1024×1024 的权重矩阵有 1,048,576 个元素。若 rank=8,A 与 B 共需 8×1024 + 1024×8 = 16,384 个参数,是该权重数量的 1/64。这里不计偏置,也不计模型的其他层。
input_size = output_size = 1024
rank = 8
full_parameters = input_size * output_size
lora_parameters = rank * (input_size + output_size)
print(full_parameters, lora_parameters)
这个比例不是整个模型的参数减少比例,更不是实际显存、耗时或效果提升比例。
为什么显存仍然要测
冻结的基座权重仍需驻留,前向激活、输入长度、批次、精度、梯度与优化器状态也会影响内存。参数数量减少,不代表所有内存都同比减少。
量化基座与 LoRA 可以组合,但量化涉及额外计算、数值误差和设备支持。这些条件要记录在实验里,不能把 LoRA 和 QLoRA 的配置混为一谈。
把适配器当成完整实验的一部分
保存适配器时,记录基座模型版本、目标层、rank、训练数据、分词器与推理模板。加载时的基座不匹配,可能让结果失去意义。评估仍使用上一课固定的留出样本和规则。
到这里,你已有预训练与微调的比较框架。下一章进入数据和工程:先确认数据质量,再测实际瓶颈,最后把整个过程整理成可复现的小项目。