Transformer 谱分析视角
谱分析(Spectral Analysis)是理解 Transformer 行为的核心工具之一。通过分析注意力矩阵、Jacobian 矩阵和权重矩阵的谱性质,我们可以揭示 Transformer 内部的信号传播、优化动力学和表达力。本文系统整理 2024-2026 年的 Transformer 谱分析成果。
1. 为什么谱分析重要
1.1 谱 = 内部动力学
核心思想:矩阵的谱(特征值集合)揭示了变换的内在结构。
| 矩阵 | 谱的含义 |
|---|---|
| 注意力矩阵 | 信息分配模式 |
| Jacobian | 信号传播特性 |
| 权重矩阵 | 表示的几何结构 |
| Token embedding | 词向量的方向结构 |
1.2 谱分析揭示的现象
- Rank Collapse:长上下文中注意力矩阵退化为接近均匀
- Spectral Gap:谱中前几个特征值远大于其他
- NTK 谱:训练动力学的渐近行为
- Optimization Stability:梯度流的稳定性
2. 注意力矩阵的谱性质
2.1 基本谱定理
定理 2.1:注意力矩阵 (softmax 输出)具有以下谱性质:
- 特征值界限:(行随机矩阵的 Perron-Frobenius 性质)
- 正实部:所有特征值的实部
- 和为 :
2.2 Perron-Frobenius 定理的应用
定理 2.2:对于行随机矩阵 :
对应的特征向量 (均匀分布)。
含义:注意力矩阵总是有一个”主特征方向”——均匀分布。
2.3 谱间隙(Spectral Gap)
定义 2.1(谱间隙):
含义:
- 大 :矩阵接近秩 1,注意力高度集中
- 小 :矩阵接近一致,注意力均匀
2.4 实证谱分布
import torch
import numpy as np
import matplotlib.pyplot as plt
def analyze_attention_spectrum(attn_matrix):
"""分析注意力矩阵的谱"""
A = attn_matrix.cpu().numpy()
# 奇异值分解
s = np.linalg.svd(A, compute_uv=False)
# 归一化(让最大奇异值为1)
s_normalized = s / s.max()
return {
'singular_values': s,
'normalized': s_normalized,
'effective_rank': (s ** 2).sum() / (s[0] ** 2),
'spectral_gap': 1 - s[1] / s[0] if len(s) > 1 else 0,
'top_5': s[:5].tolist(),
'tail_ratio': (s[5:].sum() / s.sum()).item() if s.sum() > 0 else 0,
}2.5 训练过程中的谱演化
典型轨迹:
训练初期: 训练中期: 训练后期:
谱近似均匀 谱开始集中 高度稀疏
λ_1 ≈ 1/n λ_1 ≈ 0.5 λ_1 ≈ 0.9
λ_i ≈ 1/n λ_2 ≈ 0.3 λ_2 ≈ 0.05
λ_i 衰减 λ_i → 0 (i ≥ 3)
3. Rank Collapse 现象
3.1 核心论文
Nait Saada, Naderi, Tanner (2025). Mind the Gap: a Spectral Analysis of Rank Collapse and Signal Propagation in Attention Layers. PMLR 267.1
3.2 现象定义
Rank Collapse:在长上下文场景中,注意力矩阵的”有效秩”显著降低,所有 token 趋向混合。
形式化:
即所有特征值趋向于 。
3.3 关键定理
定理 3.1(Nait Saada et al. 2025,简化):
设上下文长度 ,key/query 维度 ,则 softmax 注意力矩阵的特征值满足:
含义:
- 当 时,谱间隙急剧缩小
- 注意力趋向均匀
- 信号无法有效区分 token
3.4 Rank Collapse 的后果
对训练:
- 梯度信号减弱
- Token 表示趋同
- 模型难以区分远距离依赖
对推理:
- 长上下文性能下降
- 注意力无法聚焦相关 token
3.5 Rank Collapse 的解决方案
方案 1:注意力缩放
其中 抵消 Rank Collapse。
方案 2:温度调节
Chen et al. (2025) 证明了 是必要的。
方案 3:位置编码辅助
RoPE 等相对位置编码可缓解 Rank Collapse。
3.6 实证 Rank Collapse
def measure_rank_collapse(model, sequence_lengths):
"""测量不同长度下的 Rank Collapse"""
results = []
for n in sequence_lengths:
# 构造随机输入
x = torch.randn(1, n, model.d_model)
# 获取注意力矩阵
with torch.no_grad():
attn_matrix = get_attention_matrix(model, x) # [n, n]
# 计算谱统计
spectrum = analyze_attention_spectrum(attn_matrix)
results.append({
'n': n,
'effective_rank': spectrum['effective_rank'],
'spectral_gap': spectrum['spectral_gap'],
})
return results4. 信号传播的谱分析
4.1 残差网络的 Jacobian
关键矩阵:每层的 Jacobian 。
对残差连接:
4.2 谱传播方程
整个网络的 Jacobian:
其中 。
4.3 谱稳定性条件
定理 4.1:对于深度网络,信号稳定传播当且仅当:
残差连接的作用: 在 时稳定。
4.4 Transformer 的特殊性
注意力层的 Jacobian:
计算:通过链式法则展开。
关键观察:残差连接使 Transformer 自然有稳定的谱(即使没有 LayerNorm)。
4.5 Pre-norm 的谱稳定性
Pre-norm + 残差:
特点:
- LN 的 Jacobian 有界
- 的 Jacobian 局部有界
- 整体稳定
5. NTK 视角的谱分析
5.1 NTK 基础
定义:神经网络在无穷宽度极限下的 NTK:
5.2 Transformer 的 NTK 谱
核心结果(Yang & Hu 2021 等):
Transformer 的 NTK 在无穷宽度下是确定性的,谱与训练无关。
谱结构:
- 主要由注意力矩阵决定
- 与位置编码相关
- 受层数影响小
5.3 NTK 的特征值分布
典型分布:
- 多个接近零的特征值(高维冗余)
- 少量主导特征值(与任务相关)
- 中间过渡区域
5.4 NTK 与训练动力学
关键推论:
- NTK 模式 → 训练等价于核回归
- 谱主导特征值决定学习速度
- 谱尾部决定泛化能力
6. 权重矩阵的谱分析
6.1 权重谱的初始化分布
标准初始化(如 Kaiming Uniform):
权重矩阵 的奇异值 Marcenko-Pastur 分布。
性质:
- 谱密度有显式公式
- 谱支撑在 ,,
6.2 训练后的谱
典型演化:
初始化: 训练早期: 训练后期:
均匀谱 出现少量主导值 主导值增强
整体谱变窄 其他值衰减
6.3 谱归一化(GAN 应用)
谱归一化:约束权重矩阵的最大奇异值:
效果:限制 Lipschitz 常数,提高训练稳定性。
6.4 谱剪枝
基于谱的剪枝:
def spectral_pruning(weight_matrix, target_sparsity):
"""基于谱的权重剪枝"""
U, s, V = torch.svd(weight_matrix)
# 保留前 k 个奇异值
k = int(len(s) * (1 - target_sparsity))
s_pruned = torch.zeros_like(s)
s_pruned[:k] = s[:k]
# 重建
return U @ torch.diag(s_pruned) @ V.T7. Attention Scaling 的谱分析
7.1 核心论文
Chen, Lin, Polyanskiy, Rigollet (2025). Critical Attention Scaling in Long-Context Transformers. MIT.2
7.2 现象
在长上下文训练中,需要缩放注意力分数才能避免 Rank Collapse。
7.3 关键定理
定理 7.1(Chen et al. 2025,简化):
设序列长度 ,当 时,softmax 注意力矩阵的特征值满足:
(所有特征值趋向均匀)
对策:必须用多项式对数缩放:
其中 是某个正常数。
7.4 实证
实验发现:
- 不缩放 → 长上下文性能崩溃
- 太小 → 不够
- 太大 → 注意力过度集中
经验最优:。
7.5 实践应用
def length_aware_attention(Q, K, V, base_scale=1.0, poly_alpha=1.7):
"""长度感知的注意力缩放"""
n = Q.shape[-2]
scaling = base_scale * (torch.log(torch.tensor(n)).item() ** poly_alpha)
scores = Q @ K.transpose(-2, -1) / (Q.shape[-1] ** 0.5) * scaling
attn = torch.softmax(scores, dim=-1)
return attn @ V8. 多头注意力的谱分析
8.1 多头作为块对角
多头注意力可视为块对角矩阵:
其中 是第 个头的注意力矩阵。
8.2 多头的谱
整个多头注意力的 Jacobian:
谱:所有头的特征值合并。
8.3 头之间的谱差异
def head_spectral_diversity(attn_matrices):
"""计算不同头的谱多样性"""
spectra = []
for head_idx in range(attn_matrices.shape[0]):
s = torch.linalg.svdvals(attn_matrices[head_idx])
spectra.append(s)
# 计算谱之间的差异
spectra_tensor = torch.stack(spectra)
pairwise_diff = torch.cdist(spectra_tensor, spectra_tensor)
return {
'mean_diversity': pairwise_diff.mean().item(),
'most_similar_heads': pairwise_diff.min(dim=0),
'most_different_heads': pairwise_diff.max(dim=0),
}8.4 头的冗余性
观察:在训练后期,许多头表现出类似的谱。
含义:
- 多头并不完全独立
- 部分头可以”剪枝”
- 但核心头承担主要功能
9. Transformer 优化动力学的谱
9.1 梯度流的谱
优化方程:
Hessian 谱:
控制优化动力学。
9.2 Sharp vs Flat Minima
Sharp Minimum:Hessian 最大特征值大 → 泛化差
Flat Minimum:Hessian 最大特征值小 → 泛化好
Transformer 的特点:
- 倾向于 sharp minima(容量大)
- 但训练后期会”漂移”到 flat regions
9.3 SAM(Sharpness-Aware Minimization)
核心思想:显式寻找 flat minima。
谱效果:降低 Hessian 最大特征值。
10. 谱分析的应用
10.1 模型诊断
健康的 Transformer:
- 注意力矩阵谱衰减适度(不是急剧)
- Jacobian 谱接近 1
- 权重谱分布平滑
问题模型:
- 谱突然截断 → 信息瓶颈
- Jacobian 谱远大于 1 → 训练不稳定
- 权重谱集中 → 训练失败
10.2 架构设计
基于谱的设计原则:
def spectral_design_check(architecture):
"""基于谱的架构检查"""
issues = []
# 1. 避免深度过大(谱爆炸)
if architecture.num_layers > 200:
issues.append("深度过大可能导致谱爆炸")
# 2. 维度对齐(谱密度)
if architecture.d_model % architecture.num_heads != 0:
issues.append("d_model 应能被 num_heads 整除")
# 3. 注意力头维度(谱效率)
d_k = architecture.d_model // architecture.num_heads
if d_k < 32:
issues.append("d_k 过小可能限制注意力表达")
elif d_k > 256:
issues.append("d_k 过大可能导致优化困难")
return issues if issues else ["架构谱性质良好"]10.3 量化感知训练
谱保持量化:
def spectral_preserving_quantize(weight, bits=8):
"""保留主要谱分量的量化"""
U, s, V = torch.svd(weight)
# 仅量化重要分量
k = int(0.8 * len(s)) # 保留前 80%
s_important = s[:k]
# 量化
s_quantized = quantize(s_important, bits)
# 重建
s_full = torch.zeros_like(s)
s_full[:k] = s_quantized
return U @ torch.diag(s_full) @ V.T11. 谱与表达力
11.1 表达力的谱度量
关键度量:模型在不同输入上的 Jacobian 谱的分布。
满秩 Jacobian:模型对输入敏感(可能过拟合)
低秩 Jacobian:模型”忽略”某些方向(可能欠拟合)
11.2 谱与记忆容量
关键关系:模型的记忆容量与 Hessian 谱相关。
直觉:更多特征值 → 更大存储空间 → 更强记忆
11.3 谱与泛化
关键洞察:
- Sharp minima(小特征值)→ 泛化好
- Flat minima(大特征值)→ 泛化差
Transformer 的现象:
- 训练初期:sharp
- 训练后期:逐渐 flat
- 与过拟合相关
12. 计算工具
12.1 谱分析工具箱
class TransformerSpectralAnalyzer:
"""Transformer 谱分析工具箱"""
def __init__(self, model):
self.model = model
def analyze_all_layers(self, x):
"""分析所有层的谱"""
results = {}
# 注册 hook 捕获注意力
attention_outputs = []
handles = []
def hook(module, input, output):
if isinstance(output, tuple) and len(output) > 1:
attention_outputs.append(output[1].detach())
for module in self.model.modules():
if isinstance(module, torch.nn.MultiheadAttention):
handles.append(module.register_forward_hook(hook))
with torch.no_grad():
self.model(x)
for handle in handles:
handle.remove()
# 分析每层
for i, attn in enumerate(attention_outputs):
results[f'layer_{i}'] = {
'effective_rank': self._effective_rank(attn[0, 0]),
'spectral_gap': self._spectral_gap(attn[0, 0]),
'max_eigenvalue': self._max_eigenvalue(attn[0, 0]),
}
return results
def _effective_rank(self, matrix, threshold=0.99):
s = torch.linalg.svdvals(matrix)
s_norm = s / s.sum()
cumsum = torch.cumsum(s_norm, dim=0)
return (cumsum < threshold).sum().item() + 1
def _spectral_gap(self, matrix):
s = torch.linalg.svdvals(matrix)
return (s[0] - s[1]).item() if len(s) > 1 else s[0].item()
def _max_eigenvalue(self, matrix):
return torch.linalg.eigvals(matrix).abs().max().item()12.2 谱可视化
def plot_spectrum(attn_matrix, title='Attention Spectrum'):
"""可视化注意力谱"""
s = torch.linalg.svdvals(attn_matrix).cpu().numpy()
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# 线性尺度
axes[0].plot(s, 'b-', linewidth=1)
axes[0].set_xlabel('Index')
axes[0].set_ylabel('Singular Value')
axes[0].set_title(f'{title} (Linear)')
axes[0].set_yscale('log')
# 归一化累积
cumsum = np.cumsum(s) / np.sum(s)
axes[1].plot(cumsum, 'r-', linewidth=2)
axes[1].axhline(y=0.99, color='k', linestyle='--', alpha=0.5)
axes[1].set_xlabel('Index')
axes[1].set_ylabel('Cumulative Variance Ratio')
axes[1].set_title(f'{title} (Cumulative)')
plt.tight_layout()
return fig13. 与其他理论的统一
13.1 谱 + 共识
统一视角:
- Attention Sink = 谱的极端化()
- 共识传播 = 谱主导特征值驱动
13.2 谱 + NTK
NTK 的谱:
- NTK 矩阵的谱决定训练动力学
- 与 Transformer 架构谱密切相关
13.3 谱 + 知识容量
关系:
- 注意力矩阵的稳定秩 ∝ 知识存储容量
- 谱分析方法可估计记忆容量
14. 关键论文清单
谱分析基础
- Nait Saada et al. PMLR 267 (2025) — Mind the Gap
- Chen et al. (2025) — Critical Attention Scaling
- Boncoraglio et al. arXiv:2509.24914 (2025) — Spectral Properties of Single-Head Attention
应用
- Yang & Hu (2021) — Tensor Programs IV (NTK for Transformers)
- Bansal et al. (2022) — Spectral Analysis of Attention
优化
- Foret et al. (2021) — SAM (Sharpness-Aware Minimization)
15. 实践建议
15.1 监控 Transformer 训练
def training_monitor(model, dataloader, log_every=100):
"""训练监控器"""
analyzer = TransformerSpectralAnalyzer(model)
for step, batch in enumerate(dataloader):
# 训练步骤
loss = train_step(model, batch)
if step % log_every == 0:
# 分析谱
spectra = analyzer.analyze_all_layers(batch['input'])
# 检查异常
for layer, info in spectra.items():
if info['effective_rank'] < 5:
print(f"警告: {layer} 有效秩过低 ({info['effective_rank']})")
if info['max_eigenvalue'] > 0.95:
print(f"警告: {layer} 主导特征值过高 ({info['max_eigenvalue']:.3f})")15.2 架构搜索
基于谱的架构评估:
def evaluate_architecture_spectral(config, sample_data):
"""评估架构的谱性质"""
model = build_transformer(config)
analyzer = TransformerSpectralAnalyzer(model)
spectra = analyzer.analyze_all_layers(sample_data)
score = 0
for layer, info in spectra.items():
# 健康指标:
# - 有效秩 30-100(不过低/不过高)
# - 谱间隙 0.3-0.7(适度集中)
er = info['effective_rank']
sg = info['spectral_gap']
if 30 < er < 100 and 0.3 < sg < 0.7:
score += 1
return score / len(spectra)16. 与相关专题的连接
16.1 Transformer 架构专题
16.2 数学基础
16.3 应用
最后更新:2026-06-21