引言

你有一个擅长编程的模型和一个擅长数学的模型,能不能得到一个两者都擅长的模型?模型合并(Model Merging)就是解决这个问题——将多个专门化模型的能力融合到一个模型中。

2026年,模型合并已经成为构建通用模型的重要技术。

一、合并方法

1.1 简单权重平均

def simple_average(models):
    """简单权重平均"""
    avg_state = {}
    for key in models[0].state_dict():
        avg_state[key] = sum(m.state_dict()[key] for m in models) / len(models)
    return avg_state

简单但可能不是最优——不同模型的权重可能在不同方向上优化。

1.2 SLERP(球面线性插值)

def slerp(t, v0, v1):
    """球面线性插值"""
    v0_norm = v0 / v0.norm()
    v1_norm = v1 / v1.norm()
    omega = torch.acos(torch.clamp(v0_norm @ v1_norm, -1, 1))
    so = torch.sin(omega)
    if so < 1e-6:
        return (1-t)*v0 + t*v1
    return torch.sin((1-t)*omega)/so * v0 + torch.sin(t*omega)/so * v1

def merge_slerp(model_a, model_b, t=0.5):
    """SLERP合并"""
    merged = {}
    for key in model_a.state_dict():
        merged[key] = slerp(t, model_a.state_dict()[key], model_b.state_dict()[key])
    return merged

1.3 TIES

def ties_merge(models, base_model, density=0.5):
    """TIES合并: Trim, Elect Sign, Disjoint Merge"""
    # 1. 计算每个模型相对于base的delta
    deltas = [m.state_dict() - base_model.state_dict() for m in models]
    
    # 2. Trim: 只保留每个delta中top-k的参数
    for delta in deltas:
        for key in delta:
            threshold = torch.quantile(delta[key].abs(), 1 - density)
            delta[key] = torch.where(delta[key].abs() > threshold, delta[key], 0)
    
    # 3. Elect Sign: 投票决定每个参数的符号
    merged = {}
    for key in base_model.state_dict():
        signs = sum(torch.sign(d[key]) for d in deltas)
        elected_sign = torch.sign(signs)
        
        # 4. Disjoint Merge: 只保留与选举符号一致的delta,取平均
        consistent = []
        for delta in deltas:
            mask = torch.sign(delta[key]) == elected_sign
            consistent.append(torch.where(mask, delta[key], 0))
        
        merged[key] = base_model.state_dict()[key] + sum(consistent) / max(1, sum(elected_sign != 0))
    
    return merged

1.4 DARE

def dare_merge(model_a, model_b, base_model, drop_rate=0.9):
    """DARE: Drop And REscale"""
    delta_a = model_a.state_dict() - base_model.state_dict()
    delta_b = model_b.state_dict() - base_model.state_dict()
    
    merged = {}
    for key in base_model.state_dict():
        # 随机丢弃大部分delta
        mask_a = (torch.rand_like(delta_a[key]) > drop_rate).float()
        mask_b = (torch.rand_like(delta_b[key]) > drop_rate).float()
        
        # 重新缩放
        dropped_a = delta_a[key] * mask_a / (1 - drop_rate)
        dropped_b = delta_b[key] * mask_b / (1 - drop_rate)
        
        # 合并
        merged[key] = base_model.state_dict()[key] + dropped_a + dropped_b
    
    return merged

二、层级合并

不同层使用不同的合并策略:

class LayerWiseMerger:
    def merge(self, models, base_model):
        merged = {}
        
        for key in base_model.state_dict():
            # embedding层:使用平均
            if "embed" in key:
                merged[key] = self.average([m.state_dict()[key] for m in models])
            
            # attention层:使用TIES
            elif "attention" in key:
                merged[key] = self.ties([m.state_dict()[key] for m in models], base_model.state_dict()[key])
            
            # MLP层:使用DARE
            elif "mlp" in key:
                merged[key] = self.dare([m.state_dict()[key] for m in models], base_model.state_dict()[key])
            
            # 输出层:使用SLERP
            else:
                merged[key] = self.slerp(models[0].state_dict()[key], models[1].state_dict()[key])
        
        return merged

三、评估

async def evaluate_merged(merged_model, benchmarks):
    """评估合并后的模型"""
    results = {}
    
    for bench in benchmarks:
        results[bench] = await run_benchmark(merged_model, bench)
    
    # 检查是否保持了原始模型的能力
    for capability in ["coding", "math", "reasoning", "writing"]:
        score = results.get(f"{capability}_bench", 0)
        if score < original_scores[capability] * 0.9:
            logger.warning(f"Capability {capability} degraded: {score} vs {original_scores[capability]}")
    
    return results

四、最佳实践

  1. 同源模型合并效果最好:相同基础模型微调的模型更容易合并
  2. 合并比率需要调优:不同模型的最优合并比率不同
  3. 评估所有能力:确保合并没有导致某些能力退化
  4. 合并后可选微调:轻微微调可以修复合并带来的不一致

结语

模型合并是一种低成本的能力融合方法——不需要重新训练,只需合并权重。2026年的实践表明,合并后的模型在某些任务上甚至超过了单独微调的效果。

但模型合并仍有局限性:合并的模型数量有限(通常2-4个),合并效果取决于模型间的兼容性。对于需要深度融合的场景,还是需要多任务联合训练。

未来方向是"自动化合并"——自动选择最优合并方法、比率和层级策略,让模型合并成为一个"黑箱"工具。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。