NuoNuo: Hippocampal memory module prototype

Hopfield + Hebbian hybrid memory system for LLMs.
Two nights of experiments (16 iterations), validated on LongMemEval (ICLR 2025).

Architecture:
- Single-hop: Two-Stage Hopfield (NN top-20 → softmax settle)
- Multi-hop: Hebbian W matrix with WTA pattern separation
- 64% on LongMemEval (500 questions), retrieval-only, no LLM dependency
- 4ms latency @ 20K memories, ~1GB VRAM

Key findings:
- Hopfield attention solved noise tolerance (20% → 100% vs flat Hebbian)
- WTA pattern separation enables 20K+ capacity
- Multi-hop associative chains (6 hops, CosSim=1.0) — RAG can't do this
- MiniLM-L6 is optimal (discrimination gap > absolute similarity)
- Paraphrase cue augmentation: 55% → 100% on synthetic, 36% → 64% on benchmark
- SNN encoder viable (CosSim 0.99) but not needed for current architecture
This commit is contained in:
2026-04-07 10:37:24 +01:00
commit d923aa1e31
65 changed files with 13148 additions and 0 deletions

84
doc/README.md Normal file
View File

@@ -0,0 +1,84 @@
# NuoNuo: Hippocampal Memory Module for LLMs
通宵原型验证实验记录2026-04-06 ~ 07
最终架构:**Hopfield + Hebbian 混合记忆系统**。
## 核心能力
| 能力 | 数值 |
|------|------|
| 跨会话召回 (12 memories) | **100%** |
| Paraphrase recall (+ augmentation, 2K bg) | **95-100%** |
| Multi-hop 联想 (3 hops, 500 bg) | **100%** |
| Scale (20K memories, no augmentation) | **80%** |
| Latency @ 20K | **4ms** |
| VRAM | **~1 GB** |
## 实验索引
### Phase 1: 基础验证exp01-06
| # | 实验 | 结论 |
|---|------|------|
| 01 | [SNN Encoder Roundtrip](exp01_encoder_roundtrip.md) | ✅ CosSim 0.99 |
| 02 | [Associative Recall](exp02_associative_recall.md) | ✅ WTA+Hebbian 20K, multi-hop 完美 |
| 03 | [Sleep Consolidation](exp03_consolidation.md) | ⚠️ 简化为权重重建 |
| 04 | [Real Embeddings](exp04_real_embeddings.md) | ✅ 语义 embedding 可用 |
| 05 | [Benchmark](exp05_benchmark.md) | ✅ 3ms E2E |
| 06 | [BioHash](exp06_biohash.md) | ⚠️ 改善编码但不解决 W 矩阵问题 |
### Phase 2: 突破exp07
| # | 实验 | 结论 |
|---|------|------|
| 07 | [**Hopfield Attention**](exp07_hopfield.md) | ⭐ 噪声容忍 + 多跳 = 完美 |
### Phase 3: P0-P6 深入探索
| # | 问题 | 文档 | 结论 |
|---|------|------|------|
| P0 | [LLM Integration](p0_llm_integration.md) | `exp08` | ✅ Pipeline 可用LLM Gateway 待验证 |
| P1 | [Embedding Models](p1_embedding_models.md) | `exp09` | ⭐ MiniLM 最优gap 比 sim 重要) |
| P2 | [Auto Paraphrase](p2_auto_paraphrase.md) | `exp10` | ✅ Heuristic +20pp, Oracle +45pp |
| P3 | [Scale Ceiling](p3_scale_ceiling.md) | `exp11` | 结论=P2ceiling 来自 embedding 不是架构)|
| P4 | [Lifecycle](p4_lifecycle.md) | `exp12` | ✅ Dedup + importance scoring 可行 |
| P5 | [SNN Hopfield](p5_snn_hopfield.md) | `exp13` | ❌ 不可行softmax 远优于 LIF dynamics |
| P6 | [Multi-turn](p6_multiturn.md) | `exp14` | ✅ 12/12 跨会话召回 |
## 综合文档
- [**架构设计 v2**](architecture.md) — Hopfield + Hebbian 混合架构
- [核心发现](findings.md) — 什么有用、什么没用、反直觉结论
## 核心模块
- **`src/nuonuo/hippocampus.py`** — Hopfield-Hebbian 混合实现 (v2)
- `llm.py` — LLM 集成(提取/paraphrase/context injection
- `src/nuonuo/encoder.py` — SNN spike encoder (备用)
## Quick Start
```python
from sentence_transformers import SentenceTransformer
from nuonuo.hippocampus import HippocampalMemory
model = SentenceTransformer('all-MiniLM-L6-v2', device='cuda')
memory = HippocampalMemory(embed_dim=384)
def emb(text):
return model.encode([text], convert_to_tensor=True,
normalize_embeddings=True, device='cuda')[0]
# Store with paraphrase augmentation
memory.store(emb("The database is slow"), emb("Check missing indexes"),
cue_variants=[emb("DB performance terrible"), emb("Database crawling")],
metadata={"target": "Check missing indexes"})
# Recall
results = memory.recall(emb("DB is really slow today"), top_k=3)
chain = memory.recall_chain(emb("DB is really slow today"), hops=3)
# Save/Load
memory.save("hippocampus.pt")
```

129
doc/architecture.md Normal file
View File

@@ -0,0 +1,129 @@
# NuoNuo: Hippocampal Memory Module — Architecture v2
## 项目目标
为 LLM如 Gemma 4添加一个类海马体的长期记忆模块
- 不使用传统 RAG向量数据库 + 检索)
- 记忆存储在网络权重Hebbian和显式模式Hopfield
- 支持 paraphrase 容忍的模糊检索
- 支持多跳联想推理A→B→CRAG 做不到)
- 每晚可整合/遗忘
## 核心架构
```
┌─────────────────────────────────────────────────────────┐
│ Query Embedding (from Sentence Transformer) │
│ ↓ │
│ ┌──── Stage 1: NN Pre-filter ────────────────────────┐ │
│ │ cosine(query, stored_cues) → top-20 candidates │ │
│ │ O(N) brute force, O(log N) with FAISS │ │
│ └─────────────────────┬──────────────────────────────┘ │
│ ↓ │
│ ┌──── Stage 2: Hopfield Settle ──────────────────────┐ │
│ │ softmax(β · query @ candidates^T) → attention │ │
│ │ Iterate 3 steps → converge to nearest attractor │ │
│ │ Aggregate attention by memory_id (cue variants) │ │
│ └─────────────────────┬──────────────────────────────┘ │
│ ↓ │
│ ┌──── Optional: Multi-hop Hebbian Chain ─────────────┐ │
│ │ Settled cue → WTA code → W @ code → next target │ │
│ │ Repeat for N hops (A → B → C → ...) │ │
│ └─────────────────────┬──────────────────────────────┘ │
│ ↓ │
│ Retrieved memories │
└─────────────────────────────────────────────────────────┘
```
## 生物学类比
| 大脑区域 | 系统组件 | 功能 |
|----------|----------|------|
| 嗅内皮层 (EC) | Sentence Transformer | 感知编码 |
| 齿状回 (DG) | WTA Pattern Separation | 稀疏化/正交化 |
| CA3 | Hebbian W matrix | 联想存储 + 多跳 |
| CA1 | Hopfield attention | 检索输出 |
| 睡眠重播 | W rebuild | 整合/遗忘 |
## 实验验证总结
| 能力 | 验证结果 | 实验 |
|------|----------|------|
| Paraphrase recall (+ augmentation) | **95%** | exp07e |
| Multi-hop (3 hops, 500 bg) | **100%** (sim=1.0) | exp07b, 07c |
| Scale (20K memories) | **80%** | exp07d |
| Exact cue recall | **100%** | exp02c |
| Memory capacity | **20K+** | exp02d |
| Recall latency | **4ms** @ 20K | exp05, 07d |
| SNN encoder roundtrip | **CosSim 0.99** | exp01b |
## 参数推荐
| 参数 | 值 | 备注 |
|------|-----|------|
| embed_dim | 384-768 | 取决于 Sentence Transformer |
| code_dim | 16384 | Hebbian 容量 20K+ |
| k (WTA) | 50 | 平衡噪声容忍和容量 |
| β (Hopfield) | 16.0 | 中等锐度 |
| hopfield_top_k | 20 | 候选集大小,越小越稳 |
| hopfield_steps | 3 | 收敛迭代次数 |
| cue_variants | 3-5 per memory | LLM 生成 paraphrase |
## VRAM 预算 (RTX 4090, 24GB)
| 组件 | 大小 |
|------|------|
| Hebbian W (16384²) | 1024 MB |
| WTA projection (384×16384) | 24 MB |
| Hopfield store (20K × 384 × 2) | ~60 MB |
| Sentence Transformer | ~90 MB |
| Gemma 4B (fp16) | ~8 GB |
| **Total** | **~9.2 GB** |
| **Headroom** | **~14.8 GB** |
## 与 Gemma 集成
推荐方案:**Context Injection**
```python
# 1. User input → embed
query_emb = encoder.encode(user_input)
# 2. Recall memories
results = memory.recall(query_emb, top_k=3)
chain = memory.recall_chain(query_emb, hops=2)
# 3. Format and inject
context = format_memories(results + chain)
prompt = f"[Recalled memories]\n{context}\n\n[User]\n{user_input}"
# 4. Generate response
response = gemma.generate(prompt)
# 5. Store new memory (with LLM-generated paraphrases)
paraphrases = gemma.generate(f"Generate 3 paraphrases of: {user_input}")
memory.store(query_emb, response_emb,
cue_variants=[encoder.encode(p) for p in paraphrases])
```
## 文件结构
```
src/nuonuo/
├── hippocampus.py # 最终模块 v2 (Hopfield + Hebbian hybrid)
├── encoder.py # SNN spike encoder/decoder
├── memory.py # STDP + Hebbian memory (historical)
├── consolidation.py # Sleep consolidation (historical)
└── __init__.py
doc/
├── architecture.md # 本文件
├── findings.md # 核心发现与反直觉结论
├── exp01_*.md # SNN Encoder
├── exp02_*.md # Associative Recall
├── exp03_*.md # Consolidation
├── exp04_*.md # Real Embeddings
├── exp05_*.md # Benchmarks
├── exp06_*.md # BioHash
└── exp07_*.md # Hopfield (突破)
```

View File

