我们没有再做一个 Qwen 微调版,而是把 Transformer 的层内自注意力整体替换成自研的 RCA 跨层波前注意力,用 Qwen2.5-7B-Instruct 的 FFN/Embedding 做底座重新训练,得到 Moti-1(摩谛)。在 6 领域对照评测中总均分 43.2 vs 原版 38.1,前端代码方向最高领先 +24.7 分。现已开源:modelscope.cn/models/ericsjq/Moti-1-7B,
trust_remote_code=True两行代码加载,RTX 3090 实测 30 tok/s。
一、动机:注意力是 Transformer 唯一没被认真动过的大件
过去两年,开源社区对 7B 模型的改造几乎都发生在"不动架构"的前提下:换数据、换训练配方、加 LoRA、做 DPO。FFN 换过 MoE,位置编码换过 RoPE 变体,但注意力本身——那个 2017 年论文里画出来的 Q·K^T/√d——始终没人整体换掉。
原因很直白:注意力的 KV cache 机制太成熟了,牵一发而动全身。但它也有一个结构性局限:
第 l 层只能看到第 l 层自己的 KV 历史。 信息想跨层流动,只能一个 token 一个 token 地"爬"——深层网络的表征必须沿着深度方向逐层接力。
我们做了一个激进实验:能不能让浅层直接读深层的 KV? 这就是 Moti-1。
二、核心设计:RCA 波前执行器
2.1 把"逐层爬"改成"波前推进"
RCA(Recursive Cross-Attention)把序列切成 64-token 的块,按"块 0 全部层 → 块 1 全部层 → …"的波前(wavefront)顺序推进:
传统: token 依次流过 L1→L2→…→L28(深度方向逐层接力)
RCA: 块0: L1→L2→…→L28
块1: L1→L2→…→L28 ← 此时 L1 处理块1时,L2..L28 的块0 KV 已就绪
...
当第 l 层处理第 b 块时,l..l+k 层对更早块的 KV 全部就绪——浅层可以直接按可学习的深度配比回读更深层的"成品"键值。依赖图是无环 DAG,训练和推理共用同一套确定性调度,这是整个方案工程上站得住的前提。
2.2 一次 softmax,三组 Key 同场竞争
每层注意力的归一化由单次 softmax 内的三组 key 竞争完成:
| 组 | 内容 | 作用 |
|---|---|---|
| ① 本层历史组 | 本层对更早块与块内的 KV | 保底语言建模能力(g=0 时数学上等价标准 KV cache) |
| ② 跨层成品组 | 源层已固化的成品 KV,带逐头深度偏置 −λ_h·g |
直接回读其他层的成品 |
| ③ 施工态组 | 本块内 j≤i 的本层 KV(严格下三角)+ 槽位偏置 b_σ |
块内局部交互 |
配套可学习组件:逐头深度斜率 λ(决定每层"读多深")、b_σ、层编码 e_k/e_v/f_q(写入/读取 KV 时标记来源层,零初始化)。
工程实现上,三组 key 合并为单条 KV 序列,所有偏置/掩码统一编码为一个加性 attention mask,单次 scaled_dot_product_attention 完成,不物化注意力矩阵。
2.3 消融:为什么必须是"单次 softmax"
我们最早的保守设计是"双独立 softmax + 标量门控插值"(跨层通道用 s_gate≈−6 近闭)。在 webcode2m HTML 数据上的 300 步微型对照(以留出集 NLL 为准):
| 组 | 语义 | 留出 NLL |
|---|---|---|
| vanilla | 标准 Qwen2 自注意力 | 5.5615 |
| rca_mod | 修正版(双 softmax + 标量门) | 5.7116 |
| rca_b12 | 单次 softmax 三组竞争 + 逐头 λ 分化 | 5.4834 ✦ |
结论很清晰:保守的门控插值版拖累泛化(比 vanilla 还差),只有让三组 key 在同一个 softmax 里真刀真枪竞争,跨层路由才产生正收益。最终版 Moti-1 采用 Beta12 语义。
三、训练:从"严格等效基座"平滑演进
三阶段管线,每一步都有明确的守恒量:
- 阶段一(等效起点 + 结构预调):RCA 的 q/k/v/o 直接克隆原 Attention 权重(二者结构同构),λ 大初始化(跨层通道近闭),e_k/e_v/f_q 置零——初始模型严格等效于基座,无分布崩塌。此阶段只训 RCA 参数。
- 阶段二(纯 RCA 全参):彻底抛弃 self_attn 分支(
h = h + RCA(x),无插值),RCA 全部 822M 参数解冻,对话 SFT 全参训练。 - 阶段三(RCA + MLP-LoRA 联训):每层 FFN 注入 LoRA(r=16, α=32,B 零初始化),RCA 与 LoRA 同步解冻互相适应;工具调用标签 token 损失加权 ×10(缓解其占比仅 0.06% 被淹没的问题)。
阶段收益(60 评测块,仅对回答 token 计损):
| 阶段 | NLL |
|---|---|
| 克隆起点(未训练) | 1.3506 |
| 纯 RCA 预调后 | 1.3481 |
| RCA 全参 + LoRA 联训(发布版) | 1.3126 |
一个容易被忽略的细节:六种新机制小参数(λ/b_σ/s_gate/e_k/e_v/f_q)全程保留 fp32 主权重——bf16 在 8.0 附近的量化台阶约 0.03,会把 1e-5 级的 Adam 位移直接舍回去,小参数等于没训。这个坑我们用位移验收(~1e-4)确认过。
四、成绩单:6 领域对照评测
6 领域 × 3 题,强云端模型作评委,三方同题相对评分(1-100):
| 模型 | 页面生成 | 数据可视化 | 动画交互 | 小游戏 | 古诗生成 | 日常问答 | 均分 |
|---|---|---|---|---|---|---|---|
| Moti-1(摩谛) | 64.0 | 14.0 | 49.7 | 38.7 | 54.3 | 38.3 | 43.2 |
| Qwen2.5-7B-Instruct(原版) | 39.3 | 11.3 | 29.3 | 22.0 | 79.7 | 47.0 | 38.1 |
| DeepSeek-V4-Flash(参照上界) | 95.3 | 87.7 | 96.0 | 97.0 | 81.0 | 96.7 | 92.3 |
三个值得注意的信号:
- 注意力整体替换的前提下实现净增益(43.2 vs 38.1)——结构改动不是白做的;
- 增益集中在长程结构化代码:页面生成 +24.7、动画交互 +20.4、小游戏 +16.7。我们推测跨层成品回读对"前面定过的类名/变量/样式,后面要精确复用"这类长程一致性有直接帮助;
- 古诗与日常问答弱于原版——方向性取舍是真实存在的,不做修饰。这是下一轮训练的主攻方向。数据可视化域三方方差都极大,保留原始数据。
五、下载与使用
5.1 下载
ModelScope 仓库:https://modelscope.cn/models/ericsjq/Moti-1-7B(18.57 GB)
# 方式一: modelscope CLI (推荐, 仓库首发在ModelScope)
pip install modelscope
modelscope download --model ericsjq/Moti-1-7B --local_dir ./Moti-1-7B
仓库目前仅发布在 ModelScope。HuggingFace Hub 上没有同名仓库,请勿用
huggingface-cli download ericsjq/Moti-1-7B(会 404);如需 HF 工具链,可先 ModelScope 下载到本地再从本地路径加载。
5.2 三行加载,开箱即用
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"ericsjq/Moti-1-7B", # 或本地路径 ./Moti-1-7B
torch_dtype="bfloat16",
device_map="auto",
trust_remote_code=True) # ⚠ 必需: 架构自举代码 modeling_rca.py
tok = AutoTokenizer.from_pretrained("ericsjq/Moti-1-7B")
messages = [{
"role": "user", "content": "用SVG画一个会动的机器猫"}]
ids = tok.apply_chat_template(messages, tokenize=True,
add_generation_prompt=True,
return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=4096,
temperature=0.7, top_p=0.8, top_k=20)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
需要流式输出(前端/服务端场景)的话,仓库自带与 generate 同路径的流式接口:
buf = [] # 收集token id, 最后整体解码
for tid in model.generate_stream(ids, max_new_tokens=4096,
temperature=0.7, top_p=0.8, top_k=20):
buf.append(tid)
# 注意: 不要逐token tok.decode([tid])打印中文——多字节UTF-8会被
# 切碎出现乱码; 如需边生成边显示, 请在buffer上做增量解码
print(tok.decode(buf, skip_special_tokens=True))
推荐生成参数 temperature=0.7, top_p=0.8, top_k=20;前端页面类任务建议 max_new_tokens ≥ 4096。
5.3 运行要求(重要,先看这个再下载)
- 显存约 18.6 GB,建议 24GB 卡(RTX 3090/4090 实测通过)
transformers在 4.57.6 上验收通过;更早版本未测试(架构自举代码依赖较新的 remote code 加载机制,建议直接用新版)
六、一个值得单独讲的工程坑:dtype 决定 17 倍速度
这是本文最想让做推理优化的同学看到的段落。
RCA 分支的 q/k/v/o 权重如果存成 bf16,F.scaled_dot_product_attention 会落入 cuDNN 劣化 kernel 路径:单层注意力 63ms,且伴随 40ms 级的 CPU 同步阻塞——整个 7B 模型直接掉到 0.5 tok/s。
同样的权重转成 fp32:单层 3.7ms,17 倍差距,RTX 3090 上 decode 30 tok/s。
我们用 torch.profiler 定位:bf16 + 自定义加性 mask 的 [1, 28, 1, 长KV] 单 query 形状,cuDNN 后端选择严重劣化。所以 Moti-1 发布版把 RCA 分支以 fp32 存储(磁盘 18.57 GB 的由来),并在加载代码里自动回填精度——用户按标准写法加载即可,无需任何手动干预。代价是显存比常规 bf16 7B 高约 2.6 GB,但速度是数量级的差别。
通用教训:低精度推理不是免费的。自定义 attention mask + 单 query 长 KV 的形状组合,务必实测一下 SDPA 各后端的实际耗时。
七、局限与展望
直说短板:
- 古诗生成、日常问答弱于原版基座——结构性替换的方向性取舍,后续训练轮次主攻;
- 64-token 块调度,短序列(<128 token)场景收益有限;
- RCA 分支 fp32 带来约 18.6 GB 显存需求;量化(int8/int4)未验证,理论上基座部分可量化,但 RCA 分支建议保持 fp32(见第六节)。
接下来我们计划:更大规模的领域补强训练、RCA 分支量化、以及把波前调度扩展到更长上下文。欢迎在 ModelScope 仓库提 issue 交流。
八、链接与引用
- 🤗 仓库:https://modelscope.cn/models/ericsjq/Moti-1-7B
- 加载方式:
trust_remote_code=True(架构自举,无需装额外包)
@misc{moti1_2026,
title = {Moti-1: Recursive Cross-Attention Wavefront Language Model},
author = {XiaoSi Framework Researchers},
year = {2026},
howpublished = {\url{https://modelscope.cn/models/ericsjq/Moti-1-7B}}
}
Moti-1(摩谛) · 小思框架 - 石京麒
如果这篇文章对你有帮助,欢迎点赞收藏,也欢迎在评论区聊你对注意力架构改造的看法。