Skip to content

损失、梯度与参数高效训练 ​

理解一次参数更新,可以先训练只有一个权重的分类器。输入x是一个特征,sigmoid(wx)输出概率,二元交叉熵惩罚错误概率,梯度为(p-y)x。学习率决定每步走多远,过大会震荡,过小收敛慢。

python
from math import exp, log
samples = [(-2.,0.),(-1.,0.),(1.,1.),(2.,1.)]
def loss(w):
    return sum(-y*log(1/(1+exp(-w*x)))-(1-y)*log(1-1/(1+exp(-w*x))) for x,y in samples)/len(samples)
w = 0.
initial = loss(w)
for _ in range(100):
    gradient = sum((1/(1+exp(-w*x))-y)*x for x,y in samples)/len(samples)
    w -= 0.1*gradient
assert loss(w) < initial
assert 1/(1+exp(-w)) > 0.5
print(round(initial,4), round(loss(w),4))

例子把整个训练集作为一个batch;小批量训练的梯度更噪,梯度累积可以模拟较大有效batch,但不能忽略loss缩放。真实语言模型对许多token求损失,序列长度和mask会改变平均权重。训练loss下降、验证loss上升提示过拟合;只提高epoch不解决标签错和数据泄漏。

全量微调更新全部参数,还需保存梯度、优化器状态和激活,显存远大于权重文件。LoRA冻结基础权重W,学习低秩增量BA:若W为d×k,秩r的新增参数为r(d+k),小于dk时节省可训练状态。r过小限制表达,r变大增加内存,并不保证质量。LoRA不是压缩原模型。

QLoRA把冻结基础权重量化,训练适配器;计算精度、存储精度和优化器状态不同。量化格式和硬件支持必须匹配。偏好优化如DPO利用chosen/rejected与参考策略的相对概率训练偏好,数据偏好若只追求冗长就会放大冗长。它不是替代所有SFT的数据清洗方法。PEFT量化说明给出量化模型与LoRA配合条件。

混合精度降低部分显存和计算开销,但数值溢出需监控;梯度检查点以重算换激活内存;数据并行复制模型分摊样本,模型/张量并行切分参数计算,通信成本不同。不要把这些术语都当成“显存减半”的按钮。

保存检查点时包括权重或adapter、优化器、scheduler、随机状态、数据进度和配置;只存权重能用于推理,未必可等价恢复训练。先做极小样本过拟合检查确认管道能学,再进行完整训练。

练习 ​

计算4096×4096线性层、r=8的LoRA参数数和全量参数数,再把r变成16,解释模型推理内存为什么不因此变成原来的几百分之一。

完成后查看本章答案。

下一篇:继续本章完整实验。

用心记录每一步成长