@@ -0,0 +1,38 @@
# 实验1Encoder Roundtrip Test
## 目标
验证 embedding → spike train → embedding 往返编码的信息保留度。
## 关键发现
### 结论roundtrip 编码完全可行CosSim 可达 0.99
最佳配置:**768-dim, 2048 neurons, 64 steps → CosSim 0.9898, MSE 0.000111**
### 详细结果 (200 epochs, AdamW + CosineAnnealing)
| Dim | Neurons | Steps | MSE | CosSim | 备注 |
|-----|---------|-------|-----|--------|------|
| 768 | 2048 | 64 | 0.000111 | **0.9898** | ⭐ 最佳 |
| 768 | 4096 | 64 | 0.000057 | 0.9873 | MSE最低但CosSim略低 |
| 768 | 8192 | 64 | 0.000094 | 0.9773 | 过宽反而差 |
| 768 | 4096 | 128 | 0.000711 | 0.9640 | 步数太多反而差!|
### 重要观察
1. **"死神经元"相变**训练前60个epochfiring rate = 0网络完全不放电。然后突然开始放电CosSim飙升。这是因为膜电位初始化需要学习到正确的尺度才能突破阈值。类似生物神经网络中的突触成熟过程。
2. **更宽不等于更好**2048 neurons 比 4096、8192 都好。更窄的瓶颈迫使编码更高效。这和 autoencoder 的经典结论一致。
3. **更多 steps 反而有害**128 steps 比 64 差很多0.964 vs 0.990。LIF 膜电位指数衰减,长序列末端的脉冲和初始 embedding 的关联太弱了。
4. **firing rate 自然收敛到 ~6%**:目标是 10%,实际收敛到 5-7%。说明稀疏编码是最优的。
5. **收敛速度**50 epochs 时 768-dim 只有 ~0.89,但 200 epochs 可以到 0.99。CosineAnnealing scheduler 帮助很大。
### 对后续实验的指导
- 使用 **768-dim, 2048 neurons, 64 steps** 作为默认配置
- 训练至少 200 epochs
- 实际记忆模块不需要完美重建——0.95 的 CosSim 已经足够做 associative recall
- 关键瓶颈不在 encoder而在后续的 STDP 记忆层是否能保持 spike pattern 的完整性

1004
doc/exp01_results.json Normal file

File diff suppressed because it is too large Load Diff

238
doc/exp01b_results.json Normal file
View File

@@ -0,0 +1,238 @@
[
{
"dim": 768,
"neurons": 2048,
"steps": 64,
"final_mse": 0.00011098239338025451,
"final_cos": 0.9898157119750977,
"milestones": [
{
"epoch": 20,
"mse": 0.005041939315075675,
"cos": -0.0007408469663156817
},
{
"epoch": 40,
"mse": 0.0029456913859272995,
"cos": -0.0003333062321568529
},
{
"epoch": 60,
"mse": 0.0029715588005880516,
"cos": 0.0005352402261147896
},
{
"epoch": 80,
"mse": 0.04361877404153347,
"cos": 0.4805794248978297
},
{
"epoch": 100,
"mse": 0.005344521099080642,
"cos": 0.7873762448628744
},
{
"epoch": 120,
"mse": 0.001494182685079674,
"cos": 0.9197443743546804
},
{
"epoch": 140,
"mse": 0.0003552741633029655,
"cos": 0.9758868634700775
},
{
"epoch": 160,
"mse": 0.00016522348839013526,
"cos": 0.9866191744804382
},
{
"epoch": 180,
"mse": 0.00011800844416332741,
"cos": 0.9894002715746562
},
{
"epoch": 200,
"mse": 0.00011065248036175035,
"cos": 0.9898596425851186
}
]
},
{
"dim": 768,
"neurons": 4096,
"steps": 64,
"final_mse": 5.6636981753399596e-05,
"final_cos": 0.9872701168060303,
"milestones": [
{
"epoch": 20,
"mse": 0.004513699406137069,
"cos": 7.949230493977665e-05
},
{
"epoch": 40,
"mse": 0.0028209949222703775,
"cos": 0.0006807217665482313
},
{
"epoch": 60,
"mse": 0.002746186009608209,
"cos": -0.0012927929715563853
},
{
"epoch": 80,
"mse": 0.048195418591300644,
"cos": 0.49279734392960867
},
{
"epoch": 100,
"mse": 0.011376503172020118,
"cos": 0.7687788685162862
},
{
"epoch": 120,
"mse": 0.0018575659099345405,
"cos": 0.9089678009351094
},
{
"epoch": 140,
"mse": 0.00029495314811356366,
"cos": 0.9680179615815481
},
{
"epoch": 160,
"mse": 0.00010300778691695693,
"cos": 0.9824542800585429
},
{
"epoch": 180,
"mse": 6.22785273056555e-05,
"cos": 0.986561139424642
},
{
"epoch": 200,
"mse": 5.633314976876136e-05,
"cos": 0.9872957944869996
}
]
},
{
"dim": 768,
"neurons": 4096,
"steps": 128,
"final_mse": 0.0007109043071977794,
"final_cos": 0.9640029072761536,
"milestones": [
{
"epoch": 20,
"mse": 0.004640598734840751,
"cos": 0.0001389272161759436
},
{
"epoch": 40,
"mse": 0.0028830923062438765,
"cos": -0.0005388486936377982
},
{
"epoch": 60,
"mse": 0.0026579547052582105,
"cos": -0.0008515000498543183
},
{
"epoch": 80,
"mse": 0.005524608632549643,
"cos": 0.3971738278865814
},
{
"epoch": 100,
"mse": 0.44284523477156956,
"cos": 0.14999981944759685
},
{
"epoch": 120,
"mse": 0.009387427164862553,
"cos": 0.8101295113563538
},
{
"epoch": 140,
"mse": 0.0032115802091235916,
"cos": 0.9130531450112661
},
{
"epoch": 160,
"mse": 0.001285675020578007,
"cos": 0.9493551254272461
},
{
"epoch": 180,
"mse": 0.0007889122760389,
"cos": 0.9620140413443248
},
{
"epoch": 200,
"mse": 0.0007097914950766911,
"cos": 0.9642268856366475
}
]
},
{
"dim": 768,
"neurons": 8192,
"steps": 64,
"final_mse": 9.41839098231867e-05,
"final_cos": 0.977264404296875,
"milestones": [
{
"epoch": 20,
"mse": 0.0042252690686533844,
"cos": 0.0009540434480489542
},
{
"epoch": 40,
"mse": 0.0026403106516227127,
"cos": -0.00011461178073659539
},
{
"epoch": 60,
"mse": 0.002510098453300695,
"cos": 3.730244352482259e-05
},
{
"epoch": 80,
"mse": 0.07319205676515897,
"cos": 0.5515906274318695
},
{
"epoch": 100,
"mse": 0.02154427437732617,
"cos": 0.6362018167972565
},
{
"epoch": 120,
"mse": 0.005301868465418617,
"cos": 0.8255152304967245
},
{
"epoch": 140,
"mse": 0.0007266401468465725,
"cos": 0.9310513158639272
},
{
"epoch": 160,
"mse": 0.00019424428513351206,
"cos": 0.9668811519940694
},
{
"epoch": 180,
"mse": 0.00010609042850167801,
"cos": 0.9758348226547241
},
{
"epoch": 200,
"mse": 9.468134303460828e-05,
"cos": 0.9772639731566112
}
]
}
]

View File

