Aller au contenu principal

Autoencodeur — Réduction de dimension non-linéaire

Cette page documente les résultats de l'autoencodeur neuronal SpectralAutoencoder appliqué aux 183 descripteurs spectroscopiques de N = 43 019 spectres LAMOST DR5 × Gaia DR3. L'autoencodeur est la troisième méthode de réduction de dimension étudiée dans le cadre du projet PHY-3500, en complément de la PCA (linéaire) et d'UMAP/t-SNE (non-paramétriques). Son rôle est d'apporter une représentation non-linéaire paramétrique : il apprend une compression et peut projeter de nouveaux spectres sans recalcul complet.

Référence article PHY-3500

L'autoencodeur est mentionné dans l'article Baker, Caillat & Jean (28 avril 2026) mais ses résultats détaillés ne sont pas développés dans le corps du texte — le lecteur est renvoyé à cette page de documentation. Les résultats clés : MSE(AE, z=2) = 0,489 ≈ PCA(k=10), et la découverte que l'axe 1 latent encode la gravité plutôt que la température.


Résultats clés

MSE
0.489
MSE de reconstruction
autoencodeur z = 2 · N = 43 019
vs PCA(z=2) = 0.696 · −29,8 %
z=2
≈ PCA@10
Équivalence en compression
MSE(AE, z=2) ≈ MSE(PCA, k=10)
5× moins de dimensions que PCA
ep.
145
Époques d'entraînement
Best val loss = 0,548 · 143,7 s
Early stopping · Ryzen 9 5950X CPU
107×
Erreur QSO vs étoiles
MSE(QSO) / MSE(STAR) médiane
Détection anomalie non supervisée

Pourquoi un autoencodeur ?

Les méthodes précédentes ont des limitations complémentaires :

MéthodeLinéaire ?Paramétrique ?Avantage principalLimitation
PCALoadings interprétables · reproducibleAveugle aux relations non-linéaires
UMAP / t-SNEPartielStructure topologique · clustersPas de transform() exact sur nouveaux points
AutoencodeurNon-linéaire + paramétriqueBoîte noire · coût entraînement

L'autoencodeur est non-linéaire (il peut capturer des structures que la PCA aplatit) et paramétrique (une fois entraîné, encoder un nouveau spectre est un simple passage forward). C'est la combinaison idéale pour un pipeline en production.


Architecture

Architecture SpectralAutoencoder
MLP symétrique · BatchNorm + Dropout(0.1) · Adam lr=1e-3
Encodeur
Espace latent z=2
Décodeur
← ENCODEUR
DÉCODEUR →
183
Entrée X
256
Dense 256
128
Dense 128
64
Dense 64
2
z (latent)
64
Dense 64
128
Dense 128
256
Dense 256
183
Sortie X̂
z (latent) — dim 2
Linear — espace latent 2D
Taux de compression
183 → 2
91,5× (vs 91 pour PCA@95%)
Paramètres total
~330k
Batch size
512
Optimiseur
Adam · lr=1e-3
Perte
MSE (reconstruction)
Early stopping
patience=15 · val_loss
Device
CPU (Ryzen 9 5950X)

Justification des choix d'architecture

MLP symétrique (183 → 256 → 128 → 64 → 2 → 64 → 128 → 256 → 183) : L'expansion initiale vers 256 (> 183) n'est pas une erreur — elle permet au réseau de créer des représentations intermédiaires plus riches avant la compression. C'est une pratique courante pour les autoencodeurs sur données spectrales (Portillo et al. 2020, AJ 160:45).

BatchNorm + Dropout(p=0.1) : BatchNorm stabilise le gradient et accélère la convergence. Dropout légère (0,1) évite l'overfitting sans dégrader la reconstruction — les spectres stellaires sont suffisamment réguliers pour qu'un dropout plus fort soit contre-productif.

Dimension latente z = 2 : Choix délibéré pour la visualisation 2D et la comparaison équitable avec PCA(k=2) et UMAP(2D). Un z = 8 ou 16 atteindrait une MSE bien inférieure mais perdrait la lisibilité visuelle.

from src.dimred.autoencoder import SpectralAutoencoder

# Entraînement
ae = SpectralAutoencoder(input_dim=183, latent_dim=2, hidden_dims=[256, 128, 64])
history = ae.fit(X_train_scaled, epochs=200, lr=1e-3, batch_size=512, patience=15)

# Encoder 43 019 spectres → espace latent 2D
Z_ae = ae.encode(X_scaled) # shape: (43019, 2)

# Reconstruction
X_recon = ae.decode(Z_ae) # shape: (43019, 183)
mse = ae.reconstruction_mse(X_scaled) # → 0.489

Reconstruction — Autoencodeur vs PCA

Benchmark MSE(k)

