导语摘要

大语言模型经过安全对齐之后,通常会在面对高风险请求时拒绝回答。表面上看,这只是模型输出了一句“抱歉,我不能帮助你”。但从模型机制角度看,真正值得研究的问题是:模型为什么会拒绝?这种拒绝行为是否对应模型内部激活空间中的某个方向?如果存在这样的方向,它到底是纯粹的“拒绝机制”,还是混入了正常回答能力、指令跟随能力、上下文语义差异和统计噪声?

Projected Abliteration 可以理解为一种针对“拒绝方向”的投影式分析方法。它的核心思想是:传统方法直接用“高风险请求下的平均激活”减去“无害请求下的平均激活”,得到一个所谓的拒绝方向;但这个方向可能并不纯粹。Projected Abliteration 会进一步把这个方向相对于无害回答方向进行分解,去掉与无害方向重叠的部分,只保留更可能与拒绝行为本身相关的正交成分。

本文从大模型安全研究角度出发,系统讲解 Projected Abliteration 的背景、激活空间、拒绝方向、公式推演、数值案例、工程细节、研究价值和安全边界。

在这里插入图片描述

1. 为什么要研究大模型的拒绝机制

现在的大语言模型通常会经过安全对齐训练。

当用户提出普通问题时,模型会正常回答;当用户提出危险、违法、攻击性或高风险请求时,模型往往会拒绝回答。

例如:

抱歉,我不能帮助你完成这个请求。

从产品角度看,这是安全策略生效了。

但从研究角度看,还需要继续追问:

  • 模型是如何判断一个请求有风险的?
  • 模型内部是否存在某种“拒绝机制”?
  • 这种机制是否集中在某些层、某些神经元,或者某个向量方向上?
  • 模型的“风险识别”和“拒绝输出”是不是同一个机制?
  • 如果模型拒绝行为被改变,模型是否仍然知道请求有风险?

这些问题属于大模型安全、模型可解释性和激活空间分析的交叉方向。

过去很多安全测试只看模型最终回答:

模型拒绝⇒看起来安全 \text{模型拒绝} \Rightarrow \text{看起来安全} 模型拒绝看起来安全

模型回答⇒看起来不安全 \text{模型回答} \Rightarrow \text{看起来不安全} 模型回答看起来不安全

但这种判断方式比较粗糙。因为模型安全至少包含两个层面:

安全能力=风险识别能力+拒绝输出能力 \text{安全能力} = \text{风险识别能力} + \text{拒绝输出能力} 安全能力=风险识别能力+拒绝输出能力

一个模型可能识别到了风险,但最终没有拒绝;也可能没有真正理解风险,只是模板化拒绝。因此,仅看输出结果并不能完整解释模型内部安全机制。

Projected Abliteration 讨论的正是这个问题:模型的拒绝行为是否可以被表示为激活空间中的某种方向,以及传统拒绝方向计算是否足够准确。

2. 什么是激活空间

大语言模型生成回答时,并不是直接从输入文字跳到输出文字。

它内部大致经历这样的过程:

在这里插入图片描述

这些中间向量,就是模型内部的“激活”。

大量激活向量所在的高维空间,就可以称为“激活空间”。

可以简单理解为:

激活空间=模型内部思考状态的向量表示空间 \text{激活空间} = \text{模型内部思考状态的向量表示空间} 激活空间=模型内部思考状态的向量表示空间

当模型面对正常请求和高风险请求时,它在某些层中的激活状态可能不同。这种差异可能反映:

  • 模型如何理解输入语义;
  • 模型如何识别风险;
  • 模型是否触发安全策略;
  • 模型如何形成拒绝回答;
  • 模型如何保持或丢失正常回答能力。

在真实大模型中,一个激活向量往往不是二维、三维,而是几千维甚至上万维。例如隐藏层维度可能是:

4096,8192,14336 4096,\quad 8192,\quad 14336 4096,8192,14336

虽然高维空间无法直接画出来,但可以通过二维示例帮助理解其数学结构。

3. 什么是拒绝方向

所谓“拒绝方向”,可以理解为:

拒绝方向=模型从正常回答状态走向拒绝回答状态的内部变化方向 \text{拒绝方向} = \text{模型从正常回答状态走向拒绝回答状态的内部变化方向} 拒绝方向=模型从正常回答状态走向拒绝回答状态的内部变化方向

假设我们准备两类提示:

  • 无害提示:正常请求,模型应该回答。
  • 高风险提示:可能触发模型拒绝的请求。

模型面对两类提示时,中间层激活可能会出现差异。

我们可以分别计算两类样本的平均激活:

μA=无害请求下的平均激活 \mu_A = \text{无害请求下的平均激活} μA=无害请求下的平均激活

μH=高风险请求下的平均激活 \mu_H = \text{高风险请求下的平均激活} μH=高风险请求下的平均激活