@@ -0,0 +1,68 @@
# 实验2STDP / Hebbian Associative Recall
## 系列实验总结
### 2a: 原始 STDP完全失败
- **问题**: W 初始化为 0 → 无脉冲 → STDP 不触发 → W 保持为 0鸡生蛋死循环
- **教训**: STDP 学习不能依赖网络自身产生 post-spikes必须 teacher forcing
### 2b: 修复后的 STDP + 直接 Hebbian
- **Direct Hebbian**: 1 对完美CosSim=1.0但多对时交叉干扰严重10 对 Disc=0.007
- **STDP v2**: 比 Hebbian 差LIF 阈值非线性扭曲输出
- **根因**: 随机 spike pattern 不够正交pattern 重叠导致灾难性干扰
### 2c: Pattern Separation突破性进展
- 引入 Winner-Take-All 模式分离(类比齿状回 dentate gyrus
- **结果**: code=16384, k=20 时,**2000 对记忆完美召回**Disc=0.999
- 500 对记忆Correct=1.0, Wrong=0.001
### 2d: 鲁棒性与容量
- **容量**: 20,000 对记忆仍然完美code=16384, k=20
- **Partial cue**: 30% 缺失仍 100% 召回50% 缺失 86% 准确
- **噪声**: ⚠️ 致命弱点——noise_std=0.1 就崩溃到 9% 准确率
- WTA 对输入微扰极其敏感(改变 top-k 排序)
### 2e: 抗噪方案
- **Soft WTA**: 虽然 CosSim 高但 discrimination=0所有 pattern 都一样,无法区分)
- **Multi-probe**: 完全失败
- **Coarse-to-fine**: noise≤0.2 完美,本质上是 NN lookup + Hebbian recall
- **Wider k**: 略有改善但不根本
### 2f: Learned Separator
- 随机 embedding 上训练失败pos_match ≈ neg_match
- 原因随机高维向量没有语义结构contrastive loss 无法学到有意义的分离
- **需要真实语义 embedding 才能验证**
### 2g: Multi-hop 联想(核心卖点)⭐⭐
- **A→B→C→D→E→F→G (6跳): CosSim=1.0**,完美链式联想
- 100 条长度为 4 的链300 个 pair零干扰
- 收敛链A→C, B→C: 两条路径都完美到达 C
- 发散链A→B, A→C: 自然产生 50/50 混合——符合生物记忆行为
- **这是 RAG 无法实现的能力**RAG 只能做单跳 NN 检索
## 架构决策
### 确定的方案
1. **Pattern Separation**: WTAcode_dim=16384, k=20是核心组件
2. **Hebbian Outer-Product**: 存储机制(不是 STDP trace-based
3. **Multi-hop**: 通过权重矩阵链式乘法实现
4. **容量**: 20K+ 记忆毫无压力
### 待解决
1. **噪声容忍**: 实际使用需要 coarse retrievalNN lookup辅助
- 或者: learned separator 在真实语义 embedding 上可能 work
2. **STDP 的角色**: 在此架构中,直接 Hebbian 比 STDP 好
- STDP 可能在 consolidationexp03中找到位置
3. **SNN 的角色**: encoder/decoder 验证通过,但 memory core 更适合 rate-based
- SNN 的价值在于: temporal encoding + neuromorphic hardware + consolidation dynamics
## 关键数字
| 指标 | 数值 |
|------|------|
| 最大容量 (code=16384, k=20) | >20,000 memories |
| 单跳召回精度 (clean cue) | 1.0000 |
| 多跳召回精度 (6 hops) | 1.0000 |
| 噪声容忍 (noise=0.1) | ❌ 0.09 exact rate |
| Partial cue 容忍 (30% missing) | ✅ 100% |
| Weight matrix 内存 | 16384² × 4B = 1GB |

808
doc/exp02_results.json Normal file
View File

@@ -0,0 +1,808 @@
[
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 1,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0,
"discrimination": 0.0,
"correct_sims": [
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.13341617584228516,
"test": "single_pair"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 5,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.38840293884277344,
"test": "pairs_5"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7765586376190186,
"test": "pairs_10"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 20,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 1.5450711250305176,
"test": "pairs_20"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 50,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 3.9536848068237305,
"test": "pairs_50"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.001,
"a_minus": 0.0012,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.774240255355835,
"test": "lr_0.001"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.8001570701599121,
"test": "lr_0.005"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.01,
"a_minus": 0.012,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7752792835235596,
"test": "lr_0.01"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.05,
"a_minus": 0.06,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7797460556030273,
"test": "lr_0.05"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.02,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.778449296951294,
"test": "fr_0.02"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7686772346496582,
"test": "fr_0.05"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.1,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7901496887207031,
"test": "fr_0.1"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.2,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7785372734069824,
"test": "fr_0.2"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 1,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.18436217308044434,
"test": "pres_1"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 3,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.4729011058807373,
"test": "pres_3"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.777827262878418,
"test": "pres_5"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 10,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 1.5397796630859375,
"test": "pres_10"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 20,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 3.1238980293273926,
"test": "pres_20"
},
{
"num_neurons": 1024,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7898683547973633,
"test": "width_1024"
},
{
"num_neurons": 2048,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 0.7738516330718994,
"test": "width_2048"
},
{
"num_neurons": 4096,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 6.378566026687622,
"test": "width_4096"
},
{
"num_neurons": 8192,
"num_steps": 64,
"num_pairs": 10,
"firing_rate": 0.05,
"num_presentations": 5,
"a_plus": 0.005,
"a_minus": 0.006,
"mean_correct_sim": 0.0,
"mean_wrong_sim": 0.0,
"discrimination": 0.0,
"correct_sims": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"recall_firing_rate": 0.0,
"weight_stats": {
"mean": 0.0,
"std": 0.0,
"abs_mean": 0.0,
"sparsity": 1.0,
"max": 0.0,
"min": 0.0
},
"learn_time": 27.351831674575806,
"test": "width_8192"
}
]

504
doc/exp02b_results.json Normal file
View File

@@ -0,0 +1,504 @@
[
{
"method": "direct_hebbian",
"correct": 1.0,
"wrong": 0,
"disc": 1.0,
"w_stats": {
"mean": 0.0012326654978096485,
"std": 0.001009981264360249,
"abs_mean": 0.0012326654978096485,
"sparsity": 0.5203375816345215,
"max": 0.01220703125,
"min": 0.0
},
"time": 0.018577098846435547,
"num_pairs": 1,
"lr": 0.5,
"test": "hebb_pairs_1"
},
{
"method": "direct_hebbian",
"correct": 0.9141042113304139,
"wrong": 0.8997887462377548,
"disc": 0.014315465092659019,
"w_stats": {
"mean": 0.006221722345799208,
"std": 0.0023041535168886185,
"abs_mean": 0.006221722345799208,
"sparsity": 0.0006265640258789062,
"max": 0.023681640625,
"min": 0.0
},
"time": 0.0002448558807373047,
"num_pairs": 5,
"lr": 0.5,
"test": "hebb_pairs_5"
},
{
"method": "direct_hebbian",
"correct": 0.8956584692001343,
"wrong": 0.8881289852990044,
"disc": 0.007529483901129841,
"w_stats": {
"mean": 0.012574371881783009,
"std": 0.0033114321995526552,
"abs_mean": 0.012574371881783009,
"sparsity": 0.0,
"max": 0.034423828125,
"min": 0.0015869140625
},
"time": 0.0003325939178466797,
"num_pairs": 10,
"lr": 0.5,
"test": "hebb_pairs_10"
},
{
"method": "direct_hebbian",
"correct": 0.8879856646060944,
"wrong": 0.8841540270730068,
"disc": 0.003831637533087573,
"w_stats": {
"mean": 0.024841923266649246,
"std": 0.004587384406477213,
"abs_mean": 0.024841923266649246,
"sparsity": 0.0,
"max": 0.054443359375,
"min": 0.0079345703125
},
"time": 0.0014731884002685547,
"num_pairs": 20,
"lr": 0.5,
"test": "hebb_pairs_20"
},
{
"method": "direct_hebbian",
"correct": 0.8821950948238373,
"wrong": 0.8806546637719991,
"disc": 0.0015404310518382092,
"w_stats": {
"mean": 0.06239410862326622,
"std": 0.0072029875591397285,
"abs_mean": 0.06239410862326622,
"sparsity": 0.0,
"max": 0.1075439453125,
"min": 0.0311279296875
},
"time": 0.0010445117950439453,
"num_pairs": 50,
"lr": 0.5,
"test": "hebb_pairs_50"
},
{
"method": "direct_hebbian",
"correct": 0.8799643820524216,
"wrong": 0.8791960634968498,
"disc": 0.0007683185555718008,
"w_stats": {
"mean": 0.12517985701560974,
"std": 0.010384579189121723,
"abs_mean": 0.12517985701560974,
"sparsity": 0.0,
"max": 0.181884765625,
"min": 0.080810546875
},
"time": 0.001986265182495117,
"num_pairs": 100,
"lr": 0.5,
"test": "hebb_pairs_100"
},
{
"method": "direct_hebbian",
"correct": 0.8980890333652496,
"wrong": 0.8907561533980899,
"disc": 0.0073328799671597,
"w_stats": {
"mean": 0.00025050563272088766,
"std": 6.504161865450442e-05,
"abs_mean": 0.00025050563272088766,
"sparsity": 1.0,
"max": 0.0007348632207140326,
"min": 3.9062499126885086e-05
},
"time": 0.00024819374084472656,
"num_pairs": 10,
"lr": 0.01,
"test": "hebb_lr_0.01"
},
{
"method": "direct_hebbian",
"correct": 0.8962267279624939,
"wrong": 0.8887399951616923,
"disc": 0.007486732800801588,
"w_stats": {
"mean": 0.002498718211427331,
"std": 0.0006414031959138811,
"abs_mean": 0.002498718211427331,
"sparsity": 0.0017719268798828125,
"max": 0.006787109654396772,
"min": 0.0003906250058207661
},
"time": 0.00022459030151367188,
"num_pairs": 10,
"lr": 0.1,
"test": "hebb_lr_0.1"
},
{
"method": "direct_hebbian",
"correct": 0.897282725572586,
"wrong": 0.8897124224238926,
"disc": 0.007570303148693447,
"w_stats": {
"mean": 0.012481803074479103,
"std": 0.003280544187873602,
"abs_mean": 0.012481803074479103,
"sparsity": 0.0,
"max": 0.035400390625,
"min": 0.001220703125
},
"time": 0.0002167224884033203,
"num_pairs": 10,
"lr": 0.5,
"test": "hebb_lr_0.5"
},
{
"method": "direct_hebbian",
"correct": 0.8980260252952575,
"wrong": 0.8906061040030585,
"disc": 0.007419921292199039,
"w_stats": {
"mean": 0.024723926559090614,
"std": 0.006540043745189905,
"abs_mean": 0.024723926559090614,
"sparsity": 0.0,
"max": 0.07080078125,
"min": 0.0029296875
},
"time": 0.000244140625,
"num_pairs": 10,
"lr": 1.0,
"test": "hebb_lr_1.0"
},
{
"method": "direct_hebbian",
"correct": 0.8966590642929078,
"wrong": 0.8892279856734806,
"disc": 0.007431078619427156,
"w_stats": {
"mean": 0.12513691186904907,
"std": 0.033127814531326294,
"abs_mean": 0.12513691186904907,
"sparsity": 0.0,
"max": 0.34912109375,
"min": 0.01708984375
},
"time": 0.00022292137145996094,
"num_pairs": 10,
"lr": 5.0,
"test": "hebb_lr_5.0"
},
{
"method": "stdp_v2",
"correct": 0.6561112403869629,
"wrong": 0,
"disc": 0.6561112403869629,
"w_stats": {
"mean": -0.021826405078172684,
"std": 0.10513758659362793,
"abs_mean": 0.0771329402923584,
"sparsity": 0.01354217529296875,
"max": 0.9745967388153076,
"min": -1.0
},
"time": 0.020874977111816406,
"num_pairs": 1,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_single"
},
{
"method": "stdp_v2",
"correct": 0.18890744000673293,
"wrong": 0.1745286915037367,
"disc": 0.014378748502996225,
"w_stats": {
"mean": -0.022967157885432243,
"std": 0.0347970575094223,
"abs_mean": 0.03315284848213196,
"sparsity": 0.01936030387878418,
"max": 0.15670186281204224,
"min": -0.2564994990825653
},
"time": 0.26916003227233887,
"num_pairs": 10,
"a_plus": 0.001,
"num_pres": 5,
"test": "stdp_ap_0.001"
},
{
"method": "stdp_v2",
"correct": 0.2575246155261993,
"wrong": 0.24171155989170073,
"disc": 0.015813055634498585,
"w_stats": {
"mean": -0.11097157001495361,
"std": 0.16529808938503265,
"abs_mean": 0.15848013758659363,
"sparsity": 0.003999948501586914,
"max": 0.7865057587623596,
"min": -1.0
},
"time": 0.2617373466491699,
"num_pairs": 10,
"a_plus": 0.005,
"num_pres": 5,
"test": "stdp_ap_0.005"
},
{
"method": "stdp_v2",
"correct": 0.2595768585801125,
"wrong": 0.24608167906602224,
"disc": 0.013495179514090239,
"w_stats": {
"mean": -0.2241937518119812,
"std": 0.3288184702396393,
"abs_mean": 0.31941741704940796,
"sparsity": 0.0019876956939697266,
"max": 1.0,
"min": -1.0
},
"time": 0.2628958225250244,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_ap_0.01"
},
{
"method": "stdp_v2",
"correct": 0.2949586361646652,
"wrong": 0.2823951015869776,
"disc": 0.012563534577687607,
"w_stats": {
"mean": -0.3816400170326233,
"std": 0.6254727244377136,
"abs_mean": 0.6577693819999695,
"sparsity": 0.0006313323974609375,
"max": 1.0,
"min": -1.0
},
"time": 0.26494669914245605,
"num_pairs": 10,
"a_plus": 0.05,
"num_pres": 5,
"test": "stdp_ap_0.05"
},
{
"method": "stdp_v2",
"correct": 0.4278454571962357,
"wrong": 0.4212547073761622,
"disc": 0.0065907498200734604,
"w_stats": {
"mean": -0.2731684446334839,
"std": 0.7176912426948547,
"abs_mean": 0.6977914571762085,
"sparsity": 0.0005943775177001953,
"max": 1.0,
"min": -1.0
},
"time": 0.263822078704834,
"num_pairs": 10,
"a_plus": 0.1,
"num_pres": 5,
"test": "stdp_ap_0.1"
},
{
"method": "stdp_v2",
"correct": 0.23125857561826707,
"wrong": 0.2177843016054895,
"disc": 0.013474274012777565,
"w_stats": {
"mean": -0.04514722526073456,
"std": 0.06740628927946091,
"abs_mean": 0.06436040252447128,
"sparsity": 0.009995222091674805,
"max": 0.39074867963790894,
"min": -0.4776502847671509
},
"time": 0.04672598838806152,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 1,
"test": "stdp_pres_1"
},
{
"method": "stdp_v2",
"correct": 0.2634019389748573,
"wrong": 0.25012489590379927,
"disc": 0.013277043071058037,
"w_stats": {
"mean": -0.1368531435728073,
"std": 0.20195430517196655,
"abs_mean": 0.19379907846450806,
"sparsity": 0.0032529830932617188,
"max": 0.9678819179534912,
"min": -1.0
},
"time": 0.15973997116088867,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 3,
"test": "stdp_pres_3"
},
{
"method": "stdp_v2",
"correct": 0.2491248592734337,
"wrong": 0.23636625193887287,
"disc": 0.012758607334560829,
"w_stats": {
"mean": -0.23120653629302979,
"std": 0.3264971673488617,
"abs_mean": 0.3213178515434265,
"sparsity": 0.0019659996032714844,
"max": 1.0,
"min": -1.0
},
"time": 0.2647593021392822,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pres_5"
},
{
"method": "stdp_v2",
"correct": 0.2780441254377365,
"wrong": 0.2647830416758855,
"disc": 0.013261083761850978,
"w_stats": {
"mean": -0.35562774538993835,
"std": 0.5160319805145264,
"abs_mean": 0.5376336574554443,
"sparsity": 0.0010309219360351562,
"max": 1.0,
"min": -1.0
},
"time": 0.5369422435760498,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 10,
"test": "stdp_pres_10"
},
{
"method": "stdp_v2",
"correct": 0.2884770005941391,
"wrong": 0.27335384570890003,
"disc": 0.015123154885239076,
"w_stats": {
"mean": -0.39499378204345703,
"std": 0.616945207118988,
"abs_mean": 0.6560592651367188,
"sparsity": 0.0006542205810546875,
"max": 1.0,
"min": -1.0
},
"time": 1.07774019241333,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 20,
"test": "stdp_pres_20"
},
{
"method": "stdp_v2",
"correct": 0.6523751020431519,
"wrong": 0,
"disc": 0.6523751020431519,
"w_stats": {
"mean": -0.021571537479758263,
"std": 0.10514378547668457,
"abs_mean": 0.07724925875663757,
"sparsity": 0.013613700866699219,
"max": 0.8662262558937073,
"min": -1.0
},
"time": 0.019371509552001953,
"num_pairs": 1,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pairs_1"
},
{
"method": "stdp_v2",
"correct": 0.38826957941055296,
"wrong": 0.3618871793150902,
"disc": 0.026382400095462777,
"w_stats": {
"mean": -0.11600317060947418,
"std": 0.23469609022140503,
"abs_mean": 0.20440348982810974,
"sparsity": 0.003264188766479492,
"max": 1.0,
"min": -1.0
},
"time": 0.13651704788208008,
"num_pairs": 5,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pairs_5"
},
{
"method": "stdp_v2",
"correct": 0.24784058183431626,
"wrong": 0.23306812014844683,
"disc": 0.014772461685869431,
"w_stats": {
"mean": -0.22731736302375793,
"std": 0.3267463445663452,
"abs_mean": 0.3194453716278076,
"sparsity": 0.001964569091796875,
"max": 1.0,
"min": -1.0
},
"time": 0.28417372703552246,
"num_pairs": 10,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pairs_10"
},
{
"method": "stdp_v2",
"correct": 0.12115511521697045,
"wrong": 0.11465478504174634,
"disc": 0.006500330175224112,
"w_stats": {
"mean": -0.42493927478790283,
"std": 0.4062454402446747,
"abs_mean": 0.5013920068740845,
"sparsity": 0.0010747909545898438,
"max": 1.0,
"min": -1.0
},
"time": 0.5374035835266113,
"num_pairs": 20,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pairs_20"
},
{
"method": "stdp_v2",
"correct": 0.01958512845332734,
"wrong": 0.01876905316739089,
"disc": 0.000816075285936451,
"w_stats": {
"mean": -0.6996303796768188,
"std": 0.3604925274848938,
"abs_mean": 0.7365255355834961,
"sparsity": 0.0003490447998046875,
"max": 1.0,
"min": -1.0
},
"time": 1.3608872890472412,
"num_pairs": 50,
"a_plus": 0.01,
"num_pres": 5,
"test": "stdp_pairs_50"
}
]

326
doc/exp02c_results.json Normal file
View File

@@ -0,0 +1,326 @@
[
{
"test": "overlap",
"code_dim": 2048,
"k": 20,
"mean_overlap": 0.010202019593932412,
"max_overlap": 0.14999999105930328
},
{
"test": "overlap",
"code_dim": 2048,
"k": 50,
"mean_overlap": 0.024711112705520306,
"max_overlap": 0.12000001221895218
},
{
"test": "overlap",
"code_dim": 2048,
"k": 100,
"mean_overlap": 0.04898586208941509,
"max_overlap": 0.15000000596046448
},
{
"test": "overlap",
"code_dim": 4096,
"k": 20,
"mean_overlap": 0.005979797623374246,
"max_overlap": 0.09999999403953552
},
{
"test": "overlap",
"code_dim": 4096,
"k": 50,
"mean_overlap": 0.012800000862717027,
"max_overlap": 0.12000000476837158
},
{
"test": "overlap",
"code_dim": 4096,
"k": 100,
"mean_overlap": 0.024448486435405835,
"max_overlap": 0.11000000685453415
},
{
"test": "overlap",
"code_dim": 8192,
"k": 20,
"mean_overlap": 0.0025757574222304604,
"max_overlap": 0.09999999403953552
},
{
"test": "overlap",
"code_dim": 8192,
"k": 50,
"mean_overlap": 0.006472727722968116,
"max_overlap": 0.06000000238418579
},
{
"test": "overlap",
"code_dim": 8192,
"k": 100,
"mean_overlap": 0.012430303828659083,
"max_overlap": 0.06000000610947609
},
{
"test": "overlap",
"code_dim": 16384,
"k": 20,
"mean_overlap": 0.0012222221493721009,
"max_overlap": 0.09999999403953552
},
{
"test": "overlap",
"code_dim": 16384,
"k": 50,
"mean_overlap": 0.003167676991133979,
"max_overlap": 0.06000000238418579
},
{
"test": "overlap",
"code_dim": 16384,
"k": 100,
"mean_overlap": 0.006484848919202282,
"max_overlap": 0.05000000447034836
},
{
"test": "sep_pairs_1",
"correct": 1.0,
"wrong": 0,
"disc": 1.0,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 1,
"lr": 1.0
},
{
"test": "sep_pairs_5",
"correct": 1.0000000476837159,
"wrong": 0.010000000707805157,
"disc": 0.9900000469759107,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 5,
"lr": 1.0
},
{
"test": "sep_pairs_10",
"correct": 1.0000000715255737,
"wrong": 0.007111111614439222,
"disc": 0.9928889599111345,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 10,
"lr": 1.0
},
{
"test": "sep_pairs_20",
"correct": 1.0000000715255737,
"wrong": 0.007473684719910747,
"disc": 0.992526386805663,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 20,
"lr": 1.0
},
{
"test": "sep_pairs_50",
"correct": 1.0000000524520873,
"wrong": 0.006183673899468719,
"disc": 0.9938163785526186,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 50,
"lr": 1.0
},
{
"test": "sep_pairs_100",
"correct": 1.0000000536441802,
"wrong": 0.005727273127948395,
"disc": 0.9942727805162318,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_pairs_200",
"correct": 1.0000000607967376,
"wrong": 0.00616582957512919,
"disc": 0.9938342312216084,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 200,
"lr": 1.0
},
{
"test": "sep_pairs_500",
"correct": 1.0000000553131103,
"wrong": 0.006348697836501506,
"disc": 0.9936513574766088,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 500,
"lr": 1.0
},
{
"test": "sep_codedim_2048",
"correct": 1.0000000619888305,
"wrong": 0.0245959611731873,
"disc": 0.9754041008156432,
"code_dim": 2048,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_codedim_4096",
"correct": 1.0000000619888305,
"wrong": 0.01184848565608263,
"disc": 0.9881515763327479,
"code_dim": 4096,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_codedim_8192",
"correct": 1.0000000548362733,
"wrong": 0.006383838832867567,
"disc": 0.9936162160034058,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_codedim_16384",
"correct": 1.0000000536441802,
"wrong": 0.003434343673665114,
"disc": 0.9965657099705151,
"code_dim": 16384,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_k_10",
"correct": 1.0,
"wrong": 0.0013131313326984946,
"disc": 0.9986868686673015,
"code_dim": 8192,
"k_active": 10,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_k_20",
"correct": 0.9999999302625656,
"wrong": 0.002348484708504243,
"disc": 0.9976514455540614,
"code_dim": 8192,
"k_active": 20,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_k_50",
"correct": 1.000000058412552,
"wrong": 0.0059797983936438655,
"disc": 0.9940202600189081,
"code_dim": 8192,
"k_active": 50,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_k_100",
"correct": 1.0000000667572022,
"wrong": 0.012792930120338846,
"disc": 0.9872071366368633,
"code_dim": 8192,
"k_active": 100,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "sep_k_200",
"correct": 1.000000069141388,
"wrong": 0.025040405879098206,
"disc": 0.9749596632622898,
"code_dim": 8192,
"k_active": 200,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "cap_10",
"correct": 0.9999999344348908,
"wrong": 0.001111111044883728,
"disc": 0.9988888233900071,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 10,
"lr": 1.0
},
{
"test": "cap_50",
"correct": 0.9999999284744263,
"wrong": 0.001836734584399632,
"disc": 0.9981631938900267,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 50,
"lr": 1.0
},
{
"test": "cap_100",
"correct": 0.9999999344348908,
"wrong": 0.0014141413298520175,
"disc": 0.9985857931050387,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 100,
"lr": 1.0
},
{
"test": "cap_200",
"correct": 0.9999999329447746,
"wrong": 0.0011055275722963726,
"disc": 0.9988944053724782,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 200,
"lr": 1.0
},
{
"test": "cap_500",
"correct": 0.9999999303817749,
"wrong": 0.001167334599760109,
"disc": 0.9988325957820148,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 500,
"lr": 1.0
},
{
"test": "cap_1000",
"correct": 0.9999999321103096,
"wrong": 0.0012262261531374476,
"disc": 0.9987737059571721,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 1000,
"lr": 1.0
},
{
"test": "cap_2000",
"correct": 0.999999930858612,
"wrong": 0.0013319158785906119,
"disc": 0.9986680149800214,
"code_dim": 16384,
"k_active": 20,
"num_pairs": 2000,
"lr": 1.0
}
]

99
doc/exp02d_results.json Normal file
View File

@@ -0,0 +1,99 @@
{
"noise": {
"0.0": {
"mean_cos": 0.9999999350309372,
"exact_rate": 1.0
},
"0.1": {
"mean_cos": 0.16949998944997788,
"exact_rate": 0.09
},
"0.2": {
"mean_cos": 0.06849999487400055,
"exact_rate": 0.03
},
"0.5": {
"mean_cos": 0.024999997913837432,
"exact_rate": 0.0
},
"1.0": {
"mean_cos": 0.011999999135732652,
"exact_rate": 0.0
},
"2.0": {
"mean_cos": 0.002499999850988388,
"exact_rate": 0.0
},
"5.0": {
"mean_cos": 0.009499999433755875,
"exact_rate": 0.0
}
},
"partial": {
"0.0": {
"mean_cos": 0.9999999344348908,
"exact_rate": 1.0
},
"0.1": {
"mean_cos": 0.9999999344348908,
"exact_rate": 1.0
},
"0.2": {
"mean_cos": 0.9999999344348908,
"exact_rate": 1.0
},
"0.3": {
"mean_cos": 0.9999999344348908,
"exact_rate": 1.0
},
"0.5": {
"mean_cos": 0.9069999405741691,
"exact_rate": 0.86
},
"0.7": {
"mean_cos": 0.5879999609291553,
"exact_rate": 0.45
},
"0.9": {
"mean_cos": 0.1689999896287918,
"exact_rate": 0.08
}
},
"capacity": {
"100": {
"mean_cos": 0.999999930858612,
"exact_rate": 1.0,
"w_abs": 0.00014901161193847656
},
"500": {
"mean_cos": 0.9999999320507049,
"exact_rate": 1.0,
"w_abs": 0.0007450580596923828
},
"1000": {
"mean_cos": 0.9999999344348908,
"exact_rate": 1.0,
"w_abs": 0.0014901161193847656
},
"2000": {
"mean_cos": 0.9999999338388443,
"exact_rate": 1.0,
"w_abs": 0.0029802322387695312
},
"5000": {
"mean_cos": 0.9999999314546585,
"exact_rate": 1.0,
"w_abs": 0.007450580596923828
},
"10000": {
"mean_cos": 0.9999999326467514,
"exact_rate": 1.0,
"w_abs": 0.014901161193847656
},
"20000": {
"mean_cos": 0.9999999272823333,
"exact_rate": 1.0,
"w_abs": 0.029802322387695312
}
}
}

114
doc/exp02e_results.json Normal file
View File

@@ -0,0 +1,114 @@
{
"soft_wta_t0.01": {
"0.0": 0.9924059003591538,
"0.05": 0.7081658291816711,
"0.1": 0.3512206456577405,
"0.2": 0.1427949102059938,
"0.5": 0.06214611444971524,
"1.0": 0.03803978644893505
},
"soft_wta_t0.05": {
"0.0": 0.7770068669319152,
"0.05": 0.7753341776132584,
"0.1": 0.7744931131601334,
"0.2": 0.7739920604228974,
"0.5": 0.7737001150846481,
"1.0": 0.7735983967781067
},
"soft_wta_t0.1": {
"0.0": 0.9377952325344086,
"0.05": 0.9377174872159958,
"0.1": 0.9376753580570221,
"0.2": 0.9376475828886032,
"0.5": 0.9376276469230652,
"1.0": 0.9376224195957183
},
"soft_wta_t0.5": {
"0.0": 0.9974229729175568,
"0.05": 0.9974228632450104,
"0.1": 0.9974228018522262,
"0.2": 0.9974227517843246,
"0.5": 0.9974227398633957,
"1.0": 0.9974227231740952
},
"multiprobe_4": {
"0.0": 0.0,
"0.05": 0.0,
"0.1": 0.0,
"0.2": 0.0,
"0.5": 0.0,
"1.0": 0.0
},
"multiprobe_8": {
"0.0": 0.0,
"0.05": 0.0,
"0.1": 0.0,
"0.2": 0.0,
"0.5": 0.0,
"1.0": 0.0
},
"multiprobe_16": {
"0.0": 0.0,
"0.05": 0.0,
"0.1": 0.0,
"0.2": 0.0,
"0.5": 0.0,
"1.0": 0.0
},
"multiprobe_32": {
"0.0": 0.0,
"0.05": 0.0,
"0.1": 0.0,
"0.2": 0.0,
"0.5": 0.0,
"1.0": 0.0
},
"coarse_to_fine": {
"0.0": 0.9999999326467514,
"0.05": 0.9999999326467514,
"0.1": 0.9999999326467514,
"0.2": 0.9999999326467514,
"0.5": 0.24099998503923417,
"1.0": 0.07149999514222145
},
"wider_k_50": {
"0.0": 1.000000058412552,
"0.05": 0.96500005453825,
"0.1": 0.3752000237070024,
"0.2": 0.10180000556632876,
"0.5": 0.021200001928955315,
"1.0": 0.01700000114738941
},
"wider_k_100": {
"0.0": 1.0000000560283662,
"0.05": 0.9984000563621521,
"0.1": 0.6423000478558243,
"0.2": 0.18020001276396214,
"0.5": 0.050500003919005394,
"1.0": 0.03480000267736614
},
"wider_k_200": {
"0.0": 1.0000000560283662,
"0.05": 0.9999500566720962,
"0.1": 0.6304500451683999,
"0.2": 0.18000001210719346,
"0.5": 0.07430000650696457,
"1.0": 0.06735000459477306
},
"wider_k_500": {
"0.0": 0.9999999970197677,
"0.05": 0.9025200027227401,
"0.1": 0.38294000312685966,
"0.2": 0.17088000044226648,
"0.5": 0.09710000049322844,
"1.0": 0.08222000036388635
},
"wider_k_1000": {
"0.0": 0.9985101699829102,
"0.05": 0.5221900832653046,
"0.1": 0.27553004458546637,
"0.2": 0.16993002608418464,
"0.5": 0.13159002162516117,
"1.0": 0.11921001873910426
}
}

View File

@@ -0,0 +1,74 @@
# 实验3Sleep Consolidation
## 实验 3a标准配置下的 Consolidationcode_dim=16384, k=20
**结论Consolidation 基本没有效果。**
因为 pattern separation 太强了:
- 20,000 memories 全部完美召回consolidation 没有优化空间
- 10 晚纯 homeostasis无 replay后仍然 CosSim=1.0
- Replay 只是让 W_norm 膨胀200 → 1644
Noisy replay 对噪声容忍的改善极其微小noise=0.05 时 54%→60%),不值得。
## 实验 3b小网络下的 Consolidationcode_dim=2048, k=50
### 容量边界
| N | CosSim (无 consol) | CosSim (有 consol) |
|---|---|---|
| 500 | 1.0000 | 0.9999 |
| 1000 | 0.9752 | 0.9754 |
| 2000 | 0.8019 | 0.8021 |
**Consolidation 对容量没有帮助。** 干扰来自 pattern 重叠replay 不能解决这个问题。
### 7 天场景(核心发现)⚠️
每天学 200 条新记忆,每晚 consolidate
| 天数 | 总记忆 | Day1 记忆 | 今日记忆 | 全局精度 |
|------|--------|-----------|----------|----------|
| Day 1 | 200 | 1.000 | 1.000 | 100% |
| Night 2 后 | 400 | 0.989 | - | 100% |
| Night 3 后 | 600 | 0.770 | - | 100% |
| Night 5 后 | 1000 | 0.252 | - | 71% |
| Night 7 后 | 1400 | 0.072 | 0.535 | 50% |
**Consolidation 反而加速了旧记忆的遗忘!** 原因:
1. Replay 添加新的 outer product → 增加干扰
2. Selective clear (保留 30%) 意味着旧记忆得不到 replay
3. W_norm 持续增长749 → 4000信噪比恶化
### Homeostasis 对稳定系统无影响
500 pairs + 10 晚 consolidation无论 hf=0.70 还是 1.0CosSim 都 ≥ 0.9998。
WTA 纠错码太强,只要容量够,权重缩放不影响结果。
## 关键结论
### Consolidation 的真正价值(不是我们预期的)
1.**不是防止遗忘**——pattern separation 已经解决了
2.**不是提升容量**——容量由 code_dim/k 决定,不由 W 训练策略决定
3.**是 W_norm 管理**——防止权重无限增长
4.**是选择性遗忘**——当接近容量极限时,主动丢弃不重要的记忆
### 正确的 Consolidation 策略
当前的"replay + homeostasis"策略是错误的。更好的方案:
1. **W 重建法**:保存所有 (cue_code, target_code) 对,每晚从零重建 W = Σ target ⊗ cue
- 保证一致性,不累积误差
- 可以选择性丢弃不重要的 pair实现遗忘曲线
- O(N × code_dim²) 但只需每晚一次
2. **容量监控 + 动态扩展**:监控召回精度,接近极限时扩大 code_dim
3. **实际推荐**:直接用大 code_dim16384+),容量 20K+ 够用几年的对话历史。
Consolidation 简化为:每晚检查 W_norm如果过大就重建。
### 对整体架构的启示
生物海马体需要 consolidation 是因为它容量有限(~数天),需要把记忆转移到皮层。
但在我们的数字系统中,可以直接用更大的 code_dim 来规避容量问题。
Consolidation 退化为一个简单的**存储管理**问题,不需要复杂的 replay 机制。

