尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A CNN was trained to answer one question — is there a signal in this noise? It was never shown the mass of anything. Afterwards, a straight line through its internal state recovers it.
The project page, GW Probe, has an interactive Kerr shadow explorer, and every number on it is read
from the pipeline's own JSON output. An offline single-file copy is at
site/standalone.html: download it and open it by double-click.
UM301 flagship project. Four experiments on real LIGO/Virgo data plus a from-scratch general relativity implementation, built spec-first with pre-registered predictions and a full audit trail.
| Chirp mass recovered from the frozen embedding | R² = 0.502 [+0.364, +0.646], p < 1e-4 |
| Same probe on an untrained network of identical architecture | R² = 0.056 |
| Difference, paired bootstrap | +0.424 [+0.286, +0.637], Holm p = 0.0005 |
| Events | 180 real detected black-hole mergers |
| Detector on real data (trained only on simulations) | AUC 0.973 |
The network never saw a mass label. The probe reading it is deliberately weak — a linear ridge regression, one hyperparameter — because the question is what is linearly accessible, not how well mass can be predicted.
Implements Bardeen's closed-form photon-orbit boundary for a spinning black hole, verified
symbolically against two limits where the answer is known exactly: at zero spin the shadow must be
a circle of radius 3√3 M; at maximum spin the prograde photon orbit must merge with the horizon.
Then uses the validated code to predict shadow diameters for M87* (EHT measured 42 ± 3 µas)
and Sgr A* (48.7 ± 7 µas) from independently-measured masses, and compares against the
published deviation parameters. No machine learning — this is the SDD half of the project and the
interactive anchor of the page: web/shadow.js redraws the exact boundary live,
with a schematic Novikov–Thorne disk, and on every load re-checks itself against the 30 Python
reference cases (worst disagreement 3.55e-15).
A ~4.34 M-parameter ResNet-style CNN trained on the G2Net dataset: 2-second three-detector strain segments, whitened, bandpassed 20–500 Hz, Q-transformed (Q = 12) into 3 × 64 × 128 spectrograms, classified signal-vs-noise.
Freezes that CNN, pushes 180 real GWTC events through the identical hashed preprocessing, extracts 128-dimensional pre-classification embeddings, and fits a ridge regression under nested leave-one-out cross-validation to predict chirp mass.
Three feature sources, one probe:
| Input | R² | 95 % CI | MAE (M☉) |
|---|---|---|---|
| Trained CNN embedding (128-d) | +0.502 | [+0.364, +0.646] | 6.33 |
| Raw pixels (24 576-d, no network) | +0.340 | [+0.261, +0.422] | 8.36 |
| Untrained CNN (128-d, best of 5 seeds) | +0.056 | [−0.049, +0.126] | 10.49 |
Sim-to-real transfer: the network, trained purely on simulated injections, was shown real detections for the first time and scored AUC 0.9732 ± 0.017 against real off-source noise from the same segments (mean logit +3.34 vs +0.06, p = 2.5e-86) — higher on reality than on the simulations it learned from.
Registered null: effective spin was probed alongside mass and returned ≈ 0 from all three sources (p ≈ 0.5–0.8), exactly as predicted in advance. A method that returns "yes" to every label is not measuring anything; this one does not.
Attrition: 192 events passed selection (SNR ≥ 10, BBH only), 180 produced embeddings, 12 lack published strain. Across 576 detector-fetches: 458 ok, 99 no-file, 19 all-NaN.
XGBoost trained on GWTC catalogue features — distance, SNR, redshift, spin, false-alarm rate, p_astro — predicting the same chirp mass, with every mass-bearing column removed, with SHAP attribution.
On the same 180 events: XGBoost R² 0.595 [0.472, 0.720], MAE 6.02 M☉, against 0.502 for the label-free probe. Supervision adds +0.093 [−0.021, +0.203], Holm p = 0.105 — not significant. The decomposition: training moves R² by +0.446, supervision adds +0.093, nonlinearity adds −0.002.
After Part C ran, a problem surfaced by inspection rather than by any gate: ridge on raw pixels is a linear model of the image, while ridge on the embedding is a nonlinear one, because the embedding is itself a nonlinear function of the pixels. So part of the gap might be nothing more interesting than "nonlinear beats linear."
Part F gives every source the same nonlinearity budget — identical RBF kernel ridge throughout:
| Source | Linear | Nonlinear | Gain from nonlinearity |
|---|---|---|---|
| trained | +0.502 | +0.464 | −0.038 |
| raw pixels | +0.340 | +0.338 | −0.002 |
| untrained | +0.056 | +0.069 | +0.013 |
The answer is a negative result: giving raw pixels a full nonlinear read-out moved them by −0.002. Nonlinearity buys nothing on this problem, so it cannot explain the gap.
Paired comparisons (both members refit on the same bootstrap resample):
| Comparison | ΔR² | 95 % CI | Holm p |
|---|---|---|---|
| trained vs untrained, both nonlinear | +0.424 | [+0.286, +0.637] | 0.0005 |
| trained vs raw pixels, both linear | +0.182 | [+0.106, +0.318] | 0.026 |
| trained vs raw pixels, both nonlinear | +0.155 | [+0.016, +0.325] | 0.261 — not significant |
That last row must always be reported as non-significant. The bootstrap interval excludes zero while the permutation p-value does not reach significance; when the two disagree at this sample size, the p-value is the conservative read.
Part F recomputed Part C's linear column from scratch and reproduced it to |diff| = 0.00e+00, which is what makes the two parts comparable at all.
Shows: training transforms the representation so that chirp mass becomes linearly readable, far beyond an untrained network of identical architecture, and not because of model class.
Does not show, and the page must never claim:
| Changed | Because |
|---|---|
n_subset 200k recommendation reversed | the learning curve flattened — more data was not the constraint |
| Bundle discovery rewritten | the first Part C died in 17 s at discover_bundle() |
| Shadow explorer forced to a single self-contained file | it silently rendered a Schwarzschild circle at spin 0.63 |
| Randomised window alignment reverted | Part B trained at fixed alignment; randomising degraded mass R² from 0.353 → 0.148 on identical events |
| "Recovery closed — strain not published" overturned | an HTTP Range-read fix lifted n from 73 → 180; the diagnosis had been a resolver bug |
| Part F commissioned | the model-class confound was found after Part C ran, and by inspection rather than by a gate |
schedule_completed (a labelling coincidence in Part B) and
spin_calibration_row_present (Part F). A green table proves nothing.The page follows GWprobedelta.md, one argument read top to bottom:
Dark blue and space, precise and typographic. The project's distinguishing feature is rigour, and the design amplifies it rather than fighting it.
#05070c fading to #0a1a3a, translucent panels, text #e8ecf4 / mid #c3cada /
dim #8b93a7#5b9dff, the single knob the page is tuned on: nav, eyebrows, key
figures, links, bars, glows and the focus ring all follow it#7ee59a / red #ff8a8a reserved for pass/fail badges, verdicts and error bannerssite/tools/space.py), two
tiled starfields and two soft accent glows, kept dark enough that every text token holds 4.5:1The Did You Know bar carries 17 short physics notes (closed timelike curves inside rotating
black holes, chronology protection, the Penrose process, ER = EPR, black hole impostors and the
Buchdahl bound, gravitational-wave memory). Sources stay in facts.json for anyone checking a claim.
Every number on the page is read from JSON: cnn.json, probe.json, nonlinear.json,
tabular.json, shadow.json, facts.json. Nothing is hardcoded, so a pipeline re-run updates the
page by replacing one file.
| Path | What it is |
|---|---|
site/ | the published page: index.html, style.css, app.js, shadow.js, synced data/ and img/, build.py, standalone.html |
GWprobedelta.md | the page spec this build implements |
partA.py, src/shadow/, web/ | the Kerr geometry, its Python ground truth and the JS port |
PartB/ | the detection CNN (partB.py), its cnn.json, the trained weights and the hashed preprocessing bundle |
partC.py, probe.json | the linear probe on 180 real events |
partD.py, results/tabular.json | the supervised XGBoost comparison |
partF.py, nonlinear.json, Part F/ | the nonlinearity control |
results/ | pipeline figures and JSON |
plan.md, specs_webpage.md | the build plan and the original page spec |
cd site
python3 build.py --sync # copy the pipeline's JSON, figures and shadow.js in
python3 -m http.server 8000 # then open http://localhost:8000
python3 build.py # optional: rebuild the offline standalone.html
The site deploys to GitHub Pages from site/ on every push to main
(.github/workflows/pages.yml).
| Part | State |
|---|---|
| A — Kerr shadow + EHT | complete; live explorer on the page |
| B — detection CNN | complete, AUC 0.8503 |
| C — the probe | complete, n = 180, R² 0.502 |
| D — XGBoost comparison | complete on the same 180 events |
| F — nonlinearity control | complete |
| E — this page | live: askretik.github.io/Gravitational-Waves |