TIES-Merging:解决参数干扰的模型合并
1. 背景与动机
当直接合并多个微调模型时,参数干扰(Parameter Interference)是一个严重问题。1 TIES-Merging 提出三步流程来解决这一挑战。
2. TIES三步流程
TIES = Trim + Elect Signs + Merge
2.1 Step 1: Trim(修剪)
移除微调过程中变化微小的参数,只保留真正携带任务知识的参数。
保留条件:
其中 是阈值, 是标准差。
torch::Tensor trim_task_vector(
torch::Tensor task_vector,
float delta = 1.0
) {
// 计算标准差
auto std = task_vector.std();
auto threshold = delta * std.item<float>();
// 创建掩码
auto mask = task_vector.abs() > threshold;
return task_vector * mask.to(task_vector.dtype());
}2.2 Step 2: Elect Signs(符号投票)
解决不同模型间的符号冲突,只保留「多数意见」。
对于参数位置 ,计算符号一致性:
- 如果总和为正,
- 如果总和为负,
- 如果为0(平局),则设为0
def elect_signs(task_vectors):
"""符号投票"""
signs = torch.stack([torch.sign(tv) for tv in task_vectors])
vote_sum = signs.sum(dim=0)
elected = torch.sign(vote_sum)
elected[vote_sum == 0] = 0 # 处理平局
return elected2.3 Step 3: Merge(合并)
只对符号一致的参数进行平均:
其中 是与 符号一致的数量。
torch::Tensor ties_merge(
torch::Tensor pretrain,
std::vector<torch::Tensor> task_vectors,
float delta = 1.0
) {
// Step 1: Trim
std::vector<torch::Tensor> trimmed;
for (auto& tv : task_vectors) {
trimmed.push_back(trim_task_vector(tv, delta));
}
// Step 2: Elect Signs
torch::Tensor elected = elect_signs(trimmed);
// Step 3: Merge
torch::Tensor merged_delta = torch.zeros_like(pretrain);
std::map<int, int> count_map; // 只统计符号一致的位置
for (auto& tv : trimmed) {
auto mask = (torch.sign(tv) == elected) & (elected != 0);
merged_delta += tv * mask.to(tv.dtype());
for (auto idx : mask.nonzero()) {
count_map[idx.item()]++;
}
}
// 平均
for (auto& [idx, cnt] : count_map) {
merged_delta[idx] /= cnt;
}
return pretrain + merged_delta;
}3. 与Task Arithmetic的对比
| 维度 | Task Arithmetic | TIES-Merging |
|---|---|---|
| 符号处理 | 直接平均,可能相互抵消 | 符号投票,统一方向 |
| 参数选择 | 所有参数 | 只保留变化显著的参数 |
| 冲突解决 | 无 | 有系统方法 |
| 理论基础 | 弱 | 强(实验验证) |
4. 理论分析
4.1 干扰减轻
TIES通过两个机制减轻干扰:
- 修剪:移除「模糊」参数,避免引入噪声
- 符号统一:确保合并时参数增强而非相互抵消
4.2 表达能力权衡
修剪可能导致信息损失:
- 越小,保留越多
- 需要在表达能力和抗干扰性间权衡
5. 实验结果
TIES在多项任务上的表现显著优于基线方法:1
| 方法 | Task A | Task B | 平均 |
|---|---|---|---|
| 简单平均 | 72.3 | 68.1 | 70.2 |
| Task Arithmetic | 78.5 | 71.2 | 74.9 |
| TIES-Merging | 81.2 | 79.8 | 80.5 |
6. 超参数设置
6.1 Trim阈值
- 推荐值:0.5 ~ 1.5
- 高干扰场景:选择较高值(如1.0)
- 低干扰场景:选择较低值(如0.5)
6.2 任务权重
默认使用均匀权重,也可根据任务重要性调整:
7. 实践建议
- 预处理:确保模型结构一致(对齐参数顺序)
- 预训练基准:使用相同预训练模型作为基准
- 验证:在保留的验证集上评估合并结果
- 迭代:可以多次应用TIES逐步合并
8. 扩展阅读
- Task Arithmetic - 任务向量基础
- DARE - 另一种干扰减轻方法
- SLERP - 球面插值方法