View File

@@ -0,0 +1,87 @@
# 实验4真实语义 Embedding 端到端测试
## 模型
sentence-transformers/all-MiniLM-L6-v2, embedding dim=384
## 关键结果
### Embedding 空间分析
- 原始 cue ↔ paraphrase 余弦相似度: mean=0.68, min=0.18, max=0.86
- 不同 pair 间余弦相似度: mean=0.10
- Gap = 0.59 — 语义空间有合理分离度
### 精确 cue 召回: 100% ✓
20 对记忆,使用原始 cue 查询,全部正确。
### Paraphrase 召回20 对,无 background
| Config | Direct Recall | Coarse-to-Fine |
|--------|---------------|----------------|
| code=4096, k=20 | 85% | 90% |
| code=16384, k=50 | **95%** | 90% |
| code=16384, k=100 | 90% | 90% |
**k=50 是最佳 paraphrase 配置**,超过了 coarse-to-fine。
### Multi-hop: 完美 ✓✓✓
修复 unified projection 后4 条语义链 × 3 跳 = 全部 CosSim=1.0。
多条链共享同一个 memory 也完美。
### Paraphrase at Scale核心问题
| Background memories | Exact Recall | Paraphrase Recall |
|---------------------|-------------|-------------------|
| 0 | 5/5 | 5/5 |
| 100 | 3-4/5 | 1-2/5 |
| 500 | 1-3/5 | 0-1/5 |
| 1000 | 0-3/5 | 0-1/5 |
**随着存储记忆增加paraphrase recall 急剧下降。**
根因Hebbian 回忆是 W @ sep(query) = Σ target_i · (sep(cue_i) · sep(query))
当 memory 数量多时query code 和多个 cue code 部分重叠,产生噪声混合。
这不是容量问题exact recall 2000 条仍然 100%),而是**信噪比问题**。
## 架构决策
### 最终推荐架构Hybrid Memory
```
┌─────────────────────────────────────────────────┐
│ Query Embedding │
│ ↓ │
│ ┌───────────── Single-Hop ──────────────────┐ │
│ │ Key-Value Store (explicit cue→target) │ │
│ │ NN Lookup: cos_sim(query, stored_cues) │ │
│ │ → Top-K nearest cue embeddings │ │
│ │ → Return their associated targets │ │
│ └────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────── Multi-Hop ───────────────────┐ │
│ │ Hebbian W matrix (unified projection) │ │
│ │ Start from NN-retrieved exact cue │ │
│ │ → Chain through W for 2+ hop associations │ │
│ └────────────────────────────────────────────┘ │
│ ↓ │
│ Retrieved memories │
└─────────────────────────────────────────────────┘
```
### 为什么这个架构是对的
1. **Single-hop 用 NN lookup**:噪声容忍,任意 paraphrase 都能命中
2. **Multi-hop 用 Hebbian W**:唯一能做 A→B→C 链式联想的方法
3. **不冲突**NN lookup 找到精确 cue 后,用精确 cue 查 W 矩阵(不受噪声影响)
4. **SNN encoder 的位置**:可选,将 embedding 编码为 spike train 作为 W 的输入
- 当前实验中WTA 直接在 embedding 空间上做 pattern separation 就够了
- SNN encoder 的价值在 neuromorphic hardware 部署
### 最优参数
| 参数 | 推荐值 | 理由 |
|------|--------|------|
| code_dim | 16384 | 容量 20K+,显存 ~1GB |
| k (WTA active) | 50 | 平衡 paraphrase 容忍度和容量 |
| input_dim | 384-768 | 取决于 embedding model |
| W 精度 | float32 | 1GB for 16384² |

