Claim 3: supply the missing rank-1 subspace numbers; MFVI predictive variance -> prior (0.99996 at d=131072) while the exact posterior is flat at 0.166667, closed forms validated to 1.8e-15 against direct inversion
Browse files- code/mfvi_rank1_v2.py +60 -0
- code/mfvi_rank1_v3.py +60 -0
- outputs_mfvi_rank1_final.json +61 -0
- pages/claim-3-data-concentration/page.md +63 -9
code/mfvi_rank1_v2.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Claim 3: in a pathological rank-1 training-data subspace, the MFVI posterior's
|
| 2 |
+
predictive variance converges to the PRIOR variance as dimension grows, while the
|
| 3 |
+
exact posterior does not -- i.e. MFVI effectively learns nothing.
|
| 4 |
+
|
| 5 |
+
An earlier attempt in this session produced the OPPOSITE (exact -> prior, MFVI
|
| 6 |
+
collapsing) and was not pushed. The error was the test direction. With data along
|
| 7 |
+
a single direction u, the precision is
|
| 8 |
+
|
| 9 |
+
A = n u u^T / sigma^2 + I/alpha .
|
| 10 |
+
|
| 11 |
+
If u is UNIFORMLY SPREAD (u_i = 1/sqrt(d)), then
|
| 12 |
+
A_ii = n/(d sigma^2) + 1/alpha -> 1/alpha as d grows,
|
| 13 |
+
so the MFVI diagonal variance at u tends to the prior alpha, whereas
|
| 14 |
+
Sherman-Morrison gives the exact variance alpha/(1 + alpha n/sigma^2), which is
|
| 15 |
+
INDEPENDENT of d. Measuring along a random/sparse u instead hides the effect,
|
| 16 |
+
which is what went wrong before.
|
| 17 |
+
"""
|
| 18 |
+
import json, numpy as np
|
| 19 |
+
|
| 20 |
+
RES = {}
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
def run(d, n=50, alpha=1.0, sigma=0.3, spread="uniform", seed=0):
|
| 24 |
+
rng = np.random.default_rng(seed)
|
| 25 |
+
if spread == "uniform":
|
| 26 |
+
u = np.ones(d)/np.sqrt(d) # spread over all coordinates
|
| 27 |
+
elif spread == "sparse":
|
| 28 |
+
u = np.zeros(d); u[0] = 1.0 # concentrated (the earlier mistake)
|
| 29 |
+
else:
|
| 30 |
+
u = rng.normal(size=d); u /= np.linalg.norm(u)
|
| 31 |
+
Phi = np.outer(np.ones(n), u) # rank-1 design: every row along u
|
| 32 |
+
A = Phi.T @ Phi/sigma**2+np.eye(d)/alpha
|
| 33 |
+
Sig = np.linalg.inv(A)
|
| 34 |
+
exact = float(u @ Sig @ u) # exact posterior predictive var at u
|
| 35 |
+
mf = float(np.sum(u**2/np.diag(A))) # MFVI: diagonal precision
|
| 36 |
+
prior = alpha*float(u @ u)
|
| 37 |
+
return exact/prior, mf/prior
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
def main():
|
| 41 |
+
for spread in ("uniform", "sparse", "random"):
|
| 42 |
+
rows = []
|
| 43 |
+
for d in (2, 4, 8, 16, 32, 64, 128, 256):
|
| 44 |
+
e, m = run(d, spread=spread)
|
| 45 |
+
rows.append({"d": d, "exact_over_prior": round(e, 6), "mfvi_over_prior": round(m, 6)})
|
| 46 |
+
if spread == "uniform" or d in (2, 64, 256):
|
| 47 |
+
print(" [%-7s] d=%-4d exact/prior=%.6f MFVI/prior=%.6f" % (spread, d, e, m), flush=True)
|
| 48 |
+
RES[spread] = {"rows": rows,
|
| 49 |
+
"mfvi_final": rows[-1]["mfvi_over_prior"],
|
| 50 |
+
"exact_final": rows[-1]["exact_over_prior"],
|
| 51 |
+
"mfvi_converges_to_prior": bool(rows[-1]["mfvi_over_prior"] > 0.95),
|
| 52 |
+
"exact_stays_below": bool(rows[-1]["exact_over_prior"] < 0.10)}
|
| 53 |
+
print(" -> MFVI/prior at d=256: %.4f | exact/prior: %.6f | claim pattern holds: %s"
|
| 54 |
+
% (rows[-1]["mfvi_over_prior"], rows[-1]["exact_over_prior"],
|
| 55 |
+
RES[spread]["mfvi_converges_to_prior"] and RES[spread]["exact_stays_below"]), flush=True)
|
| 56 |
+
json.dump(RES, open("mfvi_rank1_results.json", "w"), indent=1)
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
if __name__ == "__main__":
|
| 60 |
+
main(); print("DONE")
|
code/mfvi_rank1_v3.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Claim 3, completed: MFVI predictive variance -> prior as d grows; exact stays put.
|
| 2 |
+
|
| 3 |
+
Closed forms (rank-1 design along a uniformly spread u, u_i = 1/sqrt(d)):
|
| 4 |
+
exact/prior = 1 / (1 + alpha n / sigma^2) -- INDEPENDENT of d
|
| 5 |
+
MFVI /prior = 1 / (1 + alpha n / (d sigma^2)) -- -> 1 as d -> infinity
|
| 6 |
+
Both are verified against direct matrix inversion before being used to reach
|
| 7 |
+
dimensions too large to invert.
|
| 8 |
+
"""
|
| 9 |
+
import json, numpy as np
|
| 10 |
+
|
| 11 |
+
RES = {}
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
def numeric(d, n, alpha, sigma):
|
| 15 |
+
u = np.ones(d)/np.sqrt(d)
|
| 16 |
+
Phi = np.outer(np.ones(n), u)
|
| 17 |
+
A = Phi.T @ Phi/sigma**2+np.eye(d)/alpha
|
| 18 |
+
Sig = np.linalg.inv(A)
|
| 19 |
+
return float(u @ Sig @ u)/alpha, float(np.sum(u**2/np.diag(A)))/alpha
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def closed(d, n, alpha, sigma):
|
| 23 |
+
k = alpha*n/sigma**2
|
| 24 |
+
return 1.0/(1.0+k), 1.0/(1.0+k/d)
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
def main():
|
| 28 |
+
# 1) validate the closed forms against direct inversion
|
| 29 |
+
val = []
|
| 30 |
+
for d in (2, 8, 32, 128, 512):
|
| 31 |
+
for (n, a, s) in ((50, 1.0, 0.3), (5, 1.0, 1.0), (20, 2.0, 0.5)):
|
| 32 |
+
e1, m1 = numeric(d, n, a, s); e2, m2 = closed(d, n, a, s)
|
| 33 |
+
val.append({"d": d, "n": n, "alpha": a, "sigma": s,
|
| 34 |
+
"exact_err": abs(e1-e2), "mfvi_err": abs(m1-m2)})
|
| 35 |
+
me = max(v["exact_err"] for v in val); mm = max(v["mfvi_err"] for v in val)
|
| 36 |
+
print(" closed form vs direct inversion: max |err| exact=%.2e MFVI=%.2e (%d cells)"
|
| 37 |
+
% (me, mm, len(val)), flush=True)
|
| 38 |
+
|
| 39 |
+
# 2) use the validated closed form to reach large d
|
| 40 |
+
rows = []
|
| 41 |
+
n, alpha, sigma = 5, 1.0, 1.0 # k = 5, so convergence is visible
|
| 42 |
+
for d in (2, 8, 32, 128, 512, 2048, 8192, 32768, 131072):
|
| 43 |
+
e, m = closed(d, n, alpha, sigma)
|
| 44 |
+
rows.append({"d": d, "exact_over_prior": round(e, 8), "mfvi_over_prior": round(m, 6)})
|
| 45 |
+
print(" d=%-7d exact/prior=%.6f (flat) MFVI/prior=%.6f" % (d, e, m), flush=True)
|
| 46 |
+
RES["claim3_rank1"] = {"validation_cells": len(val),
|
| 47 |
+
"max_closed_form_error_exact": me, "max_closed_form_error_mfvi": mm,
|
| 48 |
+
"n": n, "alpha": alpha, "sigma": sigma, "rows": rows,
|
| 49 |
+
"exact_is_d_independent": bool(max(r["exact_over_prior"] for r in rows)-min(r["exact_over_prior"] for r in rows) < 1e-12),
|
| 50 |
+
"mfvi_at_max_d": rows[-1]["mfvi_over_prior"],
|
| 51 |
+
"mfvi_converges_to_prior": bool(rows[-1]["mfvi_over_prior"] > 0.99),
|
| 52 |
+
"ratio_mfvi_over_exact_at_max_d": round(rows[-1]["mfvi_over_prior"]/rows[-1]["exact_over_prior"], 1)}
|
| 53 |
+
R = RES["claim3_rank1"]
|
| 54 |
+
print(" exact/prior d-independent: %s | MFVI/prior at d=131072: %.5f | MFVI is %.0fx the exact"
|
| 55 |
+
% (R["exact_is_d_independent"], R["mfvi_at_max_d"], R["ratio_mfvi_over_exact_at_max_d"]), flush=True)
|
| 56 |
+
json.dump(RES, open("mfvi_rank1_final.json", "w"), indent=1)
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
if __name__ == "__main__":
|
| 60 |
+
main(); print("DONE")
|
outputs_mfvi_rank1_final.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"claim3_rank1": {
|
| 3 |
+
"validation_cells": 15,
|
| 4 |
+
"max_closed_form_error_exact": 1.7486012637846216e-15,
|
| 5 |
+
"max_closed_form_error_mfvi": 5.551115123125783e-16,
|
| 6 |
+
"n": 5,
|
| 7 |
+
"alpha": 1.0,
|
| 8 |
+
"sigma": 1.0,
|
| 9 |
+
"rows": [
|
| 10 |
+
{
|
| 11 |
+
"d": 2,
|
| 12 |
+
"exact_over_prior": 0.16666667,
|
| 13 |
+
"mfvi_over_prior": 0.285714
|
| 14 |
+
},
|
| 15 |
+
{
|
| 16 |
+
"d": 8,
|
| 17 |
+
"exact_over_prior": 0.16666667,
|
| 18 |
+
"mfvi_over_prior": 0.615385
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"d": 32,
|
| 22 |
+
"exact_over_prior": 0.16666667,
|
| 23 |
+
"mfvi_over_prior": 0.864865
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"d": 128,
|
| 27 |
+
"exact_over_prior": 0.16666667,
|
| 28 |
+
"mfvi_over_prior": 0.962406
|
| 29 |
+
},
|
| 30 |
+
{
|
| 31 |
+
"d": 512,
|
| 32 |
+
"exact_over_prior": 0.16666667,
|
| 33 |
+
"mfvi_over_prior": 0.990329
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"d": 2048,
|
| 37 |
+
"exact_over_prior": 0.16666667,
|
| 38 |
+
"mfvi_over_prior": 0.997565
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
"d": 8192,
|
| 42 |
+
"exact_over_prior": 0.16666667,
|
| 43 |
+
"mfvi_over_prior": 0.99939
|
| 44 |
+
},
|
| 45 |
+
{
|
| 46 |
+
"d": 32768,
|
| 47 |
+
"exact_over_prior": 0.16666667,
|
| 48 |
+
"mfvi_over_prior": 0.999847
|
| 49 |
+
},
|
| 50 |
+
{
|
| 51 |
+
"d": 131072,
|
| 52 |
+
"exact_over_prior": 0.16666667,
|
| 53 |
+
"mfvi_over_prior": 0.999962
|
| 54 |
+
}
|
| 55 |
+
],
|
| 56 |
+
"exact_is_d_independent": true,
|
| 57 |
+
"mfvi_at_max_d": 0.999962,
|
| 58 |
+
"mfvi_converges_to_prior": true,
|
| 59 |
+
"ratio_mfvi_over_exact_at_max_d": 6.0
|
| 60 |
+
}
|
| 61 |
+
}
|
pages/claim-3-data-concentration/page.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
|
|
|
|
|
| 1 |
# Claim 3 - Data concentration
|
| 2 |
|
| 3 |
|
|
@@ -5,17 +7,69 @@
|
|
| 5 |
<!-- trackio-cell
|
| 6 |
{"type": "markdown", "id": "cell_2799d8244112", "created_at": "2026-07-17T21:13:50+00:00", "title": "First-PC mechanism and boundary controls"}
|
| 7 |
-->
|
| 8 |
-
# Claim 3 — overestimation follows data concentration
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
| 13 |
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
|
| 16 |
-
|
| 17 |
-
- MFVI predictive variance exceeds exact variance along the first PC in **140/140**, minimum margin `4.37e-9`;
|
| 18 |
-
- substituting the last PC reverses the comparison in **140/140**;
|
| 19 |
-
- substituting a deliberately dominating nonspherical prior breaks first-PC/minimum-posterior alignment in **140/140**.
|
| 20 |
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Claim 3: in a pathological rank-1 training-data subspace, the MFVI posterior's predictive variance converges to the prior variance as dimension increases
|
| 2 |
+
|
| 3 |
# Claim 3 - Data concentration
|
| 4 |
|
| 5 |
|
|
|
|
| 7 |
<!-- trackio-cell
|
| 8 |
{"type": "markdown", "id": "cell_2799d8244112", "created_at": "2026-07-17T21:13:50+00:00", "title": "First-PC mechanism and boundary controls"}
|
| 9 |
-->
|
|
|
|
| 10 |
|
| 11 |
+
**Outcome: reproduced with concrete numbers. The anchored claim map asserted
|
| 12 |
+
rank-1 experiments through dimension 64, but no page carried results; this page
|
| 13 |
+
supplies them, and reaches dimension 131,072.**
|
| 14 |
+
|
| 15 |
+
## Setup and the exact algebra
|
| 16 |
+
|
| 17 |
+
Rank-1 design: every training row lies along a single direction `u`, so the
|
| 18 |
+
posterior precision is
|
| 19 |
+
|
| 20 |
+
A = n u u^T / sigma^2 + I/alpha .
|
| 21 |
+
|
| 22 |
+
Taking `u` **uniformly spread** (`u_i = 1/sqrt(d)`), the two predictive variances
|
| 23 |
+
at `u` have closed forms — Sherman-Morrison for the exact posterior, and the
|
| 24 |
+
reciprocal diagonal for the mean-field one:
|
| 25 |
+
|
| 26 |
+
exact / prior = 1 / (1 + alpha n / sigma^2) <- INDEPENDENT of d
|
| 27 |
+
MFVI / prior = 1 / (1 + alpha n / (d sigma^2)) <- -> 1 as d -> infinity
|
| 28 |
+
|
| 29 |
+
Both were validated against **direct matrix inversion** on 15 (d, n, alpha,
|
| 30 |
+
sigma) cells before being used at large `d`: maximum absolute discrepancy
|
| 31 |
+
**1.75e-15** (exact) and **5.55e-16** (MFVI).
|
| 32 |
+
|
| 33 |
+
## Result — n = 5, alpha = 1.0, sigma = 1.0
|
| 34 |
+
|
| 35 |
+
| d | exact / prior | MFVI / prior |
|
| 36 |
+
| --- | --- | --- |
|
| 37 |
+
| 2 | 0.166667 | **0.285714** |
|
| 38 |
+
| 8 | 0.166667 | **0.615385** |
|
| 39 |
+
| 32 | 0.166667 | **0.864865** |
|
| 40 |
+
| 128 | 0.166667 | **0.962406** |
|
| 41 |
+
| 512 | 0.166667 | **0.990329** |
|
| 42 |
+
| 2048 | 0.166667 | **0.997565** |
|
| 43 |
+
| 8192 | 0.166667 | **0.999390** |
|
| 44 |
+
| 32768 | 0.166667 | **0.999847** |
|
| 45 |
+
| 131072 | 0.166667 | **0.999962** |
|
| 46 |
+
|
| 47 |
+
**The exact posterior is completely insensitive to dimension** — 0.166667 at
|
| 48 |
+
every `d`, flat to machine precision — because the rank-1 update removes the same
|
| 49 |
+
amount of variance along `u` regardless of how many coordinates that direction is
|
| 50 |
+
spread across.
|
| 51 |
+
|
| 52 |
+
**MFVI converges to the prior**: 0.286 at `d = 2` rising monotonically to
|
| 53 |
+
**0.999962** at `d = 131,072`. At that point the mean-field predictive variance is
|
| 54 |
+
**6x** the exact one and is within 0.004% of the prior — it has effectively
|
| 55 |
+
learned nothing from the data, which is the pathology the claim describes.
|
| 56 |
+
|
| 57 |
+
## Why the test direction is the whole experiment
|
| 58 |
|
| 59 |
+
The effect only appears when `u` is spread across coordinates. Measuring instead
|
| 60 |
+
along a **sparse** direction (`u = e_1`) gives `A_11 = n/sigma^2 + 1/alpha`, which
|
| 61 |
+
does not depend on `d` at all, and MFVI then tracks the exact posterior exactly
|
| 62 |
+
(both 0.001797 at every dimension) — no pathology, no convergence to the prior.
|
| 63 |
|
| 64 |
+
An earlier attempt at this claim measured along a direction that concentrated the
|
| 65 |
+
data information and obtained the *opposite* pattern, with the exact posterior
|
| 66 |
+
appearing to drift toward the prior. The mechanism is entirely about how `n/sigma^2`
|
| 67 |
+
is divided among `d` diagonal entries: spreading it makes each `A_ii` approach the
|
| 68 |
+
prior precision `1/alpha`, while the full matrix retains the rank-1 update.
|
| 69 |
|
| 70 |
+
## Scope
|
|
|
|
|
|
|
|
|
|
| 71 |
|
| 72 |
+
Gaussian linear model with isotropic prior, exact rank-1 design, predictive
|
| 73 |
+
variance evaluated at the data direction. Closed forms are used above `d = 512`
|
| 74 |
+
where direct inversion is impractical, having been checked against inversion
|
| 75 |
+
below it.
|