然后做差:

r=μH−μA r = \mu_H - \mu_A r=μHμA

这个差值方向,就被称为“拒绝方向”。

它并不是模型内部真实存在的一个按钮,而是研究者通过大量样本统计出来的一个高维向量。

直观理解:

正常回答状态→r拒绝回答状态 \text{正常回答状态} \xrightarrow{\quad r \quad} \text{拒绝回答状态} 正常回答状态r 拒绝回答状态

4. 传统 Abliteration 的基本思想

传统 Abliteration 的基本思路是:

  1. 找到模型的拒绝方向;
  2. 对这个方向进行干预;
  3. 观察模型拒绝行为是否发生变化。

传统拒绝方向通常写作:

r=μH−μA r = \mu_H - \mu_A r=μHμA

其中:

符号 含义
rrr 拒绝方向
μH\mu_HμH 高风险请求下的平均激活
μA\mu_AμA 无害请求下的平均激活

中文解释就是:

拒绝方向=高风险拒绝激活均值−无害接受激活均值 \text{拒绝方向} = \text{高风险拒绝激活均值} - \text{无害接受激活均值} 拒绝方向=高风险拒绝激活均值无害接受激活均值

这个公式很好理解。

如果模型面对高风险请求时的内部状态是 μH\mu_HμH,面对无害请求时的内部状态是 μA\mu_AμA,那么二者之间的差值 rrr,就可以被看作模型拒绝行为对应的内部变化方向。

但是,这里有一个关键问题:

μH−μA真的只代表拒绝机制吗? \mu_H - \mu_A \quad \text{真的只代表拒绝机制吗?} μHμA真的只代表拒绝机制吗?

答案并不一定。

因为高风险请求和无害请求之间的差异,不一定全部来自“拒绝行为”。它可能混入:

  • 语义差异;
  • 任务类型差异;
  • 上下文差异;
  • 模型正常回答能力差异;
  • 指令跟随能力差异;
  • 样本统计噪声;
  • 异常激活值影响。

这就是 Projected Abliteration 要解决的问题。

在这里插入图片描述

5. Projected Abliteration 的核心思想

Projected Abliteration 的核心思想是:

不要直接把完整的拒绝方向 rrr 当成纯粹的拒绝机制,而是先把 rrr 分解,去掉它与无害方向重叠的部分,只保留更可能与拒绝机制相关的正交部分。

通俗理解:

方法 思路
传统 Abliteration 看到拒绝方向 rrr,直接处理整个 rrr
Projected Abliteration 先分解 rrr,去掉与无害方向重叠的部分,再分析正交成分

可以用一个公司员工的例子理解。

当用户提出正常需求时,员工会说:

好的,我来帮你处理。

当用户提出高风险需求时,员工会说:

抱歉,这个我不能帮助你。

现在我们想知道“员工为什么拒绝”。

如果直接把所有拒绝相关表现都去掉,就可能误伤:

  • 风险识别能力;
  • 规则理解能力;
  • 正常工作能力;
  • 语言表达能力;
  • 任务判断能力。

Projected Abliteration 更谨慎:

拒绝方向=正常能力重叠部分+拒绝特有部分 \text{拒绝方向} = \text{正常能力重叠部分} + \text{拒绝特有部分} 拒绝方向=正常能力重叠部分+拒绝特有部分

它试图尽量不动正常工作能力,重点分析更像拒绝机制本身的正交成分。

6. 核心公式:从拒绝方向到投影分解

下面是全文最关键的公式部分。

6.1 传统拒绝方向

r=μH−μA r = \mu_H - \mu_A r=μHμA

含义:

符号 含义
rrr 原始拒绝方向
μH\mu_HμH 高风险请求下的平均激活
μA\mu_AμA 无害请求下的平均激活

6.2 把拒绝方向分解成两部分

拒绝方向 rrr 可以相对于无害方向 μA\mu_AμA 分解为:

r=r∥μA+r⊥μA r = r_{\parallel \mu_A} + r_{\perp \mu_A} r=rμA+rμA

其中:

符号 含义
r∥μAr_{\parallel \mu_A}rμA rrr 中与 μA\mu_AμA 平行的部分
r⊥μAr_{\perp \mu_A}rμA rrr 中与 μA\mu_AμA 正交的部分

也就是说:
原始拒绝方向=与无害方向重叠的部分+与无害方向不重叠的部分\text{原始拒绝方向}= \text{与无害方向重叠的部分} + \text{与无害方向不重叠的部分} 原始拒绝方向=与无害方向重叠的部分+与无害方向不重叠的部分

6.3 一般投影公式

如果不假设 μA\mu_AμA 是单位向量,那么 rrrμA\mu_AμA 上的投影为:

r∥μA=r⋅μA∥μA∥2μAr_{\parallel \mu_A}= \frac{r \cdot \mu_A}{\lVert \mu_A \rVert^2}\mu_A rμA=μA2rμAμA