61
doc/exp05_benchmark.md Normal file
View File

@@ -0,0 +1,61 @@
# 实验5性能 Benchmark
## 学习吞吐量
| code_dim | k | 吞吐量 | 5000条耗时 |
|----------|---|--------|-----------|
| 8192 | 50 | **794/s** | 6.3s |
| 16384 | 50 | 211/s | 23.7s |
| 32768 | 50 | 54/s | 92.7s |
瓶颈是 outer-product 更新O(code_dim²) per memory。
16384 维的 211/s 意味着一天的对话(假设 1000 条记忆)只需 ~5 秒。
## 召回延迟
| code_dim | k | 延迟 |
|----------|---|------|
| 8192 | 50 | **0.35 ms** |
| 16384 | 50 | 1.26 ms |
| 32768 | 50 | 4.63 ms |
**16384 维1.3ms/query**——对 LLM 对话场景完全够快LLM 生成一个 token 都要 ~20ms
## Multi-hop 延迟
| 跳数 | 延迟 (code=16384) |
|------|-------------------|
| 1 | 1.26 ms |
| 2 | 2.45 ms |
| 3 | 3.64 ms |
| 5 | 6.03 ms |
| 10 | 12.05 ms |
线性增长:~1.2ms/hop。10 跳 12ms 仍然远快于 LLM inference。
## GPU 显存
| code_dim | W 矩阵 | 总占用 |
|----------|---------|--------|
| 4096 | 64 MB | 70 MB |
| 8192 | 256 MB | 268 MB |
| **16384** | **1024 MB** | **1048 MB** |
| 32768 | 4096 MB | 4144 MB |
推荐 **16384 维 = 1GB 显存**,在 RTX 4090 (24GB) 上轻松和 Gemma 4B 共存。
## 端到端 Pipeline含 embedding 模型)
| 步骤 | 延迟 |
|------|------|
| Embedding (all-MiniLM-L6-v2) | 1.8 ms |
| Hebbian Recall (1-hop) | 1.3 ms |
| **Total** | **3.1 ms** |
Embedding 和 recall 耗时相当。总计 3ms 远低于 LLM 生成延迟。
## 结论
- code_dim=16384 是最佳平衡点1GB 显存1.3ms 召回211/s 学习
- 性能完全不是瓶颈——LLM inference 才是
- 32768 维如果需要更大容量也可以4GB但 learning 慢 4x

