HeteroMoEProjSpace-v2 — 维度投影空间完整模型

本系列唯一可直接加载的完整模型。 其他 HeteroMoE-* / hetero-moe-* 仓库是历史实验产物,见文末导航。

三个真实预训练骨干 + 按功能槽张成的多子空间 + 1024 维融合层。 645,190,802 参数 / 2.58 GB

组件 参数
qwen (Qwen2.5-0.5B-Instruct) 494.03M
bert (bert-uncased-L4-H256) 11.17M
vit (vit-base-patch16-224) 86.39M
proj_space(维度投影空间) 2.76M
fusion(1024 维融合层) 50.34M

目录

路径 内容
根目录 完整模型(model.safetensors 2.58 GB)
tokenizer_qwen/ tokenizer_bert/ processor_vit/ 三个模态的预处理
modeling_hetero_moe_projspace.py 自包含建模代码(auto_map 指向它)
checkpoints/v62.3/ 训练 checkpoint(不含骨干)+ 训练报告
example_inputs.npz expected_*.npy 基准输入与输出

用法

from transformers import AutoModel, AutoTokenizer, ViTImageProcessor

m = AutoModel.from_pretrained("redmingwei/HeteroMoEProjSpace-v2", trust_remote_code=True)

qtok = AutoTokenizer.from_pretrained("redmingwei/HeteroMoEProjSpace-v2", subfolder="tokenizer_qwen")
btok = AutoTokenizer.from_pretrained("redmingwei/HeteroMoEProjSpace-v2", subfolder="tokenizer_bert")
vproc = ViTImageProcessor.from_pretrained("redmingwei/HeteroMoEProjSpace-v2", subfolder="processor_vit")

qe = qtok(["hello"], return_tensors="pt", padding="max_length", truncation=True, max_length=16)
be = btok(["hello"], return_tensors="pt", padding="max_length", truncation=True, max_length=16)
px = vproc(images=[img], return_tensors="pt")

out = m(qwen_input_ids=qe["input_ids"], qwen_attention_mask=qe["attention_mask"],
        bert_input_ids=be["input_ids"], bert_attention_mask=be["attention_mask"],
        bert_token_type_ids=be["token_type_ids"], pixel_values=px["pixel_values"])

out.y           # [B, S, 1024]
out.slot_alpha  # [B, S, 4]  槽门控 —— 四个槽各贡献多少(全槽软分布,和=1)
out.alpha       # [B, S, 4]  专家选择 —— 4 选 top-2(和≠1,是 top-k 掩码后的权重)

模态是可选的:只给文本、只给图像都能跑。缺失模态在路由里用零向量占位。

⚠️ slot_alpha 与 alpha 都是 4 维,但语义完全不同: 前者是槽门控(选 Q/K/V/O 哪个子空间),后者是专家选择。 要看「四个槽是否都在用」请读 slot_alpha。

复现基准

import numpy as np, torch
from huggingface_hub import hf_hub_download

npz = np.load(hf_hub_download("redmingwei/HeteroMoEProjSpace-v2", "example_inputs.npz"))
inp = {k: torch.from_numpy(npz[k]) for k in npz.files}
exp = torch.from_numpy(np.load(hf_hub_download("redmingwei/HeteroMoEProjSpace-v2", "expected_y.npy")))

with torch.no_grad():
    out = m(**inp)
print((out.y - exp).abs().max())

精度

权重加载 missing 0 / unexpected 0;同一实例内两次前向完全一致(Δ=0.000e+00)。

expected_y 在 transformers 5.21.0 下生成,其它版本的骨干 forward 实现可能有微小差异。 实测 5.16.1 下 max|Δy| = 7.9e-05(相对量级 ~2e-7)。这是版本漂移,不是加载错误。 需要 bit 级一致请 pin transformers==5.21.0。

版本史

版本 改了什么 状态
v62.0 proj_space.router 是死代码:输出只被 return,从未参与计算 ⚠️ 作废
v62.1 router 作为 token 级槽门控真正乘进 canonical;但仍在槽上做 top-k=2 ⇒ 每 token 最大权重均值 0.9933、熵 0.0209 ⚠️ 作废
v62.2 槽门控改为全槽软门控(四槽投影在门控前已算完,top-k 不省算力、只丢信息)+ 训练加熵正则 ⚠️ 作废
v62.3 router 改为 eager 创建 —— 能加载权重、也进 optimizer,真正被优化 ✅ 当前

为什么 v62.0~v62.2 作废:它们的 router 是 lazy 创建的(__init__ 里 s.router=None, 首次 forward 才建),于是 ① load_state_dict 时 proj_space.router.weight 被判为 unexpected,权重根本加载不上; ② trainable/optimizer 在 router 存在之前就取好,router 从未被优化; ③ 熵正则的梯度流向 router,却不在 optimizer 里,被丢弃。

⇒ 槽门控完全由一个随机初始化的 router 决定。 v62.0 报告里的「专家负载均衡 0.8774」尤其误导 —— 它统计的正是这个从不参与计算的模块。

v62.3 修好后,训练脚本改为直接 import 仓库里的 projspace.py(不再内联副本)。 此前两份实现会分叉,那次 lazy/eager 不一致正是分叉的产物。

训练数据与指标(v62.3)

  • 数据:1 万条 ag_news 文本 + 5 千张 food101 图像的真实隐藏状态
  • 划分:按类别分层 80/20(train 7998 / val 2002)
  • held-out 准确率 0.9076(随机 0.25)
  • 专家负载 [0.350, 0.527, 0.572, 0.551],均衡 0.612,熵 0.472
  • 槽门控熵 0.647(软分布,激活率 100%)
  • 槽门控平均权重 [0.003, 0.171, 0.434, 0.392] —— 模型学会了几乎不用 Q 槽

⚠️ 融合层专家是解冻的(偏离 v33 原设定),且四个专家均为随机初始化、 未从真实 FFN 抽取。上述数字是 ag_news 4 分类准确率,不是通用能力。

出处

GitHub research/aligner/v62_dimension_projection_space/ —— 规范 / 声明 / 指标 / 测试 / 复算脚本 / 机制可视化都在那个子包里。

本系列其他仓库

用途 仓库
唯一可直接加载的完整模型 HeteroMoEProjSpace-v2
权重切片(复算依赖,私有) backbone-slices
训练数据缓存(4.46 GB) hetero-moe-cache (dataset)
历史完整模型(不可直接加载) HeteroMoE-v1, HeteroMoE-v1-tuned
训练实验记录 hetero-moe-router, hetero-moe-router-unfrozen, hetero-moe-shared-routed
分析产物(v48–v61) hetero-moe-projspace, hetero-moe-dimspace, hetero-moe-align, hetero-moe-projspace-v2
视频产物 structure-film-public (dataset)
Downloads last month
249
Safetensors
Model size
0.6B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Collection including redmingwei/HeteroMoEProjSpace-v2