探索 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的帮助下生成的。
限制
尽管基本概念验证很有希望,但尚未对线性消除进行广泛的测试和基准测试。计算资源的稀缺是一个因素。源代码已公开,以便他人可以更深入地探索这个研究方向。
参考文献
- Andy Arditi, Oscar Obeso, Aaquib111, wesg, Neel Nanda, "LLM中的拒绝由单一方向介导", LessWrong, 2024。
- Maxime Labonne, "使用消除法对任何LLM进行去审查", Huggingface, 2024。
- Sumandora, "使用Transformers移除拒绝", GitHub, 2024。