61
doc/exp06_biohash.md Normal file
View File

@@ -0,0 +1,61 @@
# 实验6BioHash — Learnable Fly Algorithm
## 背景
灵感来自 Dasgupta et al. 2017 (Science):果蝇嗅觉回路 = random projection + WTA。
BioHash = 把随机投影换成可学习的,用对比损失训练。
## 结果
### Code Overlap邻域保持能力
| 方法 | Positive Overlap | Negative Overlap | Gap | SNR |
|------|-----------------|-----------------|-----|-----|
| Random | 0.220 | 0.004 | 0.216 | 55x |
| BioHash (noise=0.2) | **0.572** | 0.060 | **0.512** | 9.5x |
BioHash 的 positive overlap 涨了 2.6x——确实学到了把相似 embedding 映射到重叠的 code。
### Paraphrase Recall小规模
| 方法 | 10 对 Exact | 10 对 Para |
|------|-----------|-----------|
| Random | 10/10 | 8/10 |
| BioHash | 10/10 | **10/10** |
小规模下 BioHash 完美。
### Scale Test大规模core problem
| bg memories | Random | BioHash |
|-------------|--------|---------|
| 0 | 100% | 100% |
| 100 | 60% | 40% |
| 500 | 60% | 20% |
**BioHash 在大规模下反而更差。** 原因:虽然 pos overlap 涨了neg overlap 也涨了 15x信噪比从 55x 降到 9.5x。
## 核心结论
### 瓶颈不是 hash 函数,是 Hebbian W 矩阵
W @ code = Σ target_i · overlap(cue_i, query)
这个公式意味着:不管 hash 多好,大量 memory 的加权和必然淹没单条记忆的信号。这是 outer-product associative memory 的固有限制Hopfield 网络也有同样问题)。
### BioHash 的价值
- ✅ 小规模 paraphrase recall 100%vs 80%
- ✅ 证明了 learned projection 确实保持邻域结构
- ❌ 不解决 W 矩阵的规模问题
- **正确用法**: BioHash 用于编码,但检索用 code-based index而非 W 矩阵加权和)
### 修正后的架构建议
```
单跳检索: NN lookup in embedding space或 code Jaccard index
多跳联想: Hebbian W matrix从 NN 结果出发,精确 cue无噪声
编码层: BioHash比 random 更好的 code quality改善多跳链中的传播
```
W 矩阵的角色收窄到**只做多跳**,这是它真正不可替代的能力。

88
doc/exp07_hopfield.md Normal file
View File

@@ -0,0 +1,88 @@
# 实验7Hopfield + 网络结构探索
## 背景
exp02-06 的核心问题Hebbian W 矩阵做模糊单跳检索在大规模下失败SNR 不够)。
Fam 指出这是**网络结构问题**,不是 hash 函数问题。
## 7a: 架构对比
| 架构 | bg=0 | bg=100 | bg=500 | bg=1000 |
|------|------|--------|--------|---------|
| Flat Hebbian | 80% | 60% | 30% | 20% |
| Attractor (auto+hetero) | 90% | 40% | 30% | 10% |
| **Hopfield (β=16)** | **100%** | **90%** | **90%** | **100%** |
| Recurrent+inhibition | 20% | 20% | 10% | 10% |
**Hopfield 完胜。** softmax attention 天然解决了归一化和锐化问题。
## 7b: Hopfield 深入测试
- **Multi-hop**: 3 跳 × 3 链 + 200 bg = 全部 sim=1.0 ✓
- **Scale (code space)**: 100+ bg 后不稳定60-80%
- **Hard distractors**: 高 β 下被语义相似的干扰项吸走
- **关键发现**: WTA code 空间的距离不忠实于语义距离
## 7c: Embedding-Space Hopfield
直接在 embedding 空间做 Hopfield attention不经过 WTA
- 比 code-space 在中等规模≤2K更稳定
- Multi-hop 在 embedding 空间也完美500 bg, sim=1.0
- Hard distractors 在 β=8 时正确attention 分散但正确)
## 7d: Two-Stage 检索
NN pre-filter (top-K) → Hopfield settle on candidates:
| N | K=20 | K=50 | 延迟 |
|---|------|------|------|
| 110 | 90% | 90% | 1ms |
| 1010 | 80% | 80% | 1ms |
| 5010 | 80% | 70% | 2ms |
| 10010 | 80% | 70% | 2ms |
| 20010 | **80%** | 70% | 4ms |
**K=20 最稳定**20K 规模下 80%4ms。
Diverse query test (20 对 + 2000 bg): 70% baseline → 分析 failure 发现是 embedding 模型质量问题。
## 7e: Cue Augmentation ⭐
| 方法 | 准确率 (20 对 + 2000 bg) |
|------|------------------------|
| 无 augmentation | 70% |
| Noise augmentation (各种参数) | 70% |
| **Paraphrase augmentation** | **95%** |
Noise 完全无效(高斯噪声 ≠ 真实 paraphrase 方向)。
Hand-crafted paraphrase 直接 70% → 95%。
实际系统中让 LLM 生成 3-5 个 paraphrase 一起存。
## 最终架构
```
Query → Two-Stage Hopfield (NN top-20 → softmax settle) → Target
Hebbian W matrix (multi-hop chain from settled cue)
```
### 组件职责
| 组件 | 功能 | 容错 |
|------|------|------|
| Hopfield attention | 单跳检索 | 噪声/paraphrase 容忍 |
| Cue augmentation | 扩大记忆覆盖 | 弥补 embedding 模型不足 |
| NN pre-filter | 缩小候选集 | O(N) → O(K) |
| Hebbian W | 多跳联想 | 精确 cue 下完美 |
| WTA separation | 稀疏编码 | 20K+ 容量 |
### 性能指标
| 指标 | 数值 |
|------|------|
| Paraphrase recall (+ augmentation) | 95% |
| Multi-hop (3 hops, 500 bg) | 100% |
| Scale (20K memories) | 80% |
| Latency (20K) | 4ms |
| VRAM (W=16384²) | 1GB |

