权重平均与Model Soup
1. 概述
权重平均是最直接的模型合并方法,包括简单平均、加权平均和Model Soup。其核心思想是将多个模型的参数向量进行算术平均。
2. 简单权重平均
2.1 方法定义
给定 个模型参数 ,简单平均定义为:
2.2 理论基础
在 模式连接 的假设下,如果各极小值在同一个「盆地」内,简单平均应该接近盆地中心,从而获得良好的泛化性能。
然而,参数干扰可能导致平均点落在高损失区域。
2.3 实践问题
- 幅度归一化:需要考虑不同模型权重幅度的差异
- 对称性处理:置换对称性可能导致平均结果不稳定
- 任务冲突:多任务场景下性能下降明显
3. Model Soup
3.1 核心思想
Model Soup 1 是一种在微调过程中进行权重平均的方法。通过对不同超参数下微调的模型进行平均,可以获得更鲁棒的模型。
3.2 方法分类
均匀 Soup
所有模型等权重:
贪婪 Soup
按验证集性能逐步添加模型:
def greedy_soup(models, val_scores, X_val, y_val):
theta = models[0]
best_score = val_scores[0]
for i in range(1, len(models)):
candidate = (theta * i + models[i]) / (i + 1)
score = evaluate(candidate, X_val, y_val)
if score >= best_score:
theta = candidate
best_score = score
return theta3.3 理论分析
Model Soup的理论优势在于:1
- 超参数探索的集成:不同超参数对应不同的学习动态
- 隐式正则化:平均操作引入额外的平滑效果
- 模式连接的利用:好极小值倾向于聚集在一起
4. SLERP:球面线性插值
4.1 动机
简单线性插值在参数空间中可能穿过高损失区域。SLERP(Spherical Linear Interpolation)通过在超球面上进行插值来缓解这一问题。
4.2 数学定义
对于两个单位化的参数向量 :
其中 是夹角。
4.3 PyTorch实现
import torch
import torch.nn.functional as F
def slerp(theta1, theta2, t):
"""球面线性插值"""
# 归一化
theta1_norm = theta1 / theta1.norm()
theta2_norm = theta2 / theta2.norm()
# 计算夹角
cos_omega = (theta1_norm * theta2_norm).sum()
omega = torch.acos(cos_omega.clamp(-1, 1))
# 避免除零
sin_omega = torch.sin(omega)
sin_omega[sin_omega < 1e-7] = 1e-7
# SLERP
w1 = torch.sin((1 - t) * omega) / sin_omega
w2 = torch.sin(t * omega) / sin_omega
return w1 * theta1 + w2 * theta24.4 局限性
- 计算复杂度较高(需计算反三角函数)
- 仅适用于两模型合并,多模型需链式调用
- 归一化可能丢失幅度信息
5. RegMean与统计合并
RegMean 2 利用权重的统计特性进行合并:
其中 是各模型参数的标准差,反映其置信度。
6. 实践指南
6.1 方法选择
| 场景 | 推荐方法 |
|---|---|
| 快速实验 | 简单平均 |
| 超参数微调后 | Model Soup |
| 两模型插值 | SLERP |
| 多任务场景 | TIES/DARE |
6.2 注意事项
- 权重幅度:合并前进行幅度归一化
- 对称性处理:使用权重匹配算法对齐置换对称性
- 验证集评估:贪婪Soup策略需要验证集
7. 扩展阅读
- 模型合并基础 - 理论基础与挑战
- TIES-Merging - 解决符号冲突
- DARE - 稀疏化增强