其中:

符号 含义
r⋅μAr \cdot \mu_ArμA 点积,表示两个方向的相似程度
∥μA∥2\lVert \mu_A \rVert^2μA2 μA\mu_AμA 的长度平方
r∥μAr_{\parallel \mu_A}rμA rrrμA\mu_AμA 上的平行投影

6.4 单位向量简化公式

如果先把无害方向归一化为单位向量:

μA,unit=μA∥μA∥\mu_{A,\mathrm{unit}}= \frac{\mu_A}{\lVert \mu_A \rVert} μA,unit=μAμA

那么:

∥μA,unit∥=1 \lVert \mu_{A,\mathrm{unit}} \rVert = 1 μA,unit=1

此时投影公式可以简化为:
r∥μA=(r⋅μA,unit)μA,unitr_{\parallel \mu_A}= (r \cdot \mu_{A,\mathrm{unit}})\mu_{A,\mathrm{unit}} rμA=(rμA,unit)μA,unit

6.5 投影后的拒绝方向

Projected Abliteration 的核心公式是:

rproj=r⊥μA=r−r∥μAr_{\mathrm{proj}}=r_{\perp \mu_A}= r - r_{\parallel \mu_A} rproj=rμA=rrμA

代入投影项:

rproj=r−(r⋅μA,unit)μA,unitr_{\mathrm{proj}}= r - (r \cdot \mu_{A,\mathrm{unit}})\mu_{A,\mathrm{unit}} rproj=r(rμA,unit)μA,unit

中文解释:

投影后的拒绝方向=原始拒绝方向−原始拒绝方向在无害方向上的投影\text{投影后的拒绝方向}=\text{原始拒绝方向}- \text{原始拒绝方向在无害方向上的投影} 投影后的拒绝方向=原始拒绝方向原始拒绝方向在无害方向上的投影

换句话说:

从原始拒绝方向中,减去与正常回答方向重叠的部分,剩下的就是更可能代表拒绝机制本身的正交成分。

在这里插入图片描述

7. 公式推演案例一:完整二维向量计算

为了更容易理解,我们先不用高维向量,而是用二维向量做一个简化示例。

真实大模型中的激活向量可能有几千维、几万维,但二维例子已经足够帮助我们理解公式含义。

7.1 示例背景

假设我们收集了两类提示的模型中间层激活,经过统计之后,得到两个平均激活向量:

μA=(3,4) \mu_A = (3, 4) μA=(3,4)

μH=(7,10) \mu_H = (7, 10) μH=(7,10)

其中:

符号 含义
μA\mu_AμA 无害请求下的平均激活
μH\mu_HμH 高风险请求下的平均激活

可以理解为:

μA⇒模型正常回答时的内部状态 \mu_A \Rightarrow \text{模型正常回答时的内部状态} μA模型正常回答时的内部状态

μH⇒模型面对高风险请求时的内部状态 \mu_H \Rightarrow \text{模型面对高风险请求时的内部状态} μH模型面对高风险请求时的内部状态

7.2 第一步:计算传统拒绝方向

传统拒绝方向公式为:

r=μH−μA r = \mu_H - \mu_A r=μHμA

代入数值:

r=(7,10)−(3,4) r = (7, 10) - (3, 4) r=(7,10)(3,4)

逐项相减:

r=(7−3, 10−4) r = (7 - 3,\ 10 - 4) r=(73, 104)

得到:

r=(4,6) r = (4, 6) r=(4,6)

这表示:

模型从正常回答状态到高风险拒绝状态的变化方向是 (4,6) \text{模型从正常回答状态到高风险拒绝状态的变化方向是 } (4, 6) 模型从正常回答状态到高风险拒绝状态的变化方向是 (4,6)

也就是说,传统方法会认为:

r=(4,6) r = (4, 6) r=(4,6)

就是模型的“拒绝方向”。

但是问题在于,这个方向是否真的只代表拒绝机制?不一定。因为 rrr 里面可能混入了正常回答能力、语义差异、上下文差异、统计噪声等因素。

7.3 第二步:归一化无害方向

Projected Abliteration 的关键思想是:

先看看拒绝方向 r 里面,有多少部分和无害方向 μA 重叠 \text{先看看拒绝方向 } r \text{ 里面,有多少部分和无害方向 } \mu_A \text{ 重叠} 先看看拒绝方向 r 里面,有多少部分和无害方向 μA 重叠

为了计算投影,通常需要先把 μA\mu_AμA 归一化为单位向量。

无害方向为:

μA=(3,4) \mu_A = (3, 4) μA=(3,4)

它的长度为:

∥μA∥=32+42\lVert \mu_A \rVert= \sqrt{3^2 + 4^2} μA=32+42

继续计算:

∥μA∥=9+16=25=5\lVert \mu_A \rVert=\sqrt{9 + 16}=\sqrt{25}= 5 μA=9+16 =25 =5所以归一化后的无害方向为:
μA,unit=μA∥μA∥\mu_{A,\mathrm{unit}}= \frac{\mu_A}{\lVert \mu_A \rVert} μA,unit=μAμA

代入:

μA,unit=(3,4)5\mu_{A,\mathrm{unit}}= \frac{(3, 4)}{5} μA,unit=5(3,4)

得到:

μA,unit=(0.6,0.8)\mu_{A,\mathrm{unit}}= (0.6, 0.8) μA,unit=(0.6,0.8)

也就是说,这是长度为 1 的无害方向。

在这里插入图片描述

7.4 第三步:计算拒绝方向在无害方向上的投影长度

投影长度来自点积。

点积计算规则是:

(a,b)⋅(c,d)=a×c+b×d (a,b)\cdot(c,d)=a\times c+b\times d (a,b)(c,d)=a×c+b×d

现在计算:

r⋅μA,unit=(4,6)⋅(0.6,0.8)r \cdot \mu_{A,\mathrm{unit}}= (4,6)\cdot(0.6,0.8) rμA,unit=(4,6)(0.6,0.8)

代入点积规则:

r⋅μA,unit=4×0.6+6×0.8r \cdot \mu_{A,\mathrm{unit}}= 4\times0.6+6\times0.8 rμA,unit=4×0.6+6×0.8

继续计算:

r⋅μA,unit=2.4+4.8=7.2r \cdot \mu_{A,\mathrm{unit}}=2.4+4.8= 7.2 rμA,unit=2.4+4.8=7.2

这个 7.27.27.2 表示:

拒绝方向 r 在无害方向 μA,unit 上的投影长度是 7.2 \text{拒绝方向 } r \text{ 在无害方向 } \mu_{A,\mathrm{unit}} \text{ 上的投影长度是 } 7.2 拒绝方向 r 在无害方向 μA,unit 上的投影长度是 7.2

换句话说,rrr 里面有一部分是沿着无害方向走的。

这部分不一定代表拒绝机制,可能和模型正常回答能力、指令跟随能力或一般有用性有关。

7.5 第四步:计算平行投影成分

现在计算完整的投影向量:

r∥μA=(r⋅μA,unit)μA,unitr_{\parallel \mu_A}= (r \cdot \mu_{A,\mathrm{unit}})\mu_{A,\mathrm{unit}} rμA=(rμA,unit)μA,unit

代入:

r∥μA=7.2×(0.6,0.8)r_{\parallel \mu_A}= 7.2 \times (0.6,0.8) rμA=7.2×(0.6,0.8)

逐项相乘:

r∥μA=(7.2×0.6, 7.2×0.8)r_{\parallel \mu_A}= (7.2\times0.6,\ 7.2\times0.8) rμA=(7.2×0.6, 7.2×0.8)

得到:

r∥μA=(4.32, 5.76)r_{\parallel \mu_A}= (4.32,\ 5.76) rμA=(4.32, 5.76)

这就是拒绝方向 rrr 中,和无害方向 μA\mu_AμA 平行的部分。

也就是说:

r=(4,6) r=(4,6) r=(4,6)

里面有:

r∥μA=(4.32,5.76) r_{\parallel \mu_A}=(4.32,5.76) rμA=(4.32,5.76)

这一部分是沿着无害方向的。

这部分可能不是纯粹的拒绝机制。

在这里插入图片描述

7.6 第五步:计算正交成分

Projected Abliteration 的核心公式是:

rproj=r−r∥μAr_{\mathrm{proj}}= r-r_{\parallel \mu_A} rproj=rrμA

代入数值:
rproj=(4,6)−(4.32,5.76)r_{\mathrm{proj}}= (4,6)-(4.32,5.76) rproj=(4,6)(4.32,5.76)

逐项相减:

rproj=(4−4.32, 6−5.76)r_{\mathrm{proj}}= (4-4.32,\ 6-5.76) rproj=(44.32, 65.76)

得到:

rproj=(−0.32, 0.24)r_{\mathrm{proj}}= (-0.32,\ 0.24) rproj=(0.32, 0.24)

所以,投影后的拒绝方向为:

rproj=(−0.32, 0.24) r_{\mathrm{proj}}=(-0.32,\ 0.24) rproj=(0.32, 0.24)

这个方向就是拒绝方向中,去掉无害方向投影后剩下的正交成分。

7.7 第六步:验证正交性

既然 rprojr_{\mathrm{proj}}rproj 是正交成分,那么它应该和 μA,unit\mu_{A,\mathrm{unit}}μA,unit 垂直。

我们可以用点积验证:

rproj⋅μA,unit=(−0.32,0.24)⋅(0.6,0.8)r_{\mathrm{proj}}\cdot\mu_{A,\mathrm{unit}}= (-0.32,0.24)\cdot(0.6,0.8) rprojμA,unit=(0.32,0.24)(0.6,0.8)

