Views
No views yet
Status: Research & Architecture Design Phase Goal: Build the first encoder-only embedding model where the representation layer IS a Sparse Autoencoder, trained end-to-end with contrastive loss.
| Approach | Training | Interpretable? | Sparse-native? | End-to-end? |
|---|---|---|---|---|
| Dense bi-encoder (e.g., E5, GTE) | Contrastive | ❌ | ❌ | ✅ |
| SPLADE | Distillation + regularizer | ⚠️ (vocab-tied) | ✅ | ✅ |
| Post-hoc SAE on embeddings | Reconstruction only | ✅ | ✅ | ❌ |
| CSR (Beyond Matryoshka) | Contrastive + recon (frozen backbone) | ✅ | ✅ | ❌ (backbone frozen) |
| SPLARE (Mar 2026) | Distillation (KL from cross-encoder) | ✅ | ✅ | ⚠️ (pretrained SAE, frozen LLM) |
| Ours (this project) | Contrastive + recon + FLOPS reg | ✅ | ✅ | ✅ (backbone + SAE jointly) |
├── README.md # This file
├── ARCHITECTURE.md # Detailed architecture design
├── PAPERS.md # Papers bibliography + key findings
├── TRAINING_RECIPE.md # Full training recipe with hyperparameters
├── src/ # (future) Implementation code
│ ├── model.py # SAE bottleneck + ModernBERT
│ ├── loss.py # Combined loss functions
│ └── train.py # Training script
└── experiments/ # (future) Training logs and resultsInput text
│
▼
┌─────────────────────────────────┐
│ ModernBERT-base (768-dim) │ ← Backbone (trainable)
│ - RoPE positional embeddings │
│ - FlashAttention 2 │
│ - GeGLU activations │
│ - Alternating local/global attn│
│ - 8192 token context │
└──────────────┬──────────────────┘
│ mean-pool → v ∈ ℝ^768
▼
┌─────────────────────────────────┐
│ TopK Sparse Autoencoder │ ← SAE Bottleneck (trainable)
│ │
│ Encoder: z = TopK(W_enc(v-b) + b_enc)
│ z ∈ ℝ^16384, ||z||_0 = k (32-128 active)
│ │
│ Decoder: v̂ = W_dec·z + b │ ← For reconstruction loss only
│ (not used at inference)│
└──────────────┬──────────────────┘
│
▼
z (sparse embedding)
Used for retrieval via sparse dot product| Paper | ArXiv | Relevance |
|---|---|---|
| ModernBERT | 2412.13663 | Backbone architecture |
| TopK SAE (OpenAI) | 2406.04093 | SAE architecture + dead latent prevention |
| CSR (Beyond Matryoshka) | 2503.01776 | Contrastive sparse coding framework |
| SPLARE | 2603.13277 | SAE for retrieval (closest prior work) |
| SPLADE v2 | 2109.10086 | FLOPS regularizer for sparse retrieval |
| EmbeddingGemma | 2509.20354 | GOR spread-out regularizer |
| Nomic Embed v2 MoE | 2502.07972 | MoE encoder embeddings |
| Ettin | 2507.11412 | Encoder vs Decoder comparison |
| Theoretical Limits | 2508.21038 | Why single-vector has capacity limits |
| Disentangling Embeddings (SAE) | 2408.00657 | SAE interpretability for embeddings |
| Interpretable Embed SAE | 2512.10092 | SAE data analysis toolkit |
| Hypencoder | 2502.05364 | Beyond dot-product retrieval |
| RouterRetriever | 2409.02685 | Router + expert models pattern |
1from transformers import AutoModelForCausalLM, AutoTokenizer
2
3model_id = "pauvanbr/sae-encoder-embeddings-research"
4tokenizer = AutoTokenizer.from_pretrained(model_id)
5model = AutoModelForCausalLM.from_pretrained(model_id)AutoModelForCausalLM with the appropriate AutoModel class.