模型参数设置
M2 于 2025-10-27 开源。参数为 230B 总参,10B 激活,激活参数占比约 4.3%。 语言模型部分共 62 层,全部是 MoE 层,没有 dense 层。模型宽度 3072;每层 256 个本地专家,每个专家的中间维度是 1536。词表 200,064,词嵌入与 LM head 不共享权重。
62 层全注意力
M2 的注意力是全注意力。c onfig 的注意力类型列表共 62 项,全部取 1;1 表示全注意力,0 表示线性注意力。62 层没有一层用线性注意力。M2 为了减少 KV cache,采用了 GQA,48 个 Q 头,8 个 KV 头,比例 6:1,头维度 128。
MoE 256 专家 top-8
62 层全部是 MoE 层。每层 256 个本地专家,每个 token 激活分数最高的 8 个专家。路由与聚合可以写成:
其中 是当前 token 的输入向量(宽度 3072), 是路由矩阵(3072×256), 是 sigmoid 激活; 是专家 的路由分数, 是专家 的可学习偏置; 是分数最高的 8 个专家集合; 是专家 的前馈输出(中间维度 1536); 是该层的输出。偏置 只影响 top-8 选择,选中后权重仍用原始 sigmoid 分数;M2 没有 shared 专家,输出全部来自这 8 个被选中的专家;辅助负载均衡损失的系数很小。M2 的专家内部前馈用标准 SwiGLU 激活,到 M3 改成 SwiGLU-OAI。
位置编码
位置编码是 partial RoPE:head_dim 128 中只旋转 64 维(rotary_dim=64,partial 因子 0.5),不旋转的 64 维保留原始表示。可理解为旋转维度携带位置信息、不旋转维度保留更偏内容的表示。64 个旋转维度组成 32 对,每对共享一个频率,第 i 对的频率为
其中 是 RoPE 的基频(base 参数,5e6), 是频率分量序号(0 到 31, 越大频率越低),64 是参与旋转的维度数; 是第 对的旋转频率,位置 上这一对维度的旋转角为 (弧度/位置步)。 越大,所有频率越低、能区分的距离越远。取 5e6 后,最低频分量()的周期约为 1900 万 token,远超 1M,长距离位置仍可区分。
M2.7 同一架构的后训练版本
非参数规模扩大
M2.7 不是参数规模扩大。官方技术报告把 M2、M2.5、M2.7 描述为同一底座上经 agent 驱动的后训练逐代迭代的版本,能力提升并非来自扩大模型规模,而是来自 agent 驱动的 data pipeline、Forge RL 与自进化等后训练手段。这也解释了为什么下文的 M3 与它们对比时层数、宽度、MoE、上下文都变了——M3 是更换架构,而 M2.7 不是。
模型参数设置
M2.7 的 config 与 M2 基本一致:62 层、宽度 3072、256 专家 top-8、无 shared 专家、GQA 48 个 Q 头、8 个 KV 头、theta 5e6、词表 200,064。唯一的实质差异是位置上限从 196,608 提到 204,800。
M3 架构解析
总览
语言模型部分共 60 层,每层的注意力和 MLP 是两套独立配置:前 3 层用全注意力 + dense MLP(FFN 中间维度 12288),后 57 层用 MSA 稀疏注意力 + 稀疏 MoE(128 专家)。宽度 6144;GQA 为 64 个 Q 头、4 个 KV 头(16:1);位置编码仍是 partial RoPE(128 维中只旋转 64 维),theta 仍取 5e6;位置上限 1,048,576,即 1M 上下文。
与 M2、M2.7 相比,M3 换了一代架构,架构变化如下:注意力从全注意力改为 MSA;MoE 从 256 专家 top-8 无 shared 改为 128 专家 top-4 加 1 个 shared 专家;宽度从 3072 翻倍到 6144;层数从 62 减到 60;上下文从约 192K、200K 提到 1M;新增视觉模块;QK-Norm 从按层作用改为按头作用。
MSA 解析
索引分支(Index Branch)。论文的定义是每个 GQA 组一个索引 query 头、K 侧一个跨组共享的索引 key 头:
其中 是输入hidden states(形状 , 为序列长度),、 是索引分支的两个投影矩阵; 的形状 表示每个 GQA 组一个索引 query 头, 的形状 表示单头共享索引 key。是 KV 头数(M3 是 4,即 4 个 GQA 组), 是索引头维度(128)。对每个 query 位置和组,索引分支先给因果可见的 key token 打分,再按块取最大值(block max-pooling)得到块分数,选分数最高的 块:
其中 是 query 位置, 是块编号, 是 key token 位置且满足 (因果); 是位置 与 key 的索引分数, 是块 的块分数(块内所有可见 token 分数的最大值);是组 在位置 选中的块集合。local 块的处理论文写得很明确:query 所在块恒被选入,它在 块预算内占一个名额,剩下 个名额由索引分支按分数选。同一 GQA 组内的 query 头共享这份选择。
nowcoder.com/discuss/946204633431650304
nowcoder.com/discuss/946204633431650304/
nowcoder.com/discuss/946204790428643328
nowcoder.com/discuss/946204790428643328/
nowcoder.com/discuss/946204963011633152
nowcoder.com/discuss/946204963011633152/