MSE de reconstruction : Autoencodeur (z=2) vs PCA (k=1…50)
N = 43 019 spectres · 183 features · run 20260405T220839Z
PCA (k composantes)
AE (z = 2 fixe)
0.20.30.40.50.60.70.8AE(z=2) = 0.489PCA(k=10)≈AE12510203050K composantes PCA →MSE
AE(z=2) ≈ PCA(k=10) — avec seulement 2 dimensions latentes, l'autoencodeur atteint la même MSE que la PCA avec 10 composantes. La non-linéarité compense la dimensionnalité.
Limite : PCA(k=50) atteint MSE = 0.196, bien en dessous de l'AE(z=2). La PCA profite de ses 50 degrés de liberté — l'autoencodeur 2D est contraint par sa faible dimensionnalité latente.

Erreur de reconstruction par type d'objet

La décomposition par classe révèle un résultat astrophysique important :

ClasseNMSE moyenMSE médianp95Facteur vs étoiles
STAR42 9560,4850,2270,9741× (référence)
GALAXY563,0091,1703,043~5×
QSO75,7940,95418,637~107× (médiane)
Détection d'anomalies non supervisée

Les QSO (quasi-stellar objects) ont une erreur de reconstruction 107× plus élevée que les étoiles (médiane). L'autoencodeur, entraîné quasi-exclusivement sur des étoiles (99,85% de l'échantillon), n'a jamais appris la structure spectrale des QSO — leurs spectres d'émission larges (raies Ly-α, CIV) sont radicalement différents. Ce résultat démontre que l'erreur de reconstruction peut servir de score d'anomalie : un spectre avec MSE >> 1 est probablement non stellaire.


Espace latent et interprétation physique

Corrélations de Spearman avec Gaia DR3

🔄
Découverte — L'autoencodeur encode la gravité sur son premier axe
Contrairement à la PCA (PC1 = température, ρ = +0,831), le premier axe latent de l'autoencodeur est faiblement corrélé à T_eff (ρ = +0,019) mais modérément à log g (ρ = +0,340). L'axe 2 encode la température (ρ = +0,793). Cette inversion suggère que la structure non-linéaire de la gravité est plus saillante dans l'espace appris par le réseau.
Autoencodeur (z = 2)
AE axe 1
Découverte
Gravité de surface
Autoencodeur
Teff (K)
+0.019
log g (dex)
+0.340
[Fe/H] (dex)
-0.224
G_BP−G_RP
-0.320
AE axe 2
Température effective
Autoencodeur
Teff (K)
+0.793
log g (dex)
-0.112
[Fe/H] (dex)
-0.542
G_BP−G_RP
-0.770
PCA — référence linéaire
PC1
Température effective
PCA
Teff (K)
+0.831
log g (dex)
-0.155
[Fe/H] (dex)
-0.548
G_BP−G_RP
-0.768
PC2
Mixte (signal faible)
PCA
Teff (K)
+0.156
log g (dex)
+0.081
[Fe/H] (dex)
-0.082
G_BP−G_RP
-0.025
Méthode / axe
ρ(Teff)
ρ(log g)
ρ([Fe/H])
ρ(BP−RP)
Interprétation
AE axe 1
+0.019
+0.340
-0.224
-0.320
← Gravité
AE axe 2
+0.793
-0.112
-0.542
-0.770
Thermique
PCA — PC1
+0.831
-0.155
-0.548
-0.768
← Thermique
PCA — PC2
+0.156
+0.081
-0.082
-0.025
Faible / Mixte

Organisation de l'espace latent

La grille de l'espace latent (ae_latent_grid.png) révèle une organisation physiquement cohérente :

  • L'axe 2 (thermique, ρ = +0,793 avec Teff) déploie la séquence M-K-G-F-A de bas en haut
  • L'axe 1 (gravité, ρ = +0,340 avec log g) sépare naines et géantes
  • Les galaxies et QSO sont repoussés loin de la masse stellaire principale — leur erreur de reconstruction élevée correspond à leur distance dans l'espace latent

Ce résultat est une confirmation indépendante de la découverte HDBSCAN : la distinction naines/géantes est une dimension physique réelle de l'espace spectral.


Interpolation dans l'espace latent

L'autoencodeur paramétrique permet d'interpoler linéairement entre deux points de l'espace latent et de décoder les positions intermédiaires en spectres physiques :

# Interpolation entre une étoile froide (K) et une étoile chaude (A)
# idx_cold : Teff = 4 200 K · idx_hot : Teff = 7 984 K
# Distance latente = 11,44 unités

t = np.linspace(0, 1, 10)
Z_interp = np.outer(1-t, Z_ae[idx_cold]) + np.outer(t, Z_ae[idx_hot])
X_interp = ae.decode(Z_interp)
# → 10 spectres synthétiques intermédiaires entre 4 200 et 7 984 K

