TL;DR
经过 10 轮实验,我们得到了 SPR L2 的完整验证链。
先理解 Graph Builder 是什么
假设你有一个句子:
“The cat sat on the mat.”
你已经识别出这句话里的短语模块(折叠节点):
| 短语 | 核心词 | 类型 |
|---|---|---|
| The cat | cat | 名词短语(NP) |
| sat | sat | 动词短语(VP) |
| on the mat | on | 介词短语(PP) |
| the mat | mat | 名词短语(NP) |
有 4 个模块,但不知道它们怎么连接。
Graph Builder = 决定这些模块之间谁是谁的父节点。
可能的连接方式:
sat(VP) sat(VP) sat(VP)
├── cat(NP) OR ├── cat(NP) OR ├── cat(NP)
└── on(PP) └── mat(NP) └── the(DET)
└── mat(NP)
只有一种是正确的。Graph Builder 的任务就是找到正确的那个。
当前的方案(最近节点)
最简单的规则:每个模块连接到离它最近的模块。
sat(VP) ← root
cat(NP) → nearest = sat ✓
on(PP) → nearest = mat ✗(正确应该连到 sat)
mat(NP) → nearest = on ✓
这个简单规则在 56% 的情况下是对的。但还有 14% 的情况是错的(正确父节点不是最近的)。
为什么 14% 无法用简单改进解决
看看"on"为什么连错:
...sat on the mat
↑ ↑
正确父节点 最近节点
(距离3) (距离1)
正确父节点比最近节点更远。这就是介词短语附着歧义——“on the mat"可以修饰"sat”(坐垫子上)也可以修饰更近的词。这需要理解整句话的意思才能判断,仅仅看局部距离是不够的。
这 14% 的错误中,97.5% 的正确父节点都比最近节点更远。这不是距离策略能解决的问题,需要语义信息。
Graph Builder 的下一步
我们尝试了各种方法改进这个 14%:
| 方法 | UAS | 说明 |
|---|---|---|
| 最近节点(基线) | 56% | 只考虑距离 |
| 模板规则 | 55% | 考虑短语类型(VP→NP 最常见) |
| 机器学习分类器 | 48% | 用特征预测父节点 |
| Oracle(上限) | 70% | 完美预测 |
所有方法都填不满差距。原因是这 14% 的错误本质上是局部信息不足——就像例子中的"on",在句子解析阶段就是无法确定附着到哪里,需要整句话的语义上下文。
所以我们提出了概率容器:不强制 Graph Builder 在信息不足时做决定,而是让每个模块携带一个"候选父节点列表+概率",传递给下游模块(翻译器、句子生成器),让它们在更大的上下文中消歧。
现在回到实验链。 Semantic → Action Type AUC=0.701 [跨语言, 可预测] Head Detection F1=87.6% [可定位折叠点] Span Detection F1=88.2% [可确定短语范围] Action Classification Top-5=96% [可确定折叠方式] Child Assignment 55.2% UAS [模板规则, 填48%差距] ↓ Oracle 76.5% UAS [理论上限]
最后 21.3% 的差距锁定在**子节点分配**的歧义问题上,70% 的边是确定性的(第二次坍缩),30% 需要结合语义消歧。
---
## 1. 项目回顾
SPR 将翻译分解为三级流水线:
L0: Token Base (高熵词义) L1: Semantic Collapse (128D 语义流形) L2: Structural Generation (句法生成)
S2-G-08 提出 L2 应抛弃 Transformer,用显式结构坍缩替代 O(N²) 注意力搜索。
S2-G-09 记录了前五轮实验:句子级统计失败 → 短语级坍缩成功 → 折叠动作可预测。
S2-G-10 记录完整的 D 系列和 E 系列实验:从语义到结构的端到端验证。
---
## 2. 实验管线
### Phase A: 语义 → 折叠动作(句子级多标签分类)
**设置**: sentence-transformers (384D) → PCA(128D) → MLP(128→256→47 actions)
| Dim | Top-1 | Top-3 | Top-5 | Mean AUC |
|-----|-------|-------|-------|----------|
| 32 | 95.2% | 98.7% | 99.5% | — |
| 64 | 95.3% | 99.0% | 99.6% | — |
| 128 | 95.2% | 98.8% | 99.3% | 0.644 |
| 256 | 95.7% | 99.0% | 99.6% | — |
**验证**: 语义向量编码了结构决策信息。但 Top-1 被频率偏差高估了(`CLAUSE:prep` 出现在所有句子中)。
**破坏性测试**:
- 洗牌测试: 73.6% real > 61.1% shuffled → **+12.5% 真正信号**
- 跨源测试: 73.9% ≈ 72.5% → **无过拟合**
- 标签损坏测试: 一致性降 → **真实标签依赖**
### Phase D1: 跨语言结构预测
**设置**: 中文句向量(384D) → 预测英文折叠动作类型
| 指标 | 值 |
|------|------|
| Top-1 | 94.6% |
| 词汇量 | 40 类型 |
| Mean AUC | **0.701** |
**结论**: 结构决策是语言无关的——中文语义向量可以预测英文结构。
### Phase D2a: 结构绑定(令牌级预测)
将任务分解为三个子问题:
| 子问题 | 指标 | 值 | 基线 |
|--------|------|------|------|
| 头检测(NP) | F1 | **88.4%** | 84.0% |
| 头检测(VP) | F1 | **79.3%** | — |
| 头检测(PP) | F1 | **91.2%** | 92.3% |
| 跨度检测(NP) | F1 | **88.1%** | 53.2% |
| 动作分类(NP, gold head) | Top-5 | **96.7%** | — |
| 动作分类(VP, gold head) | Top-5 | **95.4%** | — |
### Phase D2b/c: 端到端结构生成
| 条件 | BLEU | UAS |
|------|------|------|
| Oracle (gold program) | 97.40 | **100%** |
| Predicted (pipeline) | 97.40 | **35.2%** |
BLEU 不敏感(表面令牌不变),但 UAS 展示了真实结构质量。
### Phase D3: Oracle 消融
| 条件 | UAS | 差距回收 |
|------|-----|---------|
| All Predicted | 35.2% | — |
| + Gold Head | 53.3% | 44% |
| + Gold Span | 35.8% | 1% |
| + Gold Child | **76.5%** | **100%** |
**结论**: 100% 的 UAS 差距来自子节点分配。头/跨度/动作分类都不是瓶颈。
### Phase E1: 边预测器 + 第二次坍缩
**第二次坍缩发现**: 70.4% 的动作类型具有 >80% 确定性单一子节点类型。
| 边分配方法 | UAS | 差距填充 |
|-----------|-----|---------|
| 启发式(D2c) | 35.2% | — |
| 模板规则(基于第二次坍缩) | **55.2%** | **48%** |
| 随机森林边预测器 | ~50% | ~40% |
| Oracle | 76.5% | 100% |
模板规则(55.2%)超越了学习预测器(~50%),且不需要训练。
---
## 3. 理论收敛
从整个验证链可以画出 SPR L2 的理论模型:
L1 128D 语义向量 ↓ Mean AUC=0.701 (跨语言可预测) 动作类型集 {NP, VP, PP, ADJP, CLAUSE_nsubj, …} ↓ ┌───────────────────────────────┐ │ 图组装器(Graph Assembler) │ │ │ │ 头检测 → F1=87.6% │ │ 跨度检测 → F1=88.2% │ │ 动作分类 → Top-5=96% │ │ 边分配 → 55-76% UAS │ └───────────────────────────────┘ ↓ 依存树(用于 Executor 展开为目标句子)
**三个关键坍缩**:
1. **语义坍缩**(L1):高维词汇空间 → 128D 语义流形(已验证)
2. **短语坍缩**: PP≈3, ADJP≈5, VP≈25, NP≈100 种原型(已验证)
3. **边坍缩**: 70.4% 动作类型有确定性子节点类型(已验证)
---
## 4. 剩余问题
| 问题 | 状态 | 优先级 |
|------|------|--------|
| 语义→动作存在信号 | ✓ 验证 | — |
| 动作空间可坍缩 | ✓ 验证 | — |
| 动作可预测 | ✓ 验证 | — |
| 头/跨度不是瓶颈 | ✓ 验证 | — |
| 图组装是唯一瓶颈 | ✓ 验证 | — |
| 第二次坍缩存在 | ✓ 验证 | — |
| 边分配模板可填48%差距 | ✓ 验证 | — |
| 剩余21.3%差距的消歧 | ⚠ 待定 | 高 |
| 端到端 BLEU | ⚠ 待定 | 中 |
剩余 21.3% 的 UAS 差距来自 30% 的多义边场景,其中同一动作类型可以连接到不同子节点类型。这需要结合位置 proximity + 语义上下文做消歧,可能是 SPR L2 最后需要学习的组件。
---
## 参考文献
1. S2-G-08: 为什么 L2 必须抛弃 Transformer
2. S2-G-09: 折叠栈发现
3. 实验代码: `phase_a.py`, `phase_d1.py`, `phase_d2a.py`, `phase_d2bc.py`, `phase_d3.py`, `phase_e1.py`
4. 数据: 实验结果 JSON 文件