This commit is contained in:
Youmu Liu
2026-09-17 18:25:10 +08:00
parent e04adf594a
commit 6e6bd7794b
@@ -0,0 +1,288 @@
# NGRA-Tensor 设计讨论记忆
更新日期:2026-09-17
目标项目:`D:\platform-dev\src\Nitload.RegularAnalysis`
来源:关于正则分析、NFA、Transformer、GPU 执行与 NGRA 双算子设计的讨论。
> 本文件记录设计意图与讨论结果,不代表项目现有代码已经实现这些功能。本次仅检查了目标目录及祖先目录的 AGENTS.md,没有审计源码。下文区分用户已提出的设计决定、辅助建议与待验证问题。
## 1. 项目目标与讨论方式
NGRA-Tensor 试图结合结构化关系、模糊特征识别、多候选解释及模式预测。出发点包含正则模式分析与 NFA,但不应预设必须逐节点模拟 NFA 的执行方式。
核心工程矛盾:细粒度、动态、自组织的关系网络表达灵活,却容易产生大量小操作、串行依赖、零碎访存和复杂调度,影响 GPU 利用率与训练。
用户希望学习“如何构造能运行且高效的系统”,而不只是阅读既有模型的前向公式或事后解释。后续讨论应说明:需求 → 设计选择 → 数学表达 → 执行方式 → 代价 → 验证方法。不要用 Transformer 也存在串行步骤,来回避 NGRA 的节点过小与调度问题。
“Tr”在不影响理解时作为 Transformer 的简称。
## 2. 数学符号约定
| 符号 | 含义 |
| --- | --- |
| `Scal` | 标量 |
| `Vec_d` | d 维向量,本文使用列形式表示分量 |
| `Covec_d` | 对向量进行线性求值的余向量 |
| `Mat_x_y` | 每行 x 个元素、每列 y 个元素,即 y 行、x 列;列数在前 |
| `Tens_u_v` | 接收 u 个 Vec 和 v 个 Covec、输出 Scal 的多重线性对象 |
注意:
- 数组的存储维数不等于 `Tens_u_v` 的槽位数。ONNX 等工具中的 tensor 通常只是多维数组的名称。
- 线性映射 L 可通过 `T(x, φ) = φ(Lx)` 对应 `Tens_1_1`;输入向量与输出余向量可以属于不同维度的空间。
- 点积所对应的度量可视为 `Tens_2_0`。将向量与余向量识别需要相应的度量约定,不能只凭行列形状混为一谈。
- 带偏置映射一般为仿射映射;softmax、ReLU、LayerNorm 等不是多重线性运算。完整神经网络不能直接按上述定义称为一个 `Tens_u_v`。
## 3. 用户已提出的核心架构决定
### 3.1 两种组合算子
**relation:评估一定数量的 notation 按顺序串接形成的关系。**
```text
R = Relation(N1, N2, ..., Np)
```
port 表达有序关系,交换 port 输入通常会改变含义。此前使用过 `R_6` 表示 64 口 relation 的约定;64 指串行关系中的输入数量,不是特征向量维数。早期等级与端口数使用过 `2^L` 的联系,但它与新架构传播层级的准确对应仍须正式定义。
**notation(亦讨论为 idea):组织若干并列 relation。**
```text
N = Notation{R1, R2, ..., Rk}
```
这为多种可能结构提供显式位置,避免把并列候选强行塞进 relation 的串行 port。
- 两者底层数据结构可以形态一致,但必须保留类型及不同的运算语义。
- 并列候选不自动等于语义独立,也不自动等于互斥。互斥解释与可以同时成立的特征,需要不同的组合规则。
- 候选评估、候选权重、候选混合是可区分的操作;不必一生成候选就压成一个 Vec。
### 3.2 双向分层与反复传播
用户提出的方向:
```text
relation 方向:L0 → L1 → ... → L6
notation 方向:N6 → N5 → ... → N0
一次推理可能经历多轮上述传播。
```
这是当前设计意图,尚不是完整的状态更新规范。L/N 等级的含义、跨级连接是否合法、上下两个方向如何连接,都需要进一步明确。
讨论中提出的一种解释(待落实):
- 上行:由局部证据评估更大的组合与解释。
- 下行:较高层的解释、约束和关注影响局部候选的保留与活跃程度。
- notation 的候选评估仍须汇集,才能为高层提供依据;“notation 向下传播”不能遗漏候选证据如何上传。
- 区分来自输入的证据与来自上层的反馈,防止反馈被反复当成独立证据累加,产生自我强化。
### 3.3 统一机器字典与索引空间
用户决定让 token、relation、notation 位于同一个字典和索引空间。“字”本身也是一种原子理念。
- token 使用预存字典提供初始表示。
- relation、notation 的实例“词义”通过节点计算特征向量得到。
- 字典可以保存结构定义、参数及引用;运行时计算得到本次语境中的实例特征。
- 预存 token 特征不必永久固定为运行时最终特征,可以接受上下文更新。
建议明确区分两层身份:
| 层面 | 内容 |
| --- | --- |
| 字典条目 | token/关系/概念的定义、类型、结构与参数 |
| 运行时实例 | 引用哪个条目、出现在何处、连接哪些实例、本轮状态与得分 |
同一个字在文本中出现两次,可以共享字典 ID,但不能因此共享同一份位置相关状态。可采用“实例 ID + 字典引用”的实现,不要求推翻统一字典。
## 4. 每轮输出:面向下一轮的规范形
用户提出:一次“小 node → 大 node → 小 node”的传播后,输出一种较工整、供下一轮继续处理的状态。
示例:
```text
输入:吃饭了吗,您?
初步规范表达:我,提问,你,吃饭,状态
```
各状态同时具有特征向量,用于表达语气等细节。
这里建议把“规范形”理解为结构统一的语义中间表示,暂不要求第一轮得到唯一、最终正确的解释。
### 4.1 必须保留角色绑定
仅有上述扁平序列,不能明确区分“我问你是否吃饭”和“我问你我是否吃饭”。一个可参考的结构为:
```text
提问
├─ 发起者:当前说话者(来自会话上下文)
├─ 接收者:您所指的人
└─ 内容:进食事件是否已经发生
├─ 行为者:您所指的人
├─ 行为:吃饭
└─ 发生状态:待确认
```
这是讨论中的建议示例,不是已决定的 IR 格式。
- “我”没有直接出现在原句,应记录其上下文来源。
- 被询问的事件状态不能在规范化时变成已成立的事实。
- 敬称、语气等细节可通过特征表示;关键角色关系应有明确结构。
- 返回小节点时,单位可以是实体引用、行为、状态变量或关系实例,不必恢复成原始字符。
### 4.2 保留候选与来源
“询问进食情况”和“以此寒暄”可能是候选解释,也可能兼有。notation 应能保留候选身份、得分与结构,而不是强制提前选唯一结果。
建议保留输入片段或上下文依据,区分:显式内容、上下文补足、模型推断、待确认状态。
### 4.3 轮次与稳定性
可用以下关系描述一次传播,但具体更新函数尚未确定:
```text
S(t) → 组合与解释评估 → H(t) → 角色绑定、反馈与整理 → S(t+1)
```
建议每轮读取上一轮状态并集中形成下一轮状态,避免执行顺序无意改变语义。最终应定义最大轮数、变化阈值或其他停止条件。
期望已稳定的表示在没有新证据时满足 `F(S*) ≈ S*`;这只是验证目标,不代表目前已证明收敛。
## 5. 构建、剪枝与训练:尚未完成的设计
用户明确指出,当前“葫芦形”传播还不够明确,需要剪枝和额外构建规则。
优先需要确定:
1. relation 各 port 的角色、输入类型、顺序与允许的连接范围。
2. notation 中哪些候选回答同一个解释问题,是否覆盖相同区间或具有相容的输出类型。
3. 候选是互斥、可并存还是具有其他依赖;采用何种打分与归一化。
4. 构建网络、选择路径与更新特征,哪些是离散决策,哪些可微、哪些需要额外训练机制。
5. 如何限制候选数量,并测量剪枝造成的正确解释丢失。
6. 如何防止重复证据、自我支持、循环振荡及无上限的关系扩张。
7. 如何保留原始词序、实体身份、否定、疑问、范围及来源。
简单 regex/NFA 的布尔关系可以用向量、矩阵及相应的逻辑运算表达;转成浮点矩阵后,必须重新定义多路径的组合含义。布尔可达性、概率、模糊兼容度与特征混合不可直接互换。
目前没有得到“任意一组 NFA 能以常数总计算量执行”的结论。并行深度、总工作量、状态规模和存储量必须分别分析。
## 6. GPU 执行路线
### 6.1 语义粒度与执行粒度分离
讨论中形成的总体判断:
- 常规稠密 Tr 从规则的大计算出发,再为硬件分块、融合与安排数据复用。
- NGRA 从细粒度的关系与候选出发,再把已经就绪、形状相容的操作合并为批次。
不必让每个小 relation 对应一次 GPU 调用,也不必为批处理把语义上的多个 relation 合并成一个大 relation。
| 方法 | 收益与限制 |
| --- | --- |
| 批处理独立实例 | 可保持实例语义,同时提高单次执行规模 |
| 融合有依赖的操作 | 可减少启动及中间搬运;不会自动消除数据依赖 |
| 按层级、轮次、形状分组 | 可以简化调度;具体规则尚待验证 |
| 稳定的数据布局与参数分组 | 有机会提高复用并减少碎片化读取 |
早期低阶、小 port 关系的串行活动密集,是重点瓶颈。把 L0/L1 放在 CPU、把短模式预筛编译成矩阵运算等,均只是候选方向,尚未通过基准测试决定。
### 6.2 按需加载模型内容
用户提出的潜在优势:根据激活情况,只加载本次需要的 relation/notation 参数,降低显存工作集。
成立条件与待验证因素:
- 用廉价、常驻的索引或路由信息判断加载对象,避免必须先读完完整参数才能决定不用它。
- 测量当前活跃集合、跨轮复用、加载粒度、预取能力及批次内激活集合的并集。
- 同时核算参数、活跃状态、候选记录、运行缓冲与传输缓冲。
- 省显存不自动等于提速;零碎且依赖刚完成计算的加载可能使 GPU 等待。
- 区分 GPU 内部缓存未命中与数据不驻留显存、需要从主存迁入。
Tr 也能参数卸载、逐层加载或使用 MoE,故不能把“必须所有权重常驻显存”当作 Tr 的数学要求。NGRA 的优势仍需在质量相当时实测。
## 7. Tr 对照:已经澄清的关键概念
### 7.1 block、上下文与执行分块不是一回事
- Tr block 通常指深度方向的一层计算,不是固定 4096 口的文本单元。
- 4096 是本讨论的示例长度,也可能是某个模型的上下文配置;不是 Tr 固有 I/O 宽度。
- 同一层的投影权重作用于特征轴,通常不含序列长度 n 这个参数维度。
- 支持长上下文还涉及位置机制、训练与资源,不能据此宣称任意短上下文模型可直接可靠处理 1M。
- 彼此隔离的文本窗口不会自动互通。共享模型权重不等于保留上一段输入。
### 7.2 输入与输出
以 512 维、8 个头、每头 64 维的示例来说:
```text
X: Mat_n_512 → 一个完整 Tr block → Y: Mat_n_512
```
每个输出列仍对应一个位置,但携带上下文整合后的特征。输出通常不是显式 relation 表,也不是 vocabulary 概率。只有第一层直接接收 embedding 与初始位置表示,后续层接收前层输出。
token embedding 提供初始向量,不能把后续位置向量理解成始终只有原始 token 的静态词义。
### 7.3 本文列向量约定下的主要运算
| 运算 | 形状或说明 |
| --- | --- |
| `Q = WQ X`, `K = WK X`, `V = WV X` | W 为 `Mat_512_64`;Q/K/V 为 `Mat_n_64` |
| `S = QᵀK / sqrt(64) + M` | `Mat_n_n`;行是查询,列是候选 |
| `A = softmax_rows(S)` | 对每个查询的允许候选统一归一化 |
| `H = V Aᵀ` | `Mat_n_64`,按位置混合内容 |
| 8 个 H 沿特征轴拼接 | `Mat_n_512` |
| 输出投影、残差、Norm、FFN、残差、Norm | 最终仍为 `Mat_n_512`;此顺序是原论文 post-norm 示例 |
参数 WQ/WK/WV 通常分层、分头拥有,并在所有位置复用。ONNX 的图级 initializer 存储位置不代表各层共享同一组参数。Q/K/V/A 是本次输入产生的中间结果,不是查表得到的固定权重。
### 7.4 混合不等于重排
- `W X`:特征投影,不移动 token 列。
- `V Aᵀ`:根据输入计算权重,允许多个输出读取同一来源。
- `X Π`:用置换矩阵重排位置。
- 标准注意力不默认执行“聚类相关 token → 打包 → 分组路由”。若需要这种行为,须明确设计路由过程。
- 两个局部组的输出可以按 `[B00h B01h]`、`[B00l B01l]` 重组后交给下一层。若 h/l 表示 token 子集,这属于改变窗口分组;若表示特征通道子集,则是另一种操作。
- 重组本身不做语义融合,下游计算才融合;需要保留位置身份与因果约束。
### 7.5 1M 上下文与跨计算块通信
全局注意力可以逻辑上覆盖整个上下文,执行时按块读取 K/V。对于两个分块 A/B,跨块关系直接来自 `QAᵀ KB` 与 `QBᵀ KA`;因果掩码限制允许的方向。
一次处理 4096 个查询,不代表这些查询只能访问 4096 个候选。它们可以分批访问全部允许的 K/V,并维护统一的 softmax 累加状态。
不能对各候选块独立 softmax 后简单平均。FlashAttention 使用分块与在线归一化执行精确注意力;跨设备方案如 Ring Attention 可以传递 K/V 块完成跨分片交互。
这不要求先分配完整的巨大注意力矩阵再把它切开。
### 7.6 成本与能力边界
- 全局注意力的配对计算为 `O(n²d)`;序列长度翻倍,该部分工作量约四倍,不代表端到端推理时间必然四倍。
- 固定窗口宽度 w 的局部注意力为 `O(nwd)`;固定层数的间接信息覆盖范围有限。
- 使用 KV cache 生成一个新 token 时,该 token 对历史的注意力计算随历史长度线性增长,而非重新计算完整历史的所有配对。
- KV cache 不会自动把上下文容量变成无限,且需要区分缓存、压缩记忆与原始历史可访问性。
- 普通前馈网络与关闭随机操作的 Tr 都可确定性执行。“DNN”通常表示深度神经网络,不能用来与 Tr 作“确定/非确定”分类。
- 普通网络通常训练权重与偏置,而非修改固定 ReLU 等激活函数本身。
- 注意力混合不自动保留完整候选结构,也不等于显式逻辑关系或可解释的置信度。
## 8. 下一阶段建议产物(尚未执行)
1. 明确统一字典条目与运行时实例的最小 schema。
2. 明确 relation/notation 的输入输出类型、候选组合与角色绑定规则。
3. 写出一个完整传播轮次的状态读取、写入与反馈语义。
4. 用“吃饭了吗,您?”制作可逐节点检查的示例,包括歧义保留与下一轮稳定性。
5. 定义候选数量上限、剪枝指标、最大轮数与停止条件。
6. 先建立语义正确的参考执行,再比较逐节点、批处理、融合和按需加载的性能。
7. 训练目标、路由学习方式、收敛性质以及相对 Tr 的性能优势均保持待验证状态。
## 9. 讨论中核对过的参考资料
- [Attention Is All You Need](https://arxiv.org/html/1706.03762v7):架构、注意力、复杂度与参数作用。
- [Neural Machine Translation by Jointly Learning to Align and Translate](https://arxiv.org/abs/1409.0473):按当前需要读取输入位置的早期注意力设计。
- [FlashAttention](https://arxiv.org/abs/2205.14135):分块、IO 优化与精确注意力。
- [Ring Attention](https://arxiv.org/abs/2310.01889):跨设备传递 K/V 块与长上下文。
- [Swin Transformer](https://arxiv.org/abs/2103.14030):局部窗口之间通过改变划分建立联系的实例。
- [Switch Transformers](https://arxiv.org/abs/2101.03961):选择性激活专家参数。
- [ZeRO-Inference](https://www.deepspeed.ai/2022/09/09/zero-inference.html):参数卸载、逐层加载与预取。
- [ONNX Concepts](https://onnx.ai/onnx/intro/concepts.html):计算图、节点与 initializer。
上述资料作为对照,不意味着 NGRA 已被证明等价于其中某种架构。