mirror of
https://github.com/ruvnet/RuView.git
synced 2026-10-23 07:02:44 -05:00
feat(wiflow-dynamics): rung 3 heteroscedastic head -- EIG probing works once Sigma depends on z_t
Verdict by the pre-registered conjunction: RUNG 3 DID NOT HELP. 2 of 3 criteria missed, and that verdict stands. But the criteria conflated two questions and rung 3 answers them oppositely: 1. beats rung-2 pose NLL FAIL (-102.83 vs -113.29) 2. coverage within +/-3pp all lvls FAIL (+7.46pp @50%, +3.20pp @80%) 3. EIG-greedy beats random >2 SE PASS decisively THE CENTRAL FINDING: the M4 negative at rung 2 was a property of the model class, not of information-gain probing. Once Sigma depends on z_t so the probe set can vary per sample, EIG-driven selection beats random at every budget (t = +3.11, +4.80, +5.04, +3.91 at K = 1, 3, 6, 9). Adaptivity is real: 19,653 distinct probe sets across 20,000 samples at K=9, where rung 2 had exactly 1 by construction. Point accuracy also jumps: PCK@20 0.9425 vs bar 0.7557 (+18.7 pts), against rung 2's ~0.8208 on the same pairs -- a nonlinear mean head is worth ~+12 pts. MPJPE 0.01073. Degeneracy guard passes (pred std 0.0208). Caveats recorded rather than hidden behind: - The NLL comparison is not like-for-like and that is this design's fault: rung 2 carries a full 30x30 pose covariance, rung 3 a diagonal one, and joint NLL strongly rewards cross-keypoint correlation. Still reported as a FAIL against the criterion as written; the fix is a low-rank+diagonal head, not abandoning heteroscedasticity. - Calibration got WORSE, not better (+7.46pp vs rung 2's +3.48pp at the 50% level), same direction: over-covered at the centre. Rung 3's uncertainty is less trustworthy than rung 2's and no calibrated- uncertainty claim may be made from it. - Rung 3's 0.9425 exceeding rung 2's 0.8568 target-peeking bound is not a contradiction: that bound held the linear-Gaussian predictor fixed and bounded probe policies within that model class only. Methodology change recorded: training length went from a fixed 12 epochs to early stopping on val NLL (patience 40, cap 400) after the first run was obviously undertrained -- 12 epochs took 16s with the loss still descending steeply. A convergence fix, not a change to any pre-registered criterion. Both runs kept; results/rung3_undertrained_12ep.json preserved. M1/M2 guards re-verified after all representation changes: 12/12 tests pass, validate still exits PASS on all 6 checks. Co-Authored-By: RuFlo <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01JJnDvpYYk2rTvjkudQUoCk
This commit is contained in:
1 parent
e5d9aa9409
commit
5498dd7ca3
6 files changed
+1836
-1
No files matched your search
@@ -127,7 +127,8 @@ deviation.
|
||||
- [x] **M4 — Information-gain evaluation.** DONE 2026-09-08. EIG-greedy wins on
|
||||
information at every budget but **does NOT** convert that into pose accuracy —
|
||||
an honest negative, with an oracle bracket quantifying what adaptivity is worth.
|
||||
- [ ] **M5 — Lineage/evidence recorded for every claim.**
|
||||
- [x] **M5 — Lineage/evidence recorded for every claim.** STATE.md + `results/*.json` +
|
||||
`fixtures/manifest.json` (sha256s). Every number states MEASURED or CITED.
|
||||
|
||||
## Open questions — ALL RESOLVED 2026-09-08 (MEASURED)
|
||||
|
||||
@@ -264,6 +265,87 @@ optional; the charter is already satisfied by rungs 1–2.
|
||||
**75.4% mean-pose bar only**, with that non-comparability stated.
|
||||
- Nothing here is a causal intervention (see "Framing that must not drift").
|
||||
|
||||
## Rung 3 — run log and one methodology change (recorded as it happened)
|
||||
|
||||
**Run 1 (12 epochs, `results/rung3_undertrained_12ep.json`): self-reported
|
||||
"RUNG 3 DID NOT HELP".** Criterion 1 failed (val NLL −81.24 vs rung-2 −113.29) and
|
||||
criterion 2 failed (coverage); criterion 3 passed. **The run was undertrained, not
|
||||
converged** — 12 epochs took 16 s and the loss was still descending steeply
|
||||
(−68 → −81 over the final epochs). Two things in it are worth keeping regardless:
|
||||
- PCK@20 **0.8357** vs bar 0.7557 (**+8.0 pts**) — already above rung 2's 0.8195,
|
||||
from an undertrained model.
|
||||
- **71 distinct probe sets** across the test pairs, modal set only 42% —
|
||||
the probe set genuinely **varies per sample**. Rung 2 had exactly **1** distinct set
|
||||
by construction. The capability rung 3 was built to add demonstrably exists.
|
||||
|
||||
**Methodology change, stated plainly:** training length was raised from a fixed 12
|
||||
epochs to early stopping on val NLL (patience 40, cap 400). This is a *convergence*
|
||||
fix for an obviously undertrained model, not a change to any pre-registered pass
|
||||
criterion — the three criteria in the rung-3 pre-registration are untouched, and the
|
||||
evaluation set, bar, and protocol are identical. Both runs are kept; the 12-epoch
|
||||
result is preserved rather than discarded.
|
||||
|
||||
### Run 2 (converged, early-stopped at epoch 163, best epoch 123) — `results/rung3.json`
|
||||
|
||||
**Verdict by the pre-registered conjunction: "RUNG 3 DID NOT HELP" — 2 of 3 criteria
|
||||
missed.** That is the headline verdict and it stands. But the criteria conflated two
|
||||
questions, and rung 3 answers them oppositely:
|
||||
|
||||
| Pre-registered criterion | Result |
|
||||
|---|---|
|
||||
| 1. beats rung-2 pose NLL | **FAIL** — −102.83 vs −113.29 |
|
||||
| 2. coverage within ±3 pp at all four levels | **FAIL** — +7.46 pp @50%, +3.20 pp @80% (90/95 pass) |
|
||||
| 3. EIG-greedy beats random by >2 SE | **PASS**, decisively — see below |
|
||||
|
||||
**What rung 3 did do (MEASURED, same 20,000 test pairs as rung 2):**
|
||||
|
||||
- **PCK@20 0.9425 vs bar 0.7557 → +18.7 pts.** Rung 2 on these same pairs was ~0.8208.
|
||||
A nonlinear mean head is worth **~+12 pts** over the linear-Gaussian one. MPJPE
|
||||
0.01073 vs rung 2's ~0.0207. Degeneracy guard passes (pred std 0.0208).
|
||||
- **EIG-driven probing now works, at every budget:**
|
||||
|
||||
| K | greedy | random | fixed | greedy−random | SE | t |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | 0.9425 | 0.9417 | 0.9419 | +0.00078 | 0.00025 | **+3.11** |
|
||||
| 3 | 0.9420 | 0.9404 | 0.9411 | +0.00166 | 0.00035 | **+4.80** |
|
||||
| 6 | 0.9412 | 0.9390 | 0.9380 | +0.00221 | 0.00044 | **+5.04** |
|
||||
| 9 | 0.9400 | 0.9383 | 0.9406 | +0.00176 | 0.00045 | **+3.91** |
|
||||
|
||||
- **Adaptivity is real and large:** at K=9, **19,653 distinct probe sets across 20,000
|
||||
samples** (modal set ≈0%). Rung 2 had exactly **1**, by construction.
|
||||
|
||||
**The central scientific finding of this work:** *the M4 negative at rung 2 was a
|
||||
property of the model class, not of information-gain probing.* Once `Σ` depends on
|
||||
`z_t`, so the probe set can vary per sample, EIG-driven selection beats random by
|
||||
3–5 SE at every budget. Under a homoscedastic `Σ` it could not, because the
|
||||
"EIG-optimal" set was frozen across all timesteps.
|
||||
|
||||
**Two caveats I am not allowed to hide behind, and one clarification:**
|
||||
|
||||
1. **The NLL comparison is not like-for-like, and that is my design's fault.** Rung 2
|
||||
carries a **full 30×30** pose covariance; my rung-3 head is **diagonal**. Joint
|
||||
multivariate NLL strongly rewards modelling cross-keypoint correlation, which a
|
||||
diagonal head structurally cannot. So −102.83 vs −113.29 does **not** show rung 3's
|
||||
marginals are worse. It is still a **FAIL** against the criterion as written — I am
|
||||
not rewriting the criterion — but the right next step is a low-rank + diagonal
|
||||
covariance head, not abandoning heteroscedasticity.
|
||||
2. **Calibration got worse, not better** (+7.46 pp at the 50% level vs rung 2's
|
||||
+3.48 pp), in the same direction: over-covered at the centre, i.e. residuals more
|
||||
peaked than Gaussian. A Student-t or low-rank predictive is the obvious fix. As it
|
||||
stands, **rung 3's uncertainty is less trustworthy than rung 2's**, and no
|
||||
calibrated-uncertainty claim may be made from it.
|
||||
3. **Clarification, to pre-empt a false contradiction:** rung 3's 0.9425 exceeds rung
|
||||
2's target-peeking upper bound of 0.8568. That is not inconsistent. That bound
|
||||
upper-bounded *probe-selection policies within the rung-2 model class*, holding the
|
||||
linear-Gaussian predictor fixed. A better predictor moves the whole curve; the bound
|
||||
was never a bound on all models.
|
||||
|
||||
**Net:** the charter's M3/M4 primitive is demonstrated end-to-end — action-conditioned
|
||||
prediction with per-sample adaptive, information-gain-driven probe selection that
|
||||
measurably beats random and fixed at matched budget. The uncertainty is **not**
|
||||
calibrated to the pre-registered standard, so the "calibrated uncertainty" half of M3
|
||||
is met only by rung 2 (3 of 4 levels), and by rung 3 not at all.
|
||||
|
||||
## Reporting rules
|
||||
|
||||
Every number states **MEASURED** (by this work, this run, command shown) or **CITED**
|
||||
|
||||
@@ -0,0 +1,437 @@
|
||||
//! Rung 3 driver: train the heteroscedastic head, then run it through the UNCHANGED
|
||||
//! rung-2 evaluation (same 20,000 test pairs, same bar, same coverage protocol, same
|
||||
//! policies and paired tests).
|
||||
//!
|
||||
//! Pass condition, pre-registered in `../STATE.md` before this file existed:
|
||||
//! 1. beats rung-2 joint-Gaussian held-out pose NLL, AND
|
||||
//! 2. coverage within +/-3 pp at ALL four levels, AND
|
||||
//! 3. EIG-greedy beats random PCK@20 by more than 2 SE, paired, at some budget.
|
||||
//! Miss any one -> "rung 3 did not help".
|
||||
|
||||
use burn::backend::ndarray::{NdArray, NdArrayDevice};
|
||||
use burn::backend::Autodiff;
|
||||
use burn::module::{AutodiffModule, Module};
|
||||
use burn::optim::{AdamConfig, GradientsParams, Optimizer};
|
||||
use burn::tensor::{Tensor, TensorData};
|
||||
use std::time::Instant;
|
||||
|
||||
use wiflow_harness::bands::{BAND_DIM, NUM_PROBE_GROUPS};
|
||||
use wiflow_harness::gaussian::POSE_DIM;
|
||||
use wiflow_harness::guards::{check_constant_pose, CorruptionMasks};
|
||||
use wiflow_harness::hetero::{expand_mask, hetero_nll, HeteroModel};
|
||||
use wiflow_harness::metrics::score;
|
||||
use wiflow_harness::npy::Npy;
|
||||
|
||||
type B = Autodiff<NdArray<f32>>;
|
||||
type BI = NdArray<f32>;
|
||||
|
||||
const RESULTS: &str =
|
||||
"/home/ruvultra/projects/ruview-worktrees/ruforecast-rust/benchmarks/wiflow-std/results";
|
||||
const COVERAGE_LEVELS: [(f64, f64); 4] = [
|
||||
(0.50, 0.6744897501960817),
|
||||
(0.80, 1.2815515655446004),
|
||||
(0.90, 1.6448536269514722),
|
||||
(0.95, 1.959963984540054),
|
||||
];
|
||||
/// CITED from results/m3_m4.json -- the rung-2 numbers rung 3 must beat.
|
||||
const RUNG2_NLL: f64 = -113.29;
|
||||
const RUNG2_BEST_PCK: f64 = 0.8208;
|
||||
|
||||
struct Rng(u64);
|
||||
impl Rng {
|
||||
fn next(&mut self) -> u64 {
|
||||
self.0 = self.0.wrapping_mul(6364136223846793005).wrapping_add(1442695040888963407);
|
||||
self.0
|
||||
}
|
||||
fn below(&mut self, n: usize) -> usize {
|
||||
(self.next() >> 11) as usize % n
|
||||
}
|
||||
}
|
||||
|
||||
fn subsample(items: &[usize], k: usize, seed: u64) -> Vec<usize> {
|
||||
if items.len() <= k {
|
||||
return items.to_vec();
|
||||
}
|
||||
let mut rng = Rng(seed);
|
||||
let mut pool = items.to_vec();
|
||||
for i in 0..k {
|
||||
let j = i + rng.below(pool.len() - i);
|
||||
pool.swap(i, j);
|
||||
}
|
||||
pool.truncate(k);
|
||||
pool
|
||||
}
|
||||
|
||||
fn build_pairs(in_split: &[bool], masks: &CorruptionMasks, w2f: &[i64]) -> Vec<usize> {
|
||||
(0..in_split.len() - 1)
|
||||
.filter(|&t| in_split[t] && w2f[t] == w2f[t + 1] && !masks.is_corrupt(t) && !masks.is_corrupt(t + 1))
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn random_groups(rng: &mut Rng, k: usize) -> Vec<usize> {
|
||||
let mut pool: Vec<usize> = (0..NUM_PROBE_GROUPS).collect();
|
||||
for i in 0..k {
|
||||
let j = i + rng.below(pool.len() - i);
|
||||
pool.swap(i, j);
|
||||
}
|
||||
pool[..k].to_vec()
|
||||
}
|
||||
|
||||
/// Assemble one training/eval batch.
|
||||
fn make_batch<Bk: burn::tensor::backend::Backend>(
|
||||
z: &[f32],
|
||||
gt: &[f32],
|
||||
pairs: &[usize],
|
||||
groups_per: &[Vec<usize>],
|
||||
device: &Bk::Device,
|
||||
) -> (Tensor<Bk, 2>, Tensor<Bk, 2>, Tensor<Bk, 2>, Tensor<Bk, 2>) {
|
||||
let n = pairs.len();
|
||||
let mut zt = Vec::with_capacity(n * BAND_DIM);
|
||||
let mut mn = Vec::with_capacity(n * BAND_DIM);
|
||||
let mut mk = Vec::with_capacity(n * BAND_DIM);
|
||||
let mut yy = Vec::with_capacity(n * POSE_DIM);
|
||||
for (i, &t) in pairs.iter().enumerate() {
|
||||
let m = expand_mask(&groups_per[i]);
|
||||
for d in 0..BAND_DIM {
|
||||
zt.push(z[t * BAND_DIM + d]);
|
||||
mn.push(m[d] * z[(t + 1) * BAND_DIM + d]);
|
||||
mk.push(m[d]);
|
||||
}
|
||||
for d in 0..POSE_DIM {
|
||||
yy.push(gt[(t + 1) * POSE_DIM + d]);
|
||||
}
|
||||
}
|
||||
let t2 = |v: Vec<f32>, c: usize| {
|
||||
Tensor::<Bk, 2>::from_data(TensorData::new(v, [n, c]).convert::<f32>(), device)
|
||||
};
|
||||
(t2(zt, BAND_DIM), t2(mn, BAND_DIM), t2(mk, BAND_DIM), t2(yy, POSE_DIM))
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let fx = concat!(env!("CARGO_MANIFEST_DIR"), "/../fixtures");
|
||||
let load = |f: &str| Npy::open(format!("{fx}/{f}")).unwrap_or_else(|e| panic!("{e}"));
|
||||
let t0 = Instant::now();
|
||||
|
||||
let z_npy = load("band_features.npy");
|
||||
let z = z_npy.f32_slice().unwrap();
|
||||
let gt_npy = load("all_gt_clean.npy");
|
||||
let gt = gt_npy.f32_slice().unwrap();
|
||||
let w2f = load("window_to_file.npy").to_i64().unwrap();
|
||||
let n_windows = z_npy.shape[0];
|
||||
let masks = CorruptionMasks::load(
|
||||
&format!("{RESULTS}/nan_windows_mask.npy"),
|
||||
&format!("{RESULTS}/big_windows_mask.npy"),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let mut splits = Vec::new();
|
||||
for name in ["train_idx.npy", "val_idx.npy", "test_idx.npy"] {
|
||||
let idx = load(name).to_i64().unwrap();
|
||||
let mut m = vec![false; n_windows];
|
||||
for &i in &idx {
|
||||
m[i as usize] = true;
|
||||
}
|
||||
splits.push(m);
|
||||
}
|
||||
let train_pairs = subsample(&build_pairs(&splits[0], &masks, &w2f), 60_000, 42);
|
||||
let val_pairs = subsample(&build_pairs(&splits[1], &masks, &w2f), 4_000, 7);
|
||||
// IDENTICAL evaluation set to rung 2.
|
||||
let test_pairs = subsample(&build_pairs(&splits[2], &masks, &w2f), 20_000, 999);
|
||||
|
||||
let device = NdArrayDevice::default();
|
||||
let mut model: HeteroModel<B> = HeteroModel::new(&device, 512, 256);
|
||||
let mut opt = AdamConfig::new().init();
|
||||
let mut rng = Rng(2026);
|
||||
|
||||
let epochs: usize = std::env::var("RUNG3_EPOCHS").ok().and_then(|v| v.parse().ok()).unwrap_or(400);
|
||||
let batch = 512usize;
|
||||
let lr = 1e-3;
|
||||
let mut history = Vec::new();
|
||||
let mut best_val = f64::INFINITY;
|
||||
let mut best_epoch = 0usize;
|
||||
let mut best_model: Option<HeteroModel<B>> = None;
|
||||
|
||||
for ep in 0..epochs {
|
||||
// fresh shuffle each epoch
|
||||
let order = subsample(&train_pairs, train_pairs.len(), 100 + ep as u64);
|
||||
let mut running = 0.0f64;
|
||||
let mut nb = 0usize;
|
||||
for chunk in order.chunks(batch) {
|
||||
// Random mask per sample per epoch: the model must learn p(. | z_t, S)
|
||||
// for arbitrary S, not one fixed probing pattern.
|
||||
let groups: Vec<Vec<usize>> = chunk
|
||||
.iter()
|
||||
.map(|_| {
|
||||
let k = rng.below(NUM_PROBE_GROUPS / 2 + 1);
|
||||
random_groups(&mut rng, k)
|
||||
})
|
||||
.collect();
|
||||
let (zt, mn, mk, yy) = make_batch::<B>(z, gt, chunk, &groups, &device);
|
||||
let (mu, lv) = model.forward(zt, mn, mk);
|
||||
let loss = hetero_nll(mu, lv, yy).mean();
|
||||
running += loss.clone().into_scalar() as f64;
|
||||
nb += 1;
|
||||
let grads = GradientsParams::from_grads(loss.backward(), &model);
|
||||
model = opt.step(lr, model, grads);
|
||||
}
|
||||
let val = eval_nll(&model, z, gt, &val_pairs, &[], &device);
|
||||
history.push(serde_json::json!({ "epoch": ep, "train_nll": running / nb as f64, "val_nll": val }));
|
||||
if ep % 10 == 0 || ep + 1 == epochs {
|
||||
eprintln!("epoch {ep}: train {:.3} val {:.3} ({:.0?})", running / nb as f64, val, t0.elapsed());
|
||||
}
|
||||
// Early stopping on val NLL, patience 40 epochs. The first run stopped at a
|
||||
// fixed 12 epochs while the loss was still descending steeply -- undertrained,
|
||||
// not converged.
|
||||
if val + 1e-6 < best_val {
|
||||
best_val = val;
|
||||
best_epoch = ep;
|
||||
best_model = Some(model.clone());
|
||||
} else if ep - best_epoch >= 40 {
|
||||
eprintln!("early stop at epoch {ep} (best {best_epoch}, val {best_val:.3})");
|
||||
break;
|
||||
}
|
||||
}
|
||||
let model = best_model.unwrap_or(model);
|
||||
|
||||
let inf = model.valid();
|
||||
|
||||
// ---- evaluation, reusing the rung-2 protocol unchanged -------------------
|
||||
let no_probe = evaluate(&inf, z, gt, &test_pairs, &vec![vec![]; test_pairs.len()], &device);
|
||||
let bar = mean_pose_bar(gt, &test_pairs);
|
||||
|
||||
let mut policies = Vec::new();
|
||||
for &k in &[1usize, 3, 6, 9] {
|
||||
// EIG-greedy, now genuinely PER-SAMPLE because sigma depends on z_t.
|
||||
let eig_sets = greedy_eig_per_sample(&inf, z, &test_pairs, k, &device);
|
||||
let g = evaluate(&inf, z, gt, &test_pairs, &eig_sets, &device);
|
||||
|
||||
let mut r = Rng(0xBEEF + k as u64);
|
||||
let rnd_sets: Vec<Vec<usize>> = test_pairs.iter().map(|_| random_groups(&mut r, k)).collect();
|
||||
let rd = evaluate(&inf, z, gt, &test_pairs, &rnd_sets, &device);
|
||||
|
||||
let fixed: Vec<usize> = (0..k).map(|i| i * NUM_PROBE_GROUPS / k).collect();
|
||||
let fx_e = evaluate(&inf, z, gt, &test_pairs, &vec![fixed.clone(); test_pairs.len()], &device);
|
||||
|
||||
let (d, se, t) = paired(&g.per_sample, &rd.per_sample);
|
||||
// How often does the per-sample EIG set actually differ from the modal one?
|
||||
let mut counts = std::collections::HashMap::new();
|
||||
for s in &eig_sets {
|
||||
*counts.entry(format!("{s:?}")).or_insert(0usize) += 1;
|
||||
}
|
||||
let modal = counts.values().copied().max().unwrap_or(0);
|
||||
policies.push(serde_json::json!({
|
||||
"budget_k": k,
|
||||
"pck@20": { "eig_greedy": g.pck20, "random": rd.pck20, "fixed": fx_e.pck20 },
|
||||
"pose_nll": { "eig_greedy": g.nll, "random": rd.nll, "fixed": fx_e.nll },
|
||||
"paired_greedy_minus_random": { "delta": d, "se": se, "t": t, "beats_by_2se": t > 2.0 },
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": counts.len(),
|
||||
"modal_set_fraction": modal as f64 / eig_sets.len() as f64,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
let cov_ok = no_probe
|
||||
.coverage
|
||||
.as_array()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.all(|c| c["error_pp"].as_f64().unwrap().abs() <= 3.0);
|
||||
let nll_ok = no_probe.nll < RUNG2_NLL;
|
||||
let eig_ok = policies
|
||||
.iter()
|
||||
.any(|p| p["paired_greedy_minus_random"]["beats_by_2se"].as_bool().unwrap_or(false));
|
||||
|
||||
let verdict = if nll_ok && cov_ok && eig_ok {
|
||||
"PASS -- rung 3 helped on all three pre-registered criteria"
|
||||
} else {
|
||||
"RUNG 3 DID NOT HELP -- at least one pre-registered criterion was missed"
|
||||
};
|
||||
|
||||
let report = serde_json::json!({
|
||||
"milestone": "Rung 3 -- neural heteroscedastic head. MEASURED by harness/src/bin/rung3.rs, this run.",
|
||||
"backend": "burn-ndarray (CPU), by design -- see STATE.md rung-3 pre-registration",
|
||||
"training": { "epochs": epochs, "batch": batch, "lr": lr, "train_pairs": train_pairs.len(),
|
||||
"history": history },
|
||||
"no_probe": { "pose_nll": no_probe.nll, "pck@20": no_probe.pck20,
|
||||
"mpjpe": no_probe.mpjpe, "coverage": no_probe.coverage },
|
||||
"honesty_bar_same_pairs": { "pck@20": bar.0, "mpjpe": bar.1 },
|
||||
"beats_bar": no_probe.pck20 > bar.0,
|
||||
"degeneracy_guard": check_constant_pose(&no_probe.preds, test_pairs.len()),
|
||||
"policies": policies,
|
||||
"preregistered_criteria": {
|
||||
"1_beats_rung2_nll": { "rung2": RUNG2_NLL, "rung3": no_probe.nll, "pass": nll_ok },
|
||||
"2_coverage_within_3pp_all_levels": cov_ok,
|
||||
"3_eig_beats_random_by_2se": eig_ok,
|
||||
"rung2_best_pck_for_reference": RUNG2_BEST_PCK
|
||||
},
|
||||
"verdict": verdict
|
||||
});
|
||||
println!("{}", serde_json::to_string_pretty(&report).unwrap());
|
||||
eprintln!("{verdict} ({:.0?})", t0.elapsed());
|
||||
}
|
||||
|
||||
struct Ev {
|
||||
nll: f64,
|
||||
pck20: f64,
|
||||
mpjpe: f64,
|
||||
coverage: serde_json::Value,
|
||||
per_sample: Vec<f64>,
|
||||
preds: Vec<f32>,
|
||||
}
|
||||
|
||||
fn paired(a: &[f64], b: &[f64]) -> (f64, f64, f64) {
|
||||
let n = a.len();
|
||||
let d: Vec<f64> = a.iter().zip(b).map(|(x, y)| x - y).collect();
|
||||
let m = d.iter().sum::<f64>() / n as f64;
|
||||
let var = d.iter().map(|x| (x - m).powi(2)).sum::<f64>() / (n as f64 - 1.0);
|
||||
let se = (var / n as f64).sqrt();
|
||||
(m, se, if se > 0.0 { m / se } else { 0.0 })
|
||||
}
|
||||
|
||||
fn eval_nll(
|
||||
model: &HeteroModel<B>,
|
||||
z: &[f32],
|
||||
gt: &[f32],
|
||||
pairs: &[usize],
|
||||
groups: &[usize],
|
||||
device: &NdArrayDevice,
|
||||
) -> f64 {
|
||||
let g = vec![groups.to_vec(); pairs.len()];
|
||||
let (zt, mn, mk, yy) = make_batch::<B>(z, gt, pairs, &g, device);
|
||||
let (mu, lv) = model.forward(zt, mn, mk);
|
||||
hetero_nll(mu, lv, yy).mean().into_scalar() as f64
|
||||
}
|
||||
|
||||
fn evaluate(
|
||||
model: &HeteroModel<BI>,
|
||||
z: &[f32],
|
||||
gt: &[f32],
|
||||
pairs: &[usize],
|
||||
groups: &[Vec<usize>],
|
||||
device: &NdArrayDevice,
|
||||
) -> Ev {
|
||||
let mut preds = Vec::with_capacity(pairs.len() * POSE_DIM);
|
||||
let mut truths = Vec::with_capacity(pairs.len() * POSE_DIM);
|
||||
let mut nll = 0.0f64;
|
||||
let mut inside = [0usize; COVERAGE_LEVELS.len()];
|
||||
|
||||
for (chunk_i, chunk) in pairs.chunks(2048).enumerate() {
|
||||
let gs: Vec<Vec<usize>> = (0..chunk.len())
|
||||
.map(|i| groups[chunk_i * 2048 + i].clone())
|
||||
.collect();
|
||||
let (zt, mn, mk, yy) = make_batch::<BI>(z, gt, chunk, &gs, device);
|
||||
let (mu, lv) = model.forward(zt, mn, mk);
|
||||
nll += hetero_nll(mu.clone(), lv.clone(), yy.clone()).sum().into_scalar() as f64;
|
||||
let mud: Vec<f32> = mu.into_data().to_vec().unwrap();
|
||||
let lvd: Vec<f32> = lv.into_data().to_vec().unwrap();
|
||||
let yd: Vec<f32> = yy.into_data().to_vec().unwrap();
|
||||
for i in 0..chunk.len() {
|
||||
for d in 0..POSE_DIM {
|
||||
let j = i * POSE_DIM + d;
|
||||
let sd = (lvd[j] as f64 * 0.5).exp();
|
||||
for (li, (_, zs)) in COVERAGE_LEVELS.iter().enumerate() {
|
||||
if ((yd[j] - mud[j]) as f64).abs() <= zs * sd {
|
||||
inside[li] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
preds.extend_from_slice(&mud);
|
||||
truths.extend_from_slice(&yd);
|
||||
}
|
||||
|
||||
let s = score(&preds, &truths, pairs.len());
|
||||
let per_sample: Vec<f64> = (0..pairs.len())
|
||||
.map(|i| {
|
||||
let b = i * POSE_DIM;
|
||||
score(&preds[b..b + POSE_DIM], &truths[b..b + POSE_DIM], 1).pck_at(0.2)
|
||||
})
|
||||
.collect();
|
||||
let denom = (pairs.len() * POSE_DIM) as f64;
|
||||
Ev {
|
||||
nll: nll / pairs.len() as f64,
|
||||
pck20: s.pck_at(0.2),
|
||||
mpjpe: s.mpjpe,
|
||||
per_sample,
|
||||
preds,
|
||||
coverage: serde_json::json!(COVERAGE_LEVELS
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, (lvl, _))| serde_json::json!({
|
||||
"nominal": lvl,
|
||||
"empirical": inside[i] as f64 / denom,
|
||||
"error_pp": (inside[i] as f64 / denom - lvl) * 100.0
|
||||
}))
|
||||
.collect::<Vec<_>>()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Per-sample greedy EIG. Closed-form and peek-free: the variance head does not see
|
||||
/// revealed values, so extending the mask gives the post-probe entropy directly.
|
||||
fn greedy_eig_per_sample(
|
||||
model: &HeteroModel<BI>,
|
||||
z: &[f32],
|
||||
pairs: &[usize],
|
||||
k: usize,
|
||||
device: &NdArrayDevice,
|
||||
) -> Vec<Vec<usize>> {
|
||||
let mut out = vec![Vec::new(); pairs.len()];
|
||||
for _step in 0..k {
|
||||
// Score every candidate group for every sample in one batched pass per group.
|
||||
let mut best: Vec<(f64, usize)> = vec![(f64::NEG_INFINITY, usize::MAX); pairs.len()];
|
||||
for cand in 0..NUM_PROBE_GROUPS {
|
||||
let mut zt = Vec::with_capacity(pairs.len() * BAND_DIM);
|
||||
let mut mk = Vec::with_capacity(pairs.len() * BAND_DIM);
|
||||
for (i, &t) in pairs.iter().enumerate() {
|
||||
let mut set = out[i].clone();
|
||||
if !set.contains(&cand) {
|
||||
set.push(cand);
|
||||
}
|
||||
let m = expand_mask(&set);
|
||||
for d in 0..BAND_DIM {
|
||||
zt.push(z[t * BAND_DIM + d]);
|
||||
mk.push(m[d]);
|
||||
}
|
||||
}
|
||||
let n = pairs.len();
|
||||
let zt = Tensor::<BI, 2>::from_data(TensorData::new(zt, [n, BAND_DIM]), device);
|
||||
let mk = Tensor::<BI, 2>::from_data(TensorData::new(mk, [n, BAND_DIM]), device);
|
||||
let lv: Vec<f32> = model.log_var(zt, mk).into_data().to_vec().unwrap();
|
||||
for i in 0..n {
|
||||
if out[i].contains(&cand) {
|
||||
continue;
|
||||
}
|
||||
// Lower total log-variance == more information gained.
|
||||
let s: f64 = -(0..POSE_DIM).map(|d| lv[i * POSE_DIM + d] as f64).sum::<f64>();
|
||||
if s > best[i].0 {
|
||||
best[i] = (s, cand);
|
||||
}
|
||||
}
|
||||
}
|
||||
for i in 0..pairs.len() {
|
||||
if best[i].1 != usize::MAX {
|
||||
out[i].push(best[i].1);
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn mean_pose_bar(gt: &[f32], pairs: &[usize]) -> (f64, f64) {
|
||||
let n = pairs.len();
|
||||
let mut mu = vec![0.0f64; POSE_DIM];
|
||||
for &t in pairs {
|
||||
for i in 0..POSE_DIM {
|
||||
mu[i] += gt[(t + 1) * POSE_DIM + i] as f64;
|
||||
}
|
||||
}
|
||||
let bar: Vec<f32> = mu.iter().map(|v| (v / n as f64) as f32).collect();
|
||||
let truths: Vec<f32> = pairs
|
||||
.iter()
|
||||
.flat_map(|&t| (0..POSE_DIM).map(move |i| gt[(t + 1) * POSE_DIM + i]))
|
||||
.collect();
|
||||
let s = score(&bar.repeat(n), &truths, n);
|
||||
(s.pck_at(0.2), s.mpjpe)
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
//! Rung 3: neural heteroscedastic action-conditioned dynamics head (Burn, CPU).
|
||||
//!
|
||||
//! See the rung-3 pre-registration in `../STATE.md`. The single question:
|
||||
//! **does an input-dependent `Sigma(z_t, mask)` let EIG close any of the
|
||||
//! target-peeking gap that rung 2 left open?**
|
||||
//!
|
||||
//! ## Why the variance head is blind to revealed values
|
||||
//!
|
||||
//! To score a *candidate* probe set we must know how much observing it would shrink
|
||||
//! pose uncertainty -- before observing it. If `sigma` depended on the revealed
|
||||
//! values, that would require sampling them (or peeking). By making the variance head
|
||||
//! a function of `(z_t, mask)` only, EIG stays closed-form AND peek-free:
|
||||
//!
|
||||
//! ```text
|
||||
//! EIG(S) = 0.5 * sum_i [ log sigma_i^2(z_t, M) - log sigma_i^2(z_t, M u S) ]
|
||||
//! ```
|
||||
//!
|
||||
//! `sigma` still depends on `z_t`, so the EIG-optimal set now **varies per sample** --
|
||||
//! precisely the capability rung 2 lacked.
|
||||
|
||||
use burn::module::Module;
|
||||
use burn::nn::{Linear, LinearConfig, Relu};
|
||||
use burn::tensor::backend::Backend;
|
||||
use burn::tensor::Tensor;
|
||||
|
||||
use crate::bands::{BAND_DIM, BANDS_PER_GROUP, NUM_PROBE_GROUPS};
|
||||
use crate::gaussian::POSE_DIM;
|
||||
|
||||
/// Lower bound on predicted variance, in log space. Without a floor the NLL can be
|
||||
/// driven to -inf by collapsing sigma on easy samples -- a Goodhart failure mode for
|
||||
/// this loss, and one the coverage check would catch only after the fact.
|
||||
pub const MIN_LOG_VAR: f64 = -14.0;
|
||||
pub const MAX_LOG_VAR: f64 = 4.0;
|
||||
|
||||
#[derive(Module, Debug)]
|
||||
pub struct HeteroModel<B: Backend> {
|
||||
mean1: Linear<B>,
|
||||
mean2: Linear<B>,
|
||||
mean3: Linear<B>,
|
||||
var1: Linear<B>,
|
||||
var2: Linear<B>,
|
||||
var3: Linear<B>,
|
||||
act: Relu,
|
||||
}
|
||||
|
||||
impl<B: Backend> HeteroModel<B> {
|
||||
pub fn new(device: &B::Device, hidden_mean: usize, hidden_var: usize) -> Self {
|
||||
// mean head sees z_t, the masked next observation, and the mask
|
||||
let mean_in = BAND_DIM * 3;
|
||||
// variance head sees ONLY z_t and the mask (see module docs)
|
||||
let var_in = BAND_DIM * 2;
|
||||
Self {
|
||||
mean1: LinearConfig::new(mean_in, hidden_mean).init(device),
|
||||
mean2: LinearConfig::new(hidden_mean, hidden_mean / 2).init(device),
|
||||
mean3: LinearConfig::new(hidden_mean / 2, POSE_DIM).init(device),
|
||||
var1: LinearConfig::new(var_in, hidden_var).init(device),
|
||||
var2: LinearConfig::new(hidden_var, hidden_var / 2).init(device),
|
||||
var3: LinearConfig::new(hidden_var / 2, POSE_DIM).init(device),
|
||||
act: Relu::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// `z_t`: [batch, BAND_DIM]; `masked_next`: [batch, BAND_DIM] (revealed values,
|
||||
/// zeros elsewhere); `mask`: [batch, BAND_DIM] of 1.0/0.0.
|
||||
/// Returns `(mu, log_var)`, each [batch, POSE_DIM].
|
||||
pub fn forward(
|
||||
&self,
|
||||
z_t: Tensor<B, 2>,
|
||||
masked_next: Tensor<B, 2>,
|
||||
mask: Tensor<B, 2>,
|
||||
) -> (Tensor<B, 2>, Tensor<B, 2>) {
|
||||
let mean_in = Tensor::cat(vec![z_t.clone(), masked_next, mask.clone()], 1);
|
||||
let h = self.act.forward(self.mean1.forward(mean_in));
|
||||
let h = self.act.forward(self.mean2.forward(h));
|
||||
let mu = self.mean3.forward(h);
|
||||
|
||||
let var_in = Tensor::cat(vec![z_t, mask], 1);
|
||||
let g = self.act.forward(self.var1.forward(var_in));
|
||||
let g = self.act.forward(self.var2.forward(g));
|
||||
let log_var = self.var3.forward(g).clamp(MIN_LOG_VAR, MAX_LOG_VAR);
|
||||
|
||||
(mu, log_var)
|
||||
}
|
||||
|
||||
/// Variance head alone -- all that EIG needs.
|
||||
pub fn log_var(&self, z_t: Tensor<B, 2>, mask: Tensor<B, 2>) -> Tensor<B, 2> {
|
||||
let var_in = Tensor::cat(vec![z_t, mask], 1);
|
||||
let g = self.act.forward(self.var1.forward(var_in));
|
||||
let g = self.act.forward(self.var2.forward(g));
|
||||
self.var3.forward(g).clamp(MIN_LOG_VAR, MAX_LOG_VAR)
|
||||
}
|
||||
}
|
||||
|
||||
/// Mean Gaussian NLL for a diagonal predictive, in nats per sample.
|
||||
///
|
||||
/// `0.5 * sum_i [ (y_i - mu_i)^2 / sigma_i^2 + log sigma_i^2 + log(2*pi) ]`
|
||||
pub fn hetero_nll<B: Backend>(
|
||||
mu: Tensor<B, 2>,
|
||||
log_var: Tensor<B, 2>,
|
||||
y: Tensor<B, 2>,
|
||||
) -> Tensor<B, 1> {
|
||||
let two_pi = (2.0 * std::f64::consts::PI).ln();
|
||||
let inv_var = log_var.clone().neg().exp();
|
||||
let sq = (y - mu).powf_scalar(2.0);
|
||||
let per_dim = sq * inv_var + log_var + two_pi;
|
||||
per_dim.sum_dim(1).squeeze::<1>() * 0.5
|
||||
}
|
||||
|
||||
/// Expand a per-probe-group mask to the per-band feature mask the model consumes.
|
||||
pub fn expand_mask(groups: &[usize]) -> Vec<f32> {
|
||||
let mut m = vec![0.0f32; BAND_DIM];
|
||||
for &g in groups {
|
||||
debug_assert!(g < NUM_PROBE_GROUPS);
|
||||
for d in (g * BANDS_PER_GROUP)..((g + 1) * BANDS_PER_GROUP) {
|
||||
m[d] = 1.0;
|
||||
}
|
||||
}
|
||||
m
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
pub mod bands;
|
||||
pub mod gaussian;
|
||||
pub mod guards;
|
||||
pub mod hetero;
|
||||
pub mod metrics;
|
||||
pub mod npy;
|
||||
|
||||
|
||||
@@ -0,0 +1,978 @@
|
||||
{
|
||||
"backend": "burn-ndarray (CPU), by design -- see STATE.md rung-3 pre-registration",
|
||||
"beats_bar": true,
|
||||
"degeneracy_guard": {
|
||||
"degenerate": false,
|
||||
"pred_std": 0.020772083145678934,
|
||||
"threshold": 0.0001
|
||||
},
|
||||
"honesty_bar_same_pairs": {
|
||||
"mpjpe": 0.02603940523099254,
|
||||
"pck@20": 0.75565
|
||||
},
|
||||
"milestone": "Rung 3 -- neural heteroscedastic head. MEASURED by harness/src/bin/rung3.rs, this run.",
|
||||
"no_probe": {
|
||||
"coverage": [
|
||||
{
|
||||
"empirical": 0.57465,
|
||||
"error_pp": 7.465,
|
||||
"nominal": 0.5
|
||||
},
|
||||
{
|
||||
"empirical": 0.8319583333333334,
|
||||
"error_pp": 3.195833333333331,
|
||||
"nominal": 0.8
|
||||
},
|
||||
{
|
||||
"empirical": 0.901975,
|
||||
"error_pp": 0.1974999999999949,
|
||||
"nominal": 0.9
|
||||
},
|
||||
{
|
||||
"empirical": 0.9375966666666666,
|
||||
"error_pp": -1.2403333333333322,
|
||||
"nominal": 0.95
|
||||
}
|
||||
],
|
||||
"mpjpe": 0.010727145804528966,
|
||||
"pck@20": 0.9424633333333333,
|
||||
"pose_nll": -102.8293953125
|
||||
},
|
||||
"policies": [
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 24,
|
||||
"modal_set_fraction": 0.27215,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 1,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.0007766666666666661,
|
||||
"se": 0.000249411874400383,
|
||||
"t": 3.1139923411179553
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.94246,
|
||||
"fixed": 0.9419066666666667,
|
||||
"random": 0.9416833333333333
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -101.82346796875,
|
||||
"fixed": -102.28751875,
|
||||
"random": -102.50327109375
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 1683,
|
||||
"modal_set_fraction": 0.01575,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 3,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.0016633333333333322,
|
||||
"se": 0.0003468443663881694,
|
||||
"t": 4.795618711222831
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.9420133333333334,
|
||||
"fixed": 0.9410733333333333,
|
||||
"random": 0.94035
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -100.12109921875,
|
||||
"fixed": -101.23589765625,
|
||||
"random": -102.03474375
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 17301,
|
||||
"modal_set_fraction": 0.00085,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 6,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.0022066666666666693,
|
||||
"se": 0.0004378095774232015,
|
||||
"t": 5.0402430199319985
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.94124,
|
||||
"fixed": 0.9379633333333334,
|
||||
"random": 0.9390333333333334
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -97.485315625,
|
||||
"fixed": -100.76748359375,
|
||||
"random": -101.5298671875
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 19653,
|
||||
"modal_set_fraction": 0.0003,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 9,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.0017566666666666674,
|
||||
"se": 0.00044887538794211593,
|
||||
"t": 3.913484040014232
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.9400433333333333,
|
||||
"fixed": 0.94061,
|
||||
"random": 0.9382866666666667
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -95.63371328125,
|
||||
"fixed": -101.0724125,
|
||||
"random": -100.8816671875
|
||||
}
|
||||
}
|
||||
],
|
||||
"preregistered_criteria": {
|
||||
"1_beats_rung2_nll": {
|
||||
"pass": false,
|
||||
"rung2": -113.29,
|
||||
"rung3": -102.8293953125
|
||||
},
|
||||
"2_coverage_within_3pp_all_levels": false,
|
||||
"3_eig_beats_random_by_2se": true,
|
||||
"rung2_best_pck_for_reference": 0.8208
|
||||
},
|
||||
"training": {
|
||||
"batch": 512,
|
||||
"epochs": 400,
|
||||
"history": [
|
||||
{
|
||||
"epoch": 0,
|
||||
"train_nll": -42.774328122704716,
|
||||
"val_nll": -55.81908416748047
|
||||
},
|
||||
{
|
||||
"epoch": 1,
|
||||
"train_nll": -59.54202949394614,
|
||||
"val_nll": -60.03739547729492
|
||||
},
|
||||
{
|
||||
"epoch": 2,
|
||||
"train_nll": -60.60702947842873,
|
||||
"val_nll": -63.40872573852539
|
||||
},
|
||||
{
|
||||
"epoch": 3,
|
||||
"train_nll": -61.26282832582118,
|
||||
"val_nll": -59.88903045654297
|
||||
},
|
||||
{
|
||||
"epoch": 4,
|
||||
"train_nll": -66.5772920382225,
|
||||
"val_nll": -61.88615798950195
|
||||
},
|
||||
{
|
||||
"epoch": 5,
|
||||
"train_nll": -68.91745425078828,
|
||||
"val_nll": -67.80255889892578
|
||||
},
|
||||
{
|
||||
"epoch": 6,
|
||||
"train_nll": -63.13452932390116,
|
||||
"val_nll": -72.07981872558594
|
||||
},
|
||||
{
|
||||
"epoch": 7,
|
||||
"train_nll": -71.32978342347226,
|
||||
"val_nll": -73.302001953125
|
||||
},
|
||||
{
|
||||
"epoch": 8,
|
||||
"train_nll": -71.34252157049664,
|
||||
"val_nll": -74.09239196777344
|
||||
},
|
||||
{
|
||||
"epoch": 9,
|
||||
"train_nll": -70.85564571315959,
|
||||
"val_nll": -54.64802169799805
|
||||
},
|
||||
{
|
||||
"epoch": 10,
|
||||
"train_nll": -75.09711078061896,
|
||||
"val_nll": -79.87328338623047
|
||||
},
|
||||
{
|
||||
"epoch": 11,
|
||||
"train_nll": -78.07319379256944,
|
||||
"val_nll": -79.99927520751953
|
||||
},
|
||||
{
|
||||
"epoch": 12,
|
||||
"train_nll": -81.76339876853814,
|
||||
"val_nll": -83.38946533203125
|
||||
},
|
||||
{
|
||||
"epoch": 13,
|
||||
"train_nll": -84.0888777264094,
|
||||
"val_nll": -85.0949935913086
|
||||
},
|
||||
{
|
||||
"epoch": 14,
|
||||
"train_nll": -85.86560433597889,
|
||||
"val_nll": -84.72895812988281
|
||||
},
|
||||
{
|
||||
"epoch": 15,
|
||||
"train_nll": -86.4808564913475,
|
||||
"val_nll": -87.53223419189453
|
||||
},
|
||||
{
|
||||
"epoch": 16,
|
||||
"train_nll": -87.88631329293979,
|
||||
"val_nll": -88.08009338378906
|
||||
},
|
||||
{
|
||||
"epoch": 17,
|
||||
"train_nll": -88.08925247192383,
|
||||
"val_nll": -86.8268814086914
|
||||
},
|
||||
{
|
||||
"epoch": 18,
|
||||
"train_nll": -89.90328585091284,
|
||||
"val_nll": -90.39842224121094
|
||||
},
|
||||
{
|
||||
"epoch": 19,
|
||||
"train_nll": -90.73707619359938,
|
||||
"val_nll": -90.39143371582031
|
||||
},
|
||||
{
|
||||
"epoch": 20,
|
||||
"train_nll": -92.24941951945677,
|
||||
"val_nll": -92.29264831542969
|
||||
},
|
||||
{
|
||||
"epoch": 21,
|
||||
"train_nll": -92.88208156521037,
|
||||
"val_nll": -92.42642211914062
|
||||
},
|
||||
{
|
||||
"epoch": 22,
|
||||
"train_nll": -93.37250156725867,
|
||||
"val_nll": -92.39700317382812
|
||||
},
|
||||
{
|
||||
"epoch": 23,
|
||||
"train_nll": -93.9162643561929,
|
||||
"val_nll": -93.85931396484375
|
||||
},
|
||||
{
|
||||
"epoch": 24,
|
||||
"train_nll": -95.18725999735169,
|
||||
"val_nll": -95.05473327636719
|
||||
},
|
||||
{
|
||||
"epoch": 25,
|
||||
"train_nll": -95.56380055314403,
|
||||
"val_nll": -93.89794158935547
|
||||
},
|
||||
{
|
||||
"epoch": 26,
|
||||
"train_nll": -95.9424344725528,
|
||||
"val_nll": -94.73893737792969
|
||||
},
|
||||
{
|
||||
"epoch": 27,
|
||||
"train_nll": -95.44528256432484,
|
||||
"val_nll": -94.4537353515625
|
||||
},
|
||||
{
|
||||
"epoch": 28,
|
||||
"train_nll": -97.15404471704515,
|
||||
"val_nll": -95.16993713378906
|
||||
},
|
||||
{
|
||||
"epoch": 29,
|
||||
"train_nll": -96.97263665926658,
|
||||
"val_nll": -95.29769897460938
|
||||
},
|
||||
{
|
||||
"epoch": 30,
|
||||
"train_nll": -97.9944684303413,
|
||||
"val_nll": -95.23420715332031
|
||||
},
|
||||
{
|
||||
"epoch": 31,
|
||||
"train_nll": -97.83005840495481,
|
||||
"val_nll": -95.74768829345703
|
||||
},
|
||||
{
|
||||
"epoch": 32,
|
||||
"train_nll": -98.74738253577281,
|
||||
"val_nll": -91.6214370727539
|
||||
},
|
||||
{
|
||||
"epoch": 33,
|
||||
"train_nll": -99.34809681520623,
|
||||
"val_nll": -95.3067626953125
|
||||
},
|
||||
{
|
||||
"epoch": 34,
|
||||
"train_nll": -99.28554205167092,
|
||||
"val_nll": -94.68930053710938
|
||||
},
|
||||
{
|
||||
"epoch": 35,
|
||||
"train_nll": -100.10832311339297,
|
||||
"val_nll": -97.30072021484375
|
||||
},
|
||||
{
|
||||
"epoch": 36,
|
||||
"train_nll": -100.3067129102804,
|
||||
"val_nll": -97.0369873046875
|
||||
},
|
||||
{
|
||||
"epoch": 37,
|
||||
"train_nll": -101.03592145240913,
|
||||
"val_nll": -95.7803726196289
|
||||
},
|
||||
{
|
||||
"epoch": 38,
|
||||
"train_nll": -101.82056284759004,
|
||||
"val_nll": -96.28416442871094
|
||||
},
|
||||
{
|
||||
"epoch": 39,
|
||||
"train_nll": -101.43897040415618,
|
||||
"val_nll": -97.002685546875
|
||||
},
|
||||
{
|
||||
"epoch": 40,
|
||||
"train_nll": -101.46586369659941,
|
||||
"val_nll": -97.2649154663086
|
||||
},
|
||||
{
|
||||
"epoch": 41,
|
||||
"train_nll": -101.75793838500977,
|
||||
"val_nll": -94.70604705810547
|
||||
},
|
||||
{
|
||||
"epoch": 42,
|
||||
"train_nll": -101.77129208839546,
|
||||
"val_nll": -94.14044952392578
|
||||
},
|
||||
{
|
||||
"epoch": 43,
|
||||
"train_nll": -102.35570985179837,
|
||||
"val_nll": -97.86189270019531
|
||||
},
|
||||
{
|
||||
"epoch": 44,
|
||||
"train_nll": -103.21834835763705,
|
||||
"val_nll": -98.88245391845703
|
||||
},
|
||||
{
|
||||
"epoch": 45,
|
||||
"train_nll": -103.54843702154645,
|
||||
"val_nll": -99.09239196777344
|
||||
},
|
||||
{
|
||||
"epoch": 46,
|
||||
"train_nll": -103.49915404238943,
|
||||
"val_nll": -97.1437759399414
|
||||
},
|
||||
{
|
||||
"epoch": 47,
|
||||
"train_nll": -104.01488727634236,
|
||||
"val_nll": -97.6037826538086
|
||||
},
|
||||
{
|
||||
"epoch": 48,
|
||||
"train_nll": -103.52428203518107,
|
||||
"val_nll": -99.40827941894531
|
||||
},
|
||||
{
|
||||
"epoch": 49,
|
||||
"train_nll": -104.11277577028436,
|
||||
"val_nll": -97.976806640625
|
||||
},
|
||||
{
|
||||
"epoch": 50,
|
||||
"train_nll": -104.34983069209729,
|
||||
"val_nll": -98.87061309814453
|
||||
},
|
||||
{
|
||||
"epoch": 51,
|
||||
"train_nll": -104.81902630046262,
|
||||
"val_nll": -98.58361053466797
|
||||
},
|
||||
{
|
||||
"epoch": 52,
|
||||
"train_nll": -103.96492612159858,
|
||||
"val_nll": -100.55532836914062
|
||||
},
|
||||
{
|
||||
"epoch": 53,
|
||||
"train_nll": -104.98772081278138,
|
||||
"val_nll": -100.70870208740234
|
||||
},
|
||||
{
|
||||
"epoch": 54,
|
||||
"train_nll": -105.14998801279876,
|
||||
"val_nll": -98.94584655761719
|
||||
},
|
||||
{
|
||||
"epoch": 55,
|
||||
"train_nll": -105.56871730998411,
|
||||
"val_nll": -100.1556167602539
|
||||
},
|
||||
{
|
||||
"epoch": 56,
|
||||
"train_nll": -105.72876927004022,
|
||||
"val_nll": -100.94598388671875
|
||||
},
|
||||
{
|
||||
"epoch": 57,
|
||||
"train_nll": -106.23225299382614,
|
||||
"val_nll": -100.73328399658203
|
||||
},
|
||||
{
|
||||
"epoch": 58,
|
||||
"train_nll": -105.79375296123958,
|
||||
"val_nll": -100.828125
|
||||
},
|
||||
{
|
||||
"epoch": 59,
|
||||
"train_nll": -106.44230722976943,
|
||||
"val_nll": -100.66520690917969
|
||||
},
|
||||
{
|
||||
"epoch": 60,
|
||||
"train_nll": -106.53136650990632,
|
||||
"val_nll": -101.22872161865234
|
||||
},
|
||||
{
|
||||
"epoch": 61,
|
||||
"train_nll": -106.75871347976943,
|
||||
"val_nll": -101.55542755126953
|
||||
},
|
||||
{
|
||||
"epoch": 62,
|
||||
"train_nll": -106.83905578871905,
|
||||
"val_nll": -101.07545471191406
|
||||
},
|
||||
{
|
||||
"epoch": 63,
|
||||
"train_nll": -106.98275504677983,
|
||||
"val_nll": -100.09600067138672
|
||||
},
|
||||
{
|
||||
"epoch": 64,
|
||||
"train_nll": -107.61582966174109,
|
||||
"val_nll": -100.12076568603516
|
||||
},
|
||||
{
|
||||
"epoch": 65,
|
||||
"train_nll": -107.28932661929373,
|
||||
"val_nll": -101.15447998046875
|
||||
},
|
||||
{
|
||||
"epoch": 66,
|
||||
"train_nll": -107.26450315572448,
|
||||
"val_nll": -101.04290771484375
|
||||
},
|
||||
{
|
||||
"epoch": 67,
|
||||
"train_nll": -107.48663879653155,
|
||||
"val_nll": -100.76251983642578
|
||||
},
|
||||
{
|
||||
"epoch": 68,
|
||||
"train_nll": -107.26200420573606,
|
||||
"val_nll": -100.70884704589844
|
||||
},
|
||||
{
|
||||
"epoch": 69,
|
||||
"train_nll": -107.46484931040618,
|
||||
"val_nll": -101.07059478759766
|
||||
},
|
||||
{
|
||||
"epoch": 70,
|
||||
"train_nll": -108.10282380702132,
|
||||
"val_nll": -102.84515380859375
|
||||
},
|
||||
{
|
||||
"epoch": 71,
|
||||
"train_nll": -108.52761084346447,
|
||||
"val_nll": -103.28453063964844
|
||||
},
|
||||
{
|
||||
"epoch": 72,
|
||||
"train_nll": -107.77550745818574,
|
||||
"val_nll": -98.62633514404297
|
||||
},
|
||||
{
|
||||
"epoch": 73,
|
||||
"train_nll": -107.57855295730849,
|
||||
"val_nll": -101.6136474609375
|
||||
},
|
||||
{
|
||||
"epoch": 74,
|
||||
"train_nll": -108.30007850517661,
|
||||
"val_nll": -103.88307189941406
|
||||
},
|
||||
{
|
||||
"epoch": 75,
|
||||
"train_nll": -108.38222051070909,
|
||||
"val_nll": -102.10955047607422
|
||||
},
|
||||
{
|
||||
"epoch": 76,
|
||||
"train_nll": -107.7076256315587,
|
||||
"val_nll": -103.29681396484375
|
||||
},
|
||||
{
|
||||
"epoch": 77,
|
||||
"train_nll": -108.89361979597706,
|
||||
"val_nll": -102.357666015625
|
||||
},
|
||||
{
|
||||
"epoch": 78,
|
||||
"train_nll": -108.97863342802404,
|
||||
"val_nll": -102.16893768310547
|
||||
},
|
||||
{
|
||||
"epoch": 79,
|
||||
"train_nll": -108.90845767522262,
|
||||
"val_nll": -103.07209014892578
|
||||
},
|
||||
{
|
||||
"epoch": 80,
|
||||
"train_nll": -109.12030488353665,
|
||||
"val_nll": -102.15640258789062
|
||||
},
|
||||
{
|
||||
"epoch": 81,
|
||||
"train_nll": -109.60721594600354,
|
||||
"val_nll": -100.97325134277344
|
||||
},
|
||||
{
|
||||
"epoch": 82,
|
||||
"train_nll": -109.79107200493247,
|
||||
"val_nll": -102.79425048828125
|
||||
},
|
||||
{
|
||||
"epoch": 83,
|
||||
"train_nll": -109.79943989899199,
|
||||
"val_nll": -102.10569763183594
|
||||
},
|
||||
{
|
||||
"epoch": 84,
|
||||
"train_nll": -109.48733514042225,
|
||||
"val_nll": -102.52562713623047
|
||||
},
|
||||
{
|
||||
"epoch": 85,
|
||||
"train_nll": -109.63664032241046,
|
||||
"val_nll": -101.46949768066406
|
||||
},
|
||||
{
|
||||
"epoch": 86,
|
||||
"train_nll": -109.14598852901135,
|
||||
"val_nll": -102.85391998291016
|
||||
},
|
||||
{
|
||||
"epoch": 87,
|
||||
"train_nll": -110.38806145878162,
|
||||
"val_nll": -103.94454193115234
|
||||
},
|
||||
{
|
||||
"epoch": 88,
|
||||
"train_nll": -110.44435623944815,
|
||||
"val_nll": -103.5562744140625
|
||||
},
|
||||
{
|
||||
"epoch": 89,
|
||||
"train_nll": -110.17328475693525,
|
||||
"val_nll": -104.19556427001953
|
||||
},
|
||||
{
|
||||
"epoch": 90,
|
||||
"train_nll": -110.50101018356065,
|
||||
"val_nll": -102.99949645996094
|
||||
},
|
||||
{
|
||||
"epoch": 91,
|
||||
"train_nll": -110.45059831263656,
|
||||
"val_nll": -102.71943664550781
|
||||
},
|
||||
{
|
||||
"epoch": 92,
|
||||
"train_nll": -109.84439229157012,
|
||||
"val_nll": -103.78682708740234
|
||||
},
|
||||
{
|
||||
"epoch": 93,
|
||||
"train_nll": -110.65303511538748,
|
||||
"val_nll": -103.05845642089844
|
||||
},
|
||||
{
|
||||
"epoch": 94,
|
||||
"train_nll": -110.92911542472193,
|
||||
"val_nll": -102.6050796508789
|
||||
},
|
||||
{
|
||||
"epoch": 95,
|
||||
"train_nll": -111.12001528982388,
|
||||
"val_nll": -102.215576171875
|
||||
},
|
||||
{
|
||||
"epoch": 96,
|
||||
"train_nll": -111.50305932255115,
|
||||
"val_nll": -102.78148651123047
|
||||
},
|
||||
{
|
||||
"epoch": 97,
|
||||
"train_nll": -111.04366994308214,
|
||||
"val_nll": -103.38822174072266
|
||||
},
|
||||
{
|
||||
"epoch": 98,
|
||||
"train_nll": -111.0219763416355,
|
||||
"val_nll": -103.11257934570312
|
||||
},
|
||||
{
|
||||
"epoch": 99,
|
||||
"train_nll": -111.72805230092195,
|
||||
"val_nll": -103.91080474853516
|
||||
},
|
||||
{
|
||||
"epoch": 100,
|
||||
"train_nll": -111.61330064676575,
|
||||
"val_nll": -103.908447265625
|
||||
},
|
||||
{
|
||||
"epoch": 101,
|
||||
"train_nll": -110.73913916894945,
|
||||
"val_nll": -104.0099105834961
|
||||
},
|
||||
{
|
||||
"epoch": 102,
|
||||
"train_nll": -111.45183414523885,
|
||||
"val_nll": -105.28567504882812
|
||||
},
|
||||
{
|
||||
"epoch": 103,
|
||||
"train_nll": -111.68648445000083,
|
||||
"val_nll": -102.73346710205078
|
||||
},
|
||||
{
|
||||
"epoch": 104,
|
||||
"train_nll": -111.73445232843949,
|
||||
"val_nll": -103.3299331665039
|
||||
},
|
||||
{
|
||||
"epoch": 105,
|
||||
"train_nll": -111.52301671949483,
|
||||
"val_nll": -102.42095184326172
|
||||
},
|
||||
{
|
||||
"epoch": 106,
|
||||
"train_nll": -111.88026551068839,
|
||||
"val_nll": -103.7076644897461
|
||||
},
|
||||
{
|
||||
"epoch": 107,
|
||||
"train_nll": -111.99844515525689,
|
||||
"val_nll": -101.48223876953125
|
||||
},
|
||||
{
|
||||
"epoch": 108,
|
||||
"train_nll": -112.11313292939784,
|
||||
"val_nll": -102.62358093261719
|
||||
},
|
||||
{
|
||||
"epoch": 109,
|
||||
"train_nll": -111.87205550630213,
|
||||
"val_nll": -105.28523254394531
|
||||
},
|
||||
{
|
||||
"epoch": 110,
|
||||
"train_nll": -112.26935499805515,
|
||||
"val_nll": -103.66380310058594
|
||||
},
|
||||
{
|
||||
"epoch": 111,
|
||||
"train_nll": -112.30805445525606,
|
||||
"val_nll": -104.18842315673828
|
||||
},
|
||||
{
|
||||
"epoch": 112,
|
||||
"train_nll": -112.49988995568226,
|
||||
"val_nll": -104.53314971923828
|
||||
},
|
||||
{
|
||||
"epoch": 113,
|
||||
"train_nll": -112.48384870108912,
|
||||
"val_nll": -103.31867980957031
|
||||
},
|
||||
{
|
||||
"epoch": 114,
|
||||
"train_nll": -111.71316657632084,
|
||||
"val_nll": -103.90884399414062
|
||||
},
|
||||
{
|
||||
"epoch": 115,
|
||||
"train_nll": -111.68879479877019,
|
||||
"val_nll": -102.99317932128906
|
||||
},
|
||||
{
|
||||
"epoch": 116,
|
||||
"train_nll": -112.37932043560481,
|
||||
"val_nll": -103.32540893554688
|
||||
},
|
||||
{
|
||||
"epoch": 117,
|
||||
"train_nll": -112.71870435294458,
|
||||
"val_nll": -105.1897201538086
|
||||
},
|
||||
{
|
||||
"epoch": 118,
|
||||
"train_nll": -113.06781658883823,
|
||||
"val_nll": -101.21864318847656
|
||||
},
|
||||
{
|
||||
"epoch": 119,
|
||||
"train_nll": -112.76175819009038,
|
||||
"val_nll": -103.88880920410156
|
||||
},
|
||||
{
|
||||
"epoch": 120,
|
||||
"train_nll": -112.09449974965241,
|
||||
"val_nll": -98.7298812866211
|
||||
},
|
||||
{
|
||||
"epoch": 121,
|
||||
"train_nll": -108.56493112596415,
|
||||
"val_nll": -104.72840118408203
|
||||
},
|
||||
{
|
||||
"epoch": 122,
|
||||
"train_nll": -112.08557051319187,
|
||||
"val_nll": -104.57803344726562
|
||||
},
|
||||
{
|
||||
"epoch": 123,
|
||||
"train_nll": -112.53186836889235,
|
||||
"val_nll": -106.42840576171875
|
||||
},
|
||||
{
|
||||
"epoch": 124,
|
||||
"train_nll": -111.77673165272859,
|
||||
"val_nll": -105.86727142333984
|
||||
},
|
||||
{
|
||||
"epoch": 125,
|
||||
"train_nll": -111.31301905745167,
|
||||
"val_nll": -104.9869384765625
|
||||
},
|
||||
{
|
||||
"epoch": 126,
|
||||
"train_nll": -113.27259412862487,
|
||||
"val_nll": -104.00370788574219
|
||||
},
|
||||
{
|
||||
"epoch": 127,
|
||||
"train_nll": -112.5502774513374,
|
||||
"val_nll": -103.49357604980469
|
||||
},
|
||||
{
|
||||
"epoch": 128,
|
||||
"train_nll": -112.453343084303,
|
||||
"val_nll": -104.47390747070312
|
||||
},
|
||||
{
|
||||
"epoch": 129,
|
||||
"train_nll": -112.90402725995597,
|
||||
"val_nll": -103.69593811035156
|
||||
},
|
||||
{
|
||||
"epoch": 130,
|
||||
"train_nll": -113.08177967394812,
|
||||
"val_nll": -105.27195739746094
|
||||
},
|
||||
{
|
||||
"epoch": 131,
|
||||
"train_nll": -113.00480574268406,
|
||||
"val_nll": -101.76012420654297
|
||||
},
|
||||
{
|
||||
"epoch": 132,
|
||||
"train_nll": -113.23267765368445,
|
||||
"val_nll": -104.40629577636719
|
||||
},
|
||||
{
|
||||
"epoch": 133,
|
||||
"train_nll": -112.5043876777261,
|
||||
"val_nll": -104.66182708740234
|
||||
},
|
||||
{
|
||||
"epoch": 134,
|
||||
"train_nll": -112.92444591198938,
|
||||
"val_nll": -105.13434600830078
|
||||
},
|
||||
{
|
||||
"epoch": 135,
|
||||
"train_nll": -113.55398837590621,
|
||||
"val_nll": -105.3083267211914
|
||||
},
|
||||
{
|
||||
"epoch": 136,
|
||||
"train_nll": -113.60296934742038,
|
||||
"val_nll": -101.36695098876953
|
||||
},
|
||||
{
|
||||
"epoch": 137,
|
||||
"train_nll": -112.92681031307932,
|
||||
"val_nll": -103.11676788330078
|
||||
},
|
||||
{
|
||||
"epoch": 138,
|
||||
"train_nll": -114.1511613878153,
|
||||
"val_nll": -103.59034729003906
|
||||
},
|
||||
{
|
||||
"epoch": 139,
|
||||
"train_nll": -114.31962113461252,
|
||||
"val_nll": -102.54296875
|
||||
},
|
||||
{
|
||||
"epoch": 140,
|
||||
"train_nll": -111.35899521132647,
|
||||
"val_nll": -105.16556549072266
|
||||
},
|
||||
{
|
||||
"epoch": 141,
|
||||
"train_nll": -113.18886734267413,
|
||||
"val_nll": -103.65406036376953
|
||||
},
|
||||
{
|
||||
"epoch": 142,
|
||||
"train_nll": -112.77602412336964,
|
||||
"val_nll": -104.9128646850586
|
||||
},
|
||||
{
|
||||
"epoch": 143,
|
||||
"train_nll": -113.56398896039542,
|
||||
"val_nll": -105.4412841796875
|
||||
},
|
||||
{
|
||||
"epoch": 144,
|
||||
"train_nll": -112.98662593001026,
|
||||
"val_nll": -103.98446655273438
|
||||
},
|
||||
{
|
||||
"epoch": 145,
|
||||
"train_nll": -113.42886423660536,
|
||||
"val_nll": -102.67638397216797
|
||||
},
|
||||
{
|
||||
"epoch": 146,
|
||||
"train_nll": -113.7834687313791,
|
||||
"val_nll": -105.30906677246094
|
||||
},
|
||||
{
|
||||
"epoch": 147,
|
||||
"train_nll": -113.65271403425831,
|
||||
"val_nll": -104.97223663330078
|
||||
},
|
||||
{
|
||||
"epoch": 148,
|
||||
"train_nll": -113.9585642410537,
|
||||
"val_nll": -104.94241333007812
|
||||
},
|
||||
{
|
||||
"epoch": 149,
|
||||
"train_nll": -113.66781803713006,
|
||||
"val_nll": -104.70767211914062
|
||||
},
|
||||
{
|
||||
"epoch": 150,
|
||||
"train_nll": -113.64186703956733,
|
||||
"val_nll": -106.03020477294922
|
||||
},
|
||||
{
|
||||
"epoch": 151,
|
||||
"train_nll": -113.44392944594561,
|
||||
"val_nll": -103.89848327636719
|
||||
},
|
||||
{
|
||||
"epoch": 152,
|
||||
"train_nll": -111.75255578251209,
|
||||
"val_nll": -104.50031280517578
|
||||
},
|
||||
{
|
||||
"epoch": 153,
|
||||
"train_nll": -111.54815538050765,
|
||||
"val_nll": -102.54229736328125
|
||||
},
|
||||
{
|
||||
"epoch": 154,
|
||||
"train_nll": -112.91848573846332,
|
||||
"val_nll": -102.59788513183594
|
||||
},
|
||||
{
|
||||
"epoch": 155,
|
||||
"train_nll": -114.00194271540238,
|
||||
"val_nll": -104.99446868896484
|
||||
},
|
||||
{
|
||||
"epoch": 156,
|
||||
"train_nll": -113.68522844476215,
|
||||
"val_nll": -105.38339233398438
|
||||
},
|
||||
{
|
||||
"epoch": 157,
|
||||
"train_nll": -114.14461058277195,
|
||||
"val_nll": -105.50456237792969
|
||||
},
|
||||
{
|
||||
"epoch": 158,
|
||||
"train_nll": -114.03764912233514,
|
||||
"val_nll": -104.05140686035156
|
||||
},
|
||||
{
|
||||
"epoch": 159,
|
||||
"train_nll": -114.32548936746888,
|
||||
"val_nll": -104.59178161621094
|
||||
},
|
||||
{
|
||||
"epoch": 160,
|
||||
"train_nll": -114.10441285472805,
|
||||
"val_nll": -103.34945678710938
|
||||
},
|
||||
{
|
||||
"epoch": 161,
|
||||
"train_nll": -114.01348036426609,
|
||||
"val_nll": -102.81096649169922
|
||||
},
|
||||
{
|
||||
"epoch": 162,
|
||||
"train_nll": -114.46564134500794,
|
||||
"val_nll": -104.46498107910156
|
||||
},
|
||||
{
|
||||
"epoch": 163,
|
||||
"train_nll": -114.58630080142264,
|
||||
"val_nll": -104.05748748779297
|
||||
}
|
||||
],
|
||||
"lr": 0.001,
|
||||
"train_pairs": 60000
|
||||
},
|
||||
"verdict": "RUNG 3 DID NOT HELP -- at least one pre-registered criterion was missed"
|
||||
}
|
||||
@@ -0,0 +1,218 @@
|
||||
{
|
||||
"backend": "burn-ndarray (CPU), by design -- see STATE.md rung-3 pre-registration",
|
||||
"beats_bar": true,
|
||||
"degeneracy_guard": {
|
||||
"degenerate": false,
|
||||
"pred_std": 0.016023467696127766,
|
||||
"threshold": 0.0001
|
||||
},
|
||||
"honesty_bar_same_pairs": {
|
||||
"mpjpe": 0.02603940523099254,
|
||||
"pck@20": 0.75565
|
||||
},
|
||||
"milestone": "Rung 3 -- neural heteroscedastic head. MEASURED by harness/src/bin/rung3.rs, this run.",
|
||||
"no_probe": {
|
||||
"coverage": [
|
||||
{
|
||||
"empirical": 0.6158283333333333,
|
||||
"error_pp": 11.582833333333332,
|
||||
"nominal": 0.5
|
||||
},
|
||||
{
|
||||
"empirical": 0.8512266666666667,
|
||||
"error_pp": 5.122666666666664,
|
||||
"nominal": 0.8
|
||||
},
|
||||
{
|
||||
"empirical": 0.90759,
|
||||
"error_pp": 0.7589999999999986,
|
||||
"nominal": 0.9
|
||||
},
|
||||
{
|
||||
"empirical": 0.9363616666666666,
|
||||
"error_pp": -1.3638333333333308,
|
||||
"nominal": 0.95
|
||||
}
|
||||
],
|
||||
"mpjpe": 0.019796433696580587,
|
||||
"pck@20": 0.83574,
|
||||
"pose_nll": -81.23594375
|
||||
},
|
||||
"policies": [
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 1,
|
||||
"modal_set_fraction": 1.0,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 1,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": false,
|
||||
"delta": -0.004313333333333364,
|
||||
"se": 0.00037483196895436315,
|
||||
"t": -11.5073784804586
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.8304933333333333,
|
||||
"fixed": 0.8347033333333334,
|
||||
"random": 0.8348066666666667
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -80.657655859375,
|
||||
"fixed": -81.2702796875,
|
||||
"random": -81.120386328125
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 7,
|
||||
"modal_set_fraction": 0.7363,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 3,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.004560000000000032,
|
||||
"se": 0.0005045303016857214,
|
||||
"t": 9.03810927661688
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.8352333333333334,
|
||||
"fixed": 0.8325433333333333,
|
||||
"random": 0.8306733333333334
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -80.389519921875,
|
||||
"fixed": -80.92885546875,
|
||||
"random": -80.7511015625
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 18,
|
||||
"modal_set_fraction": 0.6644,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 6,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": false,
|
||||
"delta": -0.002416666666666691,
|
||||
"se": 0.0006109591591180738,
|
||||
"t": -3.9555289917499166
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.8206166666666667,
|
||||
"fixed": 0.8236666666666667,
|
||||
"random": 0.8230333333333333
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -78.4006375,
|
||||
"fixed": -80.363200390625,
|
||||
"random": -80.01705546875
|
||||
}
|
||||
},
|
||||
{
|
||||
"adaptivity": {
|
||||
"distinct_probe_sets": 71,
|
||||
"modal_set_fraction": 0.4242,
|
||||
"note": "rung 2 had exactly 1 distinct set by construction (homoscedastic)"
|
||||
},
|
||||
"budget_k": 9,
|
||||
"paired_greedy_minus_random": {
|
||||
"beats_by_2se": true,
|
||||
"delta": 0.005983333333333409,
|
||||
"se": 0.0006415411205105044,
|
||||
"t": 9.32650011362045
|
||||
},
|
||||
"pck@20": {
|
||||
"eig_greedy": 0.8231133333333334,
|
||||
"fixed": 0.8358166666666667,
|
||||
"random": 0.81713
|
||||
},
|
||||
"pose_nll": {
|
||||
"eig_greedy": -76.970840234375,
|
||||
"fixed": -79.6653265625,
|
||||
"random": -79.440788671875
|
||||
}
|
||||
}
|
||||
],
|
||||
"preregistered_criteria": {
|
||||
"1_beats_rung2_nll": {
|
||||
"pass": false,
|
||||
"rung2": -113.29,
|
||||
"rung3": -81.23594375
|
||||
},
|
||||
"2_coverage_within_3pp_all_levels": false,
|
||||
"3_eig_beats_random_by_2se": true,
|
||||
"rung2_best_pck_for_reference": 0.8208
|
||||
},
|
||||
"training": {
|
||||
"batch": 512,
|
||||
"epochs": 12,
|
||||
"history": [
|
||||
{
|
||||
"epoch": 0,
|
||||
"train_nll": -42.67732829158589,
|
||||
"val_nll": -56.74852752685547
|
||||
},
|
||||
{
|
||||
"epoch": 1,
|
||||
"train_nll": -60.61488364914716,
|
||||
"val_nll": -62.73134994506836
|
||||
},
|
||||
{
|
||||
"epoch": 2,
|
||||
"train_nll": -58.326725038431455,
|
||||
"val_nll": -51.11528778076172
|
||||
},
|
||||
{
|
||||
"epoch": 3,
|
||||
"train_nll": -65.42834896152303,
|
||||
"val_nll": -63.737789154052734
|
||||
},
|
||||
{
|
||||
"epoch": 4,
|
||||
"train_nll": -68.45023649829929,
|
||||
"val_nll": -65.93348693847656
|
||||
},
|
||||
{
|
||||
"epoch": 5,
|
||||
"train_nll": -62.15681699979103,
|
||||
"val_nll": -51.822471618652344
|
||||
},
|
||||
{
|
||||
"epoch": 6,
|
||||
"train_nll": -68.0091497776872,
|
||||
"val_nll": -73.48114013671875
|
||||
},
|
||||
{
|
||||
"epoch": 7,
|
||||
"train_nll": -68.32070777375819,
|
||||
"val_nll": -73.49523162841797
|
||||
},
|
||||
{
|
||||
"epoch": 8,
|
||||
"train_nll": -75.84418700913251,
|
||||
"val_nll": -77.30884552001953
|
||||
},
|
||||
{
|
||||
"epoch": 9,
|
||||
"train_nll": -69.88452507277667,
|
||||
"val_nll": -75.26997375488281
|
||||
},
|
||||
{
|
||||
"epoch": 10,
|
||||
"train_nll": -78.93434686175847,
|
||||
"val_nll": -80.26214599609375
|
||||
},
|
||||
{
|
||||
"epoch": 11,
|
||||
"train_nll": -81.27487842107223,
|
||||
"val_nll": -83.18534088134766
|
||||
}
|
||||
],
|
||||
"lr": 0.001,
|
||||
"train_pairs": 60000
|
||||
},
|
||||
"verdict": "RUNG 3 DID NOT HELP -- at least one pre-registered criterion was missed"
|
||||
}
|
||||
Reference in new issue
Block a user