Qwen-Scope Gradio可视化工具详解:实时特征激活热力图教程
Qwen-Scope Gradio可视化工具详解:实时特征激活热力图教程
Qwen-Scope Gradio可视化工具是一款专为Qwen3.5系列模型打造的强大解释性工具,通过稀疏自编码器(SAE)技术,帮助用户直观分析模型内部特征激活情况,轻松生成实时特征激活热力图。无论是模型行为分析还是优化探索,这款工具都能为新手和普通用户提供便捷的操作体验。
🌟 Qwen-Scope工具核心功能解析
Qwen-Scope作为Qwen3.5系列模型的解释性模块,其核心在于将稀疏自编码器(SAE)集成并训练在模型的隐藏层中。通过实施稀疏性约束,能够自动提取高度解耦、低冗余且可解释性强的数据特征。该工具不仅可用于分析Qwen模型行为的内部机制,还在可控推理、评估样本分布分析、数据分类与合成以及模型训练优化等场景中展现出巨大潜力。
🔑 关键技术特性
- TopK SAE架构:在每次前向传播中,精确保留50个非零特征
- 全面覆盖:涵盖0-31层共32个Transformer层
- 高扩展性:SAE宽度达65536,隐藏层大小4096,扩展因子16倍
- 直观可视化:通过热力图清晰展示特征激活情况
🚀 快速安装与启动指南
一键安装步骤
- 首先克隆仓库:
git clone https://gitcode.com/hf_mirrors/Qwen/SAE-Res-Qwen3.5-9B-Base-W64K-L0_50
cd SAE-Res-Qwen3.5-9B-Base-W64K-L0_50
- 安装所需依赖(确保已安装Python 3.8+):
pip install -r requirements.txt
最快配置方法
使用以下命令启动Gradio demo:
python app.py \
--model Qwen/Qwen3.5-9B-Base \
--model-name-sae-trained-from qwen3.5-9b-base \
--model-name-analyzing-now qwen3.5-9b \
--sae-path . \
--top-k 50 \
--num-layers 32 \
--sae-width 65536 \
--d-model 4096 \
--server-port 7860
启动成功后,在浏览器中访问 http://localhost:7860 即可使用Qwen-Scope可视化工具。
📊 实时特征激活热力图生成教程
基本操作流程
- 选择分析层:在界面中通过滑块选择要分析的Transformer层(0-31)
- 输入文本:在文本框中输入想要分析的文本提示
- 运行分析:点击"分析特征"按钮,工具将自动提取特征并生成热力图
- 调整参数:可通过"Top-K"参数控制显示的特征数量,建议保持默认值50
热力图解读指南
热力图以二维表格形式展示:
- 行:按所有位置平均激活值排序的Top-K特征
- 列:标记位置
- 颜色:激活值(白色→红色,按每行最大值归一化)
热力图右侧提供了颜色图例,从左到右表示激活值从0到峰值的变化。每个单元格悬停时会显示详细信息,包括特征编号、位置和激活值。
💡 高级功能:特征比较与控制
特征比较功能
Qwen-Scope提供了强大的特征比较功能,可帮助用户分析两个不同文本示例之间的特征激活差异:
- 在"Feature Comparison"标签页中,输入两个文本示例
- 设置比较参数,包括层范围和Top-K结果数量
- 点击"Compare Features"按钮,系统将生成比较结果
比较结果将显示每个层中激活率差异最大的特征,通过直观的条形图展示差异程度,并支持悬停查看具体token的激活情况。
特征控制功能
通过"Feature Steering"标签页,用户可以尝试控制模型输出:
- 输入生成提示
- 设置要控制的层和特征索引
- 选择要控制的token位置和控制强度
- 点击"Generate Both Outputs"按钮,比较原始输出和受控输出
这一功能允许用户探索特征对模型输出的影响,为模型行为控制提供了直观的操作界面。
📝 特征激活提取代码示例
以下是一个简单的Python代码示例,展示如何提取Qwen模型的特征激活:
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载基础模型
model_name = "Qwen/Qwen3.5-9B-Base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float32)
model.eval()
# 加载目标层的SAE
LAYER = 0 # 选择0-31中的任何层
sae = torch.load(f"layer{LAYER}.sae.pt", map_location="cpu")
W_enc = sae["W_enc"] # (65536, 4096)
b_enc = sae["b_enc"] # (65536,)
def get_feature_acts(residual: torch.Tensor) -> torch.Tensor:
"""residual: (..., 4096) → 稀疏特征激活 (..., 65536)"""
pre_acts = residual @ W_enc.T + b_enc
topk_vals, topk_idx = pre_acts.topk(50, dim=-1)
acts = torch.zeros_like(pre_acts)
acts.scatter_(-1, topk_idx, topk_vals)
return acts
# 注册钩子捕获目标Transformer层后的残差流
captured = {}
def _hook(module, input, output):
hidden = output[0] if isinstance(output, tuple) else output
captured["residual"] = hidden.detach().cpu()
hook = model.model.layers[LAYER].register_forward_hook(_hook)
# 前向传播
text = "The capital of France is"
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
model(**inputs)
hook.remove()
# 提取特征激活
residual = captured["residual"] # (1, seq_len, 4096)
feature_acts = get_feature_acts(residual) # (1, seq_len, 65536)
# 检查最后一个token的活跃特征
last_token_acts = feature_acts[0, -1] # (65536,)
active_idx = last_token_acts.nonzero(as_tuple=True)[0]
print(f"活跃特征 : {active_idx.tolist()}")
print(f"特征值 : {last_token_acts[active_idx].tolist()}")
⚠️ 使用注意事项
- 严禁将解释性工具用于非科学研究目的,以干扰模型能力或生成有害信息
- 建议在GPU环境下运行,以获得最佳性能
- 首次加载模型可能需要较长时间,请耐心等待
- 对于大型文本,特征提取和热力图生成可能需要一定时间
📚 更多资源
- 技术报告:Qwen_Scope.pdf
- 基础模型:Qwen3.5-9B-Base
- 源代码:app.py
通过Qwen-Scope Gradio可视化工具,即使是新手用户也能轻松探索大型语言模型的内部工作机制。无论是学术研究还是工程应用,这款工具都能为您提供深入的模型洞察和直观的操作体验。
更多推荐

所有评论(0)