返回博客

Qwen-Scope:用稀疏自编码器打开大模型的黑盒

通过QevosAgent深度分析Qwen-Scope项目,探索如何利用SAE实现大模型的可解释性、特征提取与推理控制。

Qwen-Scope架构

背景

大语言模型(LLM)的强大能力背后,是一个巨大的"黑盒"——我们能看到输入和输出,却难以理解模型内部是如何表示和处理信息的。Qwen-Scope 是Qwen团队发布的一个突破性工具,它通过在模型中集成稀疏自编码器(Sparse Autoencoder, SAE),让我们能够"看到"模型内部的特征激活,甚至直接控制模型的推理行为。

本次,我们使用QevosAgent对Qwen-Scope进行了完整的技术分析,深入研究了它的架构设计、特征提取机制和特征控制(Steering)原理。

什么是Qwen-Scope?

Qwen-Scope是一个基于Gradio的Web应用,核心功能包括:

  1. 特征分析(Analyze):输入文本,查看模型内部哪些特征被激活
  2. 特征比较(Compare):对比两段文本的特征差异,找出区分性特征
  3. 特征引导(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热力图:

这让开发者能够直观地看到哪些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的核心创新在于:

  1. 完整的SAE工具链:从特征提取→可视化→控制,形成闭环
  2. 高效的工程实现:LRU缓存、预转置权重、Top-K ReLU稀疏化
  3. 直观的可视化:HTML热力图+交互式概率面板
  4. 实用的控制机制:通过Hook修改隐藏状态实现特征Steering

Qwen-Scope将可解释性从"研究玩具"变成了"工程工具",使开发者能够:


💡 互动展示:想了解语义是如何对应到具体特征值的吗?查看我们的科普展示页面,通过交互式演示探索大模型内部的特征激活机制。


本文基于QevosAgent对Qwen-Scope项目的深度技术分析生成,完整分析代码和结果可在Qwen-Scope GitHub获取。