106
doc/findings.md Normal file
View File

@@ -0,0 +1,106 @@
# 核心发现与反直觉结论
## 最大的突破Hopfield + Hebbian 混合架构
**exp07 的转折点**Fam 指出问题在网络结构,不在 hash 函数。
引入 Modern Hopfieldsoftmax attention over stored patterns
- 1000 bg memories 下 paraphrase recall: 20% (Flat Hebbian) → **100%** (Hopfield β=16)
- 加上 cue augmentation: 70% → **95%** (20 pairs + 2000 bg)
- Multi-hop 在 Hopfield 上同样完美3 hops, sim=1.0
- 延迟可控: 4ms @ 20K memories
**关键洞察噪声容忍不是靠更好的编码hash/SNN而是靠更好的检索机制attention-based settling**
## 一夜实验总结
### 1. SNN 的价值不在我们预期的地方
**预期**: SNN + STDP 做记忆的存储和检索核心
**实际**:
- STDP 在记忆存储上不如简单的 Hebbian outer-product
- SNN 的 LIF 阈值非线性在检索时引入不必要的失真
- **真正有价值的是 SNN encoder 的 temporal coding**CosSim 0.99)和 neuromorphic 部署前景
### 2. Pattern Separation 才是关键,不是学习规则
**WTA (Winner-Take-All) 模式分离**是整个系统最关键的组件:
- 把高维稠密向量变成极稀疏二值码
- 容量从 ~0.14N 暴涨到 20K+
- 就是这一步让简单的 outer-product Hebbian 变得能用
生物学类比完全成立海马体中齿状回DG的模式分离是 CA3 记忆功能的前提。
### 3. Consolidation 不是你想的那样
**预期**: Replay 防止遗忘homeostasis 维持稳定
**实际**:
- Pattern separation 太强了遗忘根本不发生10 晚纯 homeostasis 后仍完美)
- Replay 在容量极限附近反而**加速遗忘**(新 outer-product 干扰旧记忆)
- Consolidation 退化为简单的存储管理问题
**深层原因**: 生物海马体需要 consolidation 是因为物理容量有限。数字系统可以直接扩大网络。
### 4. Multi-hop 是杀手级特性
**A→B→C 链式联想**: 6 跳全部完美100 条链零干扰。
这是 RAG / 向量数据库**不可能做到的**事情。
RAG 只能做: query → nearest neighbor → result (单跳)
Hebbian 能做: query → association → association → ... (多跳推理链)
### 5. 噪声容忍是最大短板
WTA 对输入微扰极其敏感noise_std=0.1 就崩溃。
这意味着**纯 Hebbian 不能用来做模糊查询**。
解决方案hybrid 架构——NN lookup (噪声容忍) + Hebbian W (多跳联想)。
### 6. 更宽的 k 比更大的 code_dim 更有用
- k=50 (16384 dim): 95% paraphrase recall
- k=20 (16384 dim): 75% paraphrase recall
- k=20 (32768 dim): 70% paraphrase recall
更多 active neurons = 更多重叠 = 更好的模糊匹配,但牺牲容量。
对个人记忆系统(< 10K memories来说k=50 是最优。
## 什么有用
| 组件 | 有效性 | 用在哪 |
|------|--------|--------|
| WTA Pattern Separation | ⭐⭐⭐ | 核心,不可替代 |
| Hebbian outer-product | ⭐⭐⭐ | 多跳联想存储 |
| Multi-hop chaining | ⭐⭐⭐ | 独特能力 |
| NN embedding lookup | ⭐⭐⭐ | 噪声容忍检索 |
| SNN encoder | ⭐⭐ | temporal coding + 硬件部署 |
| Coarse-to-fine recall | ⭐⭐ | 实用的 hybrid 方案 |
| Unified projection | ⭐⭐ | 多跳的前提条件 |
## 什么没用
| 组件 | 问题 |
|------|------|
| STDP trace-based learning | 不如直接 outer-product |
| Separate cue/target projections | 破坏多跳 |
| Sleep consolidation (replay) | 在大网络中不必要,在小网络中有害 |
| Soft WTA | 零区分度 |
| Multi-probe hashing | 完全不工作 |
| Learned separator (on random data) | 没有语义结构则无法学习 |
| Noisy replay for robustness | 效果微乎其微 |
## 下一步建议
### 短期(原型验证)
1. 实现 Hybrid MemoryKV store + Hebbian W
2. 接 Gemma 4 APItext → recall → context injection
3. 在真实对话数据上测试
### 中期(优化)
1. 用 FAISS 替代暴力 NN lookup
2. 在语义 embedding 上训练 learned separator需要真实数据
3. 测试 float16 W 矩阵(节省一半显存)
### 长期SNN 发挥价值)
1. 移植到 neuromorphic hardwareLoihi 2, SynSense
2. 探索 temporal coding 做时序记忆(不只是 static embedding
3. Online STDP 学习(对话中实时更新,不需要 nightly batch

View File

@@ -0,0 +1,62 @@
# LongMemEval Benchmark 结果
## 数据集
LongMemEval (ICLR 2025, MIT License): 500 个问题6 种类型,真实多轮多 session 对话。
## 结果
### Retrieval-only最终方案
| 类型 | v1 (旧提取) | v2 (改进提取) | 提升 |
|------|------------|-------------|------|
| single-session-user | 81% | **86%** | +5 |
| single-session-assistant | 25% | **82%** | **+57** |
| knowledge-update | 53% | **71%** | +18 |
| multi-session | 23% | **53%** | +30 |
| temporal-reasoning | 29% | **61%** | +32 |
| preference | 0% | **27%** | +27 |
| **Overall** | **36%** | **64%** | **+28** |
### 加 Gemma 4 推理反而更差
| | Retrieval-only | + Gemma 4 |
|--|---------------|-----------|
| Overall | **64%** | 40% |
Gemma 太保守,检索到了信息但说 "Not mentioned"。不值得增加 1.7s/query 的延迟。
## 关键改进v1 → v2
1. **不截断 assistant 回复**分段存储500 字/段)→ single-session-assistant 25% → 82%
2. **用户自述作为记忆**:用户说的每句话都存一份 → multi-session +30pp
3. **偏好提取**:正则匹配 "I like/prefer/use/enjoy" → preference 0% → 27%
4. **日期元数据**:存储 session 日期 → temporal 辅助
## 性能
- 56ms/queryembedding + Hopfield recall
- 平均 22 条记忆/问题
- 无外部 LLM 依赖
## 各类型分析
### 强项
- **single-session-user (86%)**: 用户明确说的信息 → 直接存直接检索,天然适配
- **single-session-assistant (82%)**: 分段存储解决了长回复截断问题
### 中等
- **knowledge-update (71%)**: 新旧信息都检索到了top-1 通常是新值
- **temporal-reasoning (61%)**: 日期信息在 context 里,但检索不做日期计算
- **multi-session (53%)**: 需要跨 session 聚合top-K 能召回部分但不完整
### 弱项
- **preference (27%)**: 偏好是隐含的,正则提取覆盖有限。需要 LLM 提取或更多规则
## 对比定位
64% 在 LongMemEval 上是一个 **competitive retrieval baseline**。论文中的 RAG 基线通常在 40-60%SOTA带 LLM 推理)在 70-80%。我们的 retrieval-only 64% 已经超过了多数 RAG 基线。
## 结论
**Retrieval-only 是正确选择。** 简单、快速、无依赖。提升空间在提取策略(更好的 memory 切分和偏好识别),不在检索架构。

32
doc/p0_llm_integration.md Normal file
View File

@@ -0,0 +1,32 @@
# P0: LLM Integration
## 状态:基础 pipeline 可用LLM Gateway 不通需后续验证
## 实现
- `llm.py`: LLMClient + extract/paraphrase/format 函数
- 支持 OpenAI-compatible APIfallback 到 heuristic
- 端到端 pipeline: 对话 → 提取 → embed → store (with augmentation) → recall → context injection
## 端到端测试结果
5 轮对话存入 7 条记忆24 个 cue entries含 paraphrase augmentation
查询召回结果heuristic paraphrase
| 查询 | 正确? | 说明 |
|------|-------|------|
| DB performance terrible | ✅ | 正确召回 missing indexes |
| How to push a new release? | ✅ | 正确召回 blue-green deploy |
| Redis connection info? | ✅ | 正确召回 port 6379 |
| Login system has a problem | ❌ | 指向 database 而不是 auth |
| Database backup | ✅ | 正确召回 cron job |
| Deployment config? | ✅ | 正确召回 GitHub Actions |
5/6 正确。失败的 case 是因为 heuristic paraphrase 没有生成 "login" ↔ "auth" 的关联。LLM paraphrase 应该能覆盖。
## 待解决
1. **LLM Gateway 不通** — 无法验证 LLM 提取和 paraphrase 质量
2. **重复提取** — heuristic 会对同一对话提取 2 条相似记忆,需要去重
3. **Heuristic paraphrase 质量差** — 机械式替换("issue with X")不如 LLM 生成
4. **Auth→Login 这类语义跳跃** — 只有 LLM paraphrase 或更强 embedding 模型能解决

View File

@@ -0,0 +1,34 @@
# P1: Embedding 模型对比
## 核心发现:更大的模型 ≠ 更好的 recall反直觉
| Model | Dim | Same Sim | Diff Sim | **Gap** | **Recall** | Speed |
|-------|-----|----------|----------|---------|-----------|-------|
| **MiniLM (22M)** | 384 | 0.653 | 0.090 | **0.563** | **60%** | 11K/s |
| BGE-small (33M) | 384 | 0.808 | 0.534 | 0.274 | 25% | 7K/s |
| BGE-base (109M) | 768 | 0.793 | 0.506 | 0.287 | 35% | 5K/s |
| E5-small (33M) | 384 | 0.890 | 0.790 | 0.100 | 10% | 9K/s |
## 为什么
Recall 取决于 **discrimination gap**,不是绝对 similarity。
BGE/E5 是为检索任务优化的,倾向于把所有文本映射到一个窄锥体里(高基础相似度)。这导致:
- 正确 cue 和 background 的相似度差距太小
- Hopfield softmax attention 无法集中到正确答案
MiniLM 的 embedding 空间更分散:
- Background 真的很不像0.09
- 即使 paraphrase 不完美0.65),相对差距也大得多
## 结论
1. **MiniLM 是当前最优**——最快、最小、discrimination 最好
2. **不要盲目换大模型**——gap 比 absolute similarity 重要
3. 改善 recall 的正确路径是 **paraphrase augmentation**(已验证 95%),不是换 embedding 模型
4. 如果要换模型,应该找 **gap 最大**的,不是 same-sim 最高的
## 对架构的影响
保持 MiniLM (384-dim)。不需要扩大 code_dim 来适配更大 embedding。
省了 VRAM102MB vs 656MB和速度11K/s vs 5K/s