计算:

rproj⋅μA,unit=−0.32×0.6+0.24×0.8r_{\mathrm{proj}}\cdot\mu_{A,\mathrm{unit}}= -0.32\times0.6+0.24\times0.8 rprojμA,unit=0.32×0.6+0.24×0.8

继续计算:

rproj⋅μA,unit=−0.192+0.192=0r_{\mathrm{proj}}\cdot\mu_{A,\mathrm{unit}}=-0.192+0.192= 0 rprojμA,unit=0.192+0.192=0

点积为 000,说明:

rproj⊥μA,unit r_{\mathrm{proj}} \perp \mu_{A,\mathrm{unit}} rprojμA,unit

也就是说:

rproj 确实是从原始拒绝方向 r 中去掉无害方向投影之后剩下的正交部分 r_{\mathrm{proj}} \text{ 确实是从原始拒绝方向 } r \text{ 中去掉无害方向投影之后剩下的正交部分} rproj 确实是从原始拒绝方向 r 中去掉无害方向投影之后剩下的正交部分

7.8 推演结果总结

步骤 公式 结果
无害平均激活 μA\mu_AμA (3,4)(3,4)(3,4)
高风险平均激活 μH\mu_HμH (7,10)(7,10)(7,10)
原始拒绝方向 r=μH−μAr=\mu_H-\mu_Ar=μHμA (4,6)(4,6)(4,6)
无害方向长度 ∥μA∥\lVert \mu_A \rVertμA 555
单位无害方向 μA,unit=μA/∥μA∥\mu_{A,\mathrm{unit}}=\mu_A/\lVert\mu_A\rVertμA,unit=μA/μA (0.6,0.8)(0.6,0.8)(0.6,0.8)
投影长度 r⋅μA,unitr\cdot\mu_{A,\mathrm{unit}}rμA,unit 7.27.27.2
平行投影成分 r∥μA=7.2μA,unitr_{\parallel \mu_A}=7.2\mu_{A,\mathrm{unit}}rμA=7.2μA,unit (4.32,5.76)(4.32,5.76)(4.32,5.76)
正交拒绝成分 rproj=r−r∥μAr_{\mathrm{proj}}=r-r_{\parallel \mu_A}rproj=rrμA (−0.32,0.24)(-0.32,0.24)(0.32,0.24)
正交验证 rproj⋅μA,unitr_{\mathrm{proj}}\cdot\mu_{A,\mathrm{unit}}rprojμA,unit 000

7.9 这个例子说明了什么

这个例子说明,传统拒绝方向:

r=(4,6) r=(4,6) r=(4,6)

并不一定是纯粹的拒绝机制。

它可以被拆成两部分:

r=r∥μA+rproj r = r_{\parallel \mu_A} + r_{\mathrm{proj}} r=rμA+rproj

也就是:

(4,6)=(4.32,5.76)+(−0.32,0.24) (4,6) = (4.32,5.76) + (-0.32,0.24) (4,6)=(4.32,5.76)+(0.32,0.24)

其中:

成分 数值 含义
平行成分 (4.32,5.76)(4.32,5.76)(4.32,5.76) 与无害方向重叠,可能混入正常回答能力
正交成分 (−0.32,0.24)(-0.32,0.24)(0.32,0.24) 与无害方向正交,更可能代表拒绝特有差异

Projected Abliteration 的核心就是:

不要直接使用完整的 rrr,而是先去掉 rrr 中与无害方向重叠的部分,然后只分析剩下的正交部分 rprojr_{\mathrm{proj}}rproj

8. 动态推演图:从原始向量到正交方向

下面这张图展示了从原始向量、归一化、投影计算到正交分解的完整动态推演过程,适合直接插入博客:

在这里插入图片描述

9. 公式推演案例二:更直观的垂直分解

上面的例子中,原始拒绝方向 rrr 与无害方向 μA\mu_AμA 比较接近,所以去掉投影后,剩下的正交成分比较小。

这意味着:

原始拒绝方向里,大部分变化可能都和无害方向重叠 \text{原始拒绝方向里,大部分变化可能都和无害方向重叠} 原始拒绝方向里,大部分变化可能都和无害方向重叠

我们再看一个更直观的例子。

假设:

μA=(1,0) \mu_A=(1,0) μA=(1,0)

μH=(3,4) \mu_H=(3,4) μH=(3,4)

那么:

r=μH−μA r=\mu_H-\mu_A r=μHμA

代入:

r=(3,4)−(1,0) r=(3,4)-(1,0) r=(3,4)(1,0)

得到:

r=(2,4) r=(2,4) r=(2,4)

因为:

μA=(1,0) \mu_A=(1,0) μA=(1,0)

它本身已经是单位向量,所以:

