| { |
| "rgcn_link_prediction": { |
| "validation": { |
| "mean_reciprocal_rank": 0.0734197945466392, |
| "hits_at_10": 0.14442630250853494, |
| "hits_at_1": 0.03933501558557221 |
| }, |
| "testing": { |
| "mean_reciprocal_rank": 0.07925546916450926, |
| "hits_at_10": 0.15405164737310775, |
| "hits_at_1": 0.04407836153161175 |
| }, |
| "split_counts": { |
| "train": 121266, |
| "validation": 6737, |
| "test": 6738 |
| }, |
| "transe_init": true |
| }, |
| "rollup": { |
| "recorded_at": "2026-06-05", |
| "phase2_targets": { |
| "link_pred_mrr": 0.2, |
| "source": "TODO.md Phase 2 readiness criterion" |
| }, |
| "link_prediction_split": { |
| "train": 121266, |
| "validation": 6737, |
| "test": 6738, |
| "ratios": [ |
| 0.9, |
| 0.05, |
| 0.05 |
| ], |
| "seed": 42 |
| }, |
| "transe": { |
| "config": "data/processed/transe_config.json", |
| "artifacts": "data/processed/transe_emb.pt", |
| "hyperparams": { |
| "embedding_dim": 128, |
| "learning_rate": 0.001, |
| "batch_size": 256, |
| "num_epochs": 200, |
| "num_negs_per_pos": 10 |
| }, |
| "validation": { |
| "mean_reciprocal_rank": 0.0688, |
| "hits_at_10": 0.1718, |
| "hits_at_1": 0.0056 |
| }, |
| "testing": { |
| "mean_reciprocal_rank": 0.0684, |
| "hits_at_10": 0.1702, |
| "hits_at_1": 0.0045 |
| }, |
| "meets_mrr_target": false |
| }, |
| "rgcn": { |
| "config": "data/processed/rgcn_config.json", |
| "artifacts": "checkpoints/wikimovies_rgcn.pt", |
| "hyperparams": { |
| "hidden_dim": 128, |
| "num_layers": 2, |
| "num_bases": 4, |
| "learning_rate": 0.001, |
| "batch_size": 1024, |
| "num_epochs": 50, |
| "num_negs_per_pos": 10, |
| "transe_init": true, |
| "frozen_after_train": true |
| }, |
| "validation": { |
| "mean_reciprocal_rank": 0.0734, |
| "hits_at_10": 0.1444, |
| "hits_at_1": 0.0393 |
| }, |
| "testing": { |
| "mean_reciprocal_rank": 0.0793, |
| "hits_at_10": 0.1541, |
| "hits_at_1": 0.0441 |
| }, |
| "meets_mrr_target": false, |
| "vs_transe": { |
| "test_mrr_delta": 0.0109, |
| "test_hits10_delta": -0.0161, |
| "note": "MRR slightly up; Hits@10 down vs TransE" |
| } |
| }, |
| "hf_publish": { |
| "model_name": "wikimovies-transe-rgcn", |
| "version": "v1-experimental", |
| "status": "staged_locally", |
| "staging_dir": "models/wikimovies-transe-rgcn", |
| "upload_script": "scripts/publish_encoder_hf.py", |
| "note": "Experimental baseline; expect v2 after remediation. Upload requires: hf auth login && python scripts/publish_encoder_hf.py --repo-id USER/wikimovies-transe-rgcn --upload" |
| }, |
| "encode_api": { |
| "module": "graph_align/encoders/encoder.py", |
| "checkpoint": "checkpoints/wikimovies_rgcn.pt", |
| "benchmark": "results/encode_benchmark.json", |
| "num_subgraphs": 1000, |
| "split": "poc_train", |
| "per_subgraph_ms": { |
| "cpu_node": 2.98, |
| "cpu_graph": 2.91, |
| "mps_node": 40.32, |
| "mps_graph": 30.86 |
| }, |
| "note": "Sequential per-subgraph forward; MPS slower than CPU on small subgraphs (kernel launch overhead). Use CPU or batched encode_subgraphs for inference." |
| }, |
| "retrieval": { |
| "config": "data/processed/config.json", |
| "hop_max": 3, |
| "n_max": 500, |
| "train_samples": 114196, |
| "answer_in_khop_rate": 1.0, |
| "answer_in_retrieved_rate": 0.5623, |
| "meets_retrieval_target": false, |
| "note": "No formal MRR target; 56% cap coverage is QA bottleneck separate from link-pred MRR" |
| }, |
| "gaps": [ |
| { |
| "id": "link_pred_mrr", |
| "current": 0.079, |
| "target": 0.2, |
| "metric": "rgcn test MRR", |
| "blocks_mvp": false, |
| "blocks_phase2_criterion": true |
| }, |
| { |
| "id": "retrieval_coverage", |
| "current": 0.562, |
| "target": null, |
| "metric": "answer_in_retrieved_rate at N_max=500", |
| "blocks_mvp": false, |
| "note": "44% train QA: gold answer outside capped subgraph" |
| } |
| ], |
| "remediation": { |
| "link_pred_mrr": [ |
| { |
| "priority": 1, |
| "action": "Stronger KGE init: train ComplEx or RotatE (PyKEEN) on same split; use as R-GCN node init", |
| "expected": "Often +0.05\u20130.15 MRR on multi-rel KGs vs TransE L1", |
| "effort": "medium" |
| }, |
| { |
| "priority": 2, |
| "action": "R-GCN hyperparam sweep: 100\u2013200 epochs, lr 5e-4, dropout 0.1, num_bases=9, unfreeze/finetune init", |
| "expected": "Modest MRR gain; current 50-epoch run under-trained", |
| "effort": "low" |
| }, |
| { |
| "priority": 3, |
| "action": "Better negative sampling: type-constrained / degree-aware (PyKEEN Bernoulli or LCWA+filtered)", |
| "expected": "Better ranking tail prediction", |
| "effort": "medium" |
| }, |
| { |
| "priority": 4, |
| "action": "Add inverse relations (+9 rels) and self-loops in message-passing graph", |
| "expected": "Improves undirected reachability in conv layers", |
| "effort": "medium" |
| }, |
| { |
| "priority": 5, |
| "action": "Calibrate eval: run PyKEEN TransE/ComplEx baseline on identical split; verify our eval matches", |
| "expected": "Rule out eval implementation gap", |
| "effort": "low" |
| } |
| ], |
| "retrieval_coverage": [ |
| { |
| "priority": 1, |
| "action": "Raise N_max budget (1000 / 2000) and rebuild subgraphs; re-measure answer_in_retrieved_rate", |
| "expected": "Direct lift toward 80%+ retrieved; linear cost in subgraph size", |
| "effort": "low", |
| "command": "python scripts/build_subgraphs.py --n-max-budget 2000" |
| }, |
| { |
| "priority": 2, |
| "action": "Smarter truncation: hop-first then degree (already); add answer-aware cap ablation for upper bound", |
| "expected": "Diagnostic only \u2014 sets ceiling for retrieval", |
| "effort": "low" |
| } |
| ], |
| "mvp_path": "Proceed with frozen R-GCN (MRR 0.08) + N_max=500 (56% retrieval): link-pred MRR is init quality; QA accuracy driven mainly by retrieval + projection alignment, not global MRR>0.2." |
| } |
| } |
| } |