探索 SLERP 消除

社区文章 发布于2025年5月1日

消除(Abliteration)是一种可用于有针对性地移除或禁用大型语言模型中特定组件或机制的过程,通常针对负责生成拒绝或安全响应的行为,但也可以针对其他行为。对此主题的全面讨论超出了本文的范围。

在LLM的传统消除中,使用简单的向量差来计算概念上无害和有害响应之间的拒绝向量。此方法与线性插值对齐。

refusal_dir = harmful_mean - harmless_mean

然而,我们提出球面线性插值(SLERP)可能是一个可行的替代方案,因为我们正在处理高维空间,其中行为可能在超球面上更好地捕捉。这将保留角度关系,从而更好地尊重在超球面上编码语义意义的任何语言模型嵌入(余弦相似度是一个常见度量)。

SLERP实现

def slerp(v0, v1, t):
    """Spherical linear interpolation between two vectors."""
    # Normalize input vectors
    v0_norm = v0 / v0.norm()
    v1_norm = v1 / v1.norm()
    
    # Calculate the dot product (cosine of angle between vectors)
    dot = torch.sum(v0_norm * v1_norm)
    
    # Clamp dot product to remain in valid range for acos
    dot = torch.clamp(dot, -1.0, 1.0)
    
    # Calculate the angle between vectors
    omega = torch.acos(dot)
    
    # Handle edge cases
    if omega < 1e-6:  # Vectors are nearly parallel
        return (1-t) * v0 + t * v1
    
    # Perform SLERP
    sin_omega = torch.sin(omega)
    return torch.sin((1-t) * omega) / sin_omega * v0 + torch.sin(t * omega) / sin_omega * v1

通过SLERP计算替代拒绝方向

# Normalize means (important for SLERP)
harmful_mean_norm = harmful_mean / harmful_mean.norm()
harmless_mean_norm = harmless_mean / harmless_mean.norm()

# Using t=1 gives the full direction from harmless to harmful
refusal_dir = slerp(harmless_mean_norm, harmful_mean_norm, 1.0) - harmless_mean_norm
refusal_dir = refusal_dir / refusal_dir.norm()

上述内容可以快速移植到任何消除的Python实现中。虽然我们使用1.0表示等效,但可以插入任何小数值。

一个可用的SLERP代码实现,使用Transformers,可在GitHub上获取。

代码片段是在Clause Sonnet 3.7的帮助下生成的。

限制

尽管基本概念验证很有希望,但尚未对线性消除进行广泛的测试和基准测试。计算资源的稀缺是一个因素。源代码已公开,以便他人可以更深入地探索这个研究方向。

参考文献

社区

文章作者
5月1日编辑

需要明确的是,参数t允许进行调整。t=-1甚至可以用于反转。像t=0.7这样的分数设置应该更好地尊重模型编码,SLERP合并就是这种情况。

注册登录 发表评论