NanoJev架构深度剖析:Qwen3-0.6B骨干+集合注意力+决策头,如何一次前向完成批量决策
【免费下载链接】NanoJevA nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline.项目地址: https://gitcode.com/gh_mirrors/na/NanoJev
NanoJev 是一个 0.6B 参数的并行决策模型:输入游戏状态与候选动作,一次 Qwen3-0.6B 骨干前向就直接输出完整概率分布,零输出 token 解码。本文拆解它的核心三件套——Qwen3-0.6B 骨干、集合注意力头与标量决策头,看看它如何一次前向完成批量决策,并用同一检查点打赢迷宫、贪吃蛇和两款射击游戏。
🎮 NanoJev 是什么:不生成文字、直接输出概率的决策模型
传统大模型做决策的方式是"生成":逐 token 吐出文字答案,再解析出动作。NanoJev 反其道而行——它不调用generate(),不生成任何回答文本,而是把每个候选动作编码成一条 token 路径,一次性喂进骨干网络,直接在读出位置打分。
这意味着:
- 并行决策:一批状态、一批问题、2–255 个候选路径,共享同一次骨干前向;
- 直出概率:每个候选拿到的是 0–1 的概率,可以直接排序、选择或采样,无需解析文本;
- 一个小骨干走天下:同一个 Qwen3-0.6B + 决策头检查点,同时支撑迷宫(Maze)、贪吃蛇(Snake)、ViZDoom Basic 和 ViZDoom Predict Position 四个游戏任务。
下面是 NanoJev 与两个对照模型在同一游戏时钟下的同屏回放,三列面板共享原始帧与动作概率输出:
🔍 架构总览:一次前向、批量决策的三步流水线
NanoJev 的前向可以概括成三步:
- 拼路径:把「状态 State → 问题 Question → 候选 Candidate + 读出后缀」拼成一条完整 token 路径;
- 一次前向:整批候选路径(padding 对齐后)一次性过 Qwen3-0.6B 骨干,取每条路径最后一个 token 的隐藏状态;
- 决策头打分:共享的标量读出把隐藏状态压成一个分数
z,Choice 类问题再经过集合注意力头做候选间交互,最后按问题类型做 softmax / sigmoid 归一化,得到完整概率分布。
整个模型没有词表投影、没有思维链、没有逐候选循环,这就是"批量决策"的成本优势来源。
⚡ 骨干网络:Qwen3-0.6B 只取隐藏状态,不做词表解码
骨干选用Qwen3-0.6B(d_model=1024、28 层、16 个 Q 头 / 8 个 KV 头的 GQA 结构)。关键取舍是:加载Qwen3Model而不是Qwen3ForCausalLM——后者会额外做整张词表的投影(输出形状[B, N, V]),而决策任务只需要 hidden state 上的一个标量分数。
这样做有两层好处:
- 省计算:不构造、不投影完整词表输出,只保留输入 embedding 与 28 层 Transformer 主干;
- 省解码:推理时不需要自回归循环,一次前向拿到所有候选的分数,延迟与候选数量呈近乎线性的关系,而不是"每个候选跑一遍生成"。
骨干的官方 RoPE、QK 归一化与 GQA 实现原样保留,NanoJev 只是换了"出口":从词表分类器换成了下面这个轻量的决策头。
📌 决策头详解:一个标量读出如何给每个候选打分
决策头的本体非常简洁(见 scripts/train_toy_decisions.py):
nn.LayerNorm(1024)对读出位置的隐藏状态做归一化;nn.Linear(1024, 1)压成单个标量分数z,权重采用非零随机初始化,避免第一步"死梯度"。
每条候选路径的隐藏状态都流经同一个标量头,于是每个候选得到一个可比的分数。之后按问题类型做概率后处理(完整输入契约见 docs/TYPESAFE_CONTRACT.md):
- Choice(选择题,2–255 个候选):
p = softmax(z),每个问题的分布独立归一化,不跨题、不跨状态; - Boolean(真假判断):只有一条语义路径,等价于
p_true = sigmoid(z); - Score(2–10 个有序等级):
p = softmax(z),最终分数是概率加权的期望等级score = Σ k·p_k。
每个等级/候选的文本都是独立编码的,不注入序号或相邻等级信息——这正是它能把"判断"当作原子操作复用的原因。
🧩 集合注意力头:让候选们"看见"彼此
单独打分有一个结构性弱点:候选之间互不可见(即 IIA 限制)。比如"选最接近均值的那个数"这类问题,加入新候选后原候选的相对排序应该翻转,而孤立打分做不到。NanoJev 为此给 Choice 类问题加了一个集合注意力头(见 scripts/train_toy_decisions.py):
- 投影:把每个候选的隐藏状态与
log K(候选总数的对数)拼接后投影到 128 维——加入候选数信息,使打分对候选规模敏感; - 候选间自注意力:4 头
MultiheadAttention在同一题的所有候选上双向交互,带key_padding_mask屏蔽无效项; - 残差修正:
delta = Linear(128,1)(tanh(u + mixed)),直接加到标量分数上;最终投影层零初始化,训练初期退化为纯标量打分,逐步学出集合交互。
关键细节:集合注意力只作用于 Choice 题;Score 分支保持等级隔离,不会为了灵活性破坏"逐等级独立评估"的接口语义。这套设计同时保证了对候选排列的置换等变性——候选换顺序,输出跟着等变置换,不会引入顺序偏差。
🌳 树形注意力:共享前缀如何省下重复计算
批量前向的朴素做法是"扁平展开":10 个候选路径重复粘贴 10 份状态前缀。NanoJev 的优化版把一批请求组织成前缀树——状态S是根节点,各问题Q是子节点,各候选C + R是叶子(实现与数值核验见 scripts/check_tree_attention.py 与 scripts/check_qwen_tree.py):
- 可见性规则:token
i只能读取"严格祖先节点"或"同节点内更靠前位置"的 token。不同问题、不同候选、不同状态之间零 token 边,保证各题输出严格隔离; - 祖先判定:节点做 DFS 编号
tin/tout,祖先关系只需区间比较,不需要N²的 token 级布尔表; - 位置编码:position 取"从根到该 token 的路径深度"而非张量列号——同一状态下的兄弟候选可以共享相同 position ID,因为 attention mask 已经隔离了它们。
成本上,扁平展开的 token 数是Σ(s+q+c),树形只算Σs + Σq + Σc——候选越多、状态越长,省下的重复前缀越多。更完整的实现规格、梯度等价条件与 FlexAttention 加速路线,可阅读架构审计文档 research/algorithm_architecture_audit_zh.md。
🏆 18,760 题混合训练:一个检查点,四款游戏
这套架构的训练数据是每个目标变体 18,760 道决策问题,其中 16,333 题来自 ViZDoom:
| 任务 | 五个 split 合计 | 训练 split |
|---|---|---|
| ViZDoom Predict Position | 11,173 | 6,788 |
| ViZDoom Basic | 5,160 | 3,054 |
| Maze | 1,469 | 653 |
| Snake | 958 | 403 |
| 合计 | 18,760 | 10,898 |
训练采用完整问题交叉熵,四个任务按 1/3、1/3、1/6、1/6 的权重混合采样(配置与训练脚本见 scripts/train_unified_games.py)。最终的unified-games-v1检查点(第 400 步,骨干学习率 1e-5、决策头 1e-4)在 274 例完整测试集上的成绩:
| 模型 | Maze | Snake | Basic | Predict Position |
|---|---|---|---|---|
| NanoJev | 4/10 | 8/8 | 128/128 | 27/128 |
| 对照模型 Jev | 7/10 | 8/8 | 56/128 | 11/128 |
| 未微调 Qwen3-0.6B | 2/10 | 0/8 | 56/128 | 11/128 |
值得注意的对比:50×50 迷宫探索中,NanoJev 用 225 次尝试找到出口,而对照模型需要 2,738 次,未微调骨干则要 4,726 次。所有评测轨迹都通过了独立模拟器回放校验,详见 docs/UNIFIED_GAMES.md。
📚 关键源码与文档清单
想深入阅读,按以下路径入手:
- 模型定义与决策头/集合注意力头:scripts/train_toy_decisions.py
- 树形注意力纯 Python 数值核验:scripts/check_tree_attention.py
- Qwen3 骨干上的树 vs 扁平等价性测试:scripts/check_qwen_tree.py
- 本地推理服务(模型加载一次,批量提交 state/question):scripts/serve_decisions.py
- 输入契约与三种问题类型语义:docs/TYPESAFE_CONTRACT.md
- 完整实现规格与成本模型:research/algorithm_architecture_audit_zh.md
- 训练配置样例:configs/unified_td_v1.json、configs/sonic_unified_sft_v1.json
一句话总结
NanoJev 证明了"决策"不必等于"生成":Qwen3-0.6B 骨干负责编码,标量决策头负责打分,集合注意力头负责候选间交互,三者组合让一次前向就能返回 2–255 个候选的完整概率分布——小模型、快推理、零解码,这正是 System-1 式概率决策模型的最小可行形态。
【免费下载链接】NanoJevA nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline.项目地址: https://gitcode.com/gh_mirrors/na/NanoJev
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考