参数重要性 ≠ 参数可训练性:LLM "超级权重" 悖论
一句话总结
论文证明了一个反直觉的发现:LLM 中那些”删一个就崩溃”的超级权重(Super Weights),恰恰是你不能单独微调的参数——对它们定向训练会让模型直接退化到随机猜测水平。
为什么这篇论文重要?
大语言模型的参数不是均质的。过去一年,研究者们发现了一种极端现象:模型中存在少数”超级权重”(Super Weights),仅仅移除其中几个,模型性能就会从正常水平断崖式下跌到随机猜测。这听起来很像系统中的单点故障——如果这些参数如此关键,那么:
- 它们是模型能力的”存储中心”吗?
- 如果专门训练这些参数,能不能高效地注入新知识?
这篇论文的回答是:不能,而且会让模型彻底崩溃。
这个结论打破了”参数重要性”和”参数可训练性”之间天然等价的直觉,并为 LoRA 为何有效提供了一个新的理解视角。
什么是超级权重?
在深入讨论之前,先建立直觉。
LLM 的权重矩阵中,绝大多数值分布在某个正态范围内。但存在极少数离群值(outlier),其绝对值比均值大 10-100 倍。这些就是超级权重。
类比:想象一栋拱门建筑,拱顶的那块楔石(keystone)承受着来自两侧的所有压力。它不是”最重的石头”,但是最不可或缺的结构件。
import torch
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
def find_super_weights(model, layer_name="down_proj", top_k=100):
"""识别模型中的超级权重位置"""
super_weight_coords = {}
for name, param in model.named_parameters():
if layer_name not in name:
continue
w = param.data.float()
# 超级权重定义:绝对值远超均值 + 3*标准差的参数
threshold = w.abs().mean() + 3 * w.abs().std()
mask = w.abs() > threshold
# 按绝对值降序返回坐标
flat_indices = w.abs().flatten().topk(top_k).indices
rows = flat_indices // w.shape[1]
cols = flat_indices % w.shape[1]
super_weight_coords[name] = list(zip(rows.tolist(), cols.tolist()))
print(f"{name}: 找到 {mask.sum().item()} 个超级权重,"
f"最大值 {w.abs().max():.2f} vs 均值 {w.abs().mean():.4f}")
return super_weight_coords
# 示例:加载模型并检测
# model = AutoModelForCausalLM.from_pretrained("allenai/OLMo-1B-hf")
# coords = find_super_weights(model)
超级权重有两个特征:
- 位置固定:在不同的 prompt 下,它们的位置不变
- 删除敏感:置零后,输出的 token 分布立刻崩坏
核心发现:定向训练为何失败?
实验设计
论文的实验逻辑非常清晰:
| 训练策略 | 训练参数数量 | 结果 |
|---|---|---|
| 只训练超级权重坐标 | 100 ~ 8,192 | 崩溃(随机猜测) |
| 扩展到超级权重的局部邻域 | 最多 36K | 仍然崩溃 |
| 在同层随机选等量坐标训练 | 100 ~ 8,192 | 优于基线 |
| LoRA(全层低秩分解) | ~0.16% 参数 | 成功 |
| LoRA 但排除超级权重坐标 | ~0.16% 参数 | 与普通 LoRA 无显著差异 |
最关键的对照实验:同样的稀疏度、同样的层、随机坐标成功了,但超级权重坐标失败了。
这排除了”稀疏训练本身有问题”的假说。问题是针对超级权重坐标的,而不是稀疏性。
为什么定向训练会崩溃?
我的理解是梯度更新的”尺度错配”问题:
超级权重的值 $w_{ij}$ 极大,这意味着:
\[\frac{\partial \mathcal{L}}{\partial w_{ij}} = \frac{\partial \mathcal{L}}{\partial \mathbf{h}} \cdot \frac{\partial \mathbf{h}}{\partial w_{ij}}\]其中 $\mathbf{h} = \mathbf{W}\mathbf{x}$,输出激活对这个特定权重极度敏感。学习率的任何微小扰动,都会在输出空间产生放大的影响,破坏模型已经建立的精细表示。
而其他参数(随机选的)不存在这个问题——它们的梯度处于正常尺度,更新是稳定的。
代码实验:复现失败场景
下面用一个简化实验演示选择性训练的行为差异:
import torch
import torch.nn as nn
from torch.optim import AdamW
from copy import deepcopy
class MinimalMLP(nn.Module):
"""简化版 MLP,模拟 LLM 中的 down_proj 行为"""
def __init__(self, d_in=256, d_out=128):
super().__init__()
self.proj = nn.Linear(d_in, d_out, bias=False)
# 手动注入几个"超级权重"
with torch.no_grad():
self.proj.weight[0, :5] = 50.0 # 极大值,模拟超级权重
def forward(self, x):
return self.proj(x)
def selective_train(model, data, target_coords, n_steps=200, lr=1e-3):
"""只训练指定坐标的参数"""
model = deepcopy(model)
# 创建仅更新目标坐标的梯度钩子
mask = torch.zeros_like(model.proj.weight)
for r, c in target_coords:
mask[r, c] = 1.0
optimizer = AdamW([model.proj.weight], lr=lr)
losses = []
for step in range(n_steps):
optimizer.zero_grad()
out = model(data)
loss = nn.MSELoss()(out, target)
loss.backward()
# 只保留目标坐标的梯度
model.proj.weight.grad *= mask
optimizer.step()
losses.append(loss.item())
return losses, model
# 生成测试数据
torch.manual_seed(42)
x = torch.randn(64, 256)
target = torch.randn(64, 128)
model = MinimalMLP()
# 方案A:定向训练超级权重(前5列第0行)
super_coords = [(0, i) for i in range(5)]
losses_super, m_super = selective_train(model, x, target, super_coords)
# 方案B:定向训练等量随机坐标
random_coords = [(i // 256, i % 256)
for i in torch.randperm(256*128)[:5].tolist()]
losses_random, m_random = selective_train(model, x, target, random_coords)
print(f"超级权重定向训练 最终 loss: {losses_super[-1]:.4f}")
print(f"随机坐标定向训练 最终 loss: {losses_random[-1]:.4f}")
即使是这个玩具模型,你也会观察到超级权重坐标的训练曲线更不稳定——在真实的 OLMo 规模下,这种不稳定会演变为完全崩溃。
LoRA 为何成功:结构胜于选择
这是论文最深刻的一个隐含结论。
LoRA 不是因为”避开了超级权重”而成功——论文专门做了一个实验:把 LoRA 的更新矩阵中对应超级权重坐标的部分强制归零,结果几乎没有性能差异。
这说明:
- 超级权重不需要被更新,微调也能成功
- LoRA 成功的原因是低秩结构强制了层级协同更新
LoRA 的更新可以写成:
\[\Delta W = BA, \quad B \in \mathbb{R}^{d \times r},\ A \in \mathbb{R}^{r \times k},\ r \ll \min(d, k)\]这个低秩约束意味着:每一个参数的更新都不是独立的,而是受整个秩空间约束的。超级权重所在位置的更新量,自然被整个矩阵的方向性结构所制约,不会产生爆炸式的偏移。
import torch
import torch.nn as nn
class LoRALayer(nn.Module):
def __init__(self, base_weight, rank=8):
super().__init__()
d_out, d_in = base_weight.shape
self.base = base_weight # 冻结
# 低秩更新矩阵
self.A = nn.Parameter(torch.randn(rank, d_in) * 0.01)
self.B = nn.Parameter(torch.zeros(d_out, rank))
self.scaling = 1.0 / rank
def forward(self, x):
base_out = x @ self.base.T
lora_out = x @ self.A.T @ self.B.T * self.scaling
return base_out + lora_out
# LoRA 的关键:base_weight 完全冻结,超级权重不会被直接修改
# 但整层的表达能力通过低秩扰动得到调整
工程直觉:低秩分解就像给整个层套上一个”协调约束”,没有哪个单独的坐标能够脱离整体结构独立暴走。
实现中的坑
坑1:学习率对超级权重极度敏感
# 错误示范:用统一学习率训练含超级权重的稀疏子集
optimizer = AdamW(super_weight_params, lr=1e-4) # 看似合理
# 问题:Adam 会对梯度进行归一化,但超级权重的梯度本身就不稳定
# 更好的做法是使用极小学习率或直接 LoRA
optimizer = AdamW([
{"params": super_weight_params, "lr": 1e-6}, # 极保守
{"params": other_params, "lr": 1e-4},
])
坑2:把”删除敏感”误判为”更新有益”
移除超级权重 → 性能崩溃
≠
更新超级权重 → 性能提升
这两个命题互相独立。”不可缺少”不等于”可以优化”。就像你的脊椎骨对生命至关重要,但这不意味着你应该单独去”训练”脊椎骨。
坑3:局部邻域扩展没有帮助
论文尝试了从单个超级权重扩展到其局部 $k \times k$ 邻域(最多 36K 参数),依然崩溃。这暗示问题不是”上下文不足”,而是这个坐标本身就不适合作为训练目标。
实验:论文结论的适用边界
论文使用 OLMo-1B 和 OLMo-7B。这里有几点需要注意:
能复现的部分:
- 超级权重在
down_proj层中存在(跨模型普遍现象) - LoRA 以极少参数达到较好效果(已有大量工程实践验证)
不确定的部分:
- 论文中提到”Super Weights 的危害性不普遍适用于所有 LLM”——不同架构、不同训练数据的模型行为可能不同
- 实验局限于 OLMo 系列(开放权重但非主流部署模型)
- 在 Llama、Mistral 等模型上是否完全等效,需要单独验证
什么时候用 / 不用定向权重训练?
| 适用场景 | 不适用场景 |
|---|---|
| LoRA / QLoRA 微调 | 针对超级权重坐标的定向稀疏训练 |
| 全层参数的低秩更新 | 基于”重要性排序”选参数做 sparse fine-tuning |
| 随机稀疏子集训练(如 random pruning + retrain) | 以超级权重为核心的 PEFT 方案 |
| 按层冻结(freeze early layers,train later) | 假设”重要参数 = 训练收益高”的方案 |
我的观点
这篇论文的意义不止于”超级权重不能单独训练”这个结论,它更深层的贡献是:
它把”参数重要性”和”参数可训练性”解耦了。
这两个概念在过去的文献中经常被混用。很多剪枝、PEFT 方法都隐含地假设”重要的参数应该被优先训练/保留”——但这篇论文告诉我们,这个假设在极端情况下是错的。
对实践者的最大启示是:不要根据权重的量级或重要性来选择微调目标,而应该依赖结构化的更新方案(如 LoRA)。结构不仅仅是一种参数效率的技巧,它本质上是一种稳定训练的约束。
一个有趣的开放问题是:超级权重究竟编码了什么?如果它们不是通过直接训练产生贡献的,那么它们在预训练中是怎么形成的、扮演什么角色?这可能是理解大模型涌现能力的一个切入点。
论文链接:https://arxiv.org/abs/2607.08733v1
Comments