如何验证LLaMa2预训练模型与微调后模型的权重参数差异?
验证LLaMA2微调后模型与预训练模型的权重差异
你已经成功加载了预训练base模型和合并LoRA权重后的模型,以下是几种直接有效的权重对比方法:
方法1:逐层检查权重差异
遍历模型每一层参数,对比base模型和微调后模型的对应权重,输出有差异的层及差异统计信息:
import torch # 遍历模型参数对 for (name_base, param_base), (name_finetuned, param_finetuned) in zip(base_model.named_parameters(), model.named_parameters()): # 确保参数名匹配 assert name_base == name_finetuned, f"参数名不匹配:{name_base} vs {name_finetuned}" # 计算权重差值 diff = param_base.data - param_finetuned.data # 考虑浮点精度,用近似相等判断 if torch.allclose(param_base.data, param_finetuned.data, atol=1e-5): print(f"层 {name_base}: 权重无差异") else: print(f"层 {name_base}: 权重存在差异") print(f" 差异均值: {diff.mean().item():.6f}") print(f" 差异最大值: {diff.max().item():.6f}") print(f" 差异最小值: {diff.min().item():.6f}")
方法2:计算权重余弦相似度
余弦相似度越接近1,权重越相似;越接近0,差异越大:
from sklearn.metrics.pairwise import cosine_similarity import numpy as np for (name_base, param_base), (name_finetuned, param_finetuned) in zip(base_model.named_parameters(), model.named_parameters()): assert name_base == name_finetuned # 将张量展平为一维数组 base_flat = param_base.data.cpu().numpy().flatten() finetuned_flat = param_finetuned.data.cpu().numpy().flatten() # 计算余弦相似度 sim = cosine_similarity([base_flat], [finetuned_flat])[0][0] print(f"层 {name_base}: 余弦相似度 = {sim:.6f}")
方法3:聚焦LoRA微调层
LoRA仅针对特定层(通常是注意力层的q、v投影)微调,可只检查这些层:
# 筛选LLaMA2中常见的LoRA微调层 lora_target_layers = [name for name, _ in base_model.named_parameters() if 'q_proj' in name or 'v_proj' in name] for layer_name in lora_target_layers: param_base = base_model.state_dict()[layer_name] param_finetuned = model.state_dict()[layer_name] if not torch.allclose(param_base, param_finetuned, atol=1e-5): print(f"LoRA层 {layer_name}: 权重已更新") print(f" 差异均值: (param_base - param_finetuned).mean().item():.6f") else: print(f"LoRA层 {layer_name}: 权重无变化")
注意事项
- 由于使用
torch.float16加载模型,计算时可能存在微小浮点误差,优先用torch.allclose替代严格相等判断 - 若模型在GPU上,可先通过
.cpu()将参数转到CPU计算,避免显存占用过高
内容的提问来源于stack exchange,提问作者Sarthak Sharma
相关产品推荐
相关产品推荐