L'interpolation produit une transition continue et physiquement plausible : les raies de Balmer s'affaiblissent progressivement et les raies Ca II se renforcent. La distance latente de 11,44 unités pour une variation Teff de ~3 800 K confirme que l'axe 2 encode linéairement la température.


Arithmétique latente — Analogies stellaires

En suivant l'idée des word2vec (Mikolov et al. 2013), l'espace latent supporte-t-il des analogies du type K_géante − K_naine + G_naine ≈ G_géante ?

# K_géante − K_naine + G_naine = ?
z_pred = z_K_geante - z_K_naine + z_G_naine
z_cible = z_G_geante

distance = np.linalg.norm(z_pred - z_cible)
# → distance = 2,1 (= ~18% de la plage totale) — ANALOGIE FONCTIONNELLE

Le résultat indique que l'espace latent encode la direction naine↔géante de manière cohérente à travers les types spectraux — ce qui suggère que le réseau a appris une représentation factorisant (température, gravité) de façon partielle mais mesurable.


Synthèse comparative — PCA · UMAP · Autoencodeur

CritèrePCA (z=2)AE (z=2)UMAP (2D)
MSE reconstruction (2 dim)0,6960,489N/A
Corrélation axe 1 / Teff+0,831+0,019+0,464
Axe physique dominantTempératureGravitéTempérature
Non-linéaire
Paramétrique (transform)Partiel
Interprétable✓ (loadings)~ (corrélations)
Détection anomalies✓ (MSE élevée)✓ (MSE ×107 QSO)✗ directement

Figures de référence

Espace latent 2D — grille complète
Latent
Espace latent 2D — grille complète
AE axe 1 (gravité) × axe 2 (T_eff) — 43 019 spectres colorés par type
Espace latent 2D — zoom
Latent
Espace latent 2D — zoom
Zoom sur la masse stellaire principale — distinction naines/géantes
Courbe d'apprentissage
Entraînement
Courbe d'apprentissage
Train loss vs val loss · 145 époques · best val = 0,548
MSE : AE(z=2) vs PCA(k=1…50)
Benchmark
MSE : AE(z=2) vs PCA(k=1…50)
AE(z=2) ≈ PCA(k=10) · courbe décroissante PCA
Distribution MSE (échelle log)
Anomalies
Distribution MSE (échelle log)
STAR vs GALAXY vs QSO — séparation nette à MSE > 1
Erreur par famille spectrale
Reconstruction
Erreur par famille spectrale
Quelle famille de features est mal reconstruite ?
Exemples de reconstruction
Reconstruction
Exemples de reconstruction
Spectre original vs reconstruit — 6 exemples (A, F, G, K, M, QSO)
MSE médiane par type spectral
Reconstruction
MSE médiane par type spectral
M et K les mieux reconstruits · A les moins bien
Interpolation latente K → A
Interpolation
Interpolation latente K → A
Teff: 4 200 K → 7 984 K · distance latente = 11,44 · 10 étapes
Arithmétique latente
Arithmétique
Arithmétique latente
K_géante − K_naine + G_naine ≈ G_géante · word2vec stellaire
Densité KDE de l'espace latent
Latent
Densité KDE de l'espace latent
Distribution des 43 019 points dans l'espace z=(z1, z2)
Synthèse PCA · UMAP · AE
Synthèse
Synthèse PCA · UMAP · AE
Les 3 espaces latents côte-à-côte — même jeu coloré par T_eff

Fiches diagnostiques — candidats typiques

L'autoencodeur permet de produire une fiche diagnostique pour chaque spectre : position dans l'espace latent, spectre original vs reconstruit, résidu, et MSE. Trois exemples caractéristiques :

Fiche : Étoile A typique
Type A
Fiche : Étoile A typique
Étoile chaude > 7 500 K · raies Balmer larges · MSE modérée (raies étroites)
Fiche : Étoile G naine
Type G
Fiche : Étoile G naine
Étoile solaire 5 500 K · Ca II + Balmer · MSE basse (reconstruction excellente)
Fiche : Étoile K géante
K géante
Fiche : Étoile K géante
log g ≈ 2,5 · Ca II très fort · MSE basse · bien localisée dans l'axe gravité

Implémentation

Le code est dans src/dimred/autoencoder.py (classe SpectralAutoencoder) et le notebook complet dans phy3500_03_autoencoder.ipynb.

# Chargement du modèle sauvegardé
import torch
from src.dimred.autoencoder import SpectralAutoencoder

ae = SpectralAutoencoder(input_dim=183, latent_dim=2)
ae._model = torch.load("data/reports/models/ae_latent2.pt")
ae._model.eval()

# Encoder un nouveau spectre
X_new_scaled = scaler.transform(X_new) # même scaler qu'à l'entraînement
Z_new = ae.encode(torch.tensor(X_new_scaled, dtype=torch.float32).numpy())