μA,unit=(1,0) \mu_{A,\mathrm{unit}}=(1,0) μA,unit=(1,0)

计算投影长度:

r⋅μA,unit=(2,4)⋅(1,0)r\cdot\mu_{A,\mathrm{unit}}= (2,4)\cdot(1,0) rμA,unit=(2,4)(1,0)

继续计算:
r⋅μA,unit=2×1+4×0=2r\cdot\mu_{A,\mathrm{unit}}=2\times1+4\times0=2 rμA,unit=2×1+4×0=2

投影成分为:

r∥μA=2×(1,0)=(2,0)r_{\parallel \mu_A}=2\times(1,0)= (2,0) rμA=2×(1,0)=(2,0)

正交成分为:

rproj=r−r∥μAr_{\mathrm{proj}}= r-r_{\parallel \mu_A} rproj=rrμA

代入:
rproj=(2,4)−(2,0)r_{\mathrm{proj}}= (2,4)-(2,0) rproj=(2,4)(2,0)

得到:

rproj=(0,4)r_{\mathrm{proj}}= (0,4) rproj=(0,4)

这个例子非常直观:

r=(2,4) r=(2,4) r=(2,4)

r∥μA=(2,0) r_{\parallel \mu_A}=(2,0) rμA=(2,0)

rproj=(0,4) r_{\mathrm{proj}}=(0,4) rproj=(0,4)

所以 Projected Abliteration 会更关注:

rproj=(0,4) r_{\mathrm{proj}}=(0,4) rproj=(0,4)

而不是完整的:

r=(2,4) r=(2,4) r=(2,4)

10. 两个案例的对比理解

两个例子可以这样对比:

对比项 示例一 示例二
无害方向 μA=(3,4)\mu_A=(3,4)μA=(3,4) μA=(1,0)\mu_A=(1,0)μA=(1,0)
高风险方向 μH=(7,10)\mu_H=(7,10)μH=(7,10) μH=(3,4)\mu_H=(3,4)μH=(3,4)
原始拒绝方向 r=(4,6)r=(4,6)r=(4,6) r=(2,4)r=(2,4)r=(2,4)
平行成分 r∥μA=(4.32,5.76)r_{\parallel \mu_A}=(4.32,5.76)rμA=(4.32,5.76) r∥μA=(2,0)r_{\parallel \mu_A}=(2,0)rμA=(2,0)
正交成分 rproj=(−0.32,0.24)r_{\mathrm{proj}}=(-0.32,0.24)rproj=(0.32,0.24) rproj=(0,4)r_{\mathrm{proj}}=(0,4)rproj=(0,4)
直观含义 rrr 大部分和无害方向重叠 rrr 中有明显独立正交成分

这两个例子说明:

如果 r 和 μA 很接近,则 rproj 会很小 \text{如果 } r \text{ 和 } \mu_A \text{ 很接近,则 } r_{\mathrm{proj}} \text{ 会很小} 如果 r  μA 很接近,则 rproj 会很小

如果 r 和 μA 差异很大,则 rproj 仍然明显 \text{如果 } r \text{ 和 } \mu_A \text{ 差异很大,则 } r_{\mathrm{proj}} \text{ 仍然明显} 如果 r  μA 差异很大,则 rproj 仍然明显

这也正是 Projected Abliteration 想解决的问题:

判断传统拒绝方向中,到底有多少成分是真正独立于正常回答方向的 \text{判断传统拒绝方向中,到底有多少成分是真正独立于正常回答方向的} 判断传统拒绝方向中,到底有多少成分是真正独立于正常回答方向的

11. 放回真实大模型场景中理解

在真实大模型中,μA\mu_AμAμH\mu_HμH 不会是二维向量,而可能是几千维甚至上万维的激活向量。

但计算思想完全一样。

真实场景中:

μA=无害样本在某一层的平均激活向量 \mu_A=\text{无害样本在某一层的平均激活向量} μA=无害样本在某一层的平均激活向量

μH=高风险样本在某一层的平均激活向量 \mu_H=\text{高风险样本在某一层的平均激活向量} μH=高风险样本在某一层的平均激活向量

r=μH−μA r=\mu_H-\mu_A r=μHμA

然后:

μA,unit=μA∥μA∥ \mu_{A,\mathrm{unit}}=\frac{\mu_A}{\lVert\mu_A\rVert} μA,unit=μAμA

r∥μA=(r⋅μA,unit)μA,unitr_{\parallel \mu_A}= (r\cdot\mu_{A,\mathrm{unit}})\mu_{A,\mathrm{unit}} rμA=(rμA,unit)μA,unit

rproj=r−r∥μAr_{\mathrm{proj}}= r-r_{\parallel \mu_A} rproj=rrμA

只不过在真实模型中,这些向量不是二维,而是高维。

例如,一个隐藏层维度可能是:

d=4096,d=8192,d=14336 d=4096,\quad d=8192,\quad d=14336 d=4096,d=8192,d=14336

那么:

向量 维度
μA\mu_AμA ddd
μH\mu_HμH ddd
rrr ddd
rprojr_{\mathrm{proj}}rproj ddd

公式看起来一样,但计算发生在更高维空间中。

12. 工程细节:异常值、精度与量化

Projected Abliteration 这类方法看起来是数学问题,但实际落地时也有很多工程细节。

12.1 高幅值异常值

在测量某些模型的激活时,可能会遇到高幅值异常值。

这些异常值会带来问题:

  • 少数极端激活值可能主导平均激活方向;
  • 有害方向和无害方向之间的差异可能被扭曲;
  • 方向之间的余弦相似度可能出现人为偏高;
  • 最终导致拒绝方向计算不稳定。

这就像统计工资时,如果少数人的收入极高,那么平均工资就可能不能代表大多数人的真实水平。

12.2 异常值裁剪

为了解决异常值问题,可以使用类似 Winsorization 的缩尾处理。

通俗理解:

不是删除异常值,而是把过大的值压到一个阈值以内 \text{不是删除异常值,而是把过大的值压到一个阈值以内} 不是删除异常值,而是把过大的值压到一个阈值以内

这样可以降低极端值对均值统计的影响。

12.3 计算精度

在做激活方向分析时,中间计算最好使用更高精度。

原因是:

  • 激活方向差异可能比较微妙;
  • 低精度可能放大误差;
  • 点积、归一化、均值累计等操作对数值精度比较敏感。

如果数值计算不稳定,那么后续对机制的解释也可能不可靠。

12.4 量化模型上的测量

很多模型实际部署时都会使用量化版本,例如:

  • 4-bit 量化;
  • 8-bit 量化;
  • GGUF 量化;
  • AWQ 量化;
  • GPTQ 量化;
  • bitsandbytes 量化。

如果量化后安全相关表示仍然存在,那么安全审计也应该覆盖量化模型,而不能只测试原始全精度模型。

这对开源模型尤其重要。因为开源模型不仅可以下载,还可以被量化、微调、合并、注入 LoRA 或部署到不同推理框架中。

13. Projected Abliteration 的关键结论

Projected Abliteration 这类研究最重要的结论,不是“如何让模型不拒绝”,而是下面几个机制判断。

13.1 拒绝行为可能对应激活空间中的方向

模型面对高风险请求和无害请求时,中间层激活存在差异。

这种差异可以被表示成一个方向。

这个方向可能与模型的拒绝行为有关。

13.2 传统拒绝方向并不一定纯粹

传统公式:

r=μH−μA r=\mu_H-\mu_A r=μHμA

虽然简单直观,但它可能混入其他因素,例如:

  • 正常回答能力;
  • 指令跟随能力;
  • 上下文语义差异;
  • 统计噪声;
  • 异常激活值。

所以不能简单认为 rrr 就是纯粹的拒绝机制。

13.3 有害性识别和拒绝输出可能是分开的

一个非常重要的启发是:

有害性识别≠拒绝输出行为 \text{有害性识别} \ne \text{拒绝输出行为} 有害性识别=拒绝输出行为

也就是说,模型内部可能至少存在两类机制:

机制 作用
有害性识别机制 判断请求是否存在风险
拒绝输出机制 决定是否输出拒绝回答

这意味着,一个模型可能出现以下几种情况:

  • 识别到了风险,但没有拒绝;
  • 没有识别到风险,但模板化拒绝;
  • 既识别风险,也稳定拒绝;
  • 既不识别风险,也不拒绝。

所以安全评估不能只看最终回答,还要看模型是否真正理解风险。

14. 对大模型安全研究的启发

14.1 安全评估不能只看输出

传统测试经常这样判断:

模型拒绝=安全 \text{模型拒绝} = \text{安全} 模型拒绝=安全

模型回答=不安全 \text{模型回答} = \text{不安全} 模型回答=不安全

但这太粗糙。

更合理的安全评估应该拆成多个层次:

层次 评估问题
风险识别 模型是否知道请求有风险
策略触发 模型是否触发安全策略
输出控制 模型是否拒绝或转向安全回答
内部稳定性 模型安全表示是否稳定
多轮鲁棒性 多轮诱导下是否保持稳定
部署鲁棒性 量化、微调、合并后是否仍安全

14.2 开源模型需要更细粒度的安全审计

开源模型可以被下载到本地,然后进行各种修改:

  • 量化;
  • 微调;
  • LoRA 注入;
  • 权重合并;
  • 推理框架切换;
  • 提示模板修改;
  • 系统提示覆盖;
  • 安全层裁剪。

这些操作都可能影响模型的安全边界。

