Files
ts-as-modality/docs/diagnosis-2026-07-02-cross-domain.md
T
张宗平 150e3bd9fd docs(ts-as-modality): archive after cross-domain generalization failure
Full diagnostic chain (synth→real zero-shot→real finetune→held-out) shows
the TS-modality approach works in-distribution but fails to generalize
across entities: same SMD dataset, same 38 channels, just a different
machine (1→2) collapses output to repetition garbage. Root cause is the
lightweight TS encoder (2-layer TF, 2.1M params) learning dataset/machine-
specific patterns rather than transferable time-series representations.

This is a valuable negative result: it cleanly rules out the
'0.5B LLM + 2-layer TS encoder + single-distribution synth training'
route for general time-series understanding, which is more credible than
any 'looks like it works but never tested cross-domain' result.

Records:
- tasks.md: M6 diagnostic section (6.1-6.5) with evidence + archive decision
- proposal.md: Status header flagging archive + pointer to diagnosis
- docs/diagnosis-2026-07-02-cross-domain.md: full evidence chain, root-cause
  analysis, capability boundaries, asset inventory, restart conditions

Project status: archived. Code/data/checkpoints/reports preserved.
Restart requires any of: (1) larger encoder + real-data from-scratch
training, (2) channel-agnostic patch strategy, (3) multi-dataset joint
training with held-out-dataset generalization proof.
2026-07-03 11:52:09 +00:00

