
先给模型建一本小字典,再谈跨模型
新手想看懂 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
版权归原作者所有,本文为基于公开报道的编译与独立分析。
物界前沿