因此,对开源模型做安全研究时,不能只测官方原始模型,还应该关注:

  • 量化后的模型;
  • 微调后的模型;
  • LoRA 注入后的模型;
  • 权重合并后的模型;
  • 不同推理框架下的模型;
  • 不同提示模板下的模型;
  • 不同部署参数下的模型。

14.3 防御不能只靠提示词

如果拒绝机制与模型内部激活方向有关,那么防御也不能只依赖系统提示词。

更完整的大模型安全体系应该包括:

  • 训练前数据清洗;
  • 监督微调阶段的安全样本设计;
  • 偏好优化阶段的安全奖励建模;
  • 推理时风险分类器;
  • 输出侧安全过滤;
  • 多模型交叉审查;
  • 激活空间异常监控;
  • 红队评估基准;
  • 部署后安全日志分析。

也就是说,大模型安全不是一条提示词,而是一套完整工程体系。

15. 适合写进研究方向和成果的表述

15.1 研究方向表述

本研究聚焦开源大模型安全拒绝机制的内部表示特征,重点分析模型在正常请求与高风险请求下的激活空间差异。相关研究表明,模型的拒绝行为可能对应激活空间中的特定方向,但该方向并不一定是纯粹的拒绝机制,其中可能混入模型正常回答能力、指令跟随能力和有用性表示。因此,本研究将围绕拒绝方向识别、激活空间分解、量化模型安全鲁棒性、多层表示分布等问题开展分析,为开源大模型安全评估、红队测试和对齐鲁棒性增强提供支撑。

15.2 研究成果表述

已围绕 Gemma、Qwen 等开源大模型开展安全拒绝机制分析,重点研究模型在高风险提示与正常提示下的内部激活差异,并关注拒绝方向、投影式消融、异常激活值处理、量化误差影响和多层分布式编码等问题。初步研究表明,模型的风险识别能力与拒绝输出行为可能存在一定程度的解耦,说明仅通过表层回答判断模型安全性并不充分。该成果可用于后续构建开源大模型安全评估基准、红队测试流程和模型发布前安全审计方案。

15.3 项目申报风格

项目拟研究开源大模型在安全对齐后的拒绝行为形成机制,围绕模型激活空间中的风险识别表示、拒绝输出表示及二者之间的关系开展分析。通过对正常请求与高风险请求下的中间层激活进行统计建模,探索拒绝方向在不同模型、不同层、不同精度和不同部署形态下的稳定性,为提升大模型安全评估的可解释性和对齐鲁棒性提供方法依据。

16. 安全边界说明

Projected Abliteration 属于大模型安全与机制解释方向的研究内容。

在正式研究或项目材料中,建议将它定位为:

  • 大模型拒绝机制分析;
  • 开源模型安全审计;
  • 红队评估方法研究;
  • 安全对齐鲁棒性分析;
  • 模型内部表示可解释性研究。

不建议将它包装成:

  • 解除模型限制教程;
  • 绕过安全策略教程;
  • 越狱模型实操指南;
  • 规避模型拒绝的方法。

合理的研究目标应该是:

  • 发现安全机制的薄弱点;
  • 理解模型内部风险表示;
  • 构建更强的安全评估方法;
  • 改进模型对齐和防御能力。

17. 总结

Projected Abliteration 的核心价值,不在于“如何让模型不拒绝”,而在于它提供了一种理解大模型安全机制的新视角。

传统方法把拒绝方向定义为:

r=μH−μA r=\mu_H-\mu_A r=μHμA

但这个方向可能并不纯粹。

Projected Abliteration 进一步提出:

rproj=r−(r⋅μA,unit)μA,unitr_{\mathrm{proj}}= r-(r\cdot\mu_{A,\mathrm{unit}})\mu_{A,\mathrm{unit}} rproj=r(rμA,unit)μA,unit

它的思想是:

先把拒绝方向分解,去掉与无害回答方向重叠的部分,只保留更可能代表拒绝机制本身的正交成分 \text{先把拒绝方向分解,去掉与无害回答方向重叠的部分,只保留更可能代表拒绝机制本身的正交成分} 先把拒绝方向分解,去掉与无害回答方向重叠的部分,只保留更可能代表拒绝机制本身的正交成分

这背后的重要启发是:

模型是否识别风险≠模型是否输出拒绝 \text{模型是否识别风险} \ne \text{模型是否输出拒绝} 模型是否识别风险=模型是否输出拒绝

因此,大模型安全评估不应该只看模型有没有拒绝,还应该进一步分析:

  • 模型是否真正识别风险;
  • 风险识别是否稳定;
  • 拒绝行为是否稳定;
  • 量化和微调是否改变安全边界;
  • 不同层是否承载不同安全表示;
  • 模型是否存在风险识别与拒绝输出解耦的问题。

从这个角度看,Projected Abliteration 更适合作为大模型安全对齐机制研究、开源模型安全评估、红队测试体系建设和模型发布前安全审计的理论参考。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