[ PROMPT_NODE_22356 ]
methods
[ SKILL_DOCUMENTATION ]
# 模型合并方法:深度解析
基于研究论文的模型合并算法完整技术指南。
## 目录
- TIES-Merging 算法
- DARE (Drop And REscale)
- 线性合并 (Linear Merging)
- SLERP
- 任务算术 (Task Arithmetic)
- 对比
## TIES-Merging:解决干扰
**论文**: "TIES-Merging: Resolving Interference When Merging Models" (NeurIPS 2023)
**作者**: Prateek Yadav 等
**代码**: https://github.com/prateeky2806/ties-merging
### 算法概述
TIES-Merging 解决了两个主要的干扰源:
1. 冗余的参数值
2. 模型间的符号冲突
**三步流程**: TRIM, ELECT, MERGE
### 第一步:TRIM(重置微小变化)
移除在微调过程中变化极小的参数。
python
def trim(task_vector, density=0.2):
"""保留按幅度计算的前 k% 参数,其余重置为 0。"""
# 计算幅度
magnitudes = torch.abs(task_vector)
# 获取前 k% 的阈值
k = int(density * task_vector.numel())
threshold = torch.topk(magnitudes.flatten(), k).values.min()
# 创建掩码:保留高于阈值的参数
mask = magnitudes >= threshold
# 应用掩码
trimmed_vector = task_vector * mask
return trimmed_vector
# 示例
task_vector_1 = finetuned_model_1 - base_model
task_vector_2 = finetuned_model_2 - base_model
trimmed_1 = trim(task_vector_1, density=0.2) # 保留前 20%
trimmed_2 = trim(task_vector_2, density=0.2)
### 第二步:ELECT SIGN(解决冲突)
当参数符号冲突时,选择占主导地位的符号。
python
def elect_sign(task_vectors):
"""解决跨多个任务向量的符号冲突。"""
# 堆叠所有任务向量
stacked = torch.stack(task_vectors) # (模型数量, 参数数量)
# 计算每个参数的正负数量
positive_count = (stacked > 0).sum(dim=0)
negative_count = (stacked negative_count,
torch.ones_like(stacked[0]),
-torch.ones_like(stacked[0])
)
# 若平局,保留第一个模型的符号
tie_mask = (positive_count == negative_count)
final_sign[tie_mask] = torch.sign(stacked[0][tie_mask])
return final_sign
# 示例
task_vectors = [trimmed_1, trimmed_2, trimmed_3]
elected_sign = elect_sign(task_vectors)
### 第三步:MERGE(不相交合并)
仅合并与所选符号一致的参数。
python
def ties_merge(base_mod