Qwen-Scope:用稀疏自编码器打开大模型的黑盒
通过QevosAgent深度分析Qwen-Scope项目,探索如何利用SAE实现大模型的可解释性、特征提取与推理控制。

背景
大语言模型(LLM)的强大能力背后,是一个巨大的"黑盒"——我们能看到输入和输出,却难以理解模型内部是如何表示和处理信息的。Qwen-Scope 是Qwen团队发布的一个突破性工具,它通过在模型中集成稀疏自编码器(Sparse Autoencoder, SAE),让我们能够"看到"模型内部的特征激活,甚至直接控制模型的推理行为。
本次,我们使用QevosAgent对Qwen-Scope进行了完整的技术分析,深入研究了它的架构设计、特征提取机制和特征控制(Steering)原理。
什么是Qwen-Scope?
Qwen-Scope是一个基于Gradio的Web应用,核心功能包括:
- 特征分析(Analyze):输入文本,查看模型内部哪些特征被激活
- 特征比较(Compare):对比两段文本的特征差异,找出区分性特征
- 特征引导(Steer):通过修改隐藏状态,控制模型的生成行为
它的核心理念是:将SAE从"事后检查工具"转变为"构建和修复语言模型的实际接口"。
技术架构解析
整体架构
┌─────────────────────────────────────────────────────┐
│ Gradio Web UI │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 特征分析 │ │ 特征比较 │ │ 特征引导 │ │
│ │ (Analyze) │ │(Compare) │ │ (Steer) │ │
│ └─────┬────┘ └─────┬────┘ └─────┬────┘ │
│ │ │ │ │
│ ┌─────┴──────────────┴──────────────┴──────────┐ │
│ │ 核心计算层 (Core Engine) │ │
│ │ ┌─────────────┐ ┌──────────────────────┐ │ │
│ │ │ SAE 加载器 │ │ 特征激活计算器 │ │ │
│ │ │ (LRU缓存) │ │ (compute_sae_features)│ │ │
│ │ └──────┬──────┘ └──────────┬───────────┘ │ │
│ │ │ │ │ │
│ │ ┌──────┴────────────────────┴──────────────┐ │ │
│ │ │ 可视化渲染层 │ │ │
│ │ │ (热力图/概率分布/Token序列) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
关键技术参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| 基础模型 | Qwen/Qwen3.5-2B | 被分析的语言模型 |
| SAE 宽度 | 32,768 | 字典大小(特征数量) |
| 模型维度 | 2,048 | 隐藏层维度 |
| Top-K | 100 | 显示的前K个特征 |
核心机制:特征如何被提取?
1. 隐藏状态捕获
Qwen-Scope使用PyTorch的Hook机制,在指定Transformer层的输出后捕获隐藏状态:
def capture_hidden(model, input_ids, layer):
"""在指定层捕获隐藏状态"""
hidden_state = None
def hook(module, inp, out):
nonlocal hidden_state
hidden_state = out[0] # [batch, seq_len, d_model]
hook_handle = model.model.layers[layer].register_forward_hook(hook)
with torch.no_grad():
model(input_ids)
hook_handle.remove()
return hidden_state
2. SAE特征编码
捕获到隐藏状态后,通过SAE进行编码:
def compute_sae_features(hidden, sae, top_k=100):
x = hidden - sae["b_enc"] # 减去偏置
pre_acts = x @ sae["W_enc"] # 线性编码 [seq_len, sae_width]
features = topk_relu(pre_acts, top_k) # Top-K ReLU稀疏化
return features
关键创新:Top-K ReLU稀疏化确保每个位置只有激活最强的K个特征被保留,其余置零,这使得特征表示更加清晰可解释。
3. 热力图可视化
特征激活被渲染为HTML热力图:
- 行 = 特征(按平均激活值排序的Top-K特征)
- 列 = Token位置
- 颜色 = 激活强度(白色→红色渐变)
这让开发者能够直观地看到哪些Token激活了哪些特征。
核心机制:特征如何被控制?
Steering(特征引导)原理
Qwen-Scope最强大的功能是Steering——通过修改模型隐藏状态来控制生成行为:
原始流程:输入 → Transformer → 隐藏状态 → 语言模型头 → 输出
Steering流程:输入 → Transformer → 隐藏状态 → [+特征激活注入] → 语言模型头 → 输出
技术实现
def _steer_hook(module, inp, out):
"""在指定层的输出后注入特征激活"""
hidden = out[0] # [batch, seq_len, d_model]
for pos in steered_positions:
for feat_idx in target_features:
# 通过解码器权重获取特征方向
direction = sae["W_dec"][feat_idx]
# 按强度注入到隐藏状态
hidden[:, pos, :] += strength * direction
return (hidden,) + out[1:]
Steering强度模式
| 模式 | 强度 | 适用场景 |
|---|---|---|
| Light | 25% | 微调生成风格 |
| Medium | 50% | 明显改变输出 |
| Strong | 100% | 强制特定特征 |
| Custom | 自定义 | 精细控制 |
应用场景
1. 推理时的可控引导
通过Steering,可以在不修改模型权重的情况下,实时控制模型的生成行为。例如:
- 增强"创造性"特征,让模型生成更有创意的内容
- 抑制"重复"特征,减少重复生成
- 引导模型关注特定主题
2. 评估样本分布分析
分析不同类别样本的特征激活分布,帮助理解模型如何区分不同任务。
3. 数据分类与合成
利用特征激活模式对数据进行分类,或合成具有特定特征激活的新样本。
4. 模型训练与优化
识别出的问题特征可用于针对性微调,解决如重复生成、幻觉等问题。
总结
Qwen-Scope的核心创新在于:
- 完整的SAE工具链:从特征提取→可视化→控制,形成闭环
- 高效的工程实现:LRU缓存、预转置权重、Top-K ReLU稀疏化
- 直观的可视化:HTML热力图+交互式概率面板
- 实用的控制机制:通过Hook修改隐藏状态实现特征Steering
Qwen-Scope将可解释性从"研究玩具"变成了"工程工具",使开发者能够:
- 理解模型内部如何表示不同概念
- 控制模型在推理时的行为
- 优化模型在训练时的表现
💡 互动展示:想了解语义是如何对应到具体特征值的吗?查看我们的科普展示页面,通过交互式演示探索大模型内部的特征激活机制。
本文基于QevosAgent对Qwen-Scope项目的深度技术分析生成,完整分析代码和结果可在Qwen-Scope GitHub获取。