Research note · 2026-05
跨模型表征偏移:把神经元移植到更小的模型
Gemma 4 31B-it → E2B-it · ACM_v3 实验记录
用 shared tokenizer + 最小二乘 hidden-space 桥 把 Gemma 4 31B 的 11 个深层神经元移植到 2B 容量的 E2B-it,在 5 个文学 prompt 上诱发了 baseline 完全不存在的"N/10 量化评分"批评行为。但能力跃升不存在—— 能搬过去的只是固定的风格锚点,搬不过去的是"决定什么时候用这套风格"的上下文判断机制。 这是一次有损桥接:信号传了,语义没传到位。
前言
在很久之前我思考过模型内部的知识或是能力是否可迁移,因此在之前的数个项目基本完成和闭合后,使用之前项目的结论做出了本项目。
但因为种种原因,之前的项目出现了根源性问题——我在并未充分阅读论文或是有关内容后直接开始了大模型的可解释性方向的研究,因此导致了如果仅凭个人直觉将只有 40% 的准确命中率。总的来说,在得到这一反馈时,本项目处于即将完成的阶段,因此即便之前的项目可能有超过 60% 的问题或是错误,现在仍决定发布本项目。
本项目的原理非常简单,即定位到 MLP 神经元。MLP 内神经元的定义是一个加权求和加非线性激活,而本项目在我主导时将这一抽象概念可能错误地直接简化成了——它有个激活条件,和它将会向残差流进行一次写入,可以增删改查一个或多个概念。
不过本文章也并不是以检讨为目的发布的,而是证实表征确实可以迁移,但是很有限,并不是所有神经元都可以迁移。
实验环境
| 组件 | 配置 |
|---|---|
| 源模型 | Gemma 4 31B-it(60 层,hidden=5376,intermediate=21504,1.29M MLP 神经元,sliding(50)+full(10) 双结构,K=V 共享) |
| 目标模型 | Gemma 4 E2B-it(35 层,hidden=1536,intermediate=6144;full_attention 在 L4/9/14/19/24/29/34,其余 sliding) |
| 共享资源 | 同一 tokenizer,vocab_size = 262144 |
| 本地 | RTX 3060 12GB(跑 E2B BF16 ~6GB;跑 31B BF16 需 disk offload,~30s/token) |
| 云端 | AutoDL A800 80GB,5.98 ¥/h(31B BF16 prefill 3000 tok ~1.5s,generate 5-8s/100 tok) |
| 解码 | 全程 do_sample=False 贪婪解码,BF16 推理 |
前置项目资产(按依赖顺序)
- amr_g31b:31B 离线静态架构分析(确认 60 层 / 21504 intermediate / 5376 hidden / 无 PLE)
- neuron_typology(本项目):1.29M MLP 神经元的几何类型学 DB(
v32_class标签,几何指标含focus_gate/focus_down/align/complexity) - amr_wtf opus47code:multi-LoRA crutch-off 系列实验,证实 E2B 内部存在被 RLHF 屏蔽的"深度批评"网络(3 层冗余)
- amr_wtf identity_swap:"猫娘口癖神经元"系列,最早证实单 knowledge 神经元因果改写可实现 p=0.955 切换(L28#2406 Gemma 4 → Google → OpenAI)
- amr_zhcn:Gemma 4 E2B 语言路由研究(确认注入层效应集中在 L25/L26)
一 · 定位神经元
直接在 31B 上跑 forward 受预算限制(A800 5.98 ¥/h),不可能海量穷举。最初采用静态权重分析 + 数学建模的路线,遭遇三次方法学失败。
第一次失败:N=5000 cuneiform 污染
最初的策略是从 31B 浅中层(L20–L26)通过数学建模去静态挑 functional_xl_strong 5000 个,构造大池子 ACM(AmrCellMix)。AmrCellMix sweep 跑 N ∈ {16, 50, 500, 5000} × α ∈ {0, 0.1, 0.3, 1.0}:
- 经验量级公式:
effective_scale = √N × α,安全区 N ≤ 200 任意 α ≤ 1.0 - N=5000 α=1.0 在 75% 测试 prompt 上输出乱码
溯源:top-100 污染源的 down-projection top tokens 全是楔形文字(cuneiform)。深入诊断发现:
- 31B vocab 里共 706 个楔形文字 token,互相 cosine = 0.80(紧密子空间)
- 这 706 个 token 跟自然语言 token cosine = 0.09(近正交)
- 它们的 embed row-norm 是 0.96,正常 token 是 1.12(训练过但弱)
第二次失败:transferable filter 多语言疑问词聚簇
下一步改用 5 个静态指标过滤 1.29M 神经元 → top-1000 transferable:单语义集中度、跨任务一致性、down norm 适中、gate-down 非正交、激活非长尾。1000 个里 84% 集中在 L40–L50。
注入 E2B 后输出大量 Why / なぜ / क्यों / Pourquoi / Por qué。
原因:1000 个高质量功能神经元彼此间多样性不足,全聚成同一个"语言中的疑问代词"语义簇——多样性反而是个伪问题,应该挑功能不同的而非"质量都高"的。
第三次失败:静态 token-frequency QA diff
不做 forward,纯权重 × embed 算每个神经元在 A/B prompt 文本上的 vocab top-K 偏好差。top 神经元 vocab 偏好全是"高 / 相对 / 提升 / 增加"这类褒义+程度词——但不是真定位到高精度的激活性神经元,只是说那里的神经元大概率会是"评价倾向"概念簇。
结果并不尽人意:静态的 token 频率无法替代真正运行时的神经元激活链路。神经元的功能性表现需要看它在具体 token 位置激活什么,而不只是它在 vocab 上偏好什么。
发动钞能力:A800 上跑真实的神经元传播
经过三轮失败后,租 A800 跑真正的 31B forward。三个关键脚本产出:
- GB01 anchor-based QA diff(
server_15_qa_diff_31b.py):用 LeetCode 233 题的 A 错代码 vs B 对代码做对照,hook 60 层 MLP 层,以每个锚点为中心,在其对应的局部窗口内计算所有元素绝对值的均值;得到score_in_A/score_in_B/diff_score,各取 |diff| top-50 神经元。 - Multi-QA cross-task forward(
server_17_multi_qa_forward.py):10 个 QA(5 个 Opus 文学 lit + 2 个代码 code + 1 个 thought + 2 个 GB01)各 prefill 一次,记录每层每个 neuron 的 mean(abs(intermediate))。产物multi_qa_acts.pt(51MB),shape per QA = [60, 21504]。 - 因果验证(
server_19_identity_style_clamp.py):对 4 个负责处理 if/else 逻辑的功能性神经元执行清零消融实验(即强制将其激活值置为 0,使其失效)。实验设计为:3 种代码输入样本 × 6 种条件分支 = 共 18 次模型生成。结果显示,18 次输出的文本几乎一字不差(仅最后 1–2 个 token 存在标点符号上的细微差异)。
第 3 步揭示了一个关键的因果二分:
| 神经元类型 | 单点干预因果 |
|---|---|
| functional(gate ⊥ down,分布式表征) | 单点 zero ablation 几乎不影响输出 — 冗余补偿 |
| knowledge(gate ∥ down,单义) | 单点改写 p=0.955 切换 — 因果强 |
这跟 amr_wtf identity_swap 里 L28#2406 单神经元改写 Gemma 4 → Google → OpenAI 的实证一致。几何分类(v32_class)预测了因果行为。
候选池构造:105 神经元
最终的候选池由四部分拼成(共 105 个):
- cross_all_8 15 个:在全部 8 个 QA 上 B-prefer 一致的神经元
- L55 chain B-favoring 5 个:L55 链路分析中 A≈0 B 强的神经元
- lit_functional / code_functional / thought_functional 各 30 个:按 task 分别 top-rank
- GB01 top_B 补齐到 105
二 · 反查 v32:105 个里其实不全是功能性
用 neuron_typology DB 反查这 105 个的 v32_class:
| v32_class | 数量 | 占比 |
|---|---|---|
| functional_xl_weak | 55 | 52% |
| functional_token_focused | 20 | 19% |
| low_activity_uncertain | 15 | 14% |
| knowledge_topic | 13 | 12% |
| knowledge_strong | 1 | 1% |
| functional_xl_strong | 1 | 1% |
池子里 12% 其实是知识神经元——跟最初假设"全是功能性"不符。这一现象有理论上的解释:QA-diff 选 105 个本质是单维 DoM 应用到 neuron basis(已被 superposition 扭曲的坐标系),所以挑出的"差异大"神经元里混杂了不同类型。
下图是 31B 全 60 层 1.29M 神经元的 v32 分类分布。可以看到 knowledge 类(橙红色)在 L40+ 才显著浮现,与最深层"知识 + 功能混合"的现象吻合:
这一发现引出后续 ACM_v3 用 DoM 双轴过滤的动机——在"激活差异大"和"任务相关"之间做区分。
三 · 下游链路:功能神经元写入残差,知识神经元接收
105 池中除 L59 外 49 个神经元(L_a < 59)有下游层可分析。对每个源神经元 (L_a, n_a) 做静态权重链路分析:
down_col_src = Wd_31b[L_a, :, n_a] ; shape [5376], 残差写入方向
gate_row_dst = Wg_31b[L_b, n_b, :] ; shape [5376], 残差读取方向
; L_b > L_a
similarity = cos(down_col_src, gate_row_dst)
噪声基线:1/√5376 ≈ 0.014;5σ = 0.068;10σ = 0.136。实测 top-30 cosine:
- 中位数 0.079(约 6σ)
- p90 = 0.127(约 9σ)
- 最大 0.32(约 24σ)— 远超随机
阈值 cos ≥ 0.10(约 7σ)下找到 28 对 functional → knowledge 链路。其中最显著的是:
L48#12938 → 9 个 knowledge 神经元(跨 L49/50/51/52/53/55/56 七层):
| 下游 | v32 | arm | cos |
|---|---|---|---|
| L49#1631 | knowledge_topic | gate | −0.129 |
| L49#14326 | knowledge_topic | gate | −0.137 |
| L49#20404 | knowledge_topic | gate | −0.130 |
| L50#4896 | knowledge_strong | gate | −0.146 |
| L51#5953 | knowledge_topic | gate | −0.147 |
| L52#19129 | knowledge_topic | gate | −0.111 |
| L53#11111 | knowledge_strong | gate | −0.131 |
| L55#20612 | knowledge_topic | gate | −0.116 |
| L56#12058 | knowledge_topic | gate | −0.106 |
全部 9 对连接都属于"门控-主干"结构,且余弦相似度全为负值。这说明 L48#12938 在 31B 模型内部扮演的是一个知识压制开关的角色:当它强烈激活时,会将下游 9 个负责承载知识内容的神经元的"门"的输入值压到负数,而 SiLU 激活函数作用于负数时输出接近零,相当于把这扇门关死了。
基于上述发现,进一步做了一次 ACM_v2 实验:把 105 个功能神经元 + 9 个知识神经元,共 114 个神经元的激活值,以 α=1.0 的强度注入到 E2B 的第 30 层,观察输出变化。结果是:输出中确实冒出了"赛博朋克""象征主义文学""黑色神秘主义"等具体的文体词汇,但用错了地方——原本讲的是丽萨的故事,并不是赛博朋克风格。
四 · 神经元转换
31B 神经元的 gate/up/down 权重都是 5376 维,E2B 是 1536 维。两个模型 hidden space 没有自然对应,但共享 tokenizer 提供了 token id 这个不变量——token id=126233 在 31B 和 E2B 里都对应同一个汉字"丽",只是各自的 embedding 维度不同(5376 vs 1536)。
因此有了三个版本:
v1:mean-bridge(lossy)
最朴素的翻译:
def translate_v1(neuron_31b_weight):
scores = neuron_31b_weight @ embed_31b.T # [262144]
top30_ids = scores.topk(30).indices # 选最关心的 30 个 token
return embed_e2b[top30_ids].mean(0) # E2B 空间求均值
问题:scores.topk(30) 返回的分数有大小排序(top-1 最重要、top-30 边缘),但 .mean(0) 把这个顺序信息全部摊平。一个偏好"胡萝卜、马铃薯、土豆"的神经元,mean 后等同于偏好"任意一个根茎类"——精度损失。
实证:用这个跑 ACM_v2(114 神经元注入 L30 α=1.0),输出出现"赛博朋克"等错位术语。这跟 Function Vectors 论文(Todd et al. ICLR 2024)第 3.2 节的反向重建实验完全对应——他们证明从 vocab top-K 反推的向量注入准确率会从 48% 掉到 4.8%。
v2:top-K softmax 加权(部分修复)
一行修改:
def translate_v2(neuron_31b_weight, T=1.0):
scores = neuron_31b_weight @ embed_31b.T
topk_scores, topk_ids = scores.topk(30)
weights = F.softmax(topk_scores / T, dim=0) # 保留排序信息
return (weights[:, None] * embed_e2b[topk_ids]).sum(0)
温度 T 控制 sharpness:T→0 退化到 top-1,T→∞ 退化到 mean。但仍有 top-K=30 截断损失。
v3:最小二乘(vocab-score-preserving)
最终采用闭式解:找 v ∈ R^1536 使 v @ embed_e2b.T ≈ neuron_31b @ embed_31b.T 在全部 262144 个 token 上 ridge-LS 最优。
# 一次性预计算 (5376→1536 通用线性映射 Y)
G = embed_e2b.T @ embed_e2b # [1536, 1536]
λ = G.diag().mean() * 0.01 # ridge ~2.44
Y = (embed_31b.T @ embed_e2b) @ inv(G + λI) # [5376, 1536]
# 对任意 31B 权重向量翻译
mimic = neuron_31b_weight @ Y # [1536]
关键性质:
- 不挑 top-K,保留全 vocab 分数信息(解决 v1 截断问题)
- 不做 mean,保留权重排序与大小(解决"胡萝卜/马铃薯/土豆"问题)
- Y 一次性预计算 5.3 秒(GPU FP32,V=262144 分 chunk=32768 累加),所有神经元复用
- 数学上等价于在 token embedding 上做的 ridge regression 学一个 31B→E2B hidden-space 线性映射
对每个神经元的三个 arm 各乘一次 Y:
mimic_gate = Wg_31b[n, :] @ Y # [1536]
mimic_up = Wu_31b[n, :] @ Y # [1536]
mimic_down = Wd_31b[:, n] @ Y # [1536]
五 · ACM_v3:DoM 三重过滤
神经元转换解决了"怎么翻译"的问题,但翻译质量取决于源神经元是否真的承载我们想要的能力。105 池含 52% functional_xl_weak 杂质 + 12% knowledge 混入,需要再次过滤。
借用 Marks & Tegmark "Geometry of Truth"(COLM 2024)的 Difference-of-Means 思路构造双轴:
# multi_qa_acts.pt 存的是 mean(abs(intermediate)) per [layer, neuron]
θ_depth = mean(lit01..lit05) − mean(code_html_gemini, code_lc_gemini)
θ_thought = mean(thought_synth_html) − mean(code_html, code_lc)
为什么要双轴?θ_depth 单独可能误纳"纯文学风格"神经元(lit > code 但跟 thought 任务无关)。真"depth"应该是 lit 和 thought 同时强于 code——共享的"努力理解内容"能力,不是文学专属修辞。
θ 在 60 层的分布揭示一个沙漏结构:
- L0–L18:p99 = 0.22–0.39,但同号率正常——这是表面 vocabulary 差异(中文小说字符 vs 英文代码字符),不是 depth
- L19–L38:p99 = 0.03–0.17,塌陷区——functional_xl_weak 在这一段主导,对 lit/code 区分弱
- L39–L59:p99 回升到 0.07–1.3,最末 L58 p99=0.767 / abs_max=27.6;L59 p99=1.312
- L48–L57 段双轴同号率 < 0.5(纯文学风格层,thought 跟 code 一边)
- L39–L46 + L58–L59 同号率 0.58–0.66(真 depth 共享层)
三重过滤规则:
| 规则 | 通过条件 | 淘汰数 |
|---|---|---|
| 1. v32 干净 | ∈ {functional_token_focused, knowledge_strong, knowledge_topic} | 71 |
| 2. 双轴同正 | θ_depth > 0 且 θ_thought > 0 | 31 + 34 |
| 3. 信号强度 | |θ_depth| ≥ layer-p75 且 > 0.05 | 8 |
剩 11 个 ACM_v3 depth 神经元:
| L#n | v32 | θ_depth | θ_thought | 源 group |
|---|---|---|---|---|
| L58#10712 | functional_token_focused | +5.04 | +0.15 | lit |
| L59#10584 | knowledge_topic | +4.85 | +0.38 | lit |
| L59#18821 | knowledge_topic | +2.64 | +0.41 | lit |
| L53#13089 | functional_token_focused | +2.54 | +0.14 | cross_all_8 |
| L58#7996 | knowledge_topic | +2.29 | +6.55 ★ | cross_all_8 |
| L58#15450 | functional_token_focused | +1.65 | +1.33 | cross_all_8 |
| L59#670 | knowledge_topic | +1.08 | +1.42 | thought |
| L59#4826 | knowledge_strong | +0.86 | +0.16 | lit |
| L58#14808 | knowledge_topic | +0.78 | +2.33 | cross_all_8 |
| L59#246 | functional_token_focused | +0.35 | +1.26 | thought |
| L58#20268 | functional_token_focused | +0.20 | +1.81 | thought |
— 5 functional_token_focused + 5 knowledge_topic + 1 knowledge_strong;全部 L53/L58/L59;0 个 code_functional 源(对位)。
L58#7996 的 θ_thought 高达 +6.55,是 thought 任务的最强单点 carrier。
下图展示 105 池在 (θ_depth, θ_thought) 平面上的分布。每个圆点是一个 105 池成员,按 v32_class 着色;11 个 ACM_v3 选中的神经元用 ★ 标出,全部落在右上"真 depth 区":
六 · AmrCellMix:装配与注入
11 个 LS-translated 神经元装配成一个 mini-SwiGLU 模块:
class AmrCellMix(nn.Module):
def __init__(self, hidden=1536, intermediate=11):
super().__init__()
self.gate_proj = nn.Linear(1536, 11, bias=False)
self.up_proj = nn.Linear(1536, 11, bias=False)
self.down_proj = nn.Linear(11, 1536, bias=False)
def forward(self, x):
return self.down_proj(F.silu(self.gate_proj(x)) * self.up_proj(x))
参数总量:11 × 1536 × 3 × 2 bytes = 101 KB BF16(vs E2B 单层 MLP 是 6144 × 1536 × 3 × 2 = 56 MB)。
填入权重前做 norm matching——把 LS 翻译向量缩放到 E2B 注入层同 arm row-norm 的中位数:
E2B L11 target norms: gate=1.031 up=1.182 down=0.865
LS raw avg norms: gt=0.252 ut=0.214 dt=0.150
def n2s(v, target_norm):
return v / v.norm(dim=-1, keepdim=True) * target_norm
注入方式是并行 patch 而非替换:
def amr_hook(mod, inputs, outputs):
h = outputs[0] # E2B layer 11 输出
h_new = h + α * cell(rms_norm(h)) # additive
return (h_new,) + outputs[1:]
text_decoder.layers[11].register_forward_hook(amr_hook)
注入层选 L11 的依据:Function Vectors 论文经验性发现 FV 注入 L/3 处最优(GPT-J L9 / GPT-NeoX L15 / Llama-70B L26),E2B 35 层 → L/3 ≈ L11.67 → 取 L11。此前的 ACM 实验注入 L30(86% 深度位置),按 FV 法则太晚。
rms_norm(h) 是因为 E2B 内部各 layer 之间 residual 会做 RMSNorm,我们的注入也要预归一化使输入分布跟 E2B 原生 MLP 一致。
七 · α-sweep:稳定窗口
注入强度 α 决定 ACM cell 输出在 residual 上的"音量"。在丽萨故事 prompt(5832 token)上做 α-sweep [0.3, 0.5, 1.0, 2.0]:
| α | tokens | 时间 | 停止 | 行为 |
|---|---|---|---|---|
| 0.3 | 951 | 85.1s | eos | 正常深度 |
| 0.5 | 1270 | 107.9s | eos | sweet spot:Opus 模板 + 9/10 量化评分 |
| 1.0 | 2 | 22.1s | eos | "..." 立刻收尾 |
| 2.0 | 385 | 45.9s | repetition kill | 中英文混乱乱码 |
非线性 α 响应——稳定区在 (0, 0.5],α ≥ 1.0 出现两种崩坏模式:
- α=1.0:立刻 eos("...")—— "接近 readout"信号触发
- α=2.0:中英文混乱循环 —— 语言一致性失守
诊断假说:11 个 depth 神经元全部来自 31B L53/L58/L59(最深层"成熟表征"区,在 31B 内部本来就接近 readout)。LS 翻译保留了它们"接近输出空间"的几何性质,注入 E2B L11(浅层)后强信号给 E2B "现在该收尾"的强 trigger,α=1.0 即越过临界点。
这跟 FV 论文反直觉的发现"中后层注入崩"一致:FV 不是 word embedding offset(否则越靠后越好),而是 trigger 触发下游 nonlinear 计算——所以注入位置必须留足下游层。我们这里相反:注入的内容来自最深层,到了 E2B 浅层就过载了。
八 · 5-prompt 泛化验证
单 prompt 上看到正面信号不足以下结论。在 5 个 Opus lit QA 上 × baseline / ACM_v3 LS α=0.5 双条件做对照(共 10 个 generate,全部正常 eos,无崩坏):
| QA | 主题 | baseline tok | ACM tok | Δ | 9/10 评分 | 双语括注 | #### 子段 |
|---|---|---|---|---|---|---|---|
| lit01 | 丽萨小姐(文学长篇) | 1116 | 1269 | +14% | 0→1 ✓ | 0→4 | 0→5 |
| lit02 | sci-fi 人类灭绝 | 958 | 716 | −25% | 0→0 | 0→0 | 0→0 |
| lit03 | 硬科幻概念 | 968 | 725 | −25% | 0→1 ✓ | 10→0 | 0→0 |
| lit04 | 文学短篇 | 895 | 914 | +2% | 0→1 ✓ | 0→10 | 0→0 |
| lit05 | 荒诞 sci-fi | 1354 | 1217 | −10% | 0→0 | 1→0 | 0→0 |
| 总计 | 5291 | 4841 | −8% | 0→3 ★ | 11→14 | 0→5 |
观察 1:N/10 量化评分是最干净的泛化信号
baseline 5/5 全 0,ACM 3/5 出现(lit01/03/04)。N/10 评分是 Opus QA conclusion_analysis 段落的标志性深度判断符号——最终评价:9/10。baseline 完全不写这种符号,ACM 让 E2B 学会了。
观察 2:ACM 不是单向加深,是"风格锚点对齐"
- 当 baseline 朴素时(lit01/lit04 无 Opus 模板),ACM 添加双语括注 + sub-section(lit01: +4 双语 +5 子段;lit04: +10 双语)
- 当 baseline 已经 Opus 化时(lit03 自带 10 双语),ACM 反而精简(去双语 + 短 25%)
ACM_v3 LS α=0.5 的真实作用不是"给 baseline 加深度",而是把模型的批评风格拉向一个固定锚点——锚点是"带量化评分的中度结构化批评"。离锚点远的推过去,离锚点近的反而精简掉冗余。
观察 3:sci-fi 上压制概念展开
lit02/lit03(sci-fi)上 ACM 输出比 baseline 短 25%。可能 ACM_v3 的 11 个神经元都从 lit/thought QA 选出(0 个 code 来源),训练分布偏文学叙事/角色/象征,对 sci-fi 的"概念列举"模式不偏好——所以压缩前者展开。
九 · 跟两篇关键论文的对应
Marks & Tegmark — Geometry of Truth(COLM 2024)
论文核心实验:LLaMA-2-13B 在 cities 数据集上:
- LR probe 分类精度 0.97 vs DoM 0.95(几乎相同)
- 因果干预效果 NIE:LR = 0.13 vs DoM = 0.77(6 倍差距)
根源:superposition 让 LR 走"绕开非正交干扰特征"的副本方向(max-margin separator),DoM 走的是数据集质心连线,几何上不被扭曲。
对应到本项目:QA-diff 选 105 个本质是单维 DoM 应用到 neuron basis(已被 superposition 扭曲的坐标系)——这就是为什么 105 池里 55% 是 functional_xl_weak 杂质 + 12% knowledge 混入。任何 axis-aligned 的特征挑选方法(无论 QA diff 还是更复杂的 attribution)在 superposition-存在的空间里天然有上限。
Todd et al. — Function Vectors(ICLR 2024)
论文核心:top-K attention head 输出之和构成 task vector,注入到任意 prompt 触发任务执行。关键经验数字:
- K 规模随模型大小:GPT-J (6B) 用 10,Llama-7B 20,Llama-13B 50,Llama-70B 100
- 注入层 ≈ L/3 最优(GPT-J L9 / GPT-NeoX L15 / Llama-70B L26);后层注入崩
- 反向重建实验:从 task vector 的 vocab top-100 token 优化重建一个新 v̂,注入准确率从 48% 掉到 4.8%——证明 vocab-projected reconstruction 是 lossy bridge
对应到本项目:
- 有一条经验结论:注入层应选在目标模型总层数的约三分之一处,这样信息有足够的"消化空间"向后传播。E2B 模型共约 33 层,因此选第 11 层作为 ACM_v3 的激活注入点。
- v1 方案用的是"把激活值取均值再投影到词表"的做法——这本质上是一座有损的桥:信息先被压缩成一个平均向量,再被截断到词表里最近的几个词,中间丢掉了大量细节。这正是 Function Vectors 研究明确反对的路子,也直接解释了 ACM_v2 的失败:注入的是 114 个神经元的激活池、层位又选在 L30 这么靠后的地方,结果词汇是迁移过去了(所以冒出了"赛博朋克"这类词),但任务的执行逻辑没迁移过去,词用错了语境。
- v3 方案换了一条路:直接在隐空间(hidden space)里做方向迁移,完全绕开"先解码成词、再取 top-K 词、再平均"这一套有损操作。这对应 FV 研究推荐的做法——不要经过词表这个瓶颈,直接搬运向量方向本身,信息损耗更小,语义保真度更高。
十 · 结论
实证可以确认的部分
- 跨模型表征迁移通过 shared tokenizer + 最小二乘 hidden-space 桥确实可行——LS 解避开了 FV 论文证明的 vocab-projected lossy bridge
- 不是所有神经元都可迁移——105 池里只有 11 个(约 10%)通过 v32 干净 + DoM 双轴同正 + 强信号三重过滤后值得移植
- Opus 风格量化评分(N/10)成功泛化——5 个 lit prompt 上 baseline 5/5 全 0,ACM 3/5 涌现,这是 baseline 完全没有的能力
- 能力 ≠ 风格——ACM 不是均匀加深,是把模型拉向"带量化评分的中度结构化批评"这一固定锚点;离锚点远的推过去,离锚点近的反而精简
- 稳定窗口窄:α ∈ (0, 0.5],α ≥ 1.0 触发崩坏。原因是 11 个神经元都来自 31B 最深层(接近 readout),注入 E2B 浅层后强信号引发 eos / 乱码
- 完整链路成本:A800 一次 forward ~15 元 + 本地 12GB GPU 跑 E2B 数小时
仍未做到的部分
- 能力跃升不存在——E2B 输出深度仍然受 2B 容量 + RLHF 约束,ACM 只能做风格对位,做不到"化腐朽为神奇"
- 下游 wiring 未迁移——L48#12938 在 31B 内部抑制 9 个 knowledge 神经元的链路结构,搬到 E2B 后无对应接收者,只能词汇涌现不能逻辑传递
- 单 prompt 验证太弱——5 个 lit prompt 上稳定无崩,但 N/10 涌现 3/5 不是 5/5,泛化仍部分
附录:完整代码与产物路径
主代码(按依赖顺序):
scripts/01-09_*.py 静态权重分析 + 早期失败的 sweep
scripts/10_analyze_culprits.py 楔形文字污染溯源
scripts/11_what_is_cuneiform.py cuneiform 子空间诊断
scripts/12_transferable_filter.py 5-criteria 过滤(疑问词坑)
scripts/13_sweep_transferable.py
scripts/14_static_qa_diff.py 静态 QA diff(失败)
scripts/server_15_qa_diff_31b.py A800 上 GB01 anchor diff
scripts/server_17_multi_qa_forward.py 10 QA cross-task forward
scripts/server_19_identity_style_clamp.py 因果验证(if/else 零 ablation)
scripts/37_static_downstream_link.py 105 池下游 cosine 链路
scripts/38_classify_downstream_readers.py 下游 reader v32 反查
scripts/39_ACM_v2_114_lisa.py ACM_v2(105+9 knowledge)
scripts/40_dom_theta_depth.py DoM 双轴 θ 计算
scripts/41_filter_acm_v3_depth.py 三重过滤生成 ACM_v3 11 神经元
scripts/43_ACM_v3_lstsq_logged.py ACM_v3 LS 桥 + α-sweep
scripts/44_lit_sweep_v3_LS.py 5 prompt 泛化验证
关键中间产物:
outputs/cprime_pool_105.json 105 候选池
outputs/multi_qa_acts.pt (51MB) 10 QA × [60, 21504] mean act
outputs/qa_diff_31b_GB01.pt (15MB) A/B diff 张量
outputs/theta_depth.pt (36MB) θ_depth + θ_thought
outputs/downstream_links_105_classified.json 28 对链路
outputs/acm_v3_depth_pool.json 11 个 ACM_v3 神经元
outputs/acm_v3_ls_lit_sweep/ 5 prompt × 2 condition 输出
neuron_typology/31b/outputs/all_neurons_31b.db (SQLite, v32_class 标签)
全部代码与中间产物开源:github.com/chenmoacr/neuron_transplant