141 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 诊断报告 · ts-as-modality 跨域泛化失败与方案封存
> **日期**2026-07-02
> **状态**:方案封存(资产保留,不再投入)
> **决定性问题**:合成域有效的「TS-as-modality」方案,能否泛化到真实时序?
---
## TL;DR
方案在合成域内有效,但在真实时序上**跨实体泛化失败**——同一 SMD 数据集、同样 38 通道、仅换了机器(machine-1 → machine-2),模型输出从合法 JSON 崩溃为 repetition garbage。证据链完整指向:TS encoder 学到的是数据集/机器特有模式,而非可泛化的时序表征。方案作为研究性 PoC 划定了清晰的能力边界,但当前架构无法支撑「通用时序理解」这一目标,故封存。
---
## 完整诊断链
### 阶段 1:合成域内验证(成立)
在全量合成数据(50 万对齐 + 10 万 SFT)训练后:
| 指标 | model | pure_llm | 结论 |
|---|---|---|---|
| 时序消融 change_rate | 0.98/50 | — | TS token 确实被消费 ✅ |
| QA 均分(6 类) | 2.41 | 0.90 (2.7×) | TS 模态是必要非装饰 ✅ |
| anomaly JSON 解析率 | 0.98 | 0.01 | 格式学习成功 ✅ |
| VUS-PR | 0.22 | 0.24 | ⚠️ 输给 trivial baseline |
**阶段 1 结论**:机制可行,QA 能力真实,但异常精准定位弱(VUS-PR 输 trivial)。
### 阶段 2zero-shot 跨域(崩溃)
用未微调的合成 ckpt 直接评测真实 SMDmachine-1/2/2-1 合并,prevalence 5.8% vs 合成 26%):
| 指标 | modelreal | 解读 |
|---|---|---|
| parse_rate | **0.00** | 没有任何输出可解析 |
| Aff-F1 | **0.00** | 完全无定位能力 |
| QA mean | **0.00** | vs synth 的 2.41 |
| VUS-PR | 0.2263 | = all_report,是**假象** |
**输出样本**repetition collapseLLM 在 OOD 输入下的典型崩溃):
```
'ERYoticaisonaisonanxietyaisonaisonanaisonanaison...'
'horizon: horizon: horizon: horizon: horizon:...'
```
**VUS-PR=0.2263 的真相**:模型输出全是 garbage → `parse_anomaly_segments` 失败 → `answer_to_point_scores` 返回全 0 → `vus_pr(全0, y)` 退化为 prevalence=0.226)。所以「VUS-PR 与 trivial 持平」是假象,模型实际**什么都没做**,只是被 prevalence 下限兜住了。这是一个**评测陷阱**:低质量输出在低 prevalence 下会被误读为「不算太差」。
**干扰变量排除**:改写 instruction(短措辞 / 通用模板)后输出仍是 garbage,排除「指令过长/格式不兼容」因素,确认是 TS embedding 的分布偏移所致:
- 通道数:5(合成)→ 38(SMD)
- 数值分布:合成 mean~46/std~23 vs SMD z-score 后 mean~0/std~0.6
### 阶段 3:SMD 微调(训练域内有效)
从 stage2_final 继续训 LoRA on SMD trainmachine-1-1/1-2141 样本,500 步,EMA 1.27→1.00):
**训练域内输出**machine-1-1/1-2,微调后):
```
{"anomaly_regions": [{"start": 309, "end": 412}], "n_regions": 1} ✅
{"anomaly_regions": [{"start": 0, "end": 136}], "n_regions": 1} ✅
{"anomaly_regions": [{"start": 103, "end": 126}], "n_regions": 1} ✅
```
4/5 产出合法 JSON,格式与语义均正确。**机制在训练域内正常工作**。
### 阶段 4:跨实体 held-out(崩溃,决定性)
用同一个微调后模型评测 SMD held-outmachine-2-1,同数据集/同 38 通道/同样 z-score 分布,仅换机器):
```
[anomaly] '{"}</seo_http>\xa0\n\xa0\n\xa0\n\n\xa0\xa0 (since)...' ❌
[anomaly] '{"id": 1, "name": "nan</sk_inch_regions> \n\n\n...' ❌
[describe] '------------{"}</ewanewanewanewanewanewanewan...' ❌
```
**全 garbage**。从训练域内(machine-1)到 held-outmachine-2),输入分布的偏移仅仅是「换了台服务器」,模型就从「会」变成「完全不会」。
---
## 根因分析
**不是评测管道 bug、不是数据量不足、不是指令格式问题、不是通道数不匹配(held-out 也是 38 通道)。**
根因是 **TS encoder 学到的是数据集/机器特有的统计特征,而非可泛化的时序表征**
1. **架构容量不足**TS encoder 仅 2 层 TF + patch 线性嵌入,~2.1M 参数。这个容量足以「记忆」machine-1 的分布特征,但不足以学到「时序形态→语义」的通用映射。
2. **训练分布单一**:仅在合成数据上训练 encoder/projector,合成分布的特征(固定 5 通道、特定数值范围、模板化异常形态)被编码进了表征。
3. **泛化瓶颈在 encoder 侧**LoRA 只调 LLM,但 LLM 侧(语言能力)本来就没问题——崩溃发生在 encoder 输出的 TS embedding 严重偏离 LLM 能理解的流形时。
4. **微调样本不足**141 样本对 encoder 2.1M 参数,学到的更像「记忆 machine-1」而非「适应 SMD 通用分布」。
这是一个**架构性**而非工程性短板:轻量 TS encoder + 单分布训练的组合,决定了它无法跨实体泛化。
---
## 方案意义与边界(诚实评估)
### 成立的部分 ✅
- **TS 模态融合机制可行**:证明 soft token 能承载时序信息并被 LLM 消费(非被忽略的噪声)。
- **合成域内 QA 能力真实**2.7× 于 pure_llm,TS 模态对时序问答有实质增益。
- **工程管线完整可复现**:合成数据、训练、断点续训、评测全链路跑通,含真实数据接入。
### 未立住的部分 ❌
- **跨实体泛化失败**:同数据集换机器就崩溃,不能称为「理解时序」。
- **作为异常检测器**:合成域 VUS-PR 输 trivial,真实域 zero-shot 完全失效。
- **zero-shot 跨域能力**:不存在。
### 方案定位
作为「轻量 TS-modality 融合」的**研究性 PoC**,其核心价值在于**清晰、诚实地划定了能力边界**:合成域内可行,但当前架构无法泛化到真实时序。这是一个**有价值的负结果**——它明确排除了「0.5B LLM + 2 层 TS encoder + 单分布合成训练」这条路线做通用时序理解的可能性,优于任何「看起来 work 但未测跨域」的结果。
---
## 资产清单(封存保留)
**代码**git-tracked):
- `src/tsmm/`data/model/train/eval 完整模块
- `scripts/`gen/train/eval 监督脚本(含流式+断点续训)
- `tests/`158 单测全绿
**数据/模型**git-ignore,本地保留):
- `data/align.jsonl`50万)、`sft.jsonl`10万)、`eval_synth.jsonl`2k held-out
- `data/real/smd/`SMD 3 机合并 npy)、`data/eval_real.jsonl`machine-2-1 held-out)、`data/smd_ft/sft.jsonl`machine-1-1/1-2 微调集)
- `checkpoints/stage1/stage1_final.pt`31250 步)、`checkpoints/stage2/`9375 步 + lora)、`checkpoints/stage2_smd/`SMD 微调 500 步)
- `data/small_scale_backup/`(小规模对比备份)
**报告**git-tracked`reports/`):
- `eval-2026-06-30.md`:小规模首评(40/类)
- `eval-2026-07-01.md`:全量重训评测(synth 全量 2000)
- `eval-2026-07-02.md`:真实数据评测(synth + realzero-shot 崩溃记录)
- `instruct_check.json`T4.2 指令遵循抽检
---
## 重启条件
若未来重启本方案,需满足以下任一前提(按预期 ROI 排序):
1. **更大 encoder + 真实数据从头训练**encoder >10M 参数,且用真实多数据集从头训练(非仅微调),让 encoder 有足够容量和分布覆盖学到通用表征。
2. **channel-agnostic patch 策略**:消除「通道数」这一硬约束(当前 patch embed 固定 5 通道,是跨域的物理障碍),如 per-channel 独立编码后聚合。
3. **多真实数据集混合训练验证泛化**:在 SMD/SWaT/PSM 等多个真实数据集上联合训练,并在完全 held-out 的数据集上验证——只有这种泛化成立,方案才算「通用」。
在以上任一条件未满足前,本方案不再投入。