Projected Abliteration从激活空间理解大模型的“拒绝机制”
导语摘要
大语言模型经过安全对齐之后,通常会在面对高风险请求时拒绝回答。表面上看,这只是模型输出了一句“抱歉,我不能帮助你”。但从模型机制角度看,真正值得研究的问题是:模型为什么会拒绝?这种拒绝行为是否对应模型内部激活空间中的某个方向?如果存在这样的方向,它到底是纯粹的“拒绝机制”,还是混入了正常回答能力、指令跟随能力、上下文语义差异和统计噪声?
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 的基本思路是:
- 找到模型的拒绝方向;
- 对这个方向进行干预;
- 观察模型拒绝行为是否发生变化。
传统拒绝方向通常写作:
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=∥μA∥2r⋅μAμA
其中:
| 符号 | 含义 |
|---|---|
| r⋅μAr \cdot \mu_Ar⋅μA | 点积,表示两个方向的相似程度 |
| ∥μA∥2\lVert \mu_A \rVert^2∥μA∥2 | μ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=r−r∥μ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=(7−3, 10−4)
得到:
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=r−r∥μ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=(4−4.32, 6−5.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=r−r∥μ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=r−r∥μ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=r−r∥μ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 更适合作为大模型安全对齐机制研究、开源模型安全评估、红队测试体系建设和模型发布前安全审计的理论参考。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)