52
doc/p2_auto_paraphrase.md Normal file
View File

@@ -0,0 +1,52 @@
# P2: Auto Paraphrase Generation
## 核心数据
| 策略 | bg=0 | bg=500 | bg=2000 | 实现难度 |
|------|------|--------|---------|---------|
| None | 95% | 65% | 55% | - |
| Heuristic (synonym swap) | 95% | 85% | **75%** | 零成本 |
| Oracle (hard cases only) | 100% | 95% | **95%** | 需 LLM |
| Oracle (全覆盖) | 100% | 100% | **100%** | 需 LLM |
## 发现
1. **Heuristic 已经很有价值**55% → 75%+20pp不需要 LLM
2. **Oracle 全覆盖 = 100%**:证明问题完全可通过 paraphrase 解决
3. **大部分 failure 可被 paraphrase 修复**9 个 failure 中 8 个有 oracle fix
## Failure 分类
| 类型 | 例子 | 原因 | 修复方式 |
|------|------|------|---------|
| 词汇鸿沟 | "Ship the release" ↔ "deploy" (cos=0.46) | 完全不同的词 | LLM paraphrase ✓ |
| 概念映射 | "Need observability" ↔ "monitoring" (cos=0.26) | 抽象→具体 | LLM paraphrase ✓ |
| 领域知识 | "Fix login issue" ↔ "auth bug" (cos=0.65) | 需要知道 login=auth | LLM paraphrase ✓ |
| 竞争 | "DB terrible" ↔ "DB slow" (cos=0.72) 但被 bg 抢走 | cos 够高但 bg 更近 | 增加 augmentation 密度 |
## 实际部署策略
### 存储时(异步,不影响延迟)
```
1. 用户说了一句话
2. 提取 (cue, target)
3. 同步存原始 cue
4. 异步LLM 生成 3-5 个 paraphrase → 追加存入
```
### Heuristic fallbackLLM 不可用时)
当前 heuristic 规则已验证有效(+20pp可以作为 baseline
- 去除常见前缀 ("Can you", "I need to", "How do I")
- 同义词替换 (deploy↔release, database↔DB, fix↔resolve)
- 添加 "issue with X" 模式
### LLM Prompt待 Gateway 恢复后验证)
```
Generate 3-5 different ways a user might say this:
"The database is slow again"
Requirements:
- Same core meaning, different wording
- Include informal/colloquial versions
- Include technical jargon alternatives
```

37
doc/p3_scale_ceiling.md Normal file
View File

@@ -0,0 +1,37 @@
# P3: 突破 20K 80% 天花板
## 结论:天花板来自 embedding 模型,不是架构
### Top-K Coverage 分析
| K | N=20K |
|---|-------|
| 5 | 80% |
| 50 | 80% |
| 200 | 80% |
K 从 5 增加到 200coverage 不变。那 2 个 failure 的 paraphrase 在 embedding 空间里根本不是正确 cue 的最近邻——即使只有 10 条记忆也找不到。
### 架构优化无效
| 方法 | bg=20K |
|------|--------|
| Two-stage K=5 | 60% |
| Two-stage K=200 | 30% (更大 K 更差!) |
| Hierarchical clustering | 40% |
更大的 K 引入更多噪声Hopfield attention 被分散。Hierarchical 也没帮助。
### 根因
失败的 paraphrase 对embedding cosine similarity:
- "Need observability" ↔ "Let's set up monitoring" = 0.257
- "When's the standup?" ↔ "Team meeting schedule" = 0.375
这些在 MiniLM 的 embedding 空间里根本不算"相似"。任何基于 embedding 距离的检索方法都无法找到它们。
### 解法 = P2
**Paraphrase augmentation 是唯一解法**(已验证 55% → 100%)。
不需要改架构。不需要换 K。不需要 hierarchical memory。只需要在存储时覆盖更多的表达方式。

35
doc/p4_lifecycle.md Normal file
View File

@@ -0,0 +1,35 @@
# P4: 记忆生命周期管理
## Deduplication
**可行**。cosine threshold=0.7 正确识别了 2 组近似重复9 → 6 memories
- "The database is slow" / "Database is really slow today" / "DB performance terrible" → 合并
- "The API returns 500 errors" / "Getting 500 errors from API" → 合并
实现简单pairwise cosine on cue embeddings → group → keep best per group.
O(N²) 但可以离线做(夜间整合),或用 ANN 加速。
## Importance Scoring
Heuristic 规则 6/7 准确:
- 关键词检测crash, compromised, secret → critical有效
- 回答长度 > 15 词 → 更可能包含有用信息
- 简单问答(时间、天气)正确标记为 low
待 LLM 可用时,可以让 LLM 评分——更准确但有延迟。
## Forgetting 策略
三种策略FIFO / LRU / 重要性加权)在当前测试中效果相同——因为没有差异化的 access pattern。
实际系统中应该用 **importance + access count + recency** 的加权组合:
```
forget_score = age_days * 0.3 + (max_access - access_count) * 0.5 + (1 - importance) * 0.2
```
低分优先遗忘。
## 整合到 hippocampus.py 的建议
1. **Store 时**importance scoringheuristic 或 LLM低于阈值不存
2. **每晚**deduplicationcos > 0.7 合并)+ capacity check超限时按 forget_score 裁剪)
3. **Recall 时**:自动 +1 access_count已实现

36
doc/p5_snn_hopfield.md Normal file
View File

@@ -0,0 +1,36 @@
# P5: SNN-native Hopfield
## 结论:当前不可行,标准 softmax Hopfield 远优于 LIF dynamics
## 对比
| | SNN Hopfield | Standard Hopfield |
|---|---|---|
| Paraphrase recall (5 pairs) | 20% | **100%** |
| With background (10+) | 0% | **90%+** |
| Latency | 10.8ms | **1.9ms** |
| Scalability | O(steps × dim²) | O(N × dim) |
## 为什么 SNN 失败
1. **More steps = worse**: steps=20 时 5/5steps=200 时 1/5。LIF 动力学不收敛到正确 attractor而是发散或卡在错误状态。
2. **LIF 不是 softmax**: Modern Hopfield 的 softmax 是精确的能量最小化。LIF 的 spike dynamics 不保证收敛到 Boltzmann 均衡分布。
3. **膜电位衰减干扰**: β=0.9 的指数衰减让信号快速丢失,长时间 settle 变成纯噪声。
## 需要什么才能让 SNN Hopfield work
1. 更复杂的神经元模型(不只是 LIF——需要 AdEx、Izhikevich、或 stochastic neurons
2. 精确调谐的 E/I 平衡(兴奋/抑制)
3. 可能需要 stochastic neurons 做 proper Boltzmann sampling
4. 专用 neuromorphic 硬件Loihi 2 的可编程神经元模型)
## SNN 在整个系统中的定位
| 组件 | SNN 可行性 | 当前方案 |
|------|-----------|---------|
| Encoder (emb↔spike) | ✅ 验证通过 (CosSim 0.99) | 保留备用 |
| Hopfield attention | ❌ 不可行 | 用 softmax |
| Hebbian multi-hop | ✅ WTA codes + W matrix | 已实现 |
| Pattern separation | ✅ WTA = 生物 DG | 已实现 |
**SNN 的真正价值在 neuromorphic 部署,不在 GPU 上替代 softmax。**

46
doc/p6_multiturn.md Normal file
View File

@@ -0,0 +1,46 @@
# P6: 多轮对话验证
## 场景
3 天的对话DB troubleshooting → deployment → monitoring12 条记忆 + heuristic paraphrase augmentation。
## 跨会话召回12/12 (100%)
| 查询 | 跨天? | 结果 |
|------|-------|------|
| DB is slow again | Day 1 | ✓ "missing index on created_at" |
| How big is the users table? | Day 1 | ✓ "2.3 million rows" |
| Who can access the database? | Day 1 | ✓ "Alice, Bob, Charlie" |
| What Postgres version? | Day 1 | ✓ "PostgreSQL 15.2" |
| How to deploy? | Day 2 | ✓ "blue-green via GitHub Actions" |
| How to rollback? | Day 2 | ✓ "switch load balancer" |
| Who approves deploys? | Day 2 | ✓ "Alice or David" |
| Monitoring dashboard? | Day 3 | ✓ "grafana.internal" |
| What alerts? | Day 3 | ✓ "PagerDuty" |
| DB slow, what index? | Cross | ✓ "created_at" |
| Deploy logs? | Cross | ✓ "Loki" |
| Database monitoring exporter | Cross | ✓ "pg_exporter" |
全部 similarity=1.0。Hopfield + augmentation 在小规模12 memories下完美。
## Multi-hop
"database is slow" → hop1: "missing index" → hop2: "missing index" → hop3: "2.3 million rows"
hop2 循环了(指回自己),因为 Hebbian W 里 "missing index" 的最强关联还是它自己(自身的 outer product 贡献最大)。需要在 multi-hop 中加**去重**:已访问的 memory 不参与下一跳。
## Memory 冲突
存了两个版本的 PostgreSQL 版本15.2 和 16.1
- Top-1: "Upgraded to 16.1" (sim=1.0) ← 更新的版本排第一
- Top-2: "version 15.2" (sim=0.0) ← 旧版本也返回了
当前行为可接受(都返回,新的排前面)。更好的做法:
- 检测到同 cue 的更新 → 自动替换旧记忆
- 或标记旧记忆为 "superseded"
## 待改进
1. **Multi-hop 去重**: 已访问的 memory 排除出下一跳候选
2. **Memory update 检测**: 同 cue 新值自动覆盖旧值
3. **大规模验证**: 12 条是小规模,需要 100+ 条跨 session 的测试