特征几何与表示分析
神经网络的可解释性长期以来是深度学习领域的核心挑战之一。近年来,表征几何(Representation Geometry) 研究从几何视角出发,揭示了神经网络如何在高维激活空间中组织和编码信息。本文系统介绍特征表示的空间结构理论、稀疏自编码器分析方法,以及基于几何的干预技术。
1. 引言:特征表示的空间结构
1.1 从分布式表示到几何结构
传统机器学习将特征视为独立的标量,而神经网络采用分布式表示(Distributed Representation):每个概念并非由单一神经元编码,而是由整个激活向量中多个神经元的协同活动表示。
这一设计的优势在于组合性(Compositionality):有限的神经元可以表示指数级数量的概念组合。然而,这也带来了可解释性的挑战——我们需要理解这些高维向量在几何空间中如何组织。
1.2 表示空间的数学描述
设神经网络某一层的激活向量为 ,其中 为隐藏维度。对于输入 ,有:
其中 为该层的非线性变换, 为网络参数。
关键观察:不同的输入会激活不同的表示向量,而语义相近的输入往往在表示空间中距离较近。这种几何结构不是被显式编程的,而是通过端到端优化涌现(emergence) 而来。
1.3 高维空间的特殊性质
理解特征几何需要借助高维几何(High-Dimensional Geometry) 的反直觉性质:
- 球面体积集中:随机单位向量几乎垂直于任何固定方向
- 距离集中:所有点之间的距离趋向于相等
- 随机投影的保距性:Johnson-Lindenstrauss引理保证随机投影近似保持距离
这些性质使得高维空间成为信息压缩的天然场所——神经网络可以”填充”看似浪费的高维空间来高效编码语义信息。1
2. 线性表示假说
2.1 概念作为方向
线性表示假说(Linear Representation Hypothesis) 主张:语义相关的概念在表示空间中倾向于沿着特定方向排列,使得线性运算能够捕捉语义关系。
核心假说:对于概念 和 ,存在方向向量 使得:
其中 表示概念对应的激活向量, 为插值系数。
实验证据:Mikolov等人发现词嵌入空间中存在系统性关系:2
这种语义算术表明概念被编码为线性子空间中的方向。
2.2 线性组合假说
线性组合假说(Linear Combination Hypothesis) 是线性表示的更强形式:
弱版本:概念是对应于某个方向向量的叠加(Superposition),而非离散的one-hot编码。
强版本:不同概念的特征可以被线性组合,而网络的非线性激活函数能够从这种叠加中解耦(Disentangle) 出独立的概念。
设 个概念的特征向量为 ,则实际激活为:
其中 为概念 的激活系数, 为噪声或未建模成分。
2.3 几何表征与语义聚类
从几何角度看,线性表示假说暗示语义空间具有以下结构:
| 关系类型 | 几何实现 |
|---|---|
| 同义/相关 | 夹角小的方向向量 |
| 反义/对比 | 方向相反的向量 |
| 层级包含 | 子空间包含关系 |
| 属性绑定 | 特定方向的投影 |
例:在语言模型中,“positive sentiment”和”negative sentiment”可能对应两个近似相反的方向向量:
而”very positive”则可能是 的缩放版本:
3. 特征叠加(Superposition)的几何
3.1 高维空间中的特征压缩
神经网络面临一个根本矛盾:概念数量远超隐藏维度。例如,一个仅有数千维的语言模型需要表示数万个不同的语义概念。
叠加机制提供了一种解决方案:在高维空间中,通过让多个概念的特征向量共享神经元来实现压缩表示。
几何解释:假设有 个概念,每个概念需要一个独立方向。如果 ,则无法找到 个两两正交的方向。此时,特征向量必须相互重叠(Overlap)。
叠加的不完美性:当 时,特征之间必然存在干扰。设特征矩阵 ,则:
当特征高度相关时, 的特征值分布会出现幂律(Power Law) 衰减——少数主导特征占据大部分方差。3
3.2 干扰与非线性过滤
特征干扰(Feature Interference) 是叠加的代价。当多个概念的特征方向不完全正交时,激活某个概念可能无意中激活其他概念。
几何视角:设目标特征为 ,干扰特征为 ,则:
通过最大化 与 的差异,网络可以在一定程度上缓解干扰。
ReLU的非线性过滤作用:ReLU激活函数在特征叠加中扮演关键角色:
ReLU的非负约束实际上创建了稀疏门控(Sparse Gating) 机制——只有当某特征的激活超过阈值时才会被”选中”。这使得即使特征向量有重叠,非线性激活也能在一定程度上解耦(Decouple) 独立特征。
3.3 稀疏性作为解决方案
稀疏编码假说:为了减少特征干扰,网络演化出稀疏表示——任何时候只有少数特征被激活。
设激活模式为 ,其中大多数 。则实际激活向量为:
理想情况下,网络应满足独立特征数远小于潜在特征总数:
代码示例:稀疏激活的模拟实现
import torch
import torch.nn as nn
class SparseSuperposition(nn.Module):
"""
模拟特征叠加:多个稀疏特征通过线性组合形成隐藏表示
"""
def __init__(self, d_model: int, n_concepts: int, sparsity: float = 0.1):
super().__init__()
# 特征矩阵:将稀疏概念映射到d维空间
self.feature_matrix = nn.Linear(n_concepts, d_model, bias=False)
self.n_concepts = n_concepts
self.sparsity = sparsity
def forward(self, concept_activations: torch.Tensor) -> torch.Tensor:
"""
Args:
concept_activations: [batch, n_concepts] 稀疏激活向量
Returns:
hidden: [batch, d_model] 组合后的隐藏表示
"""
# 特征叠加
hidden = self.feature_matrix(concept_activations)
return hidden
def apply_topk_sparsity(self, x: torch.Tensor, k_ratio: float = 0.1):
"""应用Top-K稀疏化"""
batch_size, n = x.shape
k = max(1, int(n * k_ratio))
# 获取Top-K索引
_, topk_indices = torch.topk(torch.abs(x), k, dim=-1)
# 创建稀疏掩码
sparse_mask = torch.zeros_like(x)
sparse_mask.scatter_(1, topk_indices, 1.0)
return x * sparse_mask3.4 叠加的数学形式化
设网络层激活为 ,特征矩阵为 ,则叠加表示满足:
重建目标:给定 ,我们希望恢复稀疏激活 。这是一个稀疏编码问题:
或使用 松弛:
4. 概念向量与激活空间编辑
4.1 激活 Steering
激活 Steering 是一类直接修改神经网络中间层激活向量的技术,用于引导模型行为或探测表示结构。
基本框架:对于给定的输入 ,原始激活为 。Steering 技术修改激活为:
其中 为** steering 方向**, 为干预强度。
方向发现方法:
-
对比激活差分(CAD):比较目标概念与对照概念的激活差异
-
概念向量提取:使用SAE稀疏特征作为方向
-
PCA/ICA分析:从激活矩阵中提取主成分作为方向
实验应用:
def apply_steering(
model: nn.Module,
prompt: str,
steering_direction: torch.Tensor,
alpha: float = 1.0,
layer_idx: int = -1
) -> str:
"""
应用激活Steering引导模型生成
Args:
model: 目标语言模型
prompt: 输入提示
steering_direction: [d_model] 干预方向向量
alpha: 干预强度
layer_idx: 干预的层索引
"""
# 准备输入
input_ids = model.tokenizer(prompt, return_tensors="pt")["input_ids"]
# Hook机制捕获激活
activations = {}
def hook_fn(module, input, output):
activations["cache"] = output[0].detach().clone()
return output
# 注册hook
handle = model.layers[layer_idx].register_forward_hook(hook_fn)
# 前向传播
with torch.no_grad():
output = model(input_ids)
# 移除hook
handle.remove()
# 注入 steering 方向
activations["cache"][:, -1, :] += alpha * steering_direction
# 继续前向传播
with torch.no_grad():
# 手动完成剩余层
for layer in model.layers[layer_idx + 1:]:
activations["cache"] = layer(activations["cache"])[0]
logits = model.lm_head(activations["cache"])
return model.tokenizer.decode(logits.argmax(dim=-1)[0])4.2 定向干预与概念消除
定向干预(Directed Intervention) 旨在修改或消除特定概念在表示空间中的编码,实现可解释的模型编辑。
特征消除:对于不希望存在的特征 ,可以计算正交投影来消除:
几何解释:这相当于将 投影到 的正交补空间。
代码示例:概念消除实现
def project_away_features(
h: torch.Tensor,
feature_directions: torch.Tensor,
features_to_remove: list[int]
) -> torch.Tensor:
"""
将激活向量投影到指定特征方向的补空间
Args:
h: [batch, seq_len, d_model] 原始激活
feature_directions: [n_features, d_model] 特征方向矩阵
features_to_remove: 要消除的特征索引列表
"""
# 归一化特征方向
F = feature_directions # [k, d]
F_norm = F / F.norm(dim=-1, keepdim=True)
# 提取要消除的特征方向
F_bad = F_norm[features_to_remove] # [m, d]
# 计算投影系数
# h_proj[i,j,:] = <h[i,j,:], f> * f for each feature
# 需要对最后维度进行点积,然后重建
proj_coeffs = torch.einsum("bsd,md->bsm", h, F_bad) # [batch, seq, m]
# 重构投影
proj = torch.einsum("bsm,md->bsd", proj_coeffs, F_bad) # [batch, seq, d]
# 从原始激活中减去投影
return h - proj4.3 Representation Engineering
表征工程(Representation Engineering, RepE) 是近期提出的一种系统化表示干预框架。4
核心思想:将神经网络的高层激活视为”认知状态”的编码,通过分析和修改这些状态来实现对模型行为的控制。
RepE的分析步骤:
- 分离表示:识别不同认知状态(如真/假信念、情感、推理阶段)对应的激活模式
- 方向提取:使用对比或聚类方法提取方向向量
- 干预验证:评估方向干预对模型行为的影响
RepE的干预类型:
| 干预类型 | 描述 | 应用场景 |
|---|---|---|
| 加法干预 | 增强/减弱特定行为 | |
| 投影干预 | 沿方向投影后重建 | 精确控制某维度 |
| 插值干预 | 状态平滑过渡 |
5. 表征几何分析
5.1 表示相似性度量
分析表示空间的几何结构首先需要定义相似性度量(Similarity Metric)。
余弦相似度:最常用的度量,衡量两个向量的方向一致性:
欧氏距离:衡量绝对距离差异:
内积相似度:与余弦相似度相关,但受向量范数影响:
语义相似度实验:评估表示质量的常用方法是比较表示相似度与人工标注的语义相似度:
def compute_similarity_metrics(
representations: torch.Tensor,
labels: list[str]
) -> dict[str, float]:
"""
计算表示空间的多种相似度度量
Args:
representations: [n_samples, d_model] 表示矩阵
labels: 样本标签列表
Returns:
metrics: 各种相似度度量结果
"""
n = len(labels)
# 计算余弦相似度矩阵
norm = representations / representations.norm(dim=-1, keepdim=True)
cosine_sim = norm @ norm.T # [n, n]
# 计算欧氏距离矩阵
dist_matrix = torch.cdist(representations, representations, p=2)
# 按标签计算组内/组间距离
groups = {}
for i, label in enumerate(labels):
if label not in groups:
groups[label] = []
groups[label].append(i)
intra_distances = []
inter_distances = []
for group_id, indices in groups.items():
# 组内距离
for i in range(len(indices)):
for j in range(i + 1, len(indices)):
intra_distances.append(dist_matrix[indices[i], indices[j]].item())
# 组间距离
for other_id, other_indices in groups.items():
if other_id != group_id:
for i in indices:
for j in other_indices:
inter_distances.append(dist_matrix[i, j].item())
return {
"mean_intra_distance": np.mean(intra_distances),
"mean_inter_distance": np.mean(inter_distances),
"separation_ratio": np.mean(inter_distances) / np.mean(intra_distances),
"cosine_similarity_matrix": cosine_sim.cpu().numpy()
}5.2 SAE表示的分层结构
稀疏自编码器(Sparse Autoencoder, SAE) 是分析神经网络表示结构的重要工具。5
SAE架构:SAE由编码器和解码器组成,学习将稠密的隐藏激活 映射到稀疏的潜在空间 (通常 ):
训练目标:重构损失 + 稀疏惩罚
SAE特征的层级特性:研究发现,SAE提取的特征具有清晰的层级结构:
| 层级 | 特征类型 | 示例 |
|---|---|---|
| 浅层 | 局部模式 | 词汇、语法特征 |
| 中层 | 语义概念 | 实体、情感、关系 |
| 深层 | 抽象推理 | 逻辑、计划、自我认知 |
5.3 特征重要性与贡献分析
基于梯度的特征重要性:
这度量了激活值对损失函数的敏感性。
基于重构的特征贡献:
对于SAE的解码器 ,每个潜在维度 对重构的贡献为:
高贡献的特征通常对应重要的语义概念。
6. 几何视角下的可解释性
6.1 概念瓶颈与几何分离
概念瓶颈模型(Concept Bottleneck Models) 强制网络在中间层显式编码预定义的概念,实现几何上的分离表示。
几何设计:设 为概念数量,网络中间层维度 ,则:
理想情况下,各维度正交:
其中 为第 个概念基向量。
6.2 表示空间的可视化分析
降维技术:
-
PCA:保持最大方差方向
其中 包含前两个主成分。
-
t-SNE/UMAP:保持局部邻域结构,适合可视化聚类
-
插值路径分析:沿特定方向采样,观察激活和输出的平滑变化
import numpy as np
import torch
def interpolate_representations(
model: nn.Module,
text_a: str,
text_b: str,
layer_idx: int,
n_steps: int = 10
) -> tuple[list[str], list[torch.Tensor]]:
"""
在两个文本表示之间进行线性插值,分析几何路径
Returns:
texts: 插值过程中的采样文本
activations: 对应的中间层激活
"""
# 获取两个端点的表示
h_a = get_layer_activation(model, text_a, layer_idx)
h_b = get_layer_activation(model, text_b, layer_idx)
texts = []
activations = []
for alpha in np.linspace(0, 1, n_steps):
# 线性插值
h_interp = (1 - alpha) * h_a + alpha * h_b
# 注入并前向传播
h_modified = modify_layer_activation(model, text_a, layer_idx, h_interp)
generated = run_model(model, h_modified)
texts.append(generated)
activations.append(h_interp.cpu())
return texts, activations6.3 几何分析与因果推断的结合
表示空间中的因果结构:几何分析可以揭示表示空间中概念之间的因果关系。
干预-观察框架:
- 观察:固定其他特征,只改变目标特征
- 测量:记录模型输出的变化
- 推断:判断 对输出的因果贡献
例子:评估”情感”特征对”推荐决策”的影响:
如果 显著且方向正确,则说明情感特征对推荐有因果影响。
6.4 几何稳定性与鲁棒性
表示空间的几何稳定性度量模型对输入扰动的敏感性:
高稳定性(低 )的表示对输入噪声更鲁棒。
对抗样本的几何解释:对抗扰动 沿表示空间的”脆弱方向”:
这等价于沿损失梯度方向的小步移动,在高维空间中容易被放大。
7. 总结与展望
7.1 核心洞见
特征几何与表示分析揭示了神经网络表示学习的深层机制:
- 线性结构:尽管网络是非线性的,但语义信息以近似线性的方式编码
- 高维压缩:通过叠加和稀疏性,神经网络在有限维度中编码大量概念
- 几何可控性:激活空间的编辑为模型控制提供了几何基础
7.2 开放问题
- 叠加的极限:在高维空间中,最多能叠加多少独立特征而不产生干扰?
- 几何与功能的关系:表示空间的几何结构如何与计算功能对应?
- 跨模型迁移:不同架构学到的表示空间是否具有相似的几何结构?
7.3 实践建议
| 场景 | 建议 |
|---|---|
| 特征探测 | 使用SAE或对比激活差分提取方向 |
| 模型编辑 | 从轻量级干预开始,逐步增强 |
| 可视化分析 | 结合多种降维方法,相互验证 |
| 稳健性评估 | 测量表示空间的几何稳定性 |
参考文献
本文档系统介绍了特征几何与表示分析的理论基础、核心方法与实践应用,涵盖线性表示假说、特征叠加机制、激活空间编辑技术,以及基于SAE的分层表示分析方法。
Footnotes
-
Towards Monotonic, Interpolation and Autoencoding, NeurIPS 2024 - 高维空间的几何性质与表示学习的关系研究 ↩
-
Mikolov, T., et al. (2013). Linguistic Regularities in Continuous Space Word Representations. NAACL-HLT ↩
-
Towards Monotonic, Interpolation and Autoencoding, NeurIPS 2024 - 特征叠加与幂律分布的理论分析 ↩
-
Representation Engineering: A Top-Down Approach to AI, arXiv 2023 - 表征工程的系统性框架 ↩
-
Sparse Autoencoders Find Highly Interpretable Features in Language Models, Bricken et al., ICLR 2024 - SAE发现可解释特征的实证研究 ↩