先给模型建一本小字典,再谈跨模型
社区讨论 · 赛道

先给模型建一本小字典,再谈跨模型

墨墨墨墨9月7日2026/09/07 54 浏览

新手想看懂 SharedSAE,可以先别啃模型内部。用一个 70M 小模型,把一句话变成一串数字,再变成几个特征编号,最后用表格对照。流程跑通后,统一特征空间就不那么抽象。

feature dictionary 可以粗浅理解成一本对照表,模型内部一堆乱糟糟的神经活动,被字典拆成若干条目。RouteSAE 那篇强调,在多个路由层之间用共享 SAE,得到一个统一 feature space。

第一天先抓激活。打开 Colab,新建 Notebook,点 Runtime,选 Change runtime type,硬件加速器选 T4 GPU。在 cell 输入 %pip install transformers scikit-learn numpy,看到 Successfully installed。再输入下面这段。

python

from transformers import AutoModel, AutoTokenizer

m = AutoModel.from_pretrained("EleutherAI/pythia-70m")

t = AutoTokenizer.from_pretrained("EleutherAI/pythia-70m")

print(m(**t("cooling", return_tensors="pt")).last_hidden_state.shape)

看到类似 torch.Size([1, 1, 768]),就是模型读完 cooling 后留下的数字。

第三天建小字典。准备几个词,cooling, power, battery, robot, chip。我最近看数据中心供应链,常用这几个词练手。输入下面这段。

python

import numpy as np

words = ["cooling", "power", "battery", "robot", "chip"]

vecs = np.stack([m(**t(w, return_tensors="pt")).last_hidden_state.mean(1).squeeze.detach.numpy for w in words])

from sklearn.decomposition import MiniBatchDictionaryLearning

print(MiniBatchDictionaryLearning(n_components=8, batch_size=5).fit_transform(vecs).argsort(axis=1)[:, -5:])

看到每行 5 个编号。编号本身没含义,只是 8 个特征槽位被点亮的位置。

一周后做对照表。把 words 和结果存成 CSV,用 Excel 打开,做一张简单表。再把代码里的 last_hidden_state 换成 output_hidden_states=True 后的倒数第二层隐藏状态,例如 m(**t(w, return_tensors="pt"), output_hidden_states=True).hidden_states[-2],或者换另一个小模型,再跑一遍。比较同一个词在两个表里是否落在同一排编号附近。

坑不少。不同字典之间的编号不可比。A 字典的 12 号,和 B 字典的 12 号,不是同一个东西。SharedSAE 想解决的正是这个,让多个模型、多个层的激活,尽量落到同一本字典上。你手动做对照,只能看直觉,真要做跨模型,需要共享训练或映射。中文也麻烦,robot 是单 token,中文词常被切成子词。新手先用英文短词,别一上来拿整段网页 HTML 做清洗。上面用的是传统字典学习,不是严格 SAE,少了稀疏自编码器的训练细节,但足够建立激活、字典、特征的链条。

学完这个,下一步可以拿一组物理 AI 相关词,比如 battery, cooling, actuator, joint, sim2real,分别在不同模型层里跑一遍,看哪些特征编号反复出现。再去找开源 SAE 实现,把 MiniBatchDictionaryLearning 换成真正的 SAE 训练。别追求一步复现 SharedSAE,先把一本小字典建起来。


📌 本文编译自 Arxiv LG,原文:https://arxiv.org/abs/2609.04344

版权归原作者所有,本文为基于公开报道的编译与独立分析。

1 条回复

?
Ctrl + Enter 快速回复
偃师
偃师9月7日

看了参数表,这字典更新频率跟不上模型迭代速度吧?产线爬坡时肯定乱套。