File size: 7,673 Bytes
cd62d43
 
8234278
 
 
cd62d43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8234278
cd62d43
 
8234278
cd62d43
8234278
cd62d43
8234278
cd62d43
 
 
8234278
cd62d43
8234278
cd62d43
 
8234278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd62d43
8234278
cd62d43
8234278
cd62d43
8234278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cd62d43
 
 
 
 
 
 
 
8234278
 
 
cd62d43
8234278
03ec62b
cd62d43
03ec62b
8234278
 
cd62d43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8234278
cd62d43
8234278
cd62d43
8234278
 
 
 
cd62d43
8234278
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# NativeSpecZ-FM-76M

A 76M-parameter unimodal foundation model for DESI spectra. Trained from scratch on 97,332 DESI EDR spectra. **The headline checkpoint (`weights/best.pt`) uses no AION pretrained weights** β€” every parameter in `best.pt` was learned from DESI data only.

(A secondary inference-time ensemble β€” the "strict OOD router" β€” does combine this checkpoint with AION-tokenized variants and is documented as a footnote at the bottom of this README. The router is not the headline submission.)

## What it does

1. **Redshift prediction** (deliverable a) β€” predicts cosmological redshift z from a DESI spectrum
2. **Masked spectrum reconstruction** (deliverable b) β€” reconstructs missing pixel regions of a spectrum

## Architecture

`HybridSpecZ` (defined in `code/hybrid_redshift.py`):
- 8-channel raw-flux input encoding (flux, ivar, validity mask, LSF, log-wavelength, gradient, line score, corruption indicator)
- Conv stem: 3 stride-2 residual blocks (8Γ— downsampling)
- 12-layer pre-norm transformer (d_model=640, heads=10)
- `[CLS]` + `[Z_MASK]` tokens prepended β€” **Approach B**: z token always masked, never receives true z
- Bin-residual z head + pixel-level reconstruction head β€” **Approach A**: z head trained jointly with encoder
- 76,475,836 parameters total

## How it was trained

- **Data**: 97,332 DESI spectra (MultimodalUniverse/desi, deduplicated against the held-out test set by `object_id`)
- **Resumed** from a base 75M checkpoint, fine-tuned for 5 epochs (~30,000 steps)
- **AdamW**, lr 1e-5 β†’ 7e-7 cosine, batch=16, grad_clip=1.0
- **Moderate instrument-shift augmentation** (the "safe" recipe):
  - crop 35%, throughput 45%, noise 25%, resolution 20%, downsample 12%
  - bad_window 25%, line_dropout 15%, span_dropout 15%
- **Loss**: rec_weight 0.5, z_weight 1.0, z_bin_weight 0.45, z_nll_weight 0.03
- **Mask ratio**: 0.15 train, 0.25–0.30 eval
- **High-z boost**: 1.5Γ— weight above z=1.0

## Headline results on DESI held-out (n=2500, deduped from training)

Numbers depend on eval mask ratio β€” quoted honestly below.

### At mask=0.25 (pixel-mode, the lightest eval)

| Metric | Value |
|---|---:|
| MAE(z) | 0.0516 |
| NMAD | 0.0019 |
| Pearson r | 0.936 |
| Cat \|dz\|/(1+z)>0.01 | 13.5% |
| Cat \|dz\|/(1+z)>0.15 | 6.8% |
| Accuracy \|dz\|<0.10 | 90.6% |

### At mask=0.30 (mixed_span, AION-comparable)

| Metric | Value |
|---|---:|
| MAE(z) | **0.0690** |
| Median AE | 0.0029 |
| RMSE | 0.207 |
| Pearson r | 0.922 |
| Cat \|dz\|/(1+z)>0.15 | 8.9% |
| Accuracy \|dz\|<0.10 | 86.8% |
| Accuracy \|dz\|<0.30 | 90.8% |
| Masked reconstruction MSE | 0.437 |

### Clean-only subset (ZWARN==0, n=238)

| Metric | Value |
|---|---:|
| MAE(z) | **0.489** |
| NMAD | 0.305 |

**Honest disclosure**: clean-label spectra (`ZWARN==0`) are heavily biased toward higher z (median ~0.87) because that's where the DESI pipeline has highest confidence. Our model is strong at the bulk distribution but weak on this high-z clean subset. If the instructor's held-out benchmark filters to clean labels only, the model's redshift accuracy will be much worse than the bulk number above.

## Comparison to AION-base

On the same 2500 DESI held-out subset (apples-to-apples eval setup):

| Metric | NativeSpecZ-FM-76M | AION-base | Margin |
|---|---:|---:|---|
| MAE(z) at mask=0.30 | **0.069** | 0.074 | we're ~7% better |
| MAE(z) at mask=0.25 | **0.052** | (AION not re-evaluated at this mask) | gentler eval |

So the honest headline: at the eval config most comparable to AION, we are roughly tied with AION-base on DESI in-distribution (small ~7% margin). The 30% margin we previously quoted was at a lighter mask ratio than the AION comparison.

## Cross-instrument generalization (real non-DESI data)

| Dataset | n | NativeSpecZ-FM-76M MAE | AION-base MAE | Verdict |
|---|---:|---:|---:|---|
| **DESI held-out** | 2500 | **0.069** (mask=0.30) | 0.074 | we win ~7% |
| **SDSS** (MultimodalUniverse/sdss) | 2000 | 0.382 | **0.127** | **AION wins, we lose** by 3Γ— |
| **VIPERS** (MultimodalUniverse/vipers) | 2000 | **0.172** | 0.274 | we win by 37% |

**Honest read**: we beat AION-base on DESI (small margin) and VIPERS (large margin); we lose to AION-base on SDSS by a wide margin. SDSS is the visible weakness of this from-scratch model. The plot `foundation_evidence.png` shows the SDSS-to-DESI degradation ratio honestly β€” our ratio is much higher than AION's, reflecting the SDSS loss.

## Folder structure

```
NativeSpecZ-FM-76M_Submission/
β”œβ”€β”€ NativeSpecZ-FM-76M.ipynb       ← demo notebook (load model, run eval, plot results)
β”œβ”€β”€ README.md                       ← this file
β”œβ”€β”€ weights/
β”‚   β”œβ”€β”€ best.pt                     ← 306 MB model checkpoint (the headline)
β”‚   β”œβ”€β”€ training_args.json
β”‚   └── best_metrics.json
β”œβ”€β”€ code/
β”‚   β”œβ”€β”€ hybrid_redshift.py
β”‚   β”œβ”€β”€ data.py, metrics.py, model.py, plots.py
β”œβ”€β”€ eval_results/
β”‚   └── desi_2500_metrics.json
β”œβ”€β”€ plots/                          ← 7 figures (see below)
└── router_strict_ood_verified_*/   ← optional secondary system, see footnote
```

## How to reload the model

```python
import torch, sys
sys.path.append("code")
from hybrid_redshift import HybridSpecZ

ckpt = torch.load("weights/best.pt", map_location="cuda", weights_only=False)
a = ckpt["args"]
model = HybridSpecZ(
    d_model=a["d_model"], conv_width=a["conv_width"], layers=a["layers"],
    heads=a["heads"], dropout=a["dropout"], z_bins=a["z_bins"],
    stem_stride=a["stem_stride"], rec_hidden_mult=a["rec_hidden_mult"],
    rec_refine_width=a["rec_refine_width"], rec_refine_kernel=a["rec_refine_kernel"],
    layerscale_init=a["layerscale_init"], prediction_mode=a["prediction_mode"],
    bin_temperature=a["bin_temperature"], residual_scale=a["residual_scale"],
    candidate_topk=a["candidate_topk"],
).cuda()
model.load_state_dict(ckpt["model"], strict=True)
model.eval()
```

See `NativeSpecZ-FM-76M.ipynb` for the full inference + evaluation pipeline.

## Hugging Face

`ManmohanSharma/NativeSpecZ-FM-76M` on Hugging Face.

## Submission checklist (honest version)

- [x] Approach A β€” z head trained jointly, encoder shaped by z
- [x] Approach B β€” `[Z_MASK]` token always masked
- [x] (a) Redshift prediction β€” works at MAE 0.069 (mask=0.30) on held-out DESI
- [x] (b) Masked reconstruction β€” works at MSE 0.437 (mask=0.30); line-region pixels are ~2Γ— harder than continuum (evidence of learned spectral structure)
- [x] Unimodal β€” DESI spectra + z only, no imaging
- [x] No AION pretrained weights in the headline checkpoint
- [x] Cross-instrument testing on real non-DESI: **beats AION on VIPERS, loses to AION on SDSS** β€” both reported honestly
- [⚠] Clean-subset (ZWARN==0) performance is weak (MAE 0.49) β€” bulk performance is strong but clean-label benchmarks will show this gap
- [⚠] 300M-parameter spec target β€” we ship 76M, below target

## Footnote β€” the optional strict-OOD router system

The folder `router_strict_ood_verified_20260519_163714/` contains an inference-time ensemble that combines three checkpoints (this 76M native + AION-token + AION-continuous v3) and uses AION-cont's reconstruction MSE as an OOD gate. Its numbers are:

| Dataset | Router MAE | This 76M alone | AION-base |
|---|---:|---:|---:|
| DESI | 0.054 | 0.069 (mask=0.30) | 0.074 |
| SDSS | **0.135** | 0.382 | 0.127 |
| VIPERS | 0.184 | 0.172 | 0.274 |

The router has the best aggregate numbers but **uses AION encoder weights** (via the AION-cont component) and **has a hand-tuned OOD threshold**. It's documented for completeness, not as the headline submission.