Last active
July 10, 2026 13:46
-
-
Save tteofili/029657605b7c5213ef68f7b27ae70904 to your computer and use it in GitHub Desktop.
SRR NB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "# No More K-means: Single-Stage Sparse Retrieval (SSR)\n", | |
| "### A Step-by-Step Reproduction Tutorial\n", | |
| "\n", | |
| "**Paper:** *No More K-means: Single-Stage Sparse Coding for Efficient Multi-Vector Retrieval* \n", | |
| "**arXiv:** [2605.30120](https://arxiv.org/pdf/2605.30120) \n", | |
| "**Venue:** ICML 2026\n", | |
| "\n", | |
| "---\n", | |
| "\n", | |
| "## Overview\n", | |
| "\n", | |
| "Multi-Vector Retrieval (MVR) models like ColBERT achieve state-of-the-art retrieval quality by storing token-level embeddings and computing fine-grained **MaxSim** scores. The problem: indexing billions of token vectors requires K-means clustering (>100 hours on MSMARCO with ColBERTv2), and the multi-stage pruning pipeline is complex.\n", | |
| "\n", | |
| "**SSR's key insight:** If you make token embeddings *sparse* (few non-zero dimensions), you can replace the entire cluster-based search with a simple **inverted index** — the same data structure used by BM25. Each active neuron acts as a \"pseudo-token\" in a posting list.\n", | |
| "\n", | |
| "The result:\n", | |
| "- **15× faster indexing** (no K-means)\n", | |
| "- **2× faster retrieval** vs ColBERTv2\n", | |
| "- **Better retrieval quality** (avg +2.2% nDCG@10 over best baseline)\n", | |
| "\n", | |
| "### What this notebook covers\n", | |
| "\n", | |
| "1. Background: dense vs. sparse MVR\n", | |
| "2. Sparse Autoencoder (SAE) architecture\n", | |
| "3. Hybrid training objective (reconstruction + contrastive losses)\n", | |
| "4. Neuron-level inverted index construction\n", | |
| "5. SSR retrieval with MaxSim scoring\n", | |
| "6. SSR++ accelerated retrieval (coarse-to-fine pruning)\n", | |
| "7. End-to-end demo on a small corpus\n", | |
| "8. Hyperparameter sensitivity analysis" | |
| ], | |
| "id": "5602cce22157098b" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 0: Install Dependencies" | |
| ], | |
| "id": "f45a1d91eafa8da3" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Install required packages\n", | |
| "!pip install torch transformers datasets beir sentence-transformers tqdm numpy matplotlib --quiet" | |
| ], | |
| "id": "9ed4d264ed8dda70" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:35.324049Z", | |
| "start_time": "2026-07-10T13:41:35.275305Z" | |
| } | |
| }, | |
| "source": [ | |
| "import torch\n", | |
| "import torch.nn as nn\n", | |
| "import torch.nn.functional as F\n", | |
| "import numpy as np\n", | |
| "import matplotlib.pyplot as plt\n", | |
| "from collections import defaultdict\n", | |
| "from dataclasses import dataclass, field\n", | |
| "from typing import Dict, List, Tuple, Optional\n", | |
| "from tqdm import tqdm\n", | |
| "\n", | |
| "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n", | |
| "print(f'Using device: {device}')" | |
| ], | |
| "id": "d70c36d2f6b6505e", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Using device: cpu\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 47 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 1: Background — Why Dense MVR is Slow\n", | |
| "\n", | |
| "Standard dense MVR (e.g., PLAID/ColBERTv2) has a **three-stage pipeline**:\n", | |
| "\n", | |
| "```\n", | |
| "Stage I: Indexing — K-means cluster billion-scale token vectors\n", | |
| "Stage II: Approx Scoring — Centroid-level MaxSim to prune to thousands of candidates \n", | |
| "Stage III:Exact Reranking— Decompress residuals, full MaxSim on top-k\n", | |
| "```\n", | |
| "\n", | |
| "The clustering in Stage I is the bottleneck: ColBERTv2 takes **122.9 hours** to index MSMARCO.\n", | |
| "\n", | |
| "**SSR replaces this entire pipeline** by learning sparse token representations that plug directly into an inverted index — single stage, no clustering needed." | |
| ], | |
| "id": "a603dd20aa13e213" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:38.633413Z", | |
| "start_time": "2026-07-10T13:41:38.475103Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Visualize the paradigm shift\n", | |
| "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", | |
| "\n", | |
| "# Dense MVR pipeline\n", | |
| "ax = axes[0]\n", | |
| "stages = ['Stage I\\nK-means Clustering\\n(122.9 hrs)', \n", | |
| " 'Stage II\\nApprox Scoring\\n(centroid-level)', \n", | |
| " 'Stage III\\nExact Reranking\\n(decompression)']\n", | |
| "colors = ['#e74c3c', '#e67e22', '#f39c12']\n", | |
| "for i, (stage, color) in enumerate(zip(stages, colors)):\n", | |
| " ax.barh(i, 1, color=color, alpha=0.7, edgecolor='black')\n", | |
| " ax.text(0.5, i, stage, ha='center', va='center', fontsize=9, fontweight='bold')\n", | |
| "ax.set_yticks([])\n", | |
| "ax.set_xticks([])\n", | |
| "ax.set_title('Dense MVR (ColBERT/PLAID)\\n3-stage filter-and-refine', fontsize=12)\n", | |
| "ax.set_xlim(0, 1)\n", | |
| "\n", | |
| "# SSR pipeline\n", | |
| "ax = axes[1]\n", | |
| "ax.barh(0, 1, color='#27ae60', alpha=0.7, edgecolor='black')\n", | |
| "ax.text(0.5, 0, 'Single Stage\\nSparse Inverted Index Lookup\\n(7.5 hrs indexing, ~17ms retrieval)', \n", | |
| " ha='center', va='center', fontsize=9, fontweight='bold')\n", | |
| "ax.set_yticks([])\n", | |
| "ax.set_xticks([])\n", | |
| "ax.set_title('SSR (This Paper)\\nSingle-stage sparse retrieval', fontsize=12)\n", | |
| "ax.set_xlim(0, 1)\n", | |
| "ax.set_ylim(-0.5, 2.5)\n", | |
| "\n", | |
| "plt.suptitle('Paradigm Comparison: Dense MVR vs SSR', fontsize=14, fontweight='bold')\n", | |
| "plt.tight_layout()\n", | |
| "plt.show()" | |
| ], | |
| "id": "43646252fff7f8e8", | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 1400x500 with 2 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAABW0AAAHvCAYAAAAvoP1zAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAt8NJREFUeJzs3QV8U9f7x/GnpThtcXcfroPhso0JNnfmG/Ptv8H8N3d3H3MX2AYDhrsOd3eXtmhbyP/1PeVmaZoaFAjweb9eoU1yc3PuyW04efKc50T4fD6fAQAAAAAAAADCQuTxbgAAAAAAAAAA4D8EbQEAAAAAAAAgjBC0BQAAAAAAAIAwQtAWAAAAAAAAAMIIQVsAAAAAAAAACCMEbQEAAAAAAAAgjBC0BQAAAAAAAIAwQtAWAAAAAAAAAMIIQVsAAAAAAAAACCMEbQEAQIauu+46i4iIcJcOHTqkus+7XZcvvviCnjzF6fzwzgedNwAAAAAOD0FbAACOwKhRo1IFLgMvhQoVsjp16thdd91ly5cvp5/DmF6fhx56yFq2bGklSpSw3LlzW0xMjDVq1MjuvPNOGzdu3PFuIsL8Cw1dIiMjLV++fO4cql+/vl166aX27bff2v79++1UF9xXuvz2228ht73iiivSbKv3WjnnnHP8txUpUiTdvvX5fFatWjX/to0bN3a3r1y5MuT7tV47/c3Xq1fP/c0vXbrUTiTJycn24YcfWvv27a1YsWLuPUz9U716dTvrrLOsT58+NnHixDSP++GHH6xLly5WqlQp95jY2FirUqWK+wLmnnvusSFDhmTp/7xcuXJZ4cKFrUmTJvbggw/axo0bj+HRAwBwcoo63g0AAOBktXv3bluwYIG7fP755zZgwAA788wz7WTyyiuv+H9v3ry5nWgOHjxoTz31lD333HN24MCBVPclJCTYrFmz3OW9995zQSBk7LbbbrOuXbu63xX8OtXoHFEQUZetW7fa3Llz7eeff7aHH37YvvvuO2vTps3xbmJYefvtt+3CCy9Mddv69evtl19+yTD46wUSd+7caX/99ZdddNFFabYbP358qi/LMsv81munv/l58+a5y5dffmmjR492Qchwl5SU5ILZI0aMSHW7+keXZcuW2bBhw9x2Z5xxhv/+Xr162ddff53qMfHx8e6i4LaOf9WqVS6om5X30ri4OJsxY4a7fPXVVzZlyhSrUKFCDh4pAACnFoK2AADkoMsuu8yaNWtmiYmJLqtJAQXZs2ePXXPNNe6DcN68eXO8zxVwVKCoQIECdiw98MADdiJTRt0HH3zgv64syQsuuMBlSCtzbeHChTZ48GAXjED6FORRlqLO/1OZvsTQeaMsQwXJFPyTNWvWWOfOne2ff/6xdu3aHe9mhg0FBWfPnm0NGjTw3/b++++7PkxPz549XUangpGi4GCooK1u9yiD9Kqrrgq5P2Whnn322e5LNr0+CvbKrl277Nlnn003GzicfPbZZ6kCtsqSbdu2rXs/27Bhg02dOtVdAul9LTBg27RpUxec1QyRLVu22L///hsyMze9//P0HtC/f3+bM2eOu11/A2+88Ya9/vrrOXqsAACcUnwAAOCwjRw5UumX/ku/fv1S3X/VVVelun/48OH+x91www2+xo0b+0qXLu3LkyePL3/+/L5q1ar5rrvuOt/s2bPTPNe1117r30/79u19q1at8l199dW+kiVL+iIiIny///672+6zzz7zXXLJJb7atWv7ihUr5ouKivJFR0f7GjZs6Ovbt69vy5YtIY9l9OjRbr8FChTwFSlSxHfxxRf7li5dmuZ5A2V07Lt37/Y99NBDvgoVKvjy5s3rq1Onju+DDz7wLV++PNXj1BeeJ554wn97pUqVfOvXr/f16tXLHYeOoWvXrr5Fixa5badPn+7r0qWLr1ChQr7ChQu79q5evTrLr93gwYNTtaNmzZqubcF0HC+++GKa29WO3r17u8fptdOlRo0avltuucW3YMGCTF8/Pb5nz56+mJgY199XXHGFb+PGjW7bYcOG+dq0aeP2Wbx4cXeubN++PdX+1N+B7d+7d6/vf//7n69q1arufKpSpYrvqaee8u3fvz/V43SM99xzj9t/+fLl3eut7cuWLev6948//kjT9uDnUp888sgj7jl0fml/ouPyttHxBhozZow7Xj1P7ty5fQULFnSv8TnnnONe9507d6baPjk52Z3LnTp18p/HRYsW9XXo0MH38ccf+5KSklJtv2LFijTn1ffff+87/fTTXT9mdI4Etjv4HM9I4Gsaalit811/m979FStW9O3bty/VNgcOHPB99dVXvrPOOstXokQJ1zd6zc877zzfwIEDM33PWbZsme+9997z1a9f3/2daR833nhjmvPFex11fF5/qk90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PN6AWAHhwzFo0CAX4FQQPyPeB5KsfIgJpqCwaopp+qHopwL9CvgfKX35oQ8IgX9jHp0H+tIDAACcGjS2nD59uhtzZbadaCycnJx8WM+VnTGYxqcay2rK/pFQ8FcBUpU/ePnll12pBpV5UCmu9GT1s0J2aJ0DBbc1NldZBx2f2qTyDipFpnG36uFqDB5Mn2P0OUhjYwVs9Rroc1BgYsTXX3/tPlvoM8ZLL73kEmHmz59vbdq0SRMM1uunzzMKyivBQv3hUcKAxomMBwEcVcc71RdA9ssjeFQeoHHjxqlKBtSvXz9VyYCDBw+6afM1atRIs+8zzzzT3e+577773DT/nTt3uuu///57pm0YO3as2+bbb79NdfvgwYND3p7R1PwHHnjAV716df99zZs3911//fXpTtu65JJL3PT7uLg4/20LFy502z788MNppmDVrl3bPY8u2q5Pnz5u26yUEEhKSvJFRET47r///lS3z5o1y+3jnnvu8WVF//793fbPPvtsqtsvvvhit//A0gvplUcIvqgURKgpeHp8qO11eeGFF9K8BosWLXJ9s3LlSt/nn3/uSnBoGqCmqh1OeYSKFSu6fQe3X/vW86jswMCBA32VK1d2x+6dZ9kpj/DLL7+4bZcsWeKuqzyFzok33njjiMojeBo2bOgrUqRImttvueUW1z8AAODUMHToUDdO1uWMM87w9e3b1zdkyJA00/g1tta4U2OMUqVK+a644grfe++951u1alWafXpj8mHDhrmx0Zo1a9zYRuOvvHnzuuuZufrqq33FihXLcJuslEfIkydPqnGoN8Z955130rRX46qsflZIT/DYfMGCBb67777b7a9bt25um1Bl4FSWTNt89dVXadrVtGnTVK/Hyy+/7G4fMGCAu65SBip9dfPNN6fa58aNG93nqsDbNQbXYx966KF0j6FmzZq+c889N9vHDgBZRaYtcALTN8TKupTt27e7DMNLL700VSamvh3XN8RLlixJswqtVrANXEhJ04S0GJOmIomXfapFE9LLmP35558tNjbWTREKzORUhqXaN3LkyCwfj8ogLF261H2r7v0MVRohsESCsgACFyvzMm9DlUZQ6QWVgtBFC0C88sorLutVU6oyo/7VmDY44yE+Pt79zOrCV8o+VfaAFr8KpHIJ2r+ma2Xmf//7n5uKpYuykZVdqgUnlOUcrEWL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" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "execution_count": 49 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 2: The Sparse Autoencoder (SAE) Architecture\n", | |
| "\n", | |
| "The SAE is the core component of SSR. It maps dense token embeddings (e.g., 768-dim from BERT) into a **high-dimensional but sparse** space (e.g., 16384-dim with only K=32 active neurons).\n", | |
| "\n", | |
| "**Encoder:**\n", | |
| "$$z = \\text{TopK}(W_{enc}(x - b_{pre}) + b_{enc})$$\n", | |
| "\n", | |
| "**Decoder (reconstruction):**\n", | |
| "$$\\hat{x} = W_{dec} \\cdot z + b_{pre}$$\n", | |
| "\n", | |
| "Where:\n", | |
| "- $x \\in \\mathbb{R}^d$ — dense token embedding from BERT\n", | |
| "- $z \\in \\mathbb{R}^h$ — sparse code (only K values non-zero, $K \\ll h$)\n", | |
| "- $W_{enc} \\in \\mathbb{R}^{h \\times d}$, $W_{dec} \\in \\mathbb{R}^{d \\times h}$ — learned weights\n", | |
| "- TopK sets all but the K largest activations to zero" | |
| ], | |
| "id": "a21553c8c81e74f4" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:42.927398Z", | |
| "start_time": "2026-07-10T13:41:42.809664Z" | |
| } | |
| }, | |
| "source": [ | |
| "class SparseAutoencoder(nn.Module):\n", | |
| " \"\"\"\n", | |
| " Sparse Autoencoder (SAE) from the SSR paper.\n", | |
| " \n", | |
| " Maps dense token embeddings -> high-dimensional sparse codes\n", | |
| " via TopK activation, then reconstructs via linear decoder.\n", | |
| " \n", | |
| " Architecture:\n", | |
| " z = TopK(W_enc @ (x - b_pre) + b_enc) # sparse encoding\n", | |
| " x_hat = W_dec @ z + b_pre # reconstruction\n", | |
| " \n", | |
| " Args:\n", | |
| " d_model: input (dense) embedding dimension (e.g. 768 for BERT-base)\n", | |
| " d_sparse: sparse hidden dimension (e.g. 16384 = 2^14)\n", | |
| " k: number of active neurons (sparsity level, e.g. 32)\n", | |
| " \"\"\"\n", | |
| " def __init__(self, d_model: int = 768, d_sparse: int = 16384, k: int = 32):\n", | |
| " super().__init__()\n", | |
| " self.d_model = d_model\n", | |
| " self.d_sparse = d_sparse\n", | |
| " self.k = k\n", | |
| " \n", | |
| " # Encoder weights\n", | |
| " self.W_enc = nn.Linear(d_model, d_sparse, bias=True) # b_enc is bias here\n", | |
| " # Decoder weights (separate from encoder for flexibility)\n", | |
| " self.W_dec = nn.Linear(d_sparse, d_model, bias=False)\n", | |
| " # Pre-encoder bias (subtracted before encoding, added after decoding)\n", | |
| " self.b_pre = nn.Parameter(torch.zeros(d_model))\n", | |
| " \n", | |
| " # Initialize: unit-norm decoder columns (standard SAE init)\n", | |
| " nn.init.kaiming_uniform_(self.W_enc.weight, nonlinearity='relu')\n", | |
| " nn.init.kaiming_uniform_(self.W_dec.weight, nonlinearity='relu')\n", | |
| " self._normalize_decoder()\n", | |
| " \n", | |
| " def _normalize_decoder(self):\n", | |
| " \"\"\"Keep decoder columns unit-norm to prevent feature scaling collapse.\"\"\"\n", | |
| " with torch.no_grad():\n", | |
| " norms = self.W_dec.weight.norm(dim=0, keepdim=True).clamp(min=1e-8)\n", | |
| " self.W_dec.weight.div_(norms)\n", | |
| " \n", | |
| " def encode(self, x: torch.Tensor, k: Optional[int] = None) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Encode dense embeddings to sparse codes.\n", | |
| " \n", | |
| " Args:\n", | |
| " x: dense embeddings, shape (..., d_model)\n", | |
| " k: override sparsity level (uses self.k if None)\n", | |
| " Returns:\n", | |
| " z: sparse codes, shape (..., d_sparse), only k values non-zero\n", | |
| " \"\"\"\n", | |
| " k = k or self.k\n", | |
| " # Subtract pre-encoder bias, then linear + bias\n", | |
| " pre_acts = self.W_enc(x - self.b_pre) # (..., d_sparse)\n", | |
| " # ReLU first, then TopK (ensures non-negative activations)\n", | |
| " pre_acts = F.relu(pre_acts)\n", | |
| " return self._topk(pre_acts, k)\n", | |
| " \n", | |
| " def _topk(self, x: torch.Tensor, k: int) -> torch.Tensor:\n", | |
| " \"\"\"Zero out all but the top-k values.\"\"\"\n", | |
| " if k >= x.shape[-1]:\n", | |
| " return x\n", | |
| " topk_vals, topk_idx = x.topk(k, dim=-1)\n", | |
| " # Scatter back into full-size sparse tensor\n", | |
| " z = torch.zeros_like(x)\n", | |
| " z.scatter_(-1, topk_idx, topk_vals)\n", | |
| " return z\n", | |
| " \n", | |
| " def decode(self, z: torch.Tensor) -> torch.Tensor:\n", | |
| " \"\"\"Reconstruct dense embeddings from sparse codes.\"\"\"\n", | |
| " return self.W_dec(z) + self.b_pre\n", | |
| " \n", | |
| " def forward(self, x: torch.Tensor, k: Optional[int] = None) -> Tuple[torch.Tensor, torch.Tensor]:\n", | |
| " \"\"\"\n", | |
| " Full encode -> decode pass.\n", | |
| " Returns: (z, x_hat) — sparse code and reconstruction\n", | |
| " \"\"\"\n", | |
| " z = self.encode(x, k)\n", | |
| " x_hat = self.decode(z)\n", | |
| " return z, x_hat\n", | |
| "\n", | |
| "\n", | |
| "# Quick sanity check\n", | |
| "sae = SparseAutoencoder(d_model=768, d_sparse=4096, k=32)\n", | |
| "x_dummy = torch.randn(4, 10, 768) # batch=4, seq_len=10, d_model=768\n", | |
| "z, x_hat = sae(x_dummy)\n", | |
| "\n", | |
| "print(f'Input shape: {x_dummy.shape}')\n", | |
| "print(f'Sparse code shape: {z.shape}')\n", | |
| "print(f'Reconstruction shape: {x_hat.shape}')\n", | |
| "print(f'Non-zero per token: {(z != 0).sum(-1).float().mean():.1f} (should be ~32)')\n", | |
| "print(f'Sparsity ratio: {(z == 0).float().mean():.3f}')" | |
| ], | |
| "id": "8bd0587f25bd6932", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Input shape: torch.Size([4, 10, 768])\n", | |
| "Sparse code shape: torch.Size([4, 10, 4096])\n", | |
| "Reconstruction shape: torch.Size([4, 10, 768])\n", | |
| "Non-zero per token: 32.0 (should be ~32)\n", | |
| "Sparsity ratio: 0.992\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 50 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 3: Hybrid Training Objective\n", | |
| "\n", | |
| "SSR trains the SAE with a **combination of unsupervised and supervised losses**:\n", | |
| "\n", | |
| "$$\\mathcal{L}_{SSR} = \\mathcal{L}_{unsup} + \\gamma \\mathcal{L}_{CE}$$\n", | |
| "\n", | |
| "### 3.1 Unsupervised Loss\n", | |
| "\n", | |
| "$$\\mathcal{L}_{unsup} = \\mathcal{L}_{recon}(k) + \\frac{1}{8}\\mathcal{L}_{recon}(4k) + \\alpha \\mathcal{L}_{aux}(k_{aux}) + \\beta \\mathcal{L}_{cl}$$\n", | |
| "\n", | |
| "- **Reconstruction loss** $\\mathcal{L}_{recon}(k) = \\|x - \\hat{x}\\|_2^2$: minimize SAE reconstruction error\n", | |
| "- **Multi-TopK loss** $\\frac{1}{8}\\mathcal{L}_{recon}(4k)$: also reconstruct with 4× more active neurons (improves training stability)\n", | |
| "- **Auxiliary loss** $\\mathcal{L}_{aux}$: penalizes neurons that haven't fired recently (prevents dead neurons)\n", | |
| "- **Sparse contrastive loss** $\\mathcal{L}_{cl}$: encourages different tokens to activate different neurons\n", | |
| "\n", | |
| "### 3.2 Supervised Contrastive Loss\n", | |
| "\n", | |
| "$$\\mathcal{L}_{CE} = -\\log \\frac{e^{\\text{sim}(Q, D^+)}}{\\sum_{D \\in \\mathcal{D}} e^{\\text{sim}(Q, D)}}$$\n", | |
| "\n", | |
| "Where sim(Q, D) is the **sparse MaxSim** score between query and document." | |
| ], | |
| "id": "a04f357f95408a5b" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:49.176812Z", | |
| "start_time": "2026-07-10T13:41:49.123599Z" | |
| } | |
| }, | |
| "source": [ | |
| "class SSRLoss(nn.Module):\n", | |
| " \"\"\"\n", | |
| " Hybrid training objective for SSR (Equation 7 + 10 in the paper).\n", | |
| " \n", | |
| " L_SSR = L_unsup + gamma * L_CE\n", | |
| " L_unsup = L_recon(k) + (1/8)*L_recon(4k) + alpha*L_aux + beta*L_cl\n", | |
| " \"\"\"\n", | |
| " def __init__(self, alpha: float = 0.05, beta: float = 0.05, gamma: float = 0.05):\n", | |
| " super().__init__()\n", | |
| " self.alpha = alpha # weight for auxiliary loss\n", | |
| " self.beta = beta # weight for sparse contrastive loss\n", | |
| " self.gamma = gamma # weight for supervised contrastive loss\n", | |
| " \n", | |
| " def reconstruction_loss(self, x: torch.Tensor, x_hat: torch.Tensor) -> torch.Tensor:\n", | |
| " \"\"\"L2 reconstruction loss: ||x - x_hat||^2_2\"\"\"\n", | |
| " return (x - x_hat).pow(2).sum(-1).mean()\n", | |
| " \n", | |
| " def auxiliary_loss(\n", | |
| " self,\n", | |
| " sae: SparseAutoencoder,\n", | |
| " x: torch.Tensor,\n", | |
| " k_aux: int,\n", | |
| " neuron_last_fired: torch.Tensor\n", | |
| " ) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Auxiliary loss on neurons that have not been activated for a long time.\n", | |
| " This prevents dead neurons (neurons that never activate).\n", | |
| " \n", | |
| " We identify the k_aux neurons with the longest \"not fired\" time,\n", | |
| " and compute reconstruction loss using only those neurons.\n", | |
| " \"\"\"\n", | |
| " # Select k_aux neurons that fired longest ago\n", | |
| " _, aux_idx = neuron_last_fired.topk(k_aux, largest=True) # largest = stale-est\n", | |
| " \n", | |
| " # Build aux activations: encode but only keep the aux neurons active\n", | |
| " pre_acts = F.relu(sae.W_enc(x.view(-1, sae.d_model) - sae.b_pre))\n", | |
| " # Zero out all except selected aux neurons\n", | |
| " mask = torch.zeros(sae.d_sparse, device=x.device)\n", | |
| " mask[aux_idx] = 1.0\n", | |
| " z_aux = pre_acts * mask.unsqueeze(0)\n", | |
| " x_hat_aux = sae.decode(z_aux).view(x.shape)\n", | |
| " return self.reconstruction_loss(x, x_hat_aux)\n", | |
| " \n", | |
| " def sparse_contrastive_loss(self, z: torch.Tensor) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Token-level contrastive loss (Equation 8):\n", | |
| " encourages different tokens to activate different neurons.\n", | |
| " \n", | |
| " L_cl = -mean_i [ log( exp(z_i^T z_i) / (exp(z_i^T z_i) + sum_{j!=i} exp(z_i^T z_j)) ) ]\n", | |
| " \n", | |
| " Note: in practice this is InfoNCE over the token batch.\n", | |
| " \"\"\"\n", | |
| " # Flatten to (N_tokens, d_sparse)\n", | |
| " z_flat = z.view(-1, z.shape[-1])\n", | |
| " # L2-normalize for cosine similarity\n", | |
| " z_norm = F.normalize(z_flat, dim=-1)\n", | |
| " # Compute similarity matrix\n", | |
| " sim = z_norm @ z_norm.T # (N, N)\n", | |
| " # InfoNCE: diagonal = positive pairs (same token = perfect match)\n", | |
| " labels = torch.arange(sim.shape[0], device=z.device)\n", | |
| " temperature = 0.07\n", | |
| " return F.cross_entropy(sim / temperature, labels)\n", | |
| " \n", | |
| " def sparse_maxsim(\n", | |
| " self,\n", | |
| " q_sparse: torch.Tensor,\n", | |
| " d_sparse: torch.Tensor\n", | |
| " ) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Sparse late-interaction MaxSim score (Equation 4).\n", | |
| " \n", | |
| " S(Q, D) = sum_i max_j [ sum_{u in AK(z_qi) ∩ AK(z_dj)} z_qi^(u) * z_dj^(u) ]\n", | |
| " \n", | |
| " Args:\n", | |
| " q_sparse: query sparse codes, shape (batch, Q_len, d_sparse)\n", | |
| " d_sparse: document sparse codes, shape (batch, D_len, d_sparse)\n", | |
| " Returns:\n", | |
| " scores: shape (batch,)\n", | |
| " \"\"\"\n", | |
| " # Efficient: z_qi @ z_dj^T gives all (q_token, d_token) dot products\n", | |
| " # Only non-zero dimensions contribute — this is the key sparsity benefit!\n", | |
| " sim_matrix = torch.bmm(q_sparse, d_sparse.transpose(1, 2)) # (batch, Q_len, D_len)\n", | |
| " # MaxSim: max over document tokens for each query token, then sum\n", | |
| " return sim_matrix.max(dim=2).values.sum(dim=1) # (batch,)\n", | |
| " \n", | |
| " def supervised_contrastive_loss(\n", | |
| " self,\n", | |
| " q_sparse: torch.Tensor, # (batch, Q_len, d_sparse)\n", | |
| " pos_sparse: torch.Tensor, # (batch, D_len, d_sparse)\n", | |
| " neg_sparse: torch.Tensor, # (batch, n_neg, D_len, d_sparse)\n", | |
| " ) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Supervised contrastive (InfoNCE) loss over query-document pairs (Equation 9).\n", | |
| " \n", | |
| " Positive: (query, pos_doc) pairs\n", | |
| " Negatives: in-batch negatives from neg_sparse\n", | |
| " \"\"\"\n", | |
| " batch_size = q_sparse.shape[0]\n", | |
| " \n", | |
| " # Score query against positive\n", | |
| " pos_scores = self.sparse_maxsim(q_sparse, pos_sparse) # (batch,)\n", | |
| " \n", | |
| " # Score query against each negative\n", | |
| " # neg_sparse: (batch, n_neg, D_len, d_sparse)\n", | |
| " n_neg = neg_sparse.shape[1]\n", | |
| " neg_scores_list = []\n", | |
| " for i in range(n_neg):\n", | |
| " neg_scores_list.append(self.sparse_maxsim(q_sparse, neg_sparse[:, i]))\n", | |
| " neg_scores = torch.stack(neg_scores_list, dim=1) # (batch, n_neg)\n", | |
| " \n", | |
| " # Concatenate: [pos_score, neg_score_1, ..., neg_score_n]\n", | |
| " all_scores = torch.cat([pos_scores.unsqueeze(1), neg_scores], dim=1) # (batch, 1+n_neg)\n", | |
| " # Positive is always at index 0\n", | |
| " labels = torch.zeros(batch_size, dtype=torch.long, device=q_sparse.device)\n", | |
| " return F.cross_entropy(all_scores, labels)\n", | |
| " \n", | |
| " def forward(\n", | |
| " self,\n", | |
| " sae: SparseAutoencoder,\n", | |
| " x: torch.Tensor,\n", | |
| " z: torch.Tensor,\n", | |
| " x_hat: torch.Tensor,\n", | |
| " q_sparse: Optional[torch.Tensor] = None,\n", | |
| " pos_sparse: Optional[torch.Tensor] = None,\n", | |
| " neg_sparse: Optional[torch.Tensor] = None,\n", | |
| " neuron_last_fired: Optional[torch.Tensor] = None,\n", | |
| " k_aux: int = 512,\n", | |
| " ) -> Dict[str, torch.Tensor]:\n", | |
| " losses = {}\n", | |
| " \n", | |
| " # --- Unsupervised losses ---\n", | |
| " # 1. Standard reconstruction loss L_recon(k)\n", | |
| " losses['recon'] = self.reconstruction_loss(x, x_hat)\n", | |
| " \n", | |
| " # 2. Multi-TopK reconstruction loss L_recon(4k) — use 4x more neurons\n", | |
| " _, x_hat_4k = sae(x, k=min(sae.k * 4, sae.d_sparse))\n", | |
| " losses['recon_4k'] = self.reconstruction_loss(x, x_hat_4k)\n", | |
| " \n", | |
| " # 3. Sparse contrastive loss L_cl\n", | |
| " losses['sparse_cl'] = self.sparse_contrastive_loss(z)\n", | |
| " \n", | |
| " # 4. Auxiliary loss (optional — needs neuron tracking in practice)\n", | |
| " if neuron_last_fired is not None:\n", | |
| " losses['aux'] = self.auxiliary_loss(sae, x, k_aux, neuron_last_fired)\n", | |
| " else:\n", | |
| " losses['aux'] = torch.tensor(0.0, device=x.device)\n", | |
| " \n", | |
| " # Total unsupervised loss\n", | |
| " losses['unsup'] = (\n", | |
| " losses['recon'] +\n", | |
| " (1 / 8) * losses['recon_4k'] +\n", | |
| " self.alpha * losses['aux'] +\n", | |
| " self.beta * losses['sparse_cl']\n", | |
| " )\n", | |
| " \n", | |
| " # --- Supervised contrastive loss ---\n", | |
| " if q_sparse is not None and pos_sparse is not None and neg_sparse is not None:\n", | |
| " losses['ce'] = self.supervised_contrastive_loss(q_sparse, pos_sparse, neg_sparse)\n", | |
| " else:\n", | |
| " losses['ce'] = torch.tensor(0.0, device=x.device)\n", | |
| " \n", | |
| " # Final objective: L_SSR = L_unsup + gamma * L_CE\n", | |
| " losses['total'] = losses['unsup'] + self.gamma * losses['ce']\n", | |
| " return losses\n", | |
| "\n", | |
| "\n", | |
| "# Test the loss computation\n", | |
| "criterion = SSRLoss(alpha=0.05, beta=0.05, gamma=0.05)\n", | |
| "sae_small = SparseAutoencoder(d_model=64, d_sparse=512, k=8)\n", | |
| "\n", | |
| "x_test = torch.randn(2, 5, 64) # batch=2, seq=5, d=64\n", | |
| "z_test, x_hat_test = sae_small(x_test)\n", | |
| "\n", | |
| "losses = criterion(sae_small, x_test, z_test, x_hat_test)\n", | |
| "for name, val in losses.items():\n", | |
| " print(f' {name:12s}: {val.item():.4f}')" | |
| ], | |
| "id": "f1d9a602e74c01df", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| " recon : 139.0158\n", | |
| " recon_4k : 276.8693\n", | |
| " sparse_cl : 0.0000\n", | |
| " aux : 0.0000\n", | |
| " unsup : 173.6245\n", | |
| " ce : 0.0000\n", | |
| " total : 173.6245\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 51 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 4: Training Loop\n", | |
| "\n", | |
| "In the paper, the backbone (BERT) is **frozen** and only the SAE weights are trained. This is efficient: training SSR-tok takes ~11 hours vs 24 hours for ColBERTv2.\n", | |
| "\n", | |
| "Here we simulate training on synthetic embeddings to demonstrate the procedure. For real use, replace with MS MARCO passages encoded by bert-base-uncased." | |
| ], | |
| "id": "3529a10d4da47582" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:56.654909Z", | |
| "start_time": "2026-07-10T13:41:55.409174Z" | |
| } | |
| }, | |
| "source": [ | |
| "class NeuronFireTracker:\n", | |
| " \"\"\"\n", | |
| " Tracks when each neuron last fired, used for the auxiliary loss.\n", | |
| " Neurons that haven't fired for a long time are \"dead\" and get\n", | |
| " targeted by the aux loss to encourage them to activate.\n", | |
| " \"\"\"\n", | |
| " def __init__(self, d_sparse: int):\n", | |
| " self.steps_since_fired = torch.zeros(d_sparse)\n", | |
| " \n", | |
| " def update(self, z: torch.Tensor):\n", | |
| " \"\"\"Update fire counts given batch of sparse codes.\"\"\"\n", | |
| " fired = (z.view(-1, z.shape[-1]) > 0).any(dim=0).cpu()\n", | |
| " self.steps_since_fired += 1\n", | |
| " self.steps_since_fired[fired] = 0\n", | |
| " \n", | |
| " def get_stale_neurons(self) -> torch.Tensor:\n", | |
| " return self.steps_since_fired\n", | |
| "\n", | |
| "\n", | |
| "def train_sae(\n", | |
| " sae: SparseAutoencoder,\n", | |
| " embeddings: torch.Tensor, # (N, seq_len, d_model)\n", | |
| " n_epochs: int = 3,\n", | |
| " batch_size: int = 16,\n", | |
| " lr: float = 2e-4,\n", | |
| " device: str = 'cpu'\n", | |
| ") -> List[Dict]:\n", | |
| " \"\"\"Simplified SSR training loop (unsupervised phase only for demo).\"\"\"\n", | |
| " sae = sae.to(device)\n", | |
| " optimizer = torch.optim.Adam(sae.parameters(), lr=lr)\n", | |
| " criterion = SSRLoss()\n", | |
| " tracker = NeuronFireTracker(sae.d_sparse)\n", | |
| " \n", | |
| " N = embeddings.shape[0]\n", | |
| " history = []\n", | |
| " \n", | |
| " for epoch in range(n_epochs):\n", | |
| " perm = torch.randperm(N)\n", | |
| " epoch_losses = defaultdict(float)\n", | |
| " n_batches = 0\n", | |
| " \n", | |
| " for i in range(0, N, batch_size):\n", | |
| " idx = perm[i:i+batch_size]\n", | |
| " x = embeddings[idx].to(device)\n", | |
| " \n", | |
| " optimizer.zero_grad()\n", | |
| " z, x_hat = sae(x)\n", | |
| " \n", | |
| " # Track neuron firing for aux loss\n", | |
| " tracker.update(z)\n", | |
| " stale = tracker.get_stale_neurons().to(device)\n", | |
| " \n", | |
| " losses = criterion(\n", | |
| " sae, x, z, x_hat,\n", | |
| " neuron_last_fired=stale,\n", | |
| " k_aux=sae.k * 4\n", | |
| " )\n", | |
| " \n", | |
| " losses['total'].backward()\n", | |
| " # Gradient clipping for stability\n", | |
| " nn.utils.clip_grad_norm_(sae.parameters(), 1.0)\n", | |
| " optimizer.step()\n", | |
| " # Re-normalize decoder columns after each update\n", | |
| " sae._normalize_decoder()\n", | |
| " \n", | |
| " for k_name, v in losses.items():\n", | |
| " epoch_losses[k_name] += v.item()\n", | |
| " n_batches += 1\n", | |
| " \n", | |
| " avg = {k: v / n_batches for k, v in epoch_losses.items()}\n", | |
| " history.append(avg)\n", | |
| " print(f'Epoch {epoch+1}/{n_epochs} | recon={avg[\"recon\"]:.4f} | '\n", | |
| " f'sparse_cl={avg[\"sparse_cl\"]:.4f} | total={avg[\"total\"]:.4f}')\n", | |
| " \n", | |
| " return history\n", | |
| "\n", | |
| "\n", | |
| "# --- Demo training on synthetic embeddings ---\n", | |
| "# In practice: encode MS MARCO passages with bert-base-uncased first\n", | |
| "print('Generating synthetic token embeddings (simulating BERT output)...')\n", | |
| "N_docs = 200\n", | |
| "SEQ_LEN = 32\n", | |
| "D_MODEL = 128 # Using small dim for demo; paper uses 768\n", | |
| "D_SPARSE = 1024 # Paper uses 16384; small here for speed\n", | |
| "K = 16 # Paper uses 32; small here for speed\n", | |
| "\n", | |
| "# Synthetic embeddings with some cluster structure\n", | |
| "torch.manual_seed(42)\n", | |
| "n_clusters = 10\n", | |
| "centers = torch.randn(n_clusters, D_MODEL)\n", | |
| "embeddings = centers[torch.randint(n_clusters, (N_docs,))].unsqueeze(1).expand(-1, SEQ_LEN, -1)\n", | |
| "embeddings = embeddings + 0.3 * torch.randn(N_docs, SEQ_LEN, D_MODEL)\n", | |
| "embeddings = F.normalize(embeddings, dim=-1)\n", | |
| "\n", | |
| "sae_demo = SparseAutoencoder(d_model=D_MODEL, d_sparse=D_SPARSE, k=K)\n", | |
| "print(f'SAE params: {sum(p.numel() for p in sae_demo.parameters()):,}')\n", | |
| "\n", | |
| "history = train_sae(sae_demo, embeddings, n_epochs=5, batch_size=32)" | |
| ], | |
| "id": "ba52730fe913479a", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Generating synthetic token embeddings (simulating BERT output)...\n", | |
| "SAE params: 263,296\n", | |
| "Epoch 1/5 | recon=2.6943 | sparse_cl=0.9041 | total=3.4371\n", | |
| "Epoch 2/5 | recon=2.4238 | sparse_cl=0.8696 | total=3.0551\n", | |
| "Epoch 3/5 | recon=2.1843 | sparse_cl=0.7566 | total=2.7216\n", | |
| "Epoch 4/5 | recon=1.9690 | sparse_cl=0.6891 | total=2.4322\n", | |
| "Epoch 5/5 | recon=1.7687 | sparse_cl=0.6587 | total=2.1697\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 52 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:41:58.221082Z", | |
| "start_time": "2026-07-10T13:41:57.931637Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Plot training curves\n", | |
| "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))\n", | |
| "\n", | |
| "epochs = range(1, len(history) + 1)\n", | |
| "ax1.plot(epochs, [h['recon'] for h in history], 'b-o', label='Reconstruction')\n", | |
| "ax1.plot(epochs, [h['recon_4k'] for h in history], 'g--o', label='Recon (4k)')\n", | |
| "ax1.set_xlabel('Epoch')\n", | |
| "ax1.set_ylabel('Loss')\n", | |
| "ax1.set_title('Reconstruction Loss')\n", | |
| "ax1.legend()\n", | |
| "ax1.grid(True, alpha=0.3)\n", | |
| "\n", | |
| "ax2.plot(epochs, [h['sparse_cl'] for h in history], 'r-o', label='Sparse Contrastive')\n", | |
| "ax2.plot(epochs, [h['total'] for h in history], 'k-o', label='Total')\n", | |
| "ax2.set_xlabel('Epoch')\n", | |
| "ax2.set_ylabel('Loss')\n", | |
| "ax2.set_title('Contrastive & Total Loss')\n", | |
| "ax2.legend()\n", | |
| "ax2.grid(True, alpha=0.3)\n", | |
| "\n", | |
| "plt.suptitle('SSR Training Curves', fontsize=13, fontweight='bold')\n", | |
| "plt.tight_layout()\n", | |
| "plt.show()" | |
| ], | |
| "id": "eb15ab124b0a6fcd", | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 1200x400 with 2 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGMCAYAAAALJhESAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAuF5JREFUeJzs3Qd4U1UbB/C3hQKFQtmUUWbZowzZe2/ZAqKACIoyilsQBwIiyiqiIhsVRKmACIKA7L33LKtlr0IpUEab7/mffDckadKmK2mS/8/n2ObmJrk3t+SevPc97/HQ6XQ6ISIiIiIiIiIisiNPe74YERERERERERERMChFRERERERERER2x6AUERERERERERHZHYNSRERERERERERkdwxKERERERERERGR3TEoRUREREREREREdsegFBERERERERER2R2DUkREREREREREZHcMShERERERERERkd0xKEVEREQuz8PDw9AuXLiQ5OfBY42fi4iIiIiSjkEpIiIiJ3T37l0ZMWKEVKxYUbJkySIZM2YUPz8/qVy5srz66qvyyy+/mKwfExMj06dPl7p160r27NnFy8tLcufOLWXKlJFOnTrJqFGjRKfTWQ2+aC1DhgxSsGBBad++vaxcudKmbe3bt6/F57LWvvjiixR/v9zJvn37ZODAgVKuXDnJli2beHt7S/HixaV169Yye/ZsiYqKcvQmEhERESkeOuMeKBEREaV5ERERUqNGDQkNDbW6DoJPW7duNdzu2rWr/Pnnn/E+79OnTyV9+vSGoFSxYsUS3JZZs2bJ66+/nmBQav78+WKrzz//PMUDU8bvRfXq1VUQLykeP34se/bsMdyuV6+epBXPnj2TYcOGyffffx/vekuXLpWOHTvabbuIiIiIrNH3PImIiMhpBAcHGwJShQsXlk8//VRlwjx69EiOHTsmy5cvF0/P58nQGzduNASkEIxB0OeFF15Qt8+ePSv//vuvrF69Ot7XnDp1qsrCOnfunMrQunLlilo+fvz4BINSn3zyifTv399w+8CBAzJ06FDD7cWLF6ssLw32yZoHDx6ozLDESqngEd6/tBSIMvb222/LzJkzDbebNGmiAoKFChWS27dvy5YtW+Jk0KUk/P3h/TH+2yMiIiKKFzKliIiIyHm0bt0aWc6qBQcHW1wnMjLS8Pv48eMN63fq1Mni+vfv3ze5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H9GPQ38I9ayQZYe+DYYv4j1EPxjrYfhecmA/V69eHWd5UFCQ6p9hiCD6SZgAB/1c9KMRSEJNKA22BxeRse04RsiSQ/8afbPE9JeJnIajp/8jouSLbxramJgYXYkSJVR79uyZWoapaHv37q3z8/PTeXl56QoWLKhr166dLiQkxOSxt2/f1g0ePFjdjylsCxUqpKbVvXXrlmGd69ev61577TVd7ty51ToVK1ZU22Ps/PnzVqeuNZ7KGM+LaX/LlCmjpvD19fXV1axZU/fHH3+YPObatWtqqlxMoYvHN2zYMMH3AdasWaOrUKGC2s7SpUvrfv311zhTJmvmzJmjq1KliprSOEeOHOo11q5dm+A2WJs6+Pfffzc8X86cOXW9evXSXbp0yWQdvLfYb3PWttEctgHrWWpNmzY1rDdt2jT1HuPY58uXT/fWW2+p6YU1586d0/Xr10/9zWTKlEltb+PGjXXr1q0zrPPff/+pabgLFCig3k/87Nmzp+706dMJbicREVFKwrlnwIABuqJFi6pzEs7NdevW1X333Xe66Ohow3pPnz7VjRo1SlesWDF1DvT399cNHz7cZB0oUqSIOsdbOs9q53vNzJkzdcWLF9elS5fO5Pxv7Tlg+fLlukqVKqlzLLZ5/Pjxqt+Bx6PPBPv371fn1cKFC6u+Q968eVVfbe/evSbPtX37dl21atXUfhv3qeLrO+C9wX39+/e3+p7OmDFDPa+3t7d6P9G/+/DDD3VXrlzRJeTw4cO6zp07q/4DtqtkyZLqfb5z547u4MGD6jkDAwN1kZGROlugb2i+L/fv39e98847qv+BY4nXQD8zNjbWZL2TJ0/qGjRooF4Tz4G+FqDfo/VffXx8dC1btlTr4rhp68TXrzOn9UGttfDwcMNxxWvhNTNnzqz6VziGxsaMGaOrUaOGLnv27Gq70WcbO3as7smTJ4nqLxM5Cw/8z9GBMSIiIiIiIiIici+sKUVERERERERERHbHoBQREREREREREdkdg1JERERERERERGR3DEoREREREREREZHdMShFRERERERERER2l17cTGxsrFy5ckWyZs0qHh4ejt4cIiIiSsMwSfH9+/elQIEC4unp3tfy2IciIiKilO5DuV1QCgEpf39/R28GEREROZHw8HApVKiQuDP2oYiIiCil+1BuF5RChpT2xmTLli1VXiMiIkJy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zZcSOUowKEVERERElAQYoocaU2i9evVSyx4/fqwCU8aBKgSuTp8+rdovv/yi1suUKZNUrVrVJKMKswZy2B9R6mFQisiBUEvq5Yovq7br0i41ax+G8WnWnF0jB64ekP5V+6saVURERERElDgZM2Y0BJk0yJwyHvaH3zHz2vbt21XT5M2b1xCkQjYVhg4SUcphUIoojahZqKZqxsZtHScbL2yUUZtGySuVXlGF0SvkreCwbSQiIiIicgWoMdWmTRvVtGF/KJpunE2Fouo3btyQFStWqAbImipZsqTUqVPHEKyqWLEih/0RJRGDUkRpFE6MfQL7yN3ou3Lw2kGZuX+mak2KNZGgmkHStmRbSeeZztGbSURERETk9BBsQo0ptFdffVUti46OlgMHDpgEqs6fP28Y9jdv3jy1nre3txr2ZzzbX+HChTnsj8gGnpJGfP311+of7bBhw+Jdb/HixVKmTBk13hcRaeNCdUSuBP8e+lbuK/vf2C+b+26WLmW7iKeHp6w/v146LOog3UO6O3oTiYiIiIhcFr5z1q5dW31H/e233+TcuXNy/fp19fvIkSOlefPm4uvrK48ePZJt27bJpEmTpHv37qoOVf78+aVDhw7y1VdfyX///SeRkZGO3h2iNClNZErt2bNHfvrpJzXbQXwwtrdnz54ybtw4adeunSxcuFA6duwo+/fvlwoVOKSJXDc4Vb9IfdXC7oXJ97u/VxlTncp0MqxzL/qeXIu6JqVzl3bothIRERERuTLUmGrZsqX06NFD3Y6NjVVZU8bZVIcPH1bBq+XLl6um9enLli1rkk2F77Dp06eJr+RE7pspFRUVpWZFmDlzpuTIkSPedYODg9VUnx988IH6Bz169GiVJjlt2jS7bS+RIxX2LSzjm4+XS+9ekpfKv2RYPvvAbCnzfRlpvaC1rA5dLbG6WIduJxERpR5cnEOh3axZs6ovR7hAd+rUqXgfgyEm+EJk3JABQEREyePp6alG8vTp00d++OEH2bdvn8qK2rp1q0ycOFFeeuklKVKkiCrNcfz4cZk7d64MHDhQqlSporKsGjRooL7fhoSEyKVLl3g4yO04PCw7aNAgadu2rTRr1kzGjBkT77o7duyQd99912QZotTLli2z+hhM/4mmYdokuYLMXplNbp+LOCce4qECUmilc5WWITWGSO/A3pI1Y1aHbScREaW8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" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "execution_count": 53 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 5: Neuron-Level Inverted Index\n", | |
| "\n", | |
| "This is the key mechanism that makes SSR efficient. Instead of K-means centroids, SSR builds an inverted index where each **neuron dimension** $u$ has a posting list:\n", | |
| "\n", | |
| "$$I_u = \\{(D, \\mu_{D,u}) \\mid \\mu_{D,u} > 0\\}$$\n", | |
| "\n", | |
| "where $\\mu_{D,u} = \\max_{t \\in D} z_t^{(u)}$ is the **maximum impact** of neuron $u$ across all tokens in document $D$.\n", | |
| "\n", | |
| "Within each posting list, entries are divided into **fixed-size blocks**, each storing a block-level upper bound $UB = \\max_{D \\in B} \\mu_{D,u}$. This enables early pruning during traversal.\n", | |
| "\n", | |
| "Since $K \\ll h$ (e.g., 32 active neurons out of 16384), each token only writes to 32 posting lists — far fewer than dense cluster-based methods." | |
| ], | |
| "id": "50042d7a477d13bf" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:02.479643Z", | |
| "start_time": "2026-07-10T13:42:02.366315Z" | |
| } | |
| }, | |
| "source": [ | |
| "@dataclass\n", | |
| "class PostingListBlock:\n", | |
| " \"\"\"A block within a posting list, storing entries and a precomputed upper bound.\"\"\"\n", | |
| " doc_ids: List[int]\n", | |
| " scores: List[float]\n", | |
| " upper_bound: float # max score in this block — used for early pruning\n", | |
| "\n", | |
| "\n", | |
| "class InvertedIndex:\n", | |
| " \"\"\"\n", | |
| " Neuron-level inverted index for SSR.\n", | |
| " \n", | |
| " Each neuron dimension u maintains a posting list of (doc_id, max_impact) pairs.\n", | |
| " Posting lists are partitioned into blocks with precomputed upper bounds\n", | |
| " to enable early termination during retrieval.\n", | |
| " \n", | |
| " This replaces the entire K-means cluster index of dense MVR.\n", | |
| " \"\"\"\n", | |
| " def __init__(self, d_sparse: int, block_size: int = 64):\n", | |
| " self.d_sparse = d_sparse\n", | |
| " self.block_size = block_size\n", | |
| " # posting_lists[u] = list of PostingListBlock for neuron u\n", | |
| " self.posting_lists: Dict[int, List[PostingListBlock]] = defaultdict(list)\n", | |
| " # Raw accumulator used during construction\n", | |
| " self._raw_lists: Dict[int, List[Tuple[int, float]]] = defaultdict(list)\n", | |
| " self.n_docs = 0\n", | |
| " \n", | |
| " def add_document(\n", | |
| " self,\n", | |
| " doc_id: int,\n", | |
| " token_sparse_codes: torch.Tensor # (seq_len, d_sparse)\n", | |
| " ):\n", | |
| " \"\"\"\n", | |
| " Add one document to the index.\n", | |
| " \n", | |
| " For each active neuron u in any token of this document,\n", | |
| " record the MAX value of neuron u across all tokens (max-impact).\n", | |
| " This supports the MaxSim operator efficiently.\n", | |
| " \"\"\"\n", | |
| " # Max over token dimension for each neuron\n", | |
| " # mu[u] = max_{t in D} z_t^(u)\n", | |
| " mu = token_sparse_codes.max(dim=0).values # (d_sparse,)\n", | |
| " \n", | |
| " # Only index neurons that are active (mu > 0)\n", | |
| " active = (mu > 0).nonzero(as_tuple=True)[0]\n", | |
| " for u in active.tolist():\n", | |
| " self._raw_lists[u].append((doc_id, mu[u].item()))\n", | |
| " \n", | |
| " self.n_docs += 1\n", | |
| " \n", | |
| " def build(self):\n", | |
| " \"\"\"\n", | |
| " Finalize index: sort each posting list by score (descending)\n", | |
| " and partition into blocks with upper bounds.\n", | |
| " \"\"\"\n", | |
| " self.posting_lists.clear()\n", | |
| " for u, entries in self._raw_lists.items():\n", | |
| " # Sort by score descending (higher impact first)\n", | |
| " entries_sorted = sorted(entries, key=lambda e: -e[1])\n", | |
| " \n", | |
| " # Partition into blocks\n", | |
| " blocks = []\n", | |
| " for i in range(0, len(entries_sorted), self.block_size):\n", | |
| " block_entries = entries_sorted[i:i + self.block_size]\n", | |
| " doc_ids = [e[0] for e in block_entries]\n", | |
| " scores = [e[1] for e in block_entries]\n", | |
| " ub = max(scores) # upper bound for this block\n", | |
| " blocks.append(PostingListBlock(doc_ids, scores, ub))\n", | |
| " \n", | |
| " self.posting_lists[u] = blocks\n", | |
| " \n", | |
| " total_entries = sum(\n", | |
| " sum(len(b.doc_ids) for b in blocks)\n", | |
| " for blocks in self.posting_lists.values()\n", | |
| " )\n", | |
| " print(f'Index built: {len(self.posting_lists)} active neurons, '\n", | |
| " f'{total_entries:,} total entries, {self.n_docs} documents')\n", | |
| " \n", | |
| " def stats(self):\n", | |
| " \"\"\"Print index statistics.\"\"\"\n", | |
| " if not self.posting_lists:\n", | |
| " print('Index not built yet.')\n", | |
| " return\n", | |
| " lengths = [\n", | |
| " sum(len(b.doc_ids) for b in blocks)\n", | |
| " for blocks in self.posting_lists.values()\n", | |
| " ]\n", | |
| " print(f'Active neurons: {len(self.posting_lists):,} / {self.d_sparse:,}')\n", | |
| " print(f'Avg posting len: {np.mean(lengths):.1f}')\n", | |
| " print(f'Max posting len: {np.max(lengths):,}')\n", | |
| " print(f'Min posting len: {np.min(lengths):,}')\n", | |
| "\n", | |
| "\n", | |
| "# Build index on the demo corpus\n", | |
| "print('Encoding corpus and building inverted index...')\n", | |
| "sae_demo.eval()\n", | |
| "index = InvertedIndex(d_sparse=D_SPARSE, block_size=32)\n", | |
| "\n", | |
| "with torch.no_grad():\n", | |
| " for doc_id in range(N_docs):\n", | |
| " token_embs = embeddings[doc_id] # (SEQ_LEN, D_MODEL)\n", | |
| " z_doc = sae_demo.encode(token_embs) # (SEQ_LEN, D_SPARSE)\n", | |
| " index.add_document(doc_id, z_doc)\n", | |
| "\n", | |
| "index.build()\n", | |
| "index.stats()" | |
| ], | |
| "id": "b8799cafa3e8588e", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Encoding corpus and building inverted index...\n", | |
| "Index built: 582 active neurons, 12,493 total entries, 200 documents\n", | |
| "Active neurons: 582 / 1,024\n", | |
| "Avg posting len: 21.5\n", | |
| "Max posting len: 109\n", | |
| "Min posting len: 1\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 55 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 6: SSR Retrieval\n", | |
| "\n", | |
| "Given a query $Q = \\{q_1, ..., q_N\\}$, SSR retrieval works as follows:\n", | |
| "\n", | |
| "1. Encode each query token through SAE → get top-K active neurons $A_K(z_{q_i})$\n", | |
| "2. Look up posting lists for all $N \\times K$ active neurons\n", | |
| "3. For each document that appears in any of those lists, accumulate the MaxSim score:\n", | |
| "$$S(Q, D) = \\sum_{i=1}^{N} \\max_{j=1}^{M} \\left( \\sum_{u \\in A_K(z_{q_i}) \\cap A_K(z_{d_j})} z_{q_i}^{(u)} \\cdot z_{d_j}^{(u)} \\right)$$\n", | |
| "\n", | |
| "The sparsity is what makes this efficient: with K=32 active neurons out of h=16384, queries only touch 32/16384 ≈ 0.2% of the index per token." | |
| ], | |
| "id": "c90a0237f6246501" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:08.553877Z", | |
| "start_time": "2026-07-10T13:42:08.416450Z" | |
| } | |
| }, | |
| "source": [ | |
| "class SSRRetriever:\n", | |
| " \"\"\"\n", | |
| " SSR and SSR++ retrieval using a neuron-level inverted index.\n", | |
| " \n", | |
| " SSR: exact late-interaction using all K active neurons\n", | |
| " SSR++: coarse-to-fine — first filter with K_coarse neurons, \n", | |
| " then rerank with full K neurons\n", | |
| " \"\"\"\n", | |
| " def __init__(\n", | |
| " self,\n", | |
| " sae: SparseAutoencoder,\n", | |
| " index: InvertedIndex,\n", | |
| " doc_sparse_codes: Dict[int, torch.Tensor] # doc_id -> (seq_len, d_sparse)\n", | |
| " ):\n", | |
| " self.sae = sae\n", | |
| " self.index = index\n", | |
| " self.doc_codes = doc_sparse_codes\n", | |
| " \n", | |
| " def _get_query_neurons(\n", | |
| " self,\n", | |
| " q_tokens: torch.Tensor, # (Q_len, d_model)\n", | |
| " k: int\n", | |
| " ) -> List[Tuple[int, float, int]]: # (neuron_id, query_value, token_idx)\n", | |
| " \"\"\"Encode query tokens and extract active neurons.\"\"\"\n", | |
| " with torch.no_grad():\n", | |
| " q_sparse = self.sae.encode(q_tokens, k=k) # (Q_len, d_sparse)\n", | |
| " \n", | |
| " active_neurons = []\n", | |
| " for tok_idx in range(q_sparse.shape[0]):\n", | |
| " z = q_sparse[tok_idx]\n", | |
| " nonzero_idx = (z > 0).nonzero(as_tuple=True)[0]\n", | |
| " for neuron_id in nonzero_idx.tolist():\n", | |
| " active_neurons.append((neuron_id, z[neuron_id].item(), tok_idx))\n", | |
| " return active_neurons, q_sparse\n", | |
| " \n", | |
| " def _coarse_score(\n", | |
| " self,\n", | |
| " active_neurons: List[Tuple[int, float, int]],\n", | |
| " top_k: int,\n", | |
| " score_threshold: float = 0.0\n", | |
| " ) -> Dict[int, float]:\n", | |
| " \"\"\"\n", | |
| " Coarse scoring: traverse posting lists and accumulate upper-bound scores.\n", | |
| " Uses block-level upper bounds to skip low-scoring blocks (early pruning).\n", | |
| " \"\"\"\n", | |
| " doc_scores = defaultdict(float)\n", | |
| " \n", | |
| " for neuron_id, q_val, tok_idx in active_neurons:\n", | |
| " if neuron_id not in self.index.posting_lists:\n", | |
| " continue\n", | |
| " \n", | |
| " for block in self.index.posting_lists[neuron_id]:\n", | |
| " # Block-level pruning: if q_val * block.upper_bound is too small, skip\n", | |
| " block_contribution = q_val * block.upper_bound\n", | |
| " if block_contribution < score_threshold:\n", | |
| " break # Blocks are sorted descending, so rest will be even smaller\n", | |
| " \n", | |
| " # Accumulate scores for all docs in this block\n", | |
| " for doc_id, mu_val in zip(block.doc_ids, block.scores):\n", | |
| " doc_scores[doc_id] += q_val * mu_val\n", | |
| " \n", | |
| " return doc_scores\n", | |
| " \n", | |
| " def _exact_maxsim(\n", | |
| " self,\n", | |
| " q_sparse: torch.Tensor, # (Q_len, d_sparse)\n", | |
| " doc_ids: List[int]\n", | |
| " ) -> Dict[int, float]:\n", | |
| " \"\"\"\n", | |
| " Exact MaxSim scoring for a candidate set of documents.\n", | |
| " Uses full sparse codes — only active neurons contribute.\n", | |
| " \"\"\"\n", | |
| " scores = {}\n", | |
| " for doc_id in doc_ids:\n", | |
| " d_sparse = self.doc_codes[doc_id] # (D_len, d_sparse)\n", | |
| " # Sparse dot product: only overlapping active neurons contribute\n", | |
| " sim = q_sparse @ d_sparse.T # (Q_len, D_len)\n", | |
| " scores[doc_id] = sim.max(dim=1).values.sum().item()\n", | |
| " return scores\n", | |
| " \n", | |
| " def retrieve(\n", | |
| " self,\n", | |
| " q_tokens: torch.Tensor,\n", | |
| " top_k: int = 10,\n", | |
| " mode: str = 'ssr' # 'ssr' or 'ssr++'\n", | |
| " ) -> List[Tuple[int, float]]:\n", | |
| " \"\"\"\n", | |
| " Retrieve top-k documents for a query.\n", | |
| " \n", | |
| " SSR: traverse all K active neurons, compute exact MaxSim for all candidates\n", | |
| " SSR++: traverse K_coarse neurons first, prune, then rerank with full K\n", | |
| " \n", | |
| " Returns: [(doc_id, score), ...] sorted by score descending\n", | |
| " \"\"\"\n", | |
| " K = self.sae.k\n", | |
| " \n", | |
| " if mode == 'ssr':\n", | |
| " # Encode with full K active neurons\n", | |
| " active_neurons, q_sparse = self._get_query_neurons(q_tokens, k=K)\n", | |
| " # Score all candidates via inverted index\n", | |
| " doc_scores = self._coarse_score(active_neurons, top_k)\n", | |
| " # Exact reranking on all candidates found\n", | |
| " if doc_scores:\n", | |
| " exact = self._exact_maxsim(q_sparse, list(doc_scores.keys()))\n", | |
| " doc_scores = exact\n", | |
| " \n", | |
| " elif mode == 'ssr++':\n", | |
| " # --- Stage 1: Coarse filtering with K_coarse = 4 neurons ---\n", | |
| " K_coarse = max(1, K // 8) # paper uses K_coarse = 4 with K = 32\n", | |
| " coarse_neurons, _ = self._get_query_neurons(q_tokens, k=K_coarse)\n", | |
| " coarse_scores = self._coarse_score(coarse_neurons, top_k)\n", | |
| " \n", | |
| " # Keep top candidates from coarse pass\n", | |
| " n_candidates = min(len(coarse_scores), max(top_k * 10, 100))\n", | |
| " candidate_ids = sorted(coarse_scores, key=lambda d: -coarse_scores[d])[:n_candidates]\n", | |
| " \n", | |
| " # --- Stage 2: Exact reranking with full K neurons on candidates only ---\n", | |
| " _, q_sparse_full = self._get_query_neurons(q_tokens, k=K)\n", | |
| " exact = self._exact_maxsim(q_sparse_full, candidate_ids)\n", | |
| " doc_scores = exact\n", | |
| " \n", | |
| " # Sort and return top-k\n", | |
| " ranked = sorted(doc_scores.items(), key=lambda x: -x[1])\n", | |
| " return ranked[:top_k]\n", | |
| "\n", | |
| "\n", | |
| "# Build doc_sparse_codes for retrieval\n", | |
| "doc_sparse_codes = {}\n", | |
| "sae_demo.eval()\n", | |
| "with torch.no_grad():\n", | |
| " for doc_id in range(N_docs):\n", | |
| " doc_sparse_codes[doc_id] = sae_demo.encode(embeddings[doc_id])\n", | |
| "\n", | |
| "retriever = SSRRetriever(sae_demo, index, doc_sparse_codes)\n", | |
| "\n", | |
| "# Test retrieval with a query\n", | |
| "query_emb = embeddings[0] # Use first document's embedding as a \"query\"\n", | |
| "\n", | |
| "results_ssr = retriever.retrieve(query_emb, top_k=5, mode='ssr')\n", | |
| "results_ssrpp = retriever.retrieve(query_emb, top_k=5, mode='ssr++')\n", | |
| "\n", | |
| "print('SSR results (exact):')\n", | |
| "for doc_id, score in results_ssr:\n", | |
| " print(f' doc {doc_id:4d}: {score:.4f}')\n", | |
| "\n", | |
| "print('\\nSSR++ results (coarse-to-fine):')\n", | |
| "for doc_id, score in results_ssrpp:\n", | |
| " print(f' doc {doc_id:4d}: {score:.4f}')" | |
| ], | |
| "id": "5bd220d6fce02021", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "SSR results (exact):\n", | |
| " doc 0: 40.4532\n", | |
| " doc 73: 31.2456\n", | |
| " doc 43: 31.2080\n", | |
| " doc 191: 30.9232\n", | |
| " doc 58: 30.8908\n", | |
| "\n", | |
| "SSR++ results (coarse-to-fine):\n", | |
| " doc 0: 40.4532\n", | |
| " doc 73: 31.2456\n", | |
| " doc 43: 31.2080\n", | |
| " doc 191: 30.9232\n", | |
| " doc 58: 30.8908\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 56 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 7: SSR++ — Coarse-to-Fine Pruning\n", | |
| "\n", | |
| "SSR++ further accelerates retrieval with a two-step pipeline:\n", | |
| "\n", | |
| "**Step 1 (Coarse):** Use only $K_{coarse} = 4$ principal (highest-value) neurons to compute an approximate upper-bound score. Use block upper bounds to skip low-scoring documents entirely.\n", | |
| "\n", | |
| "$$\\hat{S}_{coarse}(Q, D) = \\sum_{i=1}^{N} \\sum_{u \\in A_{K_{coarse}}(q_i)} q_i^{(u)} \\cdot \\mu_{D,u}$$\n", | |
| "\n", | |
| "**Step 2 (Exact):** For the small candidate set $C_1$ surviving coarse filtering, compute the full precise MaxSim with all K neurons.\n", | |
| "\n", | |
| "**Impact (from paper's Table 5):** \n", | |
| "| Method | Candidates | Latency | nDCG@10 |\n", | |
| "|--------|-----------|---------|----------|\n", | |
| "| SSR | 54,278 | 38.6ms | 45.3 |\n", | |
| "| SSR++ | 3,196 | 17.5ms | 45.2 |" | |
| ], | |
| "id": "a8c873a0c6115304" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:13.427032Z", | |
| "start_time": "2026-07-10T13:42:12.057425Z" | |
| } | |
| }, | |
| "source": [ | |
| "import time\n", | |
| "\n", | |
| "def benchmark_retrieval(retriever, queries, top_k=10, n_runs=3):\n", | |
| " \"\"\"Benchmark SSR vs SSR++ on a set of queries.\"\"\"\n", | |
| " results = {}\n", | |
| " \n", | |
| " for mode in ['ssr', 'ssr++']:\n", | |
| " times = []\n", | |
| " for _ in range(n_runs):\n", | |
| " start = time.perf_counter()\n", | |
| " all_results = []\n", | |
| " for q in queries:\n", | |
| " r = retriever.retrieve(q, top_k=top_k, mode=mode)\n", | |
| " all_results.append(r)\n", | |
| " elapsed = time.perf_counter() - start\n", | |
| " times.append(elapsed)\n", | |
| " \n", | |
| " avg_ms = np.mean(times) / len(queries) * 1000\n", | |
| " results[mode] = {'avg_ms': avg_ms, 'results': all_results}\n", | |
| " print(f'{mode:6s}: {avg_ms:.2f}ms per query')\n", | |
| " \n", | |
| " return results\n", | |
| "\n", | |
| "\n", | |
| "# Generate test queries\n", | |
| "n_queries = 20\n", | |
| "torch.manual_seed(123)\n", | |
| "test_queries = [embeddings[i] + 0.1 * torch.randn_like(embeddings[i]) \n", | |
| " for i in range(n_queries)]\n", | |
| "\n", | |
| "print('Benchmarking SSR vs SSR++ ...')\n", | |
| "bench = benchmark_retrieval(retriever, test_queries, top_k=5)\n", | |
| "\n", | |
| "# Compare quality: how often do SSR and SSR++ agree on top-1?\n", | |
| "ssr_top1 = [bench['ssr']['results'][i][0][0] if bench['ssr']['results'][i] else -1 \n", | |
| " for i in range(n_queries)]\n", | |
| "ssrpp_top1 = [bench['ssr++']['results'][i][0][0] if bench['ssr++']['results'][i] else -1 \n", | |
| " for i in range(n_queries)]\n", | |
| "agreement = sum(a == b for a, b in zip(ssr_top1, ssrpp_top1)) / n_queries\n", | |
| "print(f'\\nTop-1 agreement (SSR vs SSR++): {agreement:.0%}')" | |
| ], | |
| "id": "14ea3bf5c34c012c", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Benchmarking SSR vs SSR++ ...\n", | |
| "ssr : 14.30ms per query\n", | |
| "ssr++ : 7.65ms per query\n", | |
| "\n", | |
| "Top-1 agreement (SSR vs SSR++): 100%\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 57 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 8: SSR-CLS Variant\n", | |
| "\n", | |
| "The paper presents two variants:\n", | |
| "\n", | |
| "- **SSR-tok**: Only token-level sparse MaxSim (as above)\n", | |
| "- **SSR-CLS**: Combines token-level MaxSim with a global `[CLS]` embedding similarity\n", | |
| "\n", | |
| "SSR-CLS trains a **separate SAE** ($E_{[CLS]}$) specifically on `[CLS]` token embeddings and adds cosine similarity to the score. This acts as a global semantic \"tie-breaker\" and achieves slightly higher nDCG@10 (+0.5 on average) at the cost of a slightly higher retrieval latency (+2ms)." | |
| ], | |
| "id": "c5eeec4c373fc925" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:16.964569Z", | |
| "start_time": "2026-07-10T13:42:16.904150Z" | |
| } | |
| }, | |
| "source": [ | |
| "class SSRWithCLS(nn.Module):\n", | |
| " \"\"\"\n", | |
| " SSR-CLS: combines token-level sparse MaxSim with CLS-token sparse similarity.\n", | |
| " \n", | |
| " Two separate SAEs are trained:\n", | |
| " - E_tok: for regular token embeddings (MaxSim scoring)\n", | |
| " - E_cls: for [CLS] global embeddings (cosine similarity scoring)\n", | |
| " \n", | |
| " Final score = MaxSim(Q_tok, D_tok) + lambda * cosine_sim(z_Q_cls, z_D_cls)\n", | |
| " \"\"\"\n", | |
| " def __init__(\n", | |
| " self,\n", | |
| " d_model: int = 768,\n", | |
| " d_sparse_tok: int = 16384,\n", | |
| " d_sparse_cls: int = 16384,\n", | |
| " k_tok: int = 32,\n", | |
| " k_cls: int = 32,\n", | |
| " cls_weight: float = 1.0\n", | |
| " ):\n", | |
| " super().__init__()\n", | |
| " self.E_tok = SparseAutoencoder(d_model, d_sparse_tok, k_tok)\n", | |
| " self.E_cls = SparseAutoencoder(d_model, d_sparse_cls, k_cls)\n", | |
| " self.cls_weight = cls_weight\n", | |
| " \n", | |
| " def encode_tokens(self, token_embs: torch.Tensor) -> torch.Tensor:\n", | |
| " \"\"\"Encode regular tokens for MaxSim retrieval.\"\"\"\n", | |
| " return self.E_tok.encode(token_embs)\n", | |
| " \n", | |
| " def encode_cls(self, cls_emb: torch.Tensor) -> torch.Tensor:\n", | |
| " \"\"\"Encode [CLS] token for global similarity.\"\"\"\n", | |
| " return self.E_cls.encode(cls_emb)\n", | |
| " \n", | |
| " def score(\n", | |
| " self,\n", | |
| " q_tok: torch.Tensor, # (Q_len, d_sparse_tok) — sparse token codes\n", | |
| " q_cls: torch.Tensor, # (d_sparse_cls,) — sparse CLS code\n", | |
| " d_tok: torch.Tensor, # (D_len, d_sparse_tok)\n", | |
| " d_cls: torch.Tensor, # (d_sparse_cls,)\n", | |
| " ) -> float:\n", | |
| " \"\"\"\n", | |
| " Compute SSR-CLS relevance score.\n", | |
| " = token MaxSim + cls_weight * sparse_cosine(q_cls, d_cls)\n", | |
| " \"\"\"\n", | |
| " # Token-level MaxSim\n", | |
| " tok_score = (q_tok @ d_tok.T).max(dim=1).values.sum()\n", | |
| " \n", | |
| " # CLS sparse cosine similarity\n", | |
| " cls_score = F.cosine_similarity(q_cls.unsqueeze(0), d_cls.unsqueeze(0))\n", | |
| " \n", | |
| " return (tok_score + self.cls_weight * cls_score).item()\n", | |
| "\n", | |
| "\n", | |
| "# Demonstration: compare SSR-tok vs SSR-CLS scoring\n", | |
| "model_cls = SSRWithCLS(d_model=D_MODEL, d_sparse_tok=D_SPARSE, d_sparse_cls=D_SPARSE,\n", | |
| " k_tok=K, k_cls=K)\n", | |
| "\n", | |
| "# Simulate a query and two documents (positive and negative)\n", | |
| "q_embs = embeddings[0]\n", | |
| "pos_embs = embeddings[1] # same cluster → should score higher\n", | |
| "neg_embs = embeddings[50] # different cluster\n", | |
| "\n", | |
| "with torch.no_grad():\n", | |
| " q_tok = model_cls.encode_tokens(q_embs)\n", | |
| " q_cls = model_cls.encode_cls(q_embs[0:1]).squeeze(0) # [CLS] = first token\n", | |
| " \n", | |
| " pos_tok = model_cls.encode_tokens(pos_embs)\n", | |
| " pos_cls = model_cls.encode_cls(pos_embs[0:1]).squeeze(0)\n", | |
| " \n", | |
| " neg_tok = model_cls.encode_tokens(neg_embs)\n", | |
| " neg_cls = model_cls.encode_cls(neg_embs[0:1]).squeeze(0)\n", | |
| "\n", | |
| "pos_score = model_cls.score(q_tok, q_cls, pos_tok, pos_cls)\n", | |
| "neg_score = model_cls.score(q_tok, q_cls, neg_tok, neg_cls)\n", | |
| "\n", | |
| "print(f'SSR-CLS score (positive doc): {pos_score:.4f}')\n", | |
| "print(f'SSR-CLS score (negative doc): {neg_score:.4f}')\n", | |
| "print(f'Positive > Negative: {pos_score > neg_score}')" | |
| ], | |
| "id": "af5a066a072df5f6", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "SSR-CLS score (positive doc): 7.5520\n", | |
| "SSR-CLS score (negative doc): 7.3149\n", | |
| "Positive > Negative: True\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 58 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 9: Full Pipeline on Real Data (BEIR)\n", | |
| "\n", | |
| "Here we wire everything together on a real BEIR dataset (SciFact, a small ~5K document corpus) using a pretrained BERT encoder. This demonstrates the complete SSR pipeline end-to-end.\n", | |
| "\n", | |
| "> **Note:** For production, you would train the SAE on MS MARCO first (as the paper does), then evaluate zero-shot on BEIR. This demo trains briefly for illustration." | |
| ], | |
| "id": "f1f3aee3c80dfff9" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:23.504902Z", | |
| "start_time": "2026-07-10T13:42:21.916594Z" | |
| } | |
| }, | |
| "source": [ | |
| "from transformers import AutoTokenizer, AutoModel\n", | |
| "from datasets import load_dataset\n", | |
| "\n", | |
| "# Load a small BEIR-style dataset\n", | |
| "print('Loading SciFact dataset from BEIR...')\n", | |
| "try:\n", | |
| " dataset = load_dataset('BeIR/scifact', 'corpus', trust_remote_code=True)\n", | |
| " corpus = dataset['corpus']\n", | |
| " # Use a small subset for the demo\n", | |
| " MAX_DOCS = 500\n", | |
| " doc_texts = [corpus[i]['text'][:256] for i in range(min(MAX_DOCS, len(corpus)))]\n", | |
| " doc_ids_real = [corpus[i]['_id'] for i in range(min(MAX_DOCS, len(corpus)))]\n", | |
| " print(f'Loaded {len(doc_texts)} documents')\n", | |
| "except Exception as e:\n", | |
| " print(f'Could not load BEIR dataset: {e}')\n", | |
| " print('Using synthetic texts for demo instead...')\n", | |
| " doc_texts = [f'This is document number {i} about topic {i % 10}.' for i in range(200)]\n", | |
| " doc_ids_real = list(range(200))" | |
| ], | |
| "id": "f3299ae891a68c3f", | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "`trust_remote_code` is not supported anymore.\n", | |
| "Please check that the Hugging Face dataset 'BeIR/scifact' isn't based on a loading script and remove `trust_remote_code`.\n", | |
| "If the dataset is based on a loading script, please ask the dataset author to remove it and convert it to a standard format like Parquet.\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Loading SciFact dataset from BEIR...\n", | |
| "Loaded 500 documents\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 59 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:42:36.499549Z", | |
| "start_time": "2026-07-10T13:42:24.645906Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Load BERT encoder (backbone — frozen in SSR)\n", | |
| "print('Loading BERT encoder...')\n", | |
| "tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')\n", | |
| "encoder = AutoModel.from_pretrained('bert-base-uncased')\n", | |
| "encoder.eval()\n", | |
| "encoder.to(device)\n", | |
| "\n", | |
| "def encode_texts(texts: List[str], batch_size: int = 32) -> torch.Tensor:\n", | |
| " \"\"\"\n", | |
| " Encode texts with BERT, returning all token embeddings.\n", | |
| " In SSR the backbone is FROZEN — we only train the SAE on top.\n", | |
| " \"\"\"\n", | |
| " all_embeddings = []\n", | |
| " for i in tqdm(range(0, len(texts), batch_size), desc='Encoding'):\n", | |
| " batch = texts[i:i+batch_size]\n", | |
| " inputs = tokenizer(\n", | |
| " batch, padding=True, truncation=True,\n", | |
| " max_length=64, return_tensors='pt'\n", | |
| " ).to(device)\n", | |
| " with torch.no_grad():\n", | |
| " out = encoder(**inputs)\n", | |
| " # Use all token embeddings (last hidden state), shape (batch, seq, 768)\n", | |
| " all_embeddings.append(out.last_hidden_state.cpu())\n", | |
| " return all_embeddings # list of (batch, seq, 768) tensors\n", | |
| "\n", | |
| "\n", | |
| "print('Encoding corpus with BERT (frozen backbone)...')\n", | |
| "doc_embeddings = encode_texts(doc_texts, batch_size=32)\n", | |
| "print(f'Encoded {len(doc_texts)} documents')\n", | |
| "print(f'Example shape: {doc_embeddings[0].shape}')" | |
| ], | |
| "id": "85a33f0c0a19c423", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Loading BERT encoder...\n", | |
| "Encoding corpus with BERT (frozen backbone)...\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "Encoding: 100%|██████████| 16/16 [00:10<00:00, 1.51it/s]" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Encoded 500 documents\n", | |
| "Example shape: torch.Size([32, 64, 768])\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 60 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:03.373173Z", | |
| "start_time": "2026-07-10T13:42:36.503190Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Build SSR index on BERT embeddings\n", | |
| "BERT_DIM = 768\n", | |
| "SPARSE_DIM = 4096 # Paper uses 16384; smaller for demo speed\n", | |
| "TOPK = 16 # Paper uses 32; smaller for demo\n", | |
| "\n", | |
| "print('Training SAE on encoded corpus...')\n", | |
| "sae_real = SparseAutoencoder(d_model=BERT_DIM, d_sparse=SPARSE_DIM, k=TOPK)\n", | |
| "\n", | |
| "# Collect all embeddings into a single tensor for training\n", | |
| "flat_embs = torch.cat([b.view(-1, BERT_DIM) for b in doc_embeddings], dim=0)\n", | |
| "# Reshape back to (n_docs, seq_len, d_model) for training batches\n", | |
| "# (we take first 64 tokens per doc to simplify)\n", | |
| "SEQ = doc_embeddings[0].shape[1]\n", | |
| "all_embs = torch.cat([b for b in doc_embeddings], dim=0) # (N_docs, seq, 768)\n", | |
| "\n", | |
| "history_real = train_sae(sae_real, all_embs, n_epochs=3, batch_size=16, lr=1e-3, device=str(device))\n", | |
| "\n", | |
| "print('\\nBuilding inverted index...')\n", | |
| "index_real = InvertedIndex(d_sparse=SPARSE_DIM, block_size=32)\n", | |
| "doc_codes_real = {}\n", | |
| "sae_real.eval()\n", | |
| "with torch.no_grad():\n", | |
| " for doc_idx, emb_batch in enumerate(doc_embeddings):\n", | |
| " for j in range(emb_batch.shape[0]):\n", | |
| " real_doc_id = doc_idx * 32 + j # batch_size=32\n", | |
| " if real_doc_id >= len(doc_texts):\n", | |
| " break\n", | |
| " tok_embs = emb_batch[j].to(device) # (seq, 768)\n", | |
| " z = sae_real.encode(tok_embs) # (seq, d_sparse)\n", | |
| " index_real.add_document(real_doc_id, z)\n", | |
| " doc_codes_real[real_doc_id] = z.cpu()\n", | |
| "\n", | |
| "index_real.build()\n", | |
| "index_real.stats()" | |
| ], | |
| "id": "b9d44b15a21411a4", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Training SAE on encoded corpus...\n", | |
| "Epoch 1/3 | recon=185.3545 | sparse_cl=0.2319 | total=221.2845\n", | |
| "Epoch 2/3 | recon=113.4597 | sparse_cl=0.6435 | total=138.0383\n", | |
| "Epoch 3/3 | recon=88.2644 | sparse_cl=0.7706 | total=109.2974\n", | |
| "\n", | |
| "Building inverted index...\n", | |
| "Index built: 1220 active neurons, 115,157 total entries, 500 documents\n", | |
| "Active neurons: 1,220 / 4,096\n", | |
| "Avg posting len: 94.4\n", | |
| "Max posting len: 500\n", | |
| "Min posting len: 1\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 61 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:03.817593Z", | |
| "start_time": "2026-07-10T13:43:03.445928Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Test end-to-end retrieval\n", | |
| "test_queries_text = [\n", | |
| " 'What is the effect of aspirin on cancer?',\n", | |
| " 'How does climate change affect biodiversity?',\n", | |
| " 'What are the mechanisms of protein folding?',\n", | |
| "]\n", | |
| "\n", | |
| "retriever_real = SSRRetriever(\n", | |
| " sae_real.cpu(),\n", | |
| " index_real,\n", | |
| " {k: v.cpu() for k, v in doc_codes_real.items()}\n", | |
| ")\n", | |
| "sae_real.cpu()\n", | |
| "\n", | |
| "print('End-to-end SSR++ retrieval results:')\n", | |
| "print('=' * 60)\n", | |
| "\n", | |
| "for query_text in test_queries_text:\n", | |
| " # Encode query\n", | |
| " inputs = tokenizer(query_text, return_tensors='pt', truncation=True, max_length=64)\n", | |
| " with torch.no_grad():\n", | |
| " q_emb = encoder(**inputs).last_hidden_state.squeeze(0).cpu() # (q_seq, 768)\n", | |
| " \n", | |
| " # Retrieve\n", | |
| " results = retriever_real.retrieve(q_emb, top_k=3, mode='ssr++')\n", | |
| " \n", | |
| " print(f'\\nQuery: \"{query_text}\"')\n", | |
| " for rank, (doc_id, score) in enumerate(results, 1):\n", | |
| " doc_text = doc_texts[doc_id][:100] if doc_id < len(doc_texts) else '(unknown)'\n", | |
| " print(f' Rank {rank} [score={score:.3f}]: {doc_text}...')" | |
| ], | |
| "id": "4a3ed3a80c75b803", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "End-to-end SSR++ retrieval results:\n", | |
| "============================================================\n", | |
| "\n", | |
| "Query: \"What is the effect of aspirin on cancer?\"\n", | |
| " Rank 1 [score=1128.044]: Metastatic colorectal cancer (mCRC) is increasingly treated using targeted therapies. Post-marketing...\n", | |
| " Rank 2 [score=1104.589]: A considerable subgroup of patients with early breast cancer does not address benefits of anthracycl...\n", | |
| " Rank 3 [score=1103.117]: Biochemical modulation has played an important role in the development of cancer chemotherapy. We ha...\n", | |
| "\n", | |
| "Query: \"How does climate change affect biodiversity?\"\n", | |
| " Rank 1 [score=841.224]: Dishevelled (Dvl) proteins are important signaling components of both the canonical beta-catenin/Wnt...\n", | |
| " Rank 2 [score=834.962]: Stem cell decline is an important cellular driver of aging-associated pathophysiology in multiple ti...\n", | |
| " Rank 3 [score=833.400]: Successful generation of induced pluripotent stem cells entails a major metabolic switch from mitoch...\n", | |
| "\n", | |
| "Query: \"What are the mechanisms of protein folding?\"\n", | |
| " Rank 1 [score=975.810]: Dishevelled (Dvl) proteins are important signaling components of both the canonical beta-catenin/Wnt...\n", | |
| " Rank 2 [score=971.515]: Oligodendrocytes, the myelin-forming glial cells of the central nervous system, maintain long-term a...\n", | |
| " Rank 3 [score=963.772]: Tumor metastasis is the primary cause of death of cancer patients. Understanding the molecular mecha...\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 62 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 10: Hyperparameter Analysis\n", | |
| "\n", | |
| "The paper provides detailed ablations. Let's reproduce the key findings on our small demo:" | |
| ], | |
| "id": "447917192bda558e" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:07.119820Z", | |
| "start_time": "2026-07-10T13:43:03.819129Z" | |
| } | |
| }, | |
| "source": [ | |
| "def compute_reconstruction_quality(sae, embs, n_samples=200):\n", | |
| " \"\"\"Measure how well the SAE reconstructs token embeddings.\"\"\"\n", | |
| " sae.eval()\n", | |
| " idx = torch.randperm(embs.shape[0])[:n_samples]\n", | |
| " x = embs[idx].view(-1, embs.shape[-1])\n", | |
| " with torch.no_grad():\n", | |
| " z, x_hat = sae(x)\n", | |
| " recon_error = (x - x_hat).pow(2).sum(-1).sqrt().mean().item()\n", | |
| " sparsity = (z == 0).float().mean().item()\n", | |
| " return recon_error, sparsity\n", | |
| "\n", | |
| "\n", | |
| "# --- Effect of sparsity K ---\n", | |
| "print('Analyzing effect of sparsity level K...')\n", | |
| "k_values = [4, 8, 16, 32, 64]\n", | |
| "recon_errors = []\n", | |
| "sparsities = []\n", | |
| "\n", | |
| "for k in k_values:\n", | |
| " sae_k = SparseAutoencoder(d_model=D_MODEL, d_sparse=D_SPARSE, k=k)\n", | |
| " train_sae(sae_k, embeddings, n_epochs=3, batch_size=32)\n", | |
| " err, spar = compute_reconstruction_quality(sae_k, embeddings)\n", | |
| " recon_errors.append(err)\n", | |
| " sparsities.append(spar)\n", | |
| " print(f' K={k:3d}: recon_error={err:.4f}, sparsity={spar:.3f}')" | |
| ], | |
| "id": "b1402be2a067db17", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Analyzing effect of sparsity level K...\n", | |
| "Epoch 1/3 | recon=1.6336 | sparse_cl=1.4984 | total=2.1062\n", | |
| "Epoch 2/3 | recon=1.5471 | sparse_cl=1.4549 | total=1.9825\n", | |
| "Epoch 3/3 | recon=1.4743 | sparse_cl=1.3463 | total=1.8760\n", | |
| " K= 4: recon_error=1.1963, sparsity=0.996\n", | |
| "Epoch 1/3 | recon=2.0655 | sparse_cl=0.8910 | total=2.6533\n", | |
| "Epoch 2/3 | recon=1.9153 | sparse_cl=0.8321 | total=2.4332\n", | |
| "Epoch 3/3 | recon=1.7730 | sparse_cl=0.7759 | total=2.2315\n", | |
| " K= 8: recon_error=1.2999, sparsity=0.992\n", | |
| "Epoch 1/3 | recon=2.6680 | sparse_cl=0.7564 | total=3.4315\n", | |
| "Epoch 2/3 | recon=2.3894 | sparse_cl=0.6526 | total=3.0249\n", | |
| "Epoch 3/3 | recon=2.1407 | sparse_cl=0.5760 | total=2.6770\n", | |
| " K= 16: recon_error=1.4137, sparsity=0.984\n", | |
| "Epoch 1/3 | recon=3.7569 | sparse_cl=1.0758 | total=4.7203\n", | |
| "Epoch 2/3 | recon=3.1621 | sparse_cl=0.9288 | total=3.9142\n", | |
| "Epoch 3/3 | recon=2.6963 | sparse_cl=0.8398 | total=3.2943\n", | |
| " K= 32: recon_error=1.5648, sparsity=0.969\n", | |
| "Epoch 1/3 | recon=5.3395 | sparse_cl=1.6915 | total=6.5514\n", | |
| "Epoch 2/3 | recon=4.2159 | sparse_cl=1.5047 | total=5.1135\n", | |
| "Epoch 3/3 | recon=3.3359 | sparse_cl=1.4006 | total=4.0153\n", | |
| " K= 64: recon_error=1.7027, sparsity=0.938\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 63 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T12:57:07.862581Z", | |
| "start_time": "2026-07-10T12:57:06.909693Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Plot K sensitivity (mirrors Figure 4b from the paper)\n", | |
| "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))\n", | |
| "\n", | |
| "ax1.plot(k_values, recon_errors, 'b-o', markersize=8, linewidth=2)\n", | |
| "ax1.set_xlabel('Sparsity Level K', fontsize=12)\n", | |
| "ax1.set_ylabel('Reconstruction Error (L2)', fontsize=12)\n", | |
| "ax1.set_title('Effect of Sparsity on Reconstruction\\n(lower = better)', fontsize=12)\n", | |
| "ax1.set_xscale('log', base=2)\n", | |
| "ax1.axvline(x=32, color='r', linestyle='--', alpha=0.7, label='Paper default (K=32)')\n", | |
| "ax1.legend()\n", | |
| "ax1.grid(True, alpha=0.3)\n", | |
| "\n", | |
| "ax2.plot(k_values, [s * 100 for s in sparsities], 'g-o', markersize=8, linewidth=2)\n", | |
| "ax2.set_xlabel('Sparsity Level K', fontsize=12)\n", | |
| "ax2.set_ylabel('Sparsity (%)', fontsize=12)\n", | |
| "ax2.set_title('Sparsity vs K\\n(higher = more sparse = faster retrieval)', fontsize=12)\n", | |
| "ax2.set_xscale('log', base=2)\n", | |
| "ax2.axvline(x=32, color='r', linestyle='--', alpha=0.7, label='Paper default (K=32)')\n", | |
| "ax2.legend()\n", | |
| "ax2.grid(True, alpha=0.3)\n", | |
| "\n", | |
| "plt.suptitle('Sparsity Level K Analysis (cf. Figure 4b in paper)', fontsize=13, fontweight='bold')\n", | |
| "plt.tight_layout()\n", | |
| "plt.show()\n", | |
| "\n", | |
| "print('\\nPaper finding: K=32 is the \"sweet spot\" — smaller K loses semantic detail,')\n", | |
| "print('larger K gives diminishing returns while increasing latency.')" | |
| ], | |
| "id": "f61d356ec4c2500e", | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 1200x400 with 2 Axes>" | |
| ], | |
| "image/png": "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ON/xtwrnAz5jyCLW17GLqmOI19EGhEBmpdb1mYiIol4cRKai4XWIiOgDAlla9w407vVdq1zZtGnT1Jd+QFcOfIklsgeCQvjSCrNmzZIvv/zSqXccuvRq9azQhbF79+7iStDUtFbPB121tOLYCNSvX7/eAVtH1iAwjACxFjBCN8PIhmuZNgABAsR4TUdBUBDdAhGMwih/jhzpkogotmGmFBEROQ2tSC0KT2t1SJBtgowQotAgUwvnztmzZ00jByLDA7V9nB2yzpB5ApMmTQox4lxMh89y165dVXYQghuoJzVhwgSzmlLITiFyBAShtOyqfv36MSBFRBTNWOiciIicBgrVomuPHrJc9MWfiazBSG5aZocGXXkQmIoJbI1E5wrevXunitdjsgbdW1HkmsgR0BU2It2PiYgocjAoRURETgddfVAjpFWrVqpGCZG9UKsMtaGQmYNR38jxMAodaqedOHFCfHx8VCYYagNhPupGWY7uSERERLEHa0oREREREREREVG0Y00pIiIiIiIiIiKKdgxKERERERERERFRtGNQioiIiIiIiIiIoh2DUkREREREREREFO0YlCIiIiIiIiIiomjHoBQREREREREREUU7BqWIiIiIiIiIiCjaMShFRERERERERETRjkEpIiIiIiIiIiKKdgxKERERERERERFRtGNQioiIiIiIiIiIoh2DUkREREREREREFO0YlCIiIiIiIiIiomjHoBQREREREREREUU7BqWIiIiIiIiIiCjaMShFRERERERERETRjkEpIiIiIiIiIiKKdgxKERERERERERFRtGNQioiIiIiIiIiIoh2DUkREREREREREFO0YlCIiIiIiIiIiomjHoBTFWq9evZLOnTtLunTpJE6cONKnTx8138fHR5o0aSIpU6ZU83/55ReJ6e/Jldy8eVO9twULFjh6U8gFZcuWTdq3b+/ozSAiInJauE7ieklEFBkYlCKXgkAFAha2pmPHjpmWHTdunFq+e/fusnjxYvniiy/U/L59+8rOnTtl8ODBan6NGjUifTvx2hs2bIiS9Vp7T9a8e/dOpkyZIh999JEkSZJEkiVLJgULFpQvv/xSLl26JDHJtm3bZMSIERJTWZ6nOB4VK1aUrVu3iqv5888/1bF69uxZrN4GIiKis2fPqhuhWbNmlfjx40vGjBnl888/l99++y1G7Rw/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" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "\n", | |
| "Paper finding: K=32 is the \"sweet spot\" — smaller K loses semantic detail,\n", | |
| "larger K gives diminishing returns while increasing latency.\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 18 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:09.942149Z", | |
| "start_time": "2026-07-10T13:43:07.175932Z" | |
| } | |
| }, | |
| "source": [ | |
| "# --- Effect of hidden dimension h ---\n", | |
| "print('Analyzing effect of hidden dimension h...')\n", | |
| "h_values = [256, 512, 1024, 2048]\n", | |
| "recon_errors_h = []\n", | |
| "param_counts = []\n", | |
| "\n", | |
| "for h in h_values:\n", | |
| " sae_h = SparseAutoencoder(d_model=D_MODEL, d_sparse=h, k=K)\n", | |
| " train_sae(sae_h, embeddings, n_epochs=3, batch_size=32)\n", | |
| " err, _ = compute_reconstruction_quality(sae_h, embeddings)\n", | |
| " n_params = sum(p.numel() for p in sae_h.parameters())\n", | |
| " recon_errors_h.append(err)\n", | |
| " param_counts.append(n_params)\n", | |
| " print(f' h={h:6d}: recon_error={err:.4f}, params={n_params:,}')\n", | |
| "\n", | |
| "fig, ax = plt.subplots(figsize=(8, 4))\n", | |
| "ax.plot(h_values, recon_errors_h, 'b-o', markersize=8, linewidth=2)\n", | |
| "ax.set_xlabel('Hidden Dimension h', fontsize=12)\n", | |
| "ax.set_ylabel('Reconstruction Error', fontsize=12)\n", | |
| "ax.set_title('Effect of Hidden Dimension h\\n(cf. Figure 4a in paper — optimal h = 2^14 = 16384)', fontsize=12)\n", | |
| "ax.set_xscale('log', base=2)\n", | |
| "ax.grid(True, alpha=0.3)\n", | |
| "plt.tight_layout()\n", | |
| "plt.show()\n", | |
| "\n", | |
| "print('\\nPaper finding: inverted-U curve — too small h loses capacity,')\n", | |
| "print('too large h fragments support sharing between related tokens.')" | |
| ], | |
| "id": "c1b1b2fdda0bdf53", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Analyzing effect of hidden dimension h...\n", | |
| "Epoch 1/3 | recon=2.0090 | sparse_cl=1.8393 | total=2.5071\n", | |
| "Epoch 2/3 | recon=1.8319 | sparse_cl=1.7044 | total=2.2731\n", | |
| "Epoch 3/3 | recon=1.6550 | sparse_cl=1.6068 | total=2.0481\n", | |
| " h= 256: recon_error=1.2462, params=65,920\n", | |
| "Epoch 1/3 | recon=2.3300 | sparse_cl=1.1442 | total=2.9346\n", | |
| "Epoch 2/3 | recon=2.0948 | sparse_cl=1.0331 | total=2.6107\n", | |
| "Epoch 3/3 | recon=1.8875 | sparse_cl=0.8714 | total=2.3274\n", | |
| " h= 512: recon_error=1.3312, params=131,712\n", | |
| "Epoch 1/3 | recon=2.7389 | sparse_cl=0.8416 | total=3.4929\n", | |
| "Epoch 2/3 | recon=2.4327 | sparse_cl=0.7880 | total=3.0669\n", | |
| "Epoch 3/3 | recon=2.1690 | sparse_cl=0.6606 | total=2.7044\n", | |
| " h= 1024: recon_error=1.4183, params=263,296\n", | |
| "Epoch 1/3 | recon=3.0010 | sparse_cl=0.7278 | total=3.8852\n", | |
| "Epoch 2/3 | recon=2.6852 | sparse_cl=0.6640 | total=3.4155\n", | |
| "Epoch 3/3 | recon=2.3860 | sparse_cl=0.5945 | total=2.9949\n", | |
| " h= 2048: recon_error=1.4888, params=526,464\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 800x400 with 1 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbMVJREFUeJzt3Qm8VfP6x/HnNM+jRg0SimZRkkoDSUUkYxTSgCvTNf0pXITrmrkyNcjQoJRIJDQQlVKhVFIaVDSnuf1/fX/r7tOezukM+5w9nM/79dqd9lprr7322nvtvZ71+z2/J8Xn8/kMAAAAALIhX3YeDAAAAAAEFgAAAACighYLAAAAANlGYAEAAAAg2wgsAAAAAGQbgQUAAACAbCOwAAAAAJBtBBYAAAAAso3AAgAAAEC2EVgAyHN27dplffr0scqVK1tKSordeuutbvrGjRvtkksusfLly7vpzz77rCX6a4qG4cOHu3X+9ttvR132uOOOs969e0d1nfEgo68r3j344INuv+c2vc963qeeeirXnxtA7iGwAJAU/Ceqad3mzJmTuuxjjz3mlh8wYIC99dZbdvXVV7vpt912m02dOtXuvfdeN/28886L+nbquT/44IMcWW+k15TWSXKXLl0izvvyyy/d/ho3bpwlq7PPPjv1c5EvXz4rVaqU1alTx+2zzz77LNabBwAJq0CsNwAAounhhx+2WrVqhU0/4YQTUv8/ffp0O+OMM2zw4MFBy2j6hRdeaHfeeWeOvSkKANQq0q1bt6iuN63XFA064b788sutcOHCliyqVatmQ4YMcf/fvXu3rVixwsaPH2+jRo2ySy+91P0tWLBg6vLLli1zQUiiu//+++2ee+6J9WYASFIEFgCSSqdOney0005Ld5lNmzbZKaecEnF6mTJlLBGl9ZqiIX/+/O6WTEqXLm09e/YMmvb444/bLbfcYi+//LJr1XniiSdS5yVLUFWgQAF3A4CckPiXXwAgg/zdfFatWmUfffRRancYfzcqn89nL730Uup0v23btrmcherVq7sTTLV+6KTz8OHDQevX/eeee84aNGhgRYoUsQoVKrjuVPPmzXPztU5dHR8xYkTqcxyt374Chuuvv94qVark1tmoUSP3+KO9pmjmLkTKh9C+euSRR9yV/2LFilnbtm3txx9/jPh4TW/Xrp0VLVrULa/Hhe47vylTplirVq2sePHiVrJkSevcuXPYerXPSpQoYevWrXMtP/q/9rVamg4dOpTl16ng6fnnn3cB2osvvmjbt29PM8fCv09mzZrlghE9v4LSfv362f79+91n5pprrrGyZcu621133eX2WSDtA+Xx1KtXz723eo/1+K1bt0bsuqbnatasmVv2+OOPt5EjRwYtd+DAAXvooYfsxBNPdMsoV+iss84K6t4VKcfi4MGD9q9//ctq167tPt96vvvuu8/27duXpe04mldffTX1uU4//XSbO3duph4PIH5x2QJAUtHJ4J9//hk0TSdSOsk6+eSTXf6Bcil0gnvHHXe4+U2aNEnNSzjnnHPcCaHf33//bW3atHEnsTrpq1Gjhn399dcuD2PDhg1BCd4KAHTCqVYTJVLrhG3mzJkuv0OtKHoOTddJWd++fd1jdIKVlj179rh8AHXTufnmm10Xr7Fjx7oTXJ24Dhw4MM3XpBPd9OgkNHQ/+fdfRgwaNMgFCOeff767ff/993buuee6k+pAf/zxhws6tC/UBUcBg04sFWSE0uvo1auXdezY0QVu2vf//e9/3cnxggUL3ImtnwIILde8eXOXEDxt2jT7z3/+4/an8kyyE1xcccUV9sADD7gTaAU26fnHP/7hEuZ1Qq/3Wa9NAYY+I/qsqOvbxx9/bP/+97+tfv36QZ8tfZ70ebn22mtdcKLgUAGNXuvs2bODumLpM6AudPqMaR+9+eab7nPQtGlTF5j4gwZ17/J/xnbs2OGCWr03+lynRcsrWNX69fn59ttv3Xp+/vlnmzBhQtCyGdmO9Lzzzju2c+dO99p1XD755JN28cUX26+//hr0egEkKB8AJIFhw4bpcnDEW+HChYOWrVmzpq9z585h69CyN910U9C0f/3rX77ixYv7fvnll6Dp99xzjy9//vy+NWvWuPvTp093j7/lllvC1nv48OHU/2tdvXr1ytBrevbZZ906R40alTpt//79vhYtWvhKlCjh27Fjx1FfUyRaNq195b+NHTs2bN+uWrXK3d+0aZOvUKFC7vkCX9t9993nlgt8fbfeequb9u2336ZO0+NLly4dtM6dO3f6ypQp47vhhhuCtvWPP/5wywZO1/r12Icffjho2SZNmviaNm161Nffpk0bX7169dKcP2HCBLf+5557LmifBb4u/z7p2LFj0D7Qe5OSkuLr379/6rSD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Zs1K/X34888/g+bpt+v9998P2iYgq6i8DWSTggO1PFxxxRWZfuz06dNdZeFnnnkmS89drVo1GzJkSNh0VS9WZWdVbE6WatrpnaBkh6pfq+IxkiewWLJkid16661B01WFWu91wYIFY7ZtiUQXS2bPnm09evRw1eT/+OMPe/HFF+3UU0+1OXPmuGAgElUQHzVqlJ1//vn2ySefuKvhquatwCHSezV69Gi3Tn1nZfTEXq28CnZiQSflDz/8sAu0GjVqZF9++WW6y1933XUuELrmmmtcoLZ7925bsGCBbdq0KWidqgSvC0xa74EDB+yzzz6z3r1727Jly+yxxx5LXVaV1dWyrSrx/lbpMWPGuPVrPZEuTim4UeV77TM9f6gmTZrYaaedZv/5z39s5MiR2d5HyONUeRtA1jVs2NDXs2fPLD22bdu2vnr16mXpsW3atMnyY3PSoUOHfHv27Ina+hYvXuwrUKCA7+GHH9alO9/YsWOjtm4csWvXrqTYHZ07d/bVrFnTF09WrVrlPrvDhg1LdznN13Jz5871xdrs2bN9+/btC5r2yy+/+AoXLuy76qqrIj7mv//9r9v+u+++290fMWKEL1++fL7+/ftHXH7dunW+/fv3Z+p907rr1KnjtqF48eK+3LZ3717fhg0b3P/1PqX3vo4ePdrNHz9+fJaeq0uXLu41Hjx4MHXaOeec46tatarbDr8DBw74ateu7X6L0npfypcv7xs4cKDbns2bN4ct89RTT7nn2rlzZ5a2FfCjKxSQDatWrbJFixZZhw4dIl4leu6556xBgwZWpEgRq1Chgms+V/9pf5/rL774wn788cfUJuqjXf3Kbo6FrtjecsstrgldTe4XXHCBrVu3LizPQFfKInVLiLRO3deVOF2VU7eJwoULuyuVonXril2lSpXcdM1XC09mDBw40C666CJr1apVxPmrV6+2G2+80XUj8Hc10FVW7eOMCH3t/te4YsUKtx/U1aB06dJ27bXXZqjVRF3UdDV3/vz5duaZZ7ptqlWrlr3yyitBy+3fv9+1xDRt2tStX1cT9Rr1mQjk/6w89dRTrmVLV961zjZt2rgr86HUDU5XPtVNQ587XYnUVc5Iffm/+uort+/UzUytX7Hw66+/uvdL21usWDE744wz7KOPPgpaRseFtldXt3VFvHLlym5/6fP7+++/B+17PVafCf8x5f8cR8pz0Pur7jRr1qyxLl26uP+rBfGll15y8xcvXuy6rei5tN91hT3Qli1b7M4773THuB5bqlQp69SpU7a7lOzbt89uv/12952h59bnf/PmzZab9NktVKhQ0LQTTzzRHcM///xz2PIffvih+x6499577fHHH3fTdBVd+/vVV19Ns2U1My1Iy5cvd8fA008/HbNWRn2P6fOXEdpOdVPS+6ffg0itBenRZ1ffOfquCOx6W7ZsWbcdftoX+k7X90IofUbVeq1WFn2XpeWcc85x26eWEiA7aP8HsuHrr792f9WUH0p9h/WjqhONPn36uO5SM2fOdN0IdJKqPrGPPvqoa9r3/+iefPLJmXr+Q4cOhfWX1clkWn2PdSKlZnP1gdYJnE4sO3fubNmlLl1ar04s9AOnH8SNGze65/AHHjpJmjJlitsv+nEM7aoSydixY90+1olMWoGC+oJrGXW50MmxllOfZp1k/vTTT+5kNSvUn1wBgd6b77//3l5//XV3Aq4uIkezdetW1xVE61AXOe2bAQMGuBM1BVqifaB1av4NN9xgO3futDfeeMM6duxo3333neuTHUhdFLTMTTfdZHv37nVBq056dfKrwE0UpLZs2dKdHKsbnE5K9dzqOqE+1DrBCaSgQu+LApzMnvREgz4jOoHVyZMCXgWF6leugEG5NKHbq+NFnyf1CVdXEuVSKKhfuHChO6n6v//7P9u+fbvrVuLvXni0fvg6hnSMtm7d2g3CoABZn1ftO63vqquusosvvtgFhjpRVhcUfS78QdEHH3zgAiNN0+sZOnSoC/r02cto955Q6raik0f15dfnWa9T26TA6mgBiT4jGaHjNLPU31+vUcFF6DGo40+fuUceeSRonj/fQt95GqRCuQRZpe8M5Rbo2NLnOqNyer9EouNbx7GOMQXDL7zwgvuu1+dEgVekZGld+NFxqOX03Txs2DD3eQsMGPS9pu+gBx54wHr16uX2rQJeXbCKtE+0nAKhfv362b/+9a80t/eUU05xz6Pub6HHHZApqW0XADLt/vvvd03Loc3H06dPd9NvueWWsMccPnw4Kt2Z9Fg9R+itV69ebv7gwYPdfb/58+e7+7feemvQenr37u2ma3k/rSNSt4TQdYruq7vDjz/+GDT9+uuv91WpUsX3559/Bk2//PLLfaVLl/b9/fff6b4+za9Ro4bv3nvv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iD9ZarH48ssvg/IYQm3atMm+UqfgTNJJf2BLwqpVq2zhwoWuireSrdWSsG7dOhs5cqSb/9JLL7np/roUqoOh+hq33HJL6jruvPNOVxtD3Z/Wr19vgwcPdpFXWi0aAJBbNm82e/11s1de8YKGQBoP46qrvPyJxo15TwAA8S/LBR3Sy7FQcJBWYnR65s2b50aa8vN3R+rVq5dLwFby9ZqAX1+1TijYUACiIWVr165tTzzxhKtl4bd27VoXRPz1119WoUIFO+uss1wuhv4PALHw3XdeZezRo72hYwPVru2N7HTttWr25v0BACSOFJ+GcMqAESNGuJu/xeLkk0+2SurwG2Lbtm22aNEiO//8823SpEmWDJRjUbp0adu+fXvMukUpcZw+q0DiHlcqXqdAQqM7zZsXPE/XaVQtW60THTua5ctSJ1UgPvB7BSTXcZWZ8+AMt1j8/fffbkhXv507d1q+kF8/tWKo6nX//v1t0KBBWdl2AEgqv/3mdXVSl6e//gqep98IDU6n6tjHHx+rLQQAIDoyHFioyrZu/lGYnnvuObvggguitBkAkDwOHzabNs1rnfjwQ68WRaAmTbzK2JdfblasWKy2EgCAOMixUE4DACDYtm3eMLEKKJYvD55XsKBZjx5eQHHGGV73JwAALK8HFkqg1k2J0H4//PCD/ec//3FDvSpZulu3btHcTgCIW4sXe8HEW2+p22jwvGOPNevf3+yGG7w6FAAAJKssBRYazlVDw05TW7+ZK0qn0Zz279/vRoMaN26cjR071i6++OJoby8AxIUDB8wmTPACihkzwudrgDu1TqjHaIEsj78HAEDiyNLYI999952do0pO/6O6Env27HGtFqoz0b59e1dPAgCSzYYNZg89ZFazptlllwUHFSVKeEPFLlliNn26ma6tEFQAAPKKLF1H27Jli1WsWDH1/uTJk61NmzaujoSopeK+++6L3lYCQAwp+XrWLK914v33vUrZgVSjU0PFXnONWYxGpAYAIDEDCxWXW716dWrdChWce/zxx1PnHzx40N0AIN7s3Ws2dqzZBx+oG2cJl/eglDAlVhcpErzs7t1mb7/tBRSLFgXP02jbF17oBRTt2pGMDQBAlgKLDh062PPPP++KZKhYnipgByZr//TTT1a9enX2LoC4opqdvXur0JAXGBw+XND9HT/ebOBAb0Snrl29EZ1eftls2DCz7duD11GhgpeI3a+fWY0asXolAAAkSWCh1olffvnF7rzzTitUqJDLp1BtC9GoUGPGjLErr7wy2tsKANkKKgIHq1OticC/GipWLRCNG5stWBD+eA0Rq9YJtWwULswbAQBAVAKLSpUq2ezZs11p76JFi7rgwk+tF59//jktFgDiqvuTWioktFidn396YFChAELXSBRQNG2aCxsKAEACy9YgiKVLlw6bpkCjUaNG2VktAESVcirU/SmjjjnG7K67zK67zqx8ed4MAAByNLA4dOiQTZ061X799VfbunWr+UIuA6akpNgDDzyQ1dUDQNQoUdvLqTj6sqqI3aqV2T//yRsAAECOBxbz5s2z7t2729q1a8MCiiM/zgQWAOLD779nLKgQfaVlpnUDAABko0DejTfe6AriffDBB66mhfIqQm9q0QCAWNm/32zMGK8C9ty5GX+cWjbKlcvJLQMAIDllqcVi0aJF9uijj1pXjcsIAHFEJXZefdXsjTdUpyLzj1fLxkUX5cSWAQCQ3LIUWFSrVi3NLlAAkNvUQDp1qtl//2v28cfh3Z5OOMFs3TpvdKj0vrqUX1GmjNkll+T4JgMAkHSy1BXq7rvvttdee8127NgR/S0CgAzatMlsyBAvcOjc2Wzy5CNBRYECXoAwbZrZL7+YjR59JHiIxD9dRfJCK3ADAIAcarHYuXOnlShRwk444QS7/PLLXc2K/PnzhyVv33bbbVlZPQCkSS0OM2aYvfKK2fvvmx04EDy/WjWzvn3N+vQxq1LlyHT13NToUMGVt4/8VUuFv/I2AADIvBRfFvo05dMv8dFWnJKSNAncaplRzQ4VBCxVqlRMtkFD+pYtWzYmzw3Eg+3bzUaO9AKKn34Kb23o2NFswACz88/3WivSou5Q48aZTZigHIwDVqlSQZdTodYNWiqA7OP3Ckiu4yoz58FZarFYtWpVVrcNADJl/nwvmHjnHbO//w4vZKcidv36mR1/fMbWp+ChZ0/vtnXrLgJ2AACiJEuBRc2aNaP1/AAQRgGEciKUjB1pqNizzvJaJ7p3NytcmB0IAEBCV96W3bt321dffWWrNb7j/wKONm3aWPHixaO1fQDykKVLvdYJ5Tps2xY8r2RJs2uu8VonGjSI1RYCAICoBxYvvPCC3X///bZr166goWdLlizpalzcfPPNWV01gDxEhewmTvRaJ774Inx+48Ze68SVV5qVKBGLLQQAADkWWIwcOdIGDhxoLVq0sFtuucVOPvlkN/3nn392AYfmKcnj6quvzsrqAeQBa9Z4hexefz28kJ3yIC67zAsomjVLe4hYAACQ4KNCNW7c2MqUKWOff/552DCzGgmqffv2tm3bNlu4cKElA0aFAqJbyE7dnT76KLyQ3YknmvXv7w0JW65czu91Rq8BOK6ARLA1QUaFylKBvGXLllmPHj3CggrRNM3TMgDgL2T3+ONHCtl9+OGRoEJfI0rCViE75VjcfnvuBBUAACAOukIpavntt9/SnK95sar3ACA+qC105kwvdyK9QnbXX29WtWqsthIAAMQ0sOjcubPLpWjatKmrvB1o9OjR9uKLL9pVV10VrW0EkGCF7N56y+vu9OOP4fP9hezUcpFeITsAAJAHciw2b97shpVVd6fKlSvbieoYbWbLly+3P/74w+rWreuGoT1G1auSADkWwNF9/73XOpFeITu1UNSuHT97kxwLgOMKSARbEyTHIkvXCytUqGDff/+9DR061KZMmZJax6JBgwZ29913W9++fa2IhnUBkCcK2al14rvvwue3bOm1TlxyCYXsAABIdlnuiKDAQcPK6gYgb9HYDAomhg+PXMhOI01rdCcK2QEAkHdkKbDYsmWLrV271ho2bBhx/uLFi61atWoxa7IBEH1Kvv7gAy+gmD497UJ2V1zhBRcAACBvyVJgcdttt7n8ijlz5kSc369fP1c074033sju9gGIg0J2r73mFbL744/geYULHylk17w5hewAAMjLshRYTJ8+3QboTCINXbt2tVd0WRNAQlKNCRWyUzJ2eoXsevUyK18+VlsJAAASPrDQqFDpjfhUvnx526SKWAASig7bYcPMhg41W7UqeJ4K2V14odc60a6dWb4sldcEAADJKkuBRZUqVWzBggVpzp8/f74bOQpA/NOA07Nmea0T48aFF7I79tgjhez0fwAAgEiydM2xW7duLn9i0qRJYfMmTpxow4YNs4suuigrqwaQi4XsXnzRG7mpdWuzd98NDipUyG7CBLPffjMbNIigAgAA5ECLxYMPPmjTpk1zwUOjRo2sfv36bvqSJUvshx9+cInbDz30UFZWDSAXCtkpBUqF7HbvDp6nfAkVsuvXL74K2QEAgCQNLFR9TyNCPfnkkzZ+/Hgbp/4TphOR2vbAAw/YP//5TytevHi0txVAFu3Z4xWyU3en9ArZde+uGjXsZgAAkHkpPp96WCNapcyTsZQ7EruQnRKxVchu69bgeSVKHClkl0ZJmqTHcQVwXAGJYGsMzwMzcx6c7XFdNmzY4Lo/7Q7tU5EFM2bMcEPVVq1a1VJSUuwDVeNKx6xZs6xly5ZuFKqiRYta3bp17Zlnnglb7qWXXrLjjjvOVQtv3ry5fRfpki2QJJQnoUbE9u3N6tY10yERGFQ0auR1hVq/3uzll/NuUAEAAKIry4GFkrR1Iq8K26eeeqp9++23bvqff/5pTZo0OWpQEImCE+VsKBDICHW3uvnmm11A8vPPP9v999/vbq+++mrqMqNHj7bbb7/dBg8ebN9//71bf8eOHRkOF0nn99+9JOuaNc169Aiujq1CdtdcY/b112Ya0E05FFTHBgAAMe8K9eGHH7qRoVq0aGHnnntuajJ3Ow1ub2ZdunSx/Pnzu+AjyxuWkmITJkxwz5MZF198sQs43nrrLXdfLRSnn366vajhb1zhr8NWvXp1+8c//mH33HNPhtZJVyjEKxWu+/RTL3di8uTwQnYnnOB1derdm0J2kdAVCog+jisg+pK6K9TDDz9srVu3dl2RbrrpprD5CjjSq3ORU/ScX3/9tbVp08bd379/v6up0aFDh9Rl8uXL5+5/8803aa5n3759bicG3oB4snmz2RNPeIFDp05mGvnZH1SokN3FF3sBh3Is7riDoAIAAMTpqFAaVvbpp59Oc36lSpVytauRumOpGvjBgwdd60mfPn1Su2UdOnTIbU/o9i1dujTN9Q0ZMiTicLmKFrW+WCC4gdoW58wpYMOGFbJJkwrZ/v0pQTulSpXDds01++zqq/dZ1aq+1FoV4LgCchO/V0ByHVeZee4sBRbFihVLN1n7119/dQnVuWXmzJm2a9cuNwSuujedcMIJdsUVV2R5fffee6/Lywjcoeo+pSaoWI0KJYwKlTfpeFbPPiVcL1kSPv/cc72hYrt0yWcFChQ1M92QURxXQPRxXAHJc1wpvSFHA4u2bdvaiBEj7NZbbw2b98cff9hrr73m8ixyS61atdzfBg0a2MaNG12rhQKLY445xu0MTQuk+5UrV05zfYULF3Y3IJbUm1DBxNtvp13Irm9frzsUAABArGUpx+LRRx+1tWvXuqTooUOHukTrqVOnuhGZdHKvfHCNwhQLSs5WjoQUKlTImjZtap9//nnQfN1XHggQj4XsRowwO+MMs1NPNdMAZ4FBxZlneq0Xa9eaPfkkQQUAAIgfWWqxqFOnjkvcHjhwoKu0rUDi3//+t5t39tlnp9aNyCx1Z1qxYkXq/VWrVtnChQutXLlyVqNGDddFad26dTZy5Eg3X8+j6Rr2VjTs7FNPPWW33HJL6jrUpalXr1522mmnWbNmzezZZ5913biuvfbarLx0IEf88ovXOkEhOwAAkKcCC6lXr54bYlYJzQoG1BJw/PHHW4UKFdx8BRtqyciMefPmuW5Wfv48BwUGw4cPd8X41qxZkzpfz6lgQwFIgQIFrHbt2vbEE09YPw3S/z+XXXaZS+weNGiQ66bVuHFj++STT8ISuoFYFLLTaE4aKjagUS2VCtcpd+Kqq6g5AQAAkrSORXo0xKuCALUc/KLLsEmAOhaIdiG7114ze/11Va4PnqfUnksv9QIKdYfKZGyOTGK8fSD6OK6AvFvHokBmg4ZJkybZypUr3YtTgnbVqlXdvL///tsVoVNXI7UMqPUAQHAhO3V3+vDD8EJ2Olz8heyOOYa9BgAAEk+GA4v169e7/AkFFf5GjqJFi7pAQ0nSV155pct/UB7DCy+84CpgA3mdCtkNG2Y2dKiGYQ6ep9HbLrjAa51o317FG2O1lQAAALkYWPzf//2fy2W46667rFWrVu7/qsDdt29fV4hOORejRo1KrXoN5FWKu2fP9nInxo1TS1/wfDXyaZhY1XE89thYbSUAAECMAovPPvvMjaSkqtR+qgXRo0cP69y5s02cONHycckVebyQ3ahRXkARqZDdOed4rRNdu5oVyPKwCQAAAPEpw6c3Kip3hrJJA/jvX3fddQQVyLMWLvSCiUiF7MqV8wrZaaAyCtkBAIBkluHA4tChQ1akSJGgaf77yhQH8lohu7FjvYBizpzw+Spkp2TsHj10nMRiCwEAAHJXpjpk/Pbbb/b999+n3tewU7J8+XIrU6ZM2PKnqnQwkESWLz9SyG7LluB5JUqY9ezpBRSNGsVqCwEAAOK8joXyJyIVvItUCM8/Ta0cyYA6Fnnb0QrZNWjg5U4oqChZMhZbiKxivH0g+jiugOhLujoWwzRmJpCHrF3rFbLTLVIhO3VzUkDRogWF7AAAADIcWPTq1Yu9haSnwnWffea1TlDIDgAAIOMY9BIwsz//PFLIbuXKyIXslDvRoQOF7AAAACIhsECepeyir7/2Wic0wlOkQnY33OAVsqtWLVZbCQAAkBgILJBnC9lpdKfFiyMXslPrhArZFSwYiy0EAABIPAQWyDN++OFIIbtdu8IL2V17rVfI7sQTY7WFAAAAiYvAAklt716zMWPSLmSnEZ00shOF7AAAALKHwAJJW8hOidhKyA4tZFe8uFdzQgEFhewAAACig8ACSVXITkPEqnVi2rS0C9lddZXZUeq7AAAAIJMILJA0hexef91s/frgeYUKmV16qZeMfeaZFLIDAADIKQQWSNhCdmqV8BeyO3QoeH7t2l4ithKyjzkmVlsJAACQdxBYIGkK2eXL5xWyU3cnCtkBAADkLgILJEwhO9WdUCG7ffuC51ep4hWy041CdgAAALFBYIG4tXOnV8hO3Z0iFbJTq4RaJyhkBwAAEHsEFkioQnZlyx4pZHfSSbHaQgAAAIQisEBcUCE7dXNSQPHNN+HzzzjjSCG7okVjsYUAAABID4EFYmrFCi93Ir1CdhoqtnHjWG0hAAAAMoLAArnu4MEjhew++yx8fv36XuuEggoK2QEAACQGAgvkmnXrvEJ2ukUqZKduTgooKGQHAACQeAgsENNCdscff6SQXYUKvBkAAACJisACOeKvv44UslMeRWghOw0Rq9aJc87x7gMAACCxEVggqoXsNKKTWifSK2TXp49Z9erseAAAgGRCYIGoFLJTzQkFFIsWhc9v395rnbjgArOCBdnhAAAAyYjAAlmmIELBhKpjU8gOAAAgbyOwQKYL2Y0b5wUUX38duZCd6k5ceimF7AAAAPISAgtkiBKwlYithGwlZocWsrvqKi+gaNKEHQoAAJAXEVggTRSyAwAAQEYRWCBiIbvXX/cK2en/oYXsLrnES8Zu2dIsJYUdCAAAAAILBBSy+/xzL3di0qTwQna1anldnShkBwAAgEhoscjjlC8xfLjZK69ELmTXpYvXOnHuuRSyAwAAQNoILPJoIbs5c7zWiTFjIheyUxE7FbOjkB0AAAAygsAiDxayU+vEDz+Ez6eQHQAAALIqn8WRGTNmWNeuXa1q1aqWkpJiH3zwQbrLjx8/3s455xyrUKGClSpVylq0aGFTp04NWubBBx906wq81a1b1/KSxYvNbrzR7NhjvW5NgUFF2bJmt91mtnSp2bRpZt27Ux0bAAAACR5Y7N692xo1amQvvfRShgMRBRYff/yxzZ8/39q2besCkwULFgQtV69ePduwYUPqbdasWZYXCtmpIrZGbmrY0Ov2pBYLv+bNvdwKjfr09NNmderEcmsBAACQ6OKqK1SnTp3cLaOeffbZoPuPPfaYTZw40T788ENrElCprUCBAla5cmXLC1au9ArZvflmeCG7YsW8QnZqtaCQHQAAAJI2sMiuw4cP286dO61cuXJB05cvX+66VxUpUsR1lxoyZIjVqFHDEqHVYexYM/UI27ixhFWqZNatm1mPHmZFigQXsps82WuV+PTT8PXUq+cFEz17mpUunasvAQAAAHlEUgUWTz31lO3atcsuvfTS1GnNmze34cOHW506dVw3qIceeshatWplS5YssZIlS0Zcz759+9zNb8eOHZbbVEuid2+zrVu9YV4PHy7o/o4fbzZwoNmIEWZNm3pF7NIrZKfaE2edRSE7AAAA5KykCSzeeecdFzSoK1TFihVTpwd2rWrYsKELNGrWrGljxoyx66+/PuK61KKhdYXaunWrHQqtHJcDpkwpaD17Fv/fvRRXvE78f7dt89kFF/gDjuDS1zVrHrLevffZlVfutwoVfP9bPsc3GUhIsbhoACQ7jisguY6rzDx3UgQW7733nvXp08fGjh1rHTp0SHfZMmXK2EknnWQrQqvBBbj33nvt9ttvD9qh1atXt7Jly7rRp3K6+9PNNx+pNxGJz5cSFGgEF7LLb/nyFVNGRY5uJ5AsdFwD4LgC4l3ZGP1e5c+fP+8EFu+++65dd911Lrjo3LnzUZdXV6mVK1fa1VdfneYyhQsXdrdYUE6Fuj9l1IUXmj3/vFkCpIwAAAAgicVVYKGT/sCWhFWrVtnChQtdMraSrdWSsG7dOhs5cmRq96devXrZc88957o4/fHHH2560aJFrfT/spTvvPNONwStuj+tX7/eBg8e7CKvK664wuKRErW9Lk5HX1bLKYgkqAAAAECsxVUdi3nz5rlhYv1Dxao7kv4/aNAgd1/J12vWrEld/tVXX7WDBw/aTTfdZFWqVEm9DVR28/+sXbvWBRFK3lZSd/ny5W3OnDmuqF480hCxGQkqRMtt2ZLTWwQAAAAkWIvF2Wefbb60EgtMBd2GB93/8ssvj7pOdZFKJOXLZ67FImRkXQAAACAm4qrFAl6disy0WFx0EXsNAAAAsUdgEWdU/E5J/ynBo8iG0Xwtp1oVAAAAQKwRWMQZVdRW8TtJK7jwT9dygRW4AQAAgFghsIhDXbt6o0OVKXMklyLwr6ZPnOgtBwAAAMSDuErexhGqrL1+vdm4cWYTJpht3HjAKlUq6HIq1P2JlgoAAADEEwKLOKbgoWdP77Z16y4qBAMAACBu0RUKAAAAQLYRWAAAAADINgILAAAAANlGjkUG+KuB79ixw2JFz50/f/6YPT+QjDiuAI4rIBHsiOF5oP/8138+nB4CiwzYuXOn+1u9evXsvjcAAABAQp4Ply5dOt1lUnwZCT/yuMOHD9v69eutZMmSlnK0ktg5FCkqqPn999+tVKlSuf78QDLiuAI4roBEsCPG54EKFRRUVK1a1fL5i6qlgRaLDNBOrFatmsWaPkwEFgDHFRDv+L0Ckuu4OlpLhR/J2wAAAACyjcACAAAAQLYRWCSAwoUL2+DBg91fABxXQLzi9wrI28cVydsAAAAAso0WCwAAAADZRmABAAAAINsILAAAAABkG4EFAAAAgGwjsEgwzzzzjNWrV89OOeUUu+WWW1w1RADZ89RTT7njqn79+jZq1Ch2J5BFF110kZUtW9YuueSSsHmTJ0+2OnXq2Iknnmivv/46+xiIwnGV3rxYILBIIJs3b7YXX3zR5s+fb4sXL3Z/58yZE+vNAhKajqV33nnHHU9z5851x9i2bdtivVlAQho4cKCNHDkybPrBgwft9ttvt+nTp9uCBQvs3//+t/31118x2UYgWY6ro82LBQKLBKMv571799qBAwfcrWLFirHeJCCh/fzzz9aiRQsrUqSIFS1a1Bo1amSffPJJrDcLSEhnn322lSxZMmz6d99951oFjz32WCtRooR16tTJPv3005hsI5Asx9XR5sUCgUWcGTJkiJ1++unuQ6KgoVu3brZs2TI3r0KFCnbnnXdajRo1rGrVqtahQwerXbt2rDcZSOjjSt2fvvzyS9dKsXXrVvf/devWxXqTgYQ7ltKzfv16F1T46f8cZ0D2jqt4RGARZ7766iu76aabXBenzz77zLVKnHvuubZ792530qM+qr/99pv7Qv76669txowZsd5kIKGPK3++Urt27eziiy+2M844w/Lnzx/rTQYS7lgCkDXJdFwViPUGIFhoF4zhw4e76FX9vzdu3GgnnHCClStXzs3r3Lmz+xC2bt2a3Qhk8bjS8dOvXz93kz59+rjkUgCZP5bSolb2wBYK/b9Zs2bsYsCyflzFI1os4tz27dvdXwUT1atXd60UyrE4dOiQ67KhETYAZP24kk2bNrm/anpWX/COHTuyS4EsHEtpURCxZMkSF1Ds2rXLpkyZwnEGZPO4ikcpPsYrjVuHDx+2Cy64wPX9njVrlpv2f//3fzZ+/HjLly+ftW/f3p577jlLSUmJ9aYCCX1cKXlbX+TFixe3V155xZo2bRrrzQQS8lhS7t8PP/zgunDopGjs2LHu+JJJkya5PEE97q677rK+ffvG+BUAiX9cdUhnXiwQWMSxAQMGuKs6+mBVq1Yt1psDJAWOK4BjCYhXAxL83I8cizh18803u0RtJWcn4gcLiEccVwDHEhCvbk6Ccz8Cizijnmn/+Mc/bMKECS6HolatWrHeJCDhcVwBHEtAvPIl0bkfgUWc0XBjqgI8ceJEN57xH3/84aaXLl3aFe8CwHEFxAq/UQDHVXrIsYgzaSViDxs2zHr37p3r2wMkA44rgGMJiFcpSXTuR2ABAAAAINuoYwEAAAAg2wgsAAAAAGQbgQUAAACAbCOwAAAAAJBtBBYAAAAAso3AAgAAAEC2EVgAAAAAyDYCCwAAAADZRmABAAAAINsILAAgjhx33HHWu3fvoy43fPhwS0lJsd9++y1q64wHmXld8U6v48EHH8z159V7XaJEiVx/XgAgsACAHD5JnjdvXsT5Z599ttWvXz9p9/+XX37pXr//VrhwYatUqZJ73Y899pht3rw51psIAIiiAtFcGQAge5YtW2b58iXXNZ9bbrnFTj/9dDt06JALJr7++msbPHiwPf300zZmzBhr165d6rJXX321XX755S4ISXR79uyxAgX4mQWQd/CNBwBxJBlOqEO1atXKLrnkkqBpP/zwg5177rnWvXt3++mnn6xKlSpuev78+d0tGRQpUiTWmwAAuSq5LosBQIKLlA/x448/uqv6RYsWtWrVqtkjjzxihw8fDnusz+dz87RMsWLFrG3btu6xkWzbts1uvfVWq169ugtmTjjhBHviiSeC1qs8B3Vheuqpp+zVV1+12rVru2XV+jB37txsvc5GjRrZs88+67bjxRdfTDfHQvukS5curmvVaaed5vZDgwYN3H0ZP368u68T+aZNm9qCBQvCnm/p0qUuuClXrpxbTuuZNGlS0DL+5549e7bdfvvtVqFCBStevLhddNFFYd221L2tY8eOdswxx7jtqVWrll133XVHzbHQtnXq1MlKlSrl8iDat29vc+bMyfJ2pGfdunXWrVs39zxax5133ulajQAgp9BiAQA5bPv27fbnn3+GTT9w4MBRH/vHH3+4AOHgwYN2zz33uBNMneTrZDbUoEGDXGBx/vnnu9v333/vWgX2798ftNzff/9tbdq0cSee/fr1sxo1arjuSffee69t2LDBnfAHeuedd2znzp1uWZ3wPvnkk3bxxRfbr7/+agULFrSs0on+9ddfb59++qk9+uij6S67YsUKu/LKK9029OzZ0wU7Xbt2tVdeecXuu+8+u/HGG91yQ4YMsUsvvTSoS5mCq5YtW9qxxx6bug/VBUsn3e+//747YQ/0j3/8w8qWLeu6aynA0f64+eabbfTo0W7+pk2b3H7VybrWV6ZMGbecApz0aDvUeqOg4q677nL7bujQoS7n5KuvvrLmzZtnajvSowBCgY/WqX01bdo0+89//uOCwwEDBhz18QCQJT4AQI4YNmyYT1+z6d3q1asX9JiaNWv6evXqlXr/1ltvdct9++23qdM2bdrkK126tJu+atWq1GmFChXyde7c2Xf48OHUZe+77z63XOA6//Wvf/mKFy/u++WXX4Ke+5577vHlz5/ft2bNGndf69Zjy5cv79uyZUvqchMnTnTTP/zww3Rf/xdffOGWGzt2bJrLNGrUyFe2bNmwfeZ/Xf59omlff/116rSpU6e6aUWLFvWtXr06dfrQoUPddD23X/v27X0NGjTw7d27N3Wa9tGZZ57pO/HEE8Oeu0OHDkH78LbbbnP7Zdu2be7+hAkT3HJz585N9/VrmcGDB6fe79atm3uPVq5cmTpt/fr1vpIlS/pat26d6e1Ii95rPf7hhx8Omt6kSRNf06ZN030sAGQHXaEAIIe99NJL9tlnn4XdGjZseNTHfvzxx3bGGWdYs2bNUqfpSvlVV10VtJyuSKtlQle51argp+5OocaOHeuunOtquFpS/LcOHTq4K90zZswIWv6yyy5zy/rpsaIWi+xSNx21hhzNKaecYi1atEi977+6ry5ianEJne7fti1bttj06dNdK4aex/9a//rrL3dFf/ny5a7lJlDfvn2D9qFer/bL6tWr3X21UMjkyZMz1OokerxaZtRKcvzxx6dOV26JWmJmzZplO3bsyNR2HE3//v2D7uvx0XjPACAtdIUCgBymoEB9+kP5T+zTo5PI0C4yUqdOnbDl5MQTTwyariAkMCgQnUwvWrTIzYtEXX0CBZ64+7dbtm7datm1a9cuK1my5FGXC92G0qVLu7/KEYk03b9t6kKlxoMHHnjA3dJ6veomldHXq25kSjp/6KGH7JlnnnFdmRQwKEBIK/leuRHqghb6vsnJJ5/sclt+//13q1evXoa3Iz3KIwl9f/X4aLxnAJAWAgsAyGN0EnvOOee4fv6RnHTSSUH30xqlyevtk3W62v/LL79kqJZHWttwtG3zJ6MrcVktFJEocT0z61Qrwrhx41zS9YcffmhTp051idvKYdC0aBWny85+T5aRtQAkFgILAIhjNWvWdC0MoZScHLqcaNnArja6Uh56lVoJvGopUNenWNLJuWo9pHXCHw3+faFE6Wi/XnVR002J50pwV/e09957z/r06RO2rFoPNFJX6PvmH7FKieahrS8AkGjIsQCAOKbRnXQV/LvvvgsKFt5+++2g5XTSrJPnF154IeiKdugIT6J8g2+++cZdaQ+l4V81AlVOUx0L5X+oe85NN92UY89TsWJF11VJoy9pxKtQWan+rUAttNWgcePG7u++ffvSbEHQSFITJ04MGkp348aNLig566yz3GhRAJDIaLEAgDim7kpvvfWWnXfeeTZw4MDU4WbVQqE8CT9/nQINt6qaDwpIVDNhypQprtZCoH/+85+uhoOWU80M1X7YvXu3LV682LUi6MQ39DHZMXPmTNu7d69LPFbStOoz6PmVDzFhwgSrXLmy5XTyvE7cVevihhtucK0YOqFXcLV27VoX5GTGiBEj7OWXX3bD1Kr1R0nhr732mgsMtN/ToqGAlbSvbdHwuKrKrYBHwYiG8AWAREdgAQBxTKMGffHFF260p8cff9zKly/vRvupWrWqqwEReuKqpF3VdtBjlPStkYg6d+4ctJy65KhuwmOPPeZGiBo5cqQ7KVZuhRKS/QnQ0fL888+7v2pR0YhKSlbW8+gkP60E8mjSiFIqaKfnVPE5BTdqyWjSpImr/ZFZSt5WC5K6PSlA0f5Sgr5akVQoLy1KzFaQpXohCgCV/6H3aNSoURET9AEg0aRozNlYbwQAAACAxEaOBQAAAIBsI7AAAAAAkG0EFgAAAACyjcACAAAAQLYRWAAAAADINgILAAAAANlGYAEAAAAg2wgsAAAAAGQbgQUAAACAbCOwAAAAAJBtBBYAAAAAso3AAgAAAEC2EVgAAAAAsOz6fyM3BsT3DWNXAAAAAElFTkSuQmCC" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "\n", | |
| "Paper finding: inverted-U curve — too small h loses capacity,\n", | |
| "too large h fragments support sharing between related tokens.\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 64 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Step 11: Key Takeaways\n", | |
| "\n", | |
| "Let's visualize the paper's main efficiency/effectiveness results." | |
| ], | |
| "id": "658ae51530964c99" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:10.443971Z", | |
| "start_time": "2026-07-10T13:43:10.081687Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Reproduce the efficiency comparison from Table 1 and Figure 3\n", | |
| "methods = ['ColBERT', 'ColBERTv2\\n(PLAID)', 'XTR', 'COIL', 'Splade-v3', \n", | |
| " 'SSR-tok', 'SSR-CLS']\n", | |
| "latency_ms = [57.3, 37.1, 33.4, 12.6, 16.6, 17.5, 19.5]\n", | |
| "ndcg = [41.5, 49.3, 48.8, 47.4, 51.2, 52.9, 53.4]\n", | |
| "index_time_hrs = [None, 122.9, 103.7, None, None, 7.3, 7.8] # from Figure 3\n", | |
| "\n", | |
| "colors = ['#95a5a6'] * 5 + ['#e74c3c', '#e74c3c']\n", | |
| "markers = ['o'] * 5 + ['*', '*']\n", | |
| "sizes = [100] * 5 + [300, 300]\n", | |
| "\n", | |
| "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))\n", | |
| "\n", | |
| "# Efficiency vs Effectiveness scatter plot\n", | |
| "for i, (m, lat, ndcg_val, c, mk, sz) in enumerate(\n", | |
| " zip(methods, latency_ms, ndcg, colors, markers, sizes)):\n", | |
| " ax1.scatter(lat, ndcg_val, c=c, marker=mk, s=sz, zorder=5)\n", | |
| " ax1.annotate(m, (lat, ndcg_val), textcoords='offset points',\n", | |
| " xytext=(5, 5), fontsize=8)\n", | |
| "\n", | |
| "ax1.set_xlabel('Retrieval Latency (ms) ← faster', fontsize=11)\n", | |
| "ax1.set_ylabel('nDCG@10 (BEIR avg) ↑', fontsize=11)\n", | |
| "ax1.set_title('Retrieval: SSR achieves best\\nEfficiency-Effectiveness tradeoff', fontsize=11)\n", | |
| "ax1.annotate('SSR methods\\n(red stars)', xy=(18, 53), fontsize=9, color='#e74c3c',\n", | |
| " xytext=(30, 50), arrowprops=dict(arrowstyle='->', color='#e74c3c'))\n", | |
| "ax1.grid(True, alpha=0.3)\n", | |
| "ax1.invert_xaxis() # faster = better\n", | |
| "\n", | |
| "# Indexing time comparison\n", | |
| "methods_idx = ['ColBERTv2', 'XTR', 'SSR-tok', 'SSR-CLS']\n", | |
| "times_idx = [122.9, 103.7, 7.3, 7.8]\n", | |
| "bar_colors = ['#95a5a6', '#95a5a6', '#e74c3c', '#e74c3c']\n", | |
| "bars = ax2.bar(methods_idx, times_idx, color=bar_colors, edgecolor='black')\n", | |
| "ax2.set_ylabel('Indexing Time (hours)', fontsize=11)\n", | |
| "ax2.set_title('Indexing Time: SSR is 15× faster\\n(no K-means clustering!)', fontsize=11)\n", | |
| "for bar, t in zip(bars, times_idx):\n", | |
| " ax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,\n", | |
| " f'{t}h', ha='center', va='bottom', fontweight='bold')\n", | |
| "ax2.axhline(y=times_idx[2], color='#e74c3c', linestyle='--', alpha=0.5)\n", | |
| "ax2.grid(True, alpha=0.3, axis='y')\n", | |
| "\n", | |
| "plt.suptitle('SSR Paper Results (MSMARCO + BEIR, from Tables 1 & Figure 3)', \n", | |
| " fontsize=13, fontweight='bold')\n", | |
| "plt.tight_layout()\n", | |
| "plt.show()" | |
| ], | |
| "id": "33bd8f3113807ee2", | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 1400x500 with 2 Axes>" | |
| ], | |
| "image/png": "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Hq0Gq4oqQzGx4P0hsw37Gj0U8P2QGGx9l+q7TuN7LCHgc4meHBg8Cxl8+F3BfsUx8d5776mM/pjUE04I6JmAfYnPDn4z8LlFaRR7y71gsEBkb2KQQpTswXcaMm7tzdTFwIPIskQ2J74bsAx8HvD9iu9kfD9qnwd8P2M7Yhvjc47vdO07GBmhyPa3VJYnPvXo0UOtP2qfY52w35ExjN4e+P1BLwyttAwyQpGda8/ghXEFWa3YR/hOxrbFOiLrHz1xNPrfd20ANXz34VjAc/B9hv2A/RxTaCPgc4CeP/hdxe8rthXaKshKx2+seR1lS9BjBuuH32HtGNDelzZAJ3qt4FjWQxYuejlo28T8PRMRUdLkhMhtYq8EERFRfEGATQt6odsxgtuUPKHbLoKFCHahS7A9gXyipASDJiEYhJIluBCC+qrmtb+JUhKcylqqM4vfAvwmaDXwtfIeyRVKPOHCKoK1KF+Di09ERJT0MdOWiIiIkgUE5ZEBiJP4adOmJfbqEMU5ZFoiYIvMatQxZ8CWUjpkUSMLGPViUXMeNcbRy0TfSwWZp8mZVmMc0OODAVsiouSDA5ERERFRsoBu++ieS5Rc7d69W/2PDEJLAxERpTQY5A2DdOFmCcrGYBDF5AyDh+rLphARUfLBTFsiIiIioiQANUSRSW5vrWei5A4BS9RFx/+otYsawKgj26hRI1XffNOmTaq2LBERUVLEmrZEREREREREREREDoSZtkREREREREREREQOhEFbIiIiIiIiIiIiIgfCoC0RERERERERERGRA2HQloiIiIiIiIiIiMiBMGhLRERERERERERE5EAYtCUiIiIiIiIiIiJyIAzaEhERERERERERETkQBm2JiIiIiIiIiIiIHAiDtkREREREREREREQOhEFbIiIiIiIiIiIiIgfCoC0RERERERERERGRA2HQloiIiIiIiIiIiMiBMGhLRERERERERERE5EAYtCUiIiIiIiIiIiJyIAzaEhERERERERERETkQBm2JiIiIiIiIiIiIHAiDtkREREREREREREQOhEFbIiIiIiIiIiIiIgfCoC0RERERERERERGRA2HQloiUCRMmiJOTk/GWIUMGqVatmvz222/R3kIvXrxQy7tw4YLdz6lVq5a8++67ibY3unXrJiVKlIjRc48cOSKNGzeWrFmzipeXl+TNm1fatGkj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AAAehKAtAAAAAAAAAHgQgrYAAAAAAAAA4EEI2gIAAAAAAACAByFoCwAAAAAAAAAehKAtAAAAAAAAAHgQgrYAAAAAAAAA4EEI2gIAAAAAAACAByFoC2Rxo0aNEh8fH9uQL18+adq0qSxatCjV73XlyhXzfn/99VeKX9OiRQt54IEHJKM88cQTUrVq1STbzJgxw6ybCxcu3NW8fvzxR/n0008lM/vll1+kePHicvPmTbfPa+bMmVKpUiWJi4uT9HLp0iV58MEHJTQ01Gxz3WZp4ejRo+a7ER4enibvBwAAAADwbgRtAS8QFBQk69evN8OUKVMkJiZGOnXqJOvWrUt10Hb06NGpCtpqEHPcuHHiDTJ70NZisci//vUvGTRokAQEBLh9fg8//LDcuHFDvvrqK0kvH330kaxcuVL++9//mu9D8+bN0yxoq98NgrYAAAAAgLTglybvAsCjZcuWTRo2bGh73qBBAwkLCzOBq8aNG7tlntevXzfB4sqVK7vl/ZH2Vq1aJbt375bevXuny+r19fU1mdCffPKJPPnkk+kyz3379kn16tWlc+fO4sk0+zg+Pl78/f0zelEAAAAAABmATFvACxUrVkwKFCggx48fdxivmYetWrWSnDlzSp48eeSRRx6Rc+fO2TIJS5cubR737NnTVm5Bx+ugj7XMwDPPPGNKMNSvX99leYS9e/dKly5dzDx0Xh07dpTDhw8nW1Jh4sSJJhAcERFhnmsGb7169cz7FCxY0LzmwIEDblhjyc9Lg48aBN+zZ49t3ei4lKxbZV2H33zzjfTv39/cvl+kSBF59dVXJTY2NtH669atm+TNm1dy5MghNWrUkO+++85M6969uzRp0iTR8n/22WeSPXt2Ux7AFV1+zTzVfcM+kKvLtWTJEnnooYckV65cUqJECfn222/NdA246nNdlqefftpkztpnZuv+oPubzlsvFGh2rT3dl3bs2CE7d+4Ud9PPMW/ePPn9999t28i6bTSIW7RoUbN9atasKV9//bXDa2/duiVDhgwxnzUwMNBsG81W131R11HLli1NO91H7N/buh5efPFF8xp9bZ06deS3335zeH/rPq/boEKFCqZdeqwTAAAAAIBnImgLeKHIyEgTvLMGYa2BKw0caUBx9uzZ8sUXX8jmzZtNcFVpwOmHH34wj9955x1buQUdbzVixAhzi70GED/4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" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "execution_count": 65 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "## Summary\n", | |
| "\n", | |
| "We've reproduced the core components of **Single-Stage Sparse Retrieval (SSR)**:\n", | |
| "\n", | |
| "| Component | What it does | Key design choice |\n", | |
| "|-----------|-------------|-------------------|\n", | |
| "| **Sparse Autoencoder (SAE)** | Projects BERT token embeddings → sparse codes | TopK activation; $K \\ll h$ |\n", | |
| "| **Hybrid Loss** | Trains SAE to be reconstructive AND discriminative | $\\mathcal{L}_{recon} + \\frac{1}{8}\\mathcal{L}_{recon}(4k) + \\alpha \\mathcal{L}_{aux} + \\beta \\mathcal{L}_{cl} + \\gamma \\mathcal{L}_{CE}$ |\n", | |
| "| **Inverted Index** | Replaces K-means cluster index | Per-neuron posting lists with max-impact scores |\n", | |
| "| **SSR retrieval** | Exact MaxSim via posting list union | Only overlapping active neurons contribute |\n", | |
| "| **SSR++** | Coarse-to-fine pruning | $K_{coarse}=4$ neurons first, full $K=32$ on candidates |\n", | |
| "| **SSR-CLS** | Adds global semantics | Separate SAE for `[CLS]`, cosine sim added to score |\n", | |
| "\n", | |
| "The key insight is that **sparsity is not just a compression technique** — it fundamentally changes the retrieval structure: sparse codes naturally map to inverted indices, eliminating the clustering bottleneck entirely.\n", | |
| "\n", | |
| "### Further Reading\n", | |
| "- Original SSR paper: https://arxiv.org/pdf/2605.30120\n", | |
| "- Code: https://github.com/Y-Research-SBU/SSR\n", | |
| "- ColBERTv2 (baseline): https://arxiv.org/abs/2112.01488\n", | |
| "- PLAID engine: https://arxiv.org/abs/2205.09707\n", | |
| "- Sparse Autoencoders (Gao et al.): https://arxiv.org/abs/2406.04093" | |
| ], | |
| "id": "a6dc88d3273ef93d" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "---\n", | |
| "## Step 12: Elasticsearch Sparse Vector PoC\n", | |
| "\n", | |
| "We now wire the SSR encoding pipeline into Elasticsearch's `sparse_vector` field,\n", | |
| "replacing our hand-rolled Python inverted index with Elasticsearch's Lucene-backed one.\n", | |
| "\n", | |
| "### Architecture\n", | |
| "\n", | |
| "```\n", | |
| "Text → BERT (frozen) → SAE encode → max-aggregate → ES sparse_vector\n", | |
| " mu_{D,u} = max_t z_t^(u)\n", | |
| "```\n", | |
| "\n", | |
| "Elasticsearch's `sparse_vector` field stores each document as a map of\n", | |
| "`{dimension_id: float_value}` and builds a Lucene inverted index over them.\n", | |
| "Retrieval uses Lucene's **MaxScore** algorithm — functionally equivalent to SSR++'s\n", | |
| "block-level upper-bound pruning, but battle-hardened and SIMD-optimised.\n", | |
| "\n", | |
| "> **Note:** The max-aggregation step means we are computing an approximation of the\n", | |
| "> true per-token MaxSim. For most corpora the quality loss is small, and you gain\n", | |
| "> production-grade infrastructure for free." | |
| ], | |
| "id": "87dedfcb86cab55d" | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.1 Start Elasticsearch with Docker\n", | |
| "\n", | |
| "Run the cell below once to start a single-node ES 8.x cluster locally.\n", | |
| "Skip it if ES is already running." | |
| ], | |
| "id": "76c623506d2a82c9" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:11.332764Z", | |
| "start_time": "2026-07-10T13:43:10.445889Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Start a local single-node Elasticsearch 9.x cluster (no security for PoC)\n", | |
| "# Safe to re-run — Docker will report 'already in use' if the container exists.\n", | |
| "!docker run -d \\\n", | |
| " --name es-ssr-poc94 \\\n", | |
| " -p 9200:9200 \\\n", | |
| " -e \"discovery.type=single-node\" \\\n", | |
| " -e \"xpack.security.enabled=false\" \\\n", | |
| " -e \"ES_JAVA_OPTS=-Xms512m -Xmx512m\" \\\n", | |
| " docker.elastic.co/elasticsearch/elasticsearch:9.4.0\n", | |
| "\n", | |
| "# Wait for ES to be ready\n", | |
| "import time, urllib.request, urllib.error\n", | |
| "\n", | |
| "print('Waiting for Elasticsearch...', end='')\n", | |
| "for _ in range(30):\n", | |
| " try:\n", | |
| " urllib.request.urlopen('http://localhost:9200', timeout=2)\n", | |
| " print(' ready!')\n", | |
| " break\n", | |
| " except Exception:\n", | |
| " print('.', end='', flush=True)\n", | |
| " time.sleep(2)\n", | |
| "else:\n", | |
| " print(' timed out — check docker logs es-ssr-poc')" | |
| ], | |
| "id": "2432580b8509bfae", | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", | |
| "To disable this warning, you can either:\n", | |
| "\t- Avoid using `tokenizers` before the fork if possible\n", | |
| "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "docker: Error response from daemon: Conflict. The container name \"/es-ssr-poc94\" is already in use by container \"cc0dc1c9c9e2f97302c2449d1463c3e195dcd9a2dd15883e2dbb31db071b3d9f\". You have to remove (or rename) that container to be able to reuse that name.\r\n", | |
| "\r\n", | |
| "Run 'docker run --help' for more information\r\n", | |
| "Waiting for Elasticsearch... ready!\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 66 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T12:59:13.123928Z", | |
| "start_time": "2026-07-10T12:59:09.428376Z" | |
| } | |
| }, | |
| "source": [ | |
| "!pip install elasticsearch --quiet" | |
| ], | |
| "id": "ef03d916da6703ee", | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", | |
| "To disable this warning, you can either:\n", | |
| "\t- Avoid using `tokenizers` before the fork if possible\n", | |
| "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "\r\n", | |
| "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m26.0.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m26.1.2\u001B[0m\r\n", | |
| "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 22 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.2 Connect and create the index\n", | |
| "\n", | |
| "The mapping uses a `sparse_vector` field for the SAE codes and a plain `text` field\n", | |
| "for the original document text." | |
| ], | |
| "id": "1293d6dfb3525d31" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:07:35.773885Z", | |
| "start_time": "2026-07-10T13:07:35.577081Z" | |
| } | |
| }, | |
| "source": [ | |
| "from elasticsearch import Elasticsearch\n", | |
| "\n", | |
| "es = Elasticsearch('http://localhost:9200')\n", | |
| "print('ES version:', es.info()['version']['number'])\n", | |
| "\n", | |
| "INDEX_NAME = 'ssr-sparse-poc'\n", | |
| "\n", | |
| "# Drop and recreate for a clean run\n", | |
| "if es.indices.exists(index=INDEX_NAME):\n", | |
| " es.indices.delete(index=INDEX_NAME)\n", | |
| " print(f'Deleted existing index \"{INDEX_NAME}\"')\n", | |
| "\n", | |
| "es.indices.create(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={\n", | |
| " 'settings': {\n", | |
| " 'number_of_shards': 1,\n", | |
| " 'number_of_replicas': 0\n", | |
| " },\n", | |
| " 'mappings': {\n", | |
| " 'properties': {\n", | |
| " 'text': {'type': 'text'},\n", | |
| " # sparse_vector stores {dimension_id: float} maps and\n", | |
| " # builds a Lucene inverted index over them — exactly\n", | |
| " # what SSR's neuron posting lists are.\n", | |
| " 'sparse_codes': {'type': 'sparse_vector'}\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| ")\n", | |
| "print(f'Created index \"{INDEX_NAME}\" with sparse_vector mapping')" | |
| ], | |
| "id": "c4566f2c1d9837da", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "ES version: 9.4.0\n", | |
| "Created index \"ssr-sparse-poc\" with sparse_vector mapping\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 30 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.3 Encode and index the corpus\n", | |
| "\n", | |
| "For each document we:\n", | |
| "1. Encode tokens with BERT (frozen backbone)\n", | |
| "2. Pass through the trained SAE\n", | |
| "3. Compute `mu_{D,u} = max_t z_t^(u)` — the max-impact aggregation from Equation 11\n", | |
| "4. Convert to a `{str(dim): float}` map and bulk-index into Elasticsearch" | |
| ], | |
| "id": "2b84e7f6c9637f18" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:08:09.277105Z", | |
| "start_time": "2026-07-10T13:07:45.780287Z" | |
| } | |
| }, | |
| "source": [ | |
| "from elasticsearch.helpers import bulk\n", | |
| "import torch\n", | |
| "import torch.nn.functional as F\n", | |
| "from tqdm import tqdm\n", | |
| "\n", | |
| "# Re-use the BERT encoder and trained SAE from earlier steps.\n", | |
| "# If running this section standalone, initialise them first:\n", | |
| "# encoder = AutoModel.from_pretrained('bert-base-uncased').eval()\n", | |
| "# tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')\n", | |
| "# sae_real = SparseAutoencoder(d_model=768, d_sparse=SPARSE_DIM, k=TOPK)\n", | |
| "# # ... then train or load weights ...\n", | |
| "\n", | |
| "def encode_to_sparse_map(\n", | |
| " text: str,\n", | |
| " tokenizer,\n", | |
| " encoder,\n", | |
| " sae: 'SparseAutoencoder',\n", | |
| " max_length: int = 64,\n", | |
| " device: str = 'cpu'\n", | |
| ") -> dict:\n", | |
| " \"\"\"\n", | |
| " Full SSR encoding pipeline for one document:\n", | |
| " text -> BERT tokens -> dense embeddings -> SAE sparse codes\n", | |
| " -> max-aggregate across tokens -> {dim_id: value} map\n", | |
| " \"\"\"\n", | |
| " inputs = tokenizer(\n", | |
| " text, return_tensors='pt',\n", | |
| " truncation=True, max_length=max_length,\n", | |
| " padding=False\n", | |
| " ).to(device)\n", | |
| "\n", | |
| " with torch.no_grad():\n", | |
| " token_embs = encoder(**inputs).last_hidden_state.squeeze(0) # (seq, 768)\n", | |
| " z = sae.encode(token_embs.to(device)) # (seq, d_sparse)\n", | |
| " mu = z.max(dim=0).values # (d_sparse,)\n", | |
| "\n", | |
| " # Only store active (non-zero) neurons — keep the dict small\n", | |
| " active_idx = (mu > 0).nonzero(as_tuple=True)[0]\n", | |
| " return {str(int(i)): float(mu[i]) for i in active_idx}\n", | |
| "\n", | |
| "\n", | |
| "def generate_actions(texts, tokenizer, encoder, sae, device='cpu'):\n", | |
| " \"\"\"Yield bulk-index actions for elasticsearch.helpers.bulk.\"\"\"\n", | |
| " for i, text in enumerate(texts):\n", | |
| " sparse_map = encode_to_sparse_map(text, tokenizer, encoder, sae, device=device)\n", | |
| " yield {\n", | |
| " '_index': INDEX_NAME,\n", | |
| " '_id': str(i),\n", | |
| " '_source': {\n", | |
| " 'text': text,\n", | |
| " 'sparse_codes': sparse_map\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| "\n", | |
| "# Use the doc_texts loaded earlier (SciFact or synthetic fallback)\n", | |
| "# Move SAE to CPU for simplicity\n", | |
| "sae_real.cpu().eval()\n", | |
| "encoder.cpu()\n", | |
| "\n", | |
| "print(f'Indexing {len(doc_texts)} documents into Elasticsearch...')\n", | |
| "success, errors = bulk(\n", | |
| " es,\n", | |
| " tqdm(generate_actions(doc_texts, tokenizer, encoder, sae_real), total=len(doc_texts)),\n", | |
| " chunk_size=50,\n", | |
| " raise_on_error=False\n", | |
| ")\n", | |
| "print(f'Indexed: {success} docs | Errors: {len(errors)}')\n", | |
| "es.indices.refresh(index=INDEX_NAME)\n", | |
| "\n", | |
| "# Spot-check: how many active neurons does a typical document have?\n", | |
| "sample = encode_to_sparse_map(doc_texts[0], tokenizer, encoder, sae_real)\n", | |
| "print(f'\\nSample document active neurons: {len(sample)} / {SPARSE_DIM}')\n", | |
| "print(f'Top-5 neurons: {sorted(sample.items(), key=lambda x: -x[1])[:5]}')" | |
| ], | |
| "id": "4e085f22b8acf890", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Indexing 500 documents into Elasticsearch...\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "100%|██████████| 500/500 [00:23<00:00, 21.58it/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Indexed: 500 docs | Errors: 0\n", | |
| "\n", | |
| "Sample document active neurons: 186 / 4096\n", | |
| "Top-5 neurons: [('240', 8.510189056396484), ('3812', 7.900995254516602), ('755', 7.407013416290283), ('130', 7.2392449378967285), ('14', 6.372080326080322)]\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 31 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.4 Query Elasticsearch with sparse_vector\n", | |
| "\n", | |
| "The query follows the same encoding pipeline as the documents.\n", | |
| "We issue a `sparse_vector` query, which triggers Lucene's MaxScore algorithm —\n", | |
| "structurally equivalent to SSR++'s coarse-to-fine pruning." | |
| ], | |
| "id": "5a381ec6f689c403" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:08:13.266708Z", | |
| "start_time": "2026-07-10T13:08:12.759500Z" | |
| } | |
| }, | |
| "source": [ | |
| "def ssr_es_search(\n", | |
| " query_text: str,\n", | |
| " tokenizer,\n", | |
| " encoder,\n", | |
| " sae,\n", | |
| " top_k: int = 5,\n", | |
| " device: str = 'cpu'\n", | |
| ") -> list:\n", | |
| " \"\"\"\n", | |
| " End-to-end SSR retrieval via Elasticsearch:\n", | |
| " 1. Encode query text -> sparse map\n", | |
| " 2. Issue sparse_vector query to ES\n", | |
| " 3. Return ranked (doc_id, score, text) triples\n", | |
| " \"\"\"\n", | |
| " q_sparse = encode_to_sparse_map(query_text, tokenizer, encoder, sae, device=device)\n", | |
| "\n", | |
| " resp = es.search(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={\n", | |
| " 'size': top_k,\n", | |
| " 'query': {\n", | |
| " 'sparse_vector': {\n", | |
| " 'field': 'sparse_codes',\n", | |
| " 'query_vector': q_sparse\n", | |
| " }\n", | |
| " },\n", | |
| " '_source': ['text']\n", | |
| " }\n", | |
| " )\n", | |
| "\n", | |
| " hits = resp['hits']['hits']\n", | |
| " return [\n", | |
| " {\n", | |
| " 'rank': rank + 1,\n", | |
| " 'doc_id': int(h['_id']),\n", | |
| " 'score': h['_score'],\n", | |
| " 'text': h['_source']['text'][:120]\n", | |
| " }\n", | |
| " for rank, h in enumerate(hits)\n", | |
| " ]\n", | |
| "\n", | |
| "\n", | |
| "# --- Run queries ---\n", | |
| "test_queries_es = [\n", | |
| " 'What causes protein misfolding?',\n", | |
| " 'How does climate change affect biodiversity?',\n", | |
| " 'What is the mechanism of DNA replication?',\n", | |
| "]\n", | |
| "\n", | |
| "for q in test_queries_es:\n", | |
| " results = ssr_es_search(q, tokenizer, encoder, sae_real, top_k=3)\n", | |
| " print(f'Query: \"{q}\"')\n", | |
| " for r in results:\n", | |
| " print(f' [{r[\"rank\"]}] score={r[\"score\"]:.4f} | {r[\"text\"]}...')\n", | |
| " print()" | |
| ], | |
| "id": "5300e21c7a935ec0", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Query: \"What causes protein misfolding?\"\n", | |
| " [1] score=842.8160 | Successful generation of induced pluripotent stem cells entails a major metabolic switch from mitochondrial oxidative ph...\n", | |
| " [2] score=842.2976 | Dishevelled (Dvl) proteins are important signaling components of both the canonical beta-catenin/Wnt pathway, which cont...\n", | |
| " [3] score=838.1582 | Epithelial-mesenchymal transition (EMT) is implicated in converting stationary epithelial tumor cells into motile mesenc...\n", | |
| "\n", | |
| "Query: \"How does climate change affect biodiversity?\"\n", | |
| " [1] score=851.0527 | Neutrophil extracellular traps (NETs) are implicated in autoimmunity, but how they are generated and their roles in ster...\n", | |
| " [2] score=850.1769 | Oligodendrocytes, the myelin-forming glial cells of the central nervous system, maintain long-term axonal integrity. How...\n", | |
| " [3] score=846.3793 | Myeloid-derived suppressor cells (MDSCs) play critical roles in primary and metastatic cancer progression. MDSC regulati...\n", | |
| "\n", | |
| "Query: \"What is the mechanism of DNA replication?\"\n", | |
| " [1] score=941.9208 | Single-stranded DNA-binding protein (SSB) plays an important role in DNA metabolism, such as in DNA replication, repair,...\n", | |
| " [2] score=935.8503 | Epigenetic modifiers have fundamental roles in defining unique cellular identity through the establishment and maintenan...\n", | |
| " [3] score=929.9278 | RNA-binding proteins are at the heart of posttranscriptional gene regulation, coordinating the processing, storage, and ...\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 32 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.5 Compare ES results with native SSR retriever\n", | |
| "\n", | |
| "We compare the two implementations on the same queries to verify they agree.\n", | |
| "Because ES uses the max-aggregated document vector while our Python SSR uses\n", | |
| "exact per-token MaxSim, the scores differ — but the ranking should be similar." | |
| ], | |
| "id": "7fdd03375ba50fc0" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:08:19.157216Z", | |
| "start_time": "2026-07-10T13:08:18.797526Z" | |
| } | |
| }, | |
| "source": [ | |
| "import time\n", | |
| "\n", | |
| "def compare_retrievers(query_text, top_k=5):\n", | |
| " \"\"\"Run the same query through both retrievers and compare.\"\"\"\n", | |
| " # --- Elasticsearch ---\n", | |
| " t0 = time.perf_counter()\n", | |
| " es_results = ssr_es_search(query_text, tokenizer, encoder, sae_real, top_k=top_k)\n", | |
| " es_time_ms = (time.perf_counter() - t0) * 1000\n", | |
| " es_ids = [r['doc_id'] for r in es_results]\n", | |
| "\n", | |
| " # --- Native Python SSR++ ---\n", | |
| " inputs = tokenizer(query_text, return_tensors='pt',\n", | |
| " truncation=True, max_length=64)\n", | |
| " with torch.no_grad():\n", | |
| " q_emb = encoder(**inputs).last_hidden_state.squeeze(0) # (seq, 768)\n", | |
| "\n", | |
| " t0 = time.perf_counter()\n", | |
| " native_results = retriever_real.retrieve(q_emb, top_k=top_k, mode='ssr++')\n", | |
| " native_time_ms = (time.perf_counter() - t0) * 1000\n", | |
| " native_ids = [doc_id for doc_id, _ in native_results]\n", | |
| "\n", | |
| " # --- Rank overlap ---\n", | |
| " overlap = len(set(es_ids) & set(native_ids))\n", | |
| "\n", | |
| " print(f'Query: \"{query_text}\"')\n", | |
| " print(f' {\"Rank\":<6} {\"ES doc_id\":<12} {\"Native doc_id\":<14}')\n", | |
| " for i in range(top_k):\n", | |
| " es_id = es_ids[i] if i < len(es_ids) else '-'\n", | |
| " nat_id = native_ids[i] if i < len(native_ids) else '-'\n", | |
| " match = '<<' if es_id == nat_id else ''\n", | |
| " print(f' {i+1:<6} {str(es_id):<12} {str(nat_id):<14} {match}')\n", | |
| " print(f' Overlap (top-{top_k}): {overlap}/{top_k}')\n", | |
| " print(f' ES latency: {es_time_ms:.1f}ms | Native SSR++ latency: {native_time_ms:.1f}ms')\n", | |
| " print()\n", | |
| " return overlap / top_k\n", | |
| "\n", | |
| "\n", | |
| "overlaps = [compare_retrievers(q, top_k=5) for q in test_queries_es]\n", | |
| "print(f'Average top-5 overlap across queries: {sum(overlaps)/len(overlaps):.0%}')" | |
| ], | |
| "id": "aa835d706b4fd276", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Query: \"What causes protein misfolding?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 289 57 \n", | |
| " 2 57 289 \n", | |
| " 3 326 52 \n", | |
| " 4 189 335 \n", | |
| " 5 93 93 <<\n", | |
| " Overlap (top-5): 3/5\n", | |
| " ES latency: 64.3ms | Native SSR++ latency: 53.8ms\n", | |
| "\n", | |
| "Query: \"How does climate change affect biodiversity?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 189 57 \n", | |
| " 2 480 335 \n", | |
| " 3 370 289 \n", | |
| " 4 289 187 \n", | |
| " 5 335 248 \n", | |
| " Overlap (top-5): 2/5\n", | |
| " ES latency: 55.7ms | Native SSR++ latency: 16.9ms\n", | |
| "\n", | |
| "Query: \"What is the mechanism of DNA replication?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 350 57 \n", | |
| " 2 442 442 <<\n", | |
| " 3 169 289 \n", | |
| " 4 370 350 \n", | |
| " 5 480 187 \n", | |
| " Overlap (top-5): 2/5\n", | |
| " ES latency: 44.8ms | Native SSR++ latency: 21.6ms\n", | |
| "\n", | |
| "Average top-5 overlap across queries: 47%\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 33 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.6 Index statistics and ES internals\n", | |
| "\n", | |
| "Let's inspect the Elasticsearch index to see how it represents the sparse data." | |
| ], | |
| "id": "3ad0407da824d43b" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:13:14.437090Z", | |
| "start_time": "2026-07-10T13:13:14.381576Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Index stats\n", | |
| "stats = es.indices.stats(index=INDEX_NAME)\n", | |
| "idx_stats = stats['indices'][INDEX_NAME]['total']\n", | |
| "\n", | |
| "print('=== Elasticsearch Index Statistics ===')\n", | |
| "print(f'Documents indexed : {idx_stats[\"docs\"][\"count\"]}')\n", | |
| "print(f'Index size on disk: {idx_stats[\"store\"][\"size_in_bytes\"] / 1024 / 1024:.2f} MB')\n", | |
| "print(f'Indexing time : {idx_stats[\"indexing\"][\"index_time_in_millis\"]} ms')\n", | |
| "\n", | |
| "# Fetch one document to inspect the stored sparse codes\n", | |
| "sample_doc = es.get(index=INDEX_NAME, id='0')\n", | |
| "source_doc = sample_doc['_source']\n", | |
| "if 'sparse_codes' in source_doc:\n", | |
| " sparse = source_doc['sparse_codes']\n", | |
| " print(f'\\nSample document (id=0):')\n", | |
| " print(f' Active neurons: {len(sparse)}')\n", | |
| " top_neurons = sorted(sparse.items(), key=lambda x: -x[1])[:10]\n", | |
| " print(f' Top-10 neurons (dim: value):')\n", | |
| " for dim, val in top_neurons:\n", | |
| " print(f' neuron {dim:>6}: {val:.4f}')" | |
| ], | |
| "id": "20de11fda064a295", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "=== Elasticsearch Index Statistics ===\n", | |
| "Documents indexed : 500\n", | |
| "Index size on disk: 1.10 MB\n", | |
| "Indexing time : 392 ms\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 37 | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "### 12.7 What Elasticsearch gives you vs. the hand-rolled retriever\n", | |
| "\n", | |
| "| Capability | Hand-rolled Python SSR | Elasticsearch sparse_vector |\n", | |
| "|---|---|---|\n", | |
| "| Inverted index | ✅ Custom posting lists | ✅ Lucene (battle-tested) |\n", | |
| "| Block upper bounds | ✅ Manual per-block UB | ✅ Lucene MaxScore (automatic) |\n", | |
| "| Exact per-token MaxSim | ✅ Yes | ❌ Approximated by max-aggregation |\n", | |
| "| Concurrent queries | ❌ Single-threaded | ✅ Thread-pool + shard parallelism |\n", | |
| "| Distributed sharding | ❌ | ✅ Multi-node, auto-balanced |\n", | |
| "| Persistence | ❌ In-memory only | ✅ Durable segments on disk |\n", | |
| "| Incremental updates | ✅ Append-only (like SSR) | ✅ Append-only (Lucene segments) |\n", | |
| "| BM25 hybrid search | ❌ | ✅ `linear_combination` or RRF fusion |\n", | |
| "| Filtering / faceting | ❌ | ✅ Full query DSL |\n", | |
| "\n", | |
| "**The key gap** is exact per-token MaxSim. In practice for many retrieval tasks the\n", | |
| "max-aggregated approximation is close enough. If you need exact MaxSim, the closest\n", | |
| "path in ES is storing per-token sparse codes in a `nested` field and using a nested\n", | |
| "`sparse_vector` query — but this multiplies storage by the average token count.\n", | |
| "\n", | |
| "**Hybrid search bonus:** Because ES already has BM25 over the `text` field, you can\n", | |
| "trivially combine SSR-style sparse neural scores with lexical BM25 scores using\n", | |
| "a `linear_combination` query or Reciprocal Rank Fusion (RRF) — something the paper\n", | |
| "does not explore but is a natural production enhancement." | |
| ], | |
| "id": "4003fdf5f5dee409" | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:10:11.655451Z", | |
| "start_time": "2026-07-10T13:10:11.063181Z" | |
| } | |
| }, | |
| "source": [ | |
| "# Bonus: hybrid search — SSR sparse_vector + BM25 via linear_combination\n", | |
| "def hybrid_search(query_text, top_k=5, sparse_weight=0.7, bm25_weight=0.3):\n", | |
| " \"\"\"\n", | |
| " Combine SSR sparse_vector score with BM25 lexical score.\n", | |
| " This goes beyond the original paper but is trivial in Elasticsearch.\n", | |
| " \"\"\"\n", | |
| " q_sparse = encode_to_sparse_map(query_text, tokenizer, encoder, sae_real)\n", | |
| "\n", | |
| " resp = es.search(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={\n", | |
| " 'size': top_k,\n", | |
| " 'query': {\n", | |
| " 'linear_combination': {\n", | |
| " 'queries': [\n", | |
| " {\n", | |
| " 'query': {\n", | |
| " 'sparse_vector': {\n", | |
| " 'field': 'sparse_codes',\n", | |
| " 'query_vector': q_sparse\n", | |
| " }\n", | |
| " },\n", | |
| " 'weight': sparse_weight\n", | |
| " },\n", | |
| " {\n", | |
| " 'query': {\n", | |
| " 'match': {\n", | |
| " 'text': query_text\n", | |
| " }\n", | |
| " },\n", | |
| " 'weight': bm25_weight\n", | |
| " }\n", | |
| " ]\n", | |
| " }\n", | |
| " },\n", | |
| " '_source': ['text']\n", | |
| " }\n", | |
| " )\n", | |
| "\n", | |
| " return [\n", | |
| " {'rank': i+1, 'score': h['_score'], 'text': h['_source']['text'][:120]}\n", | |
| " for i, h in enumerate(resp['hits']['hits'])\n", | |
| " ]\n", | |
| "\n", | |
| "\n", | |
| "q = 'What causes protein misfolding?'\n", | |
| "print(f'Hybrid search (SSR 70% + BM25 30%) for: \"{q}\"')\n", | |
| "print()\n", | |
| "try:\n", | |
| " for r in hybrid_search(q):\n", | |
| " print(f' [{r[\"rank\"]}] score={r[\"score\"]:.4f} | {r[\"text\"]}...')\n", | |
| "except Exception as e:\n", | |
| " # linear_combination is available in ES 8.13+ — fall back to just sparse\n", | |
| " print(f'linear_combination not available ({e})')\n", | |
| " print('Falling back to sparse-only search:')\n", | |
| " for r in ssr_es_search(q, tokenizer, encoder, sae_real, top_k=5):\n", | |
| " print(f' [{r[\"rank\"]}] score={r[\"score\"]:.4f} | {r[\"text\"]}...')" | |
| ], | |
| "id": "3dc92da50ae6fdff", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Hybrid search (SSR 70% + BM25 30%) for: \"What causes protein misfolding?\"\n", | |
| "\n", | |
| "linear_combination not available (BadRequestError(400, 'parsing_exception', 'unknown query [linear_combination]', [1:41] unknown field [linear_combination]))\n", | |
| "Falling back to sparse-only search:\n", | |
| " [1] score=842.8160 | Successful generation of induced pluripotent stem cells entails a major metabolic switch from mitochondrial oxidative ph...\n", | |
| " [2] score=842.2976 | Dishevelled (Dvl) proteins are important signaling components of both the canonical beta-catenin/Wnt pathway, which cont...\n", | |
| " [3] score=838.1582 | Epithelial-mesenchymal transition (EMT) is implicated in converting stationary epithelial tumor cells into motile mesenc...\n", | |
| " [4] score=837.3804 | Neutrophil extracellular traps (NETs) are implicated in autoimmunity, but how they are generated and their roles in ster...\n", | |
| " [5] score=836.3450 | Escherichia coli responds to the redox stress imposed by superoxide-generating agents such as paraquat by activating the...\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 36 | |
| }, | |
| { | |
| "metadata": {}, | |
| "cell_type": "markdown", | |
| "source": [ | |
| "---\n", | |
| "## Step 12: Elasticsearch PoC — `rank_features` + BM25\n", | |
| "\n", | |
| "Instead of the dedicated `sparse_vector` field type, we use Elasticsearch's\n", | |
| "**`rank_features`** field, which has been available since ES 7.0 and does not\n", | |
| "require the ML node / inference plugin that ELSER depends on.\n", | |
| "\n", | |
| "### Why `rank_features` works for SSR\n", | |
| "\n", | |
| "`rank_features` stores a map of `{feature_name: positive_float}` and indexes\n", | |
| "each feature as a posting in Lucene's inverted index — exactly the structure\n", | |
| "SSR's neuron posting lists require. At query time the `rank_feature` query\n", | |
| "with the **`linear`** scoring function computes:\n", | |
| "\n", | |
| "$$\\text{score}_{u} = \\text{boost}_u \\times \\mu_{D,u}$$\n", | |
| "\n", | |
| "If we set `boost_u = q_u` (the query's activation for neuron $u$), summing\n", | |
| "over all active query neurons gives exactly the SSR dot-product approximation:\n", | |
| "\n", | |
| "$$S_{approx}(Q, D) = \\sum_{u \\in A_K(Q)} q_u \\cdot \\mu_{D,u}$$\n", | |
| "\n", | |
| "BM25 over the raw `text` field is added as an extra `should` clause in the\n", | |
| "same `bool` query — no separate fusion step needed.\n", | |
| "\n", | |
| "### Architecture\n", | |
| "```\n", | |
| " ┌─ rank_feature clauses (one per active neuron) ───-- SSR approx score ─┐\n", | |
| "query ──▶ bool should ─┤ ├─▶ final score\n", | |
| " └─ match clause on `text` field ──────────────────── BM25 score ────────┘\n", | |
| "```\n" | |
| ], | |
| "id": "fc89de5dcc95fc1d" | |
| }, | |
| { | |
| "metadata": {}, | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### 12.2 Index mapping: `text` (BM25) + `rank_features` (SSR)\n", | |
| "\n", | |
| "`rank_features` indexes each `{neuron_id: value}` entry as a posting in Lucene's\n", | |
| "inverted index, with the float encoded as a term frequency via Lucene's\n", | |
| "`FeatureField`. This is structurally identical to SSR's neuron posting lists.\n", | |
| "\n", | |
| "- **`positive_score_impact: true`** (default) — higher feature value → higher score.\n", | |
| "- **`positive_score_impact: false`** — for features where *lower* is better (not\n", | |
| " applicable here, but available).\n", | |
| "\n", | |
| "We do **not** need the ML plugin, ELSER, or any paid tier — `rank_features` is\n", | |
| "part of the open Elasticsearch distribution." | |
| ], | |
| "id": "89db59cc507147b2" | |
| }, | |
| { | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:43:34.697346Z", | |
| "start_time": "2026-07-10T13:43:34.066607Z" | |
| } | |
| }, | |
| "cell_type": "code", | |
| "source": [ | |
| "from elasticsearch import Elasticsearch\n", | |
| "\n", | |
| "es = Elasticsearch('http://localhost:9200')\n", | |
| "print('ES version:', es.info()['version']['number'])\n", | |
| "\n", | |
| "INDEX_NAME = 'ssr-rank-features-poc'\n", | |
| "\n", | |
| "if es.indices.exists(index=INDEX_NAME):\n", | |
| " es.indices.delete(index=INDEX_NAME)\n", | |
| " print(f'Dropped existing index \"{INDEX_NAME}\"')\n", | |
| "\n", | |
| "es.indices.create(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={\n", | |
| " 'settings': {\n", | |
| " 'number_of_shards': 1,\n", | |
| " 'number_of_replicas': 0\n", | |
| " },\n", | |
| " 'mappings': {\n", | |
| " 'properties': {\n", | |
| " # Standard text field — Lucene BM25 out of the box\n", | |
| " 'text': {\n", | |
| " 'type': 'text',\n", | |
| " 'similarity': 'BM25'\n", | |
| " },\n", | |
| " # rank_features: {neuron_id_str: float}\n", | |
| " # Each key becomes a sub-field in Lucene's FeatureField\n", | |
| " 'sparse_codes': {\n", | |
| " 'type': 'rank_features',\n", | |
| " 'positive_score_impact': True\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| " }\n", | |
| ")\n", | |
| "print(f'Created index \"{INDEX_NAME}\" with rank_features + text mapping')" | |
| ], | |
| "id": "d0e40a591c1f39d3", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "ES version: 9.4.0\n", | |
| "Dropped existing index \"ssr-rank-features-poc\"\n", | |
| "Created index \"ssr-rank-features-poc\" with rank_features + text mapping\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 67 | |
| }, | |
| { | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:44:03.042233Z", | |
| "start_time": "2026-07-10T13:43:37.372392Z" | |
| } | |
| }, | |
| "cell_type": "code", | |
| "source": [ | |
| "import torch\n", | |
| "from elasticsearch.helpers import bulk\n", | |
| "from tqdm import tqdm\n", | |
| "\n", | |
| "\n", | |
| "def encode_to_sparse_map(text, tokenizer, encoder, sae, max_length=64, device='cpu'):\n", | |
| " \"\"\"\n", | |
| " SSR encoding pipeline:\n", | |
| " text -> BERT -> SAE -> max-aggregate -> {neuron_id: max_impact}\n", | |
| "\n", | |
| " The max-aggregation (mu_{D,u} = max_t z_t^(u), Equation 11) means one\n", | |
| " document = one sparse vector, directly indexable as rank_features.\n", | |
| " \"\"\"\n", | |
| " inputs = tokenizer(\n", | |
| " text, return_tensors='pt',\n", | |
| " truncation=True, max_length=max_length, padding=False\n", | |
| " ).to(device)\n", | |
| " with torch.no_grad():\n", | |
| " embs = encoder(**inputs).last_hidden_state.squeeze(0) # (seq, 768)\n", | |
| " z = sae.encode(embs.to(device)) # (seq, d_sparse)\n", | |
| " mu = z.max(dim=0).values # (d_sparse,)\n", | |
| " active = (mu > 0).nonzero(as_tuple=True)[0]\n", | |
| " return {str(int(i)): float(mu[i]) for i in active}\n", | |
| "\n", | |
| "\n", | |
| "def generate_actions(texts, tokenizer, encoder, sae, device='cpu'):\n", | |
| " for i, text in enumerate(texts):\n", | |
| " yield {\n", | |
| " '_index': INDEX_NAME,\n", | |
| " '_id': str(i),\n", | |
| " '_source': {\n", | |
| " 'text': text,\n", | |
| " 'sparse_codes': encode_to_sparse_map(\n", | |
| " text, tokenizer, encoder, sae, device=device\n", | |
| " )\n", | |
| " }\n", | |
| " }\n", | |
| "\n", | |
| "\n", | |
| "sae_real.cpu().eval()\n", | |
| "encoder.cpu()\n", | |
| "\n", | |
| "print(f'Indexing {len(doc_texts)} documents...')\n", | |
| "success, errors = bulk(\n", | |
| " es,\n", | |
| " tqdm(generate_actions(doc_texts, tokenizer, encoder, sae_real),\n", | |
| " total=len(doc_texts)),\n", | |
| " chunk_size=50,\n", | |
| " raise_on_error=False\n", | |
| ")\n", | |
| "es.indices.refresh(index=INDEX_NAME)\n", | |
| "print(f'Indexed {success} docs | Errors: {len(errors)}')\n", | |
| "\n", | |
| "# Inspect a sample\n", | |
| "sample = encode_to_sparse_map(doc_texts[0], tokenizer, encoder, sae_real)\n", | |
| "print(f'\\nDoc[0]: {len(sample)} active neurons out of {SPARSE_DIM}')\n", | |
| "print('Top-5:', sorted(sample.items(), key=lambda x: -x[1])[:5])" | |
| ], | |
| "id": "c16d60c2b0fa436d", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Indexing 500 documents...\n" | |
| ] | |
| }, | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "100%|██████████| 500/500 [00:25<00:00, 19.61it/s]\n" | |
| ] | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Indexed 500 docs | Errors: 0\n", | |
| "\n", | |
| "Doc[0]: 186 active neurons out of 4096\n", | |
| "Top-5: [('240', 8.510189056396484), ('3812', 7.900995254516602), ('755', 7.407013416290283), ('130', 7.2392449378967285), ('14', 6.372080326080322)]\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 68 | |
| }, | |
| { | |
| "metadata": {}, | |
| "cell_type": "markdown", | |
| "source": [ | |
| "### 12.4 Hybrid query: `rank_feature` (SSR) + `match` (BM25)\n", | |
| "\n", | |
| "The query is a `bool` with `should` clauses:\n", | |
| "\n", | |
| "- **One `rank_feature` clause per active query neuron** — uses the `linear`\n", | |
| " scoring function with `boost = q_u` (the query neuron's activation value).\n", | |
| " This gives `score contribution = q_u × mu_{D,u}`, i.e. the SSR dot product.\n", | |
| "- **One `match` clause on `text`** — standard BM25, boosted by `bm25_weight`.\n", | |
| "\n", | |
| "All clauses sit inside `bool.should` so Elasticsearch sums their scores, which\n", | |
| "directly implements the combined objective:\n", | |
| "\n", | |
| "$$\\text{score}(Q, D) = \\underbrace{\\alpha \\sum_{u} q_u \\cdot \\mu_{D,u}}_{\\text{SSR (rank\\_feature, linear)}} + \\underbrace{\\beta \\cdot \\text{BM25}(Q, D)}_{\\text{match}}$$\n", | |
| "\n", | |
| "> **`linear` vs `saturation`:** The default `rank_feature` scoring is `saturation`\n", | |
| "> (`score = S / (S + pivot)`), which compresses large values. We use `linear`\n", | |
| "> because it preserves the dot-product semantics SSR requires. Fall-back to\n", | |
| "> `saturation` is shown if your ES version doesn't support `linear`." | |
| ], | |
| "id": "50243b8d08f3d4e0" | |
| }, | |
| { | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:45:49.606751Z", | |
| "start_time": "2026-07-10T13:45:49.175086Z" | |
| } | |
| }, | |
| "cell_type": "code", | |
| "source": [ | |
| "def build_query(\n", | |
| " query_text: str,\n", | |
| " q_sparse: dict,\n", | |
| " sparse_weight: float = 0.7,\n", | |
| " bm25_weight: float = 0.3,\n", | |
| " scoring: str = 'linear', # 'linear' | 'saturation'\n", | |
| " saturation_pivot: float = 1.0\n", | |
| ") -> dict:\n", | |
| " \"\"\"\n", | |
| " Build a bool/should query that combines:\n", | |
| " - rank_feature clauses (SSR dot-product approximation)\n", | |
| " - a match clause (BM25 lexical score)\n", | |
| "\n", | |
| " For each active query neuron u with value q_u, we emit:\n", | |
| " { rank_feature: { field: 'sparse_codes.<u>',\n", | |
| " boost: q_u * sparse_weight,\n", | |
| " linear: {} } }\n", | |
| "\n", | |
| " This gives score_u = (q_u * sparse_weight) * mu_{D,u}, which when\n", | |
| " summed across all active neurons equals:\n", | |
| " sparse_weight * sum_u(q_u * mu_{D,u}) — the SSR approximation score.\n", | |
| " \"\"\"\n", | |
| " should = []\n", | |
| "\n", | |
| " # --- SSR rank_feature clauses ---\n", | |
| " for neuron_id, q_val in q_sparse.items():\n", | |
| " boost = float(q_val) * sparse_weight\n", | |
| " if scoring == 'linear':\n", | |
| " func = {'linear': {}}\n", | |
| " else: # saturation fallback\n", | |
| " func = {'saturation': {'pivot': saturation_pivot}}\n", | |
| "\n", | |
| " should.append({\n", | |
| " 'rank_feature': {\n", | |
| " 'field': f'sparse_codes.{neuron_id}',\n", | |
| " 'boost': boost,\n", | |
| " **func\n", | |
| " }\n", | |
| " })\n", | |
| "\n", | |
| " # --- BM25 match clause ---\n", | |
| " '''should.append({\n", | |
| " 'match': {\n", | |
| " 'text': {\n", | |
| " 'query': query_text,\n", | |
| " 'boost': bm25_weight\n", | |
| " }\n", | |
| " }\n", | |
| " })'''\n", | |
| "\n", | |
| " return {'bool': {'should': should}}\n", | |
| "\n", | |
| "\n", | |
| "def ssr_es_search(\n", | |
| " query_text: str,\n", | |
| " tokenizer, encoder, sae,\n", | |
| " top_k: int = 5,\n", | |
| " sparse_weight: float = 0.7,\n", | |
| " bm25_weight: float = 0.3,\n", | |
| " scoring: str = 'linear',\n", | |
| " device: str = 'cpu'\n", | |
| ") -> list:\n", | |
| " \"\"\"End-to-end SSR+BM25 retrieval via Elasticsearch rank_features.\"\"\"\n", | |
| " q_sparse = encode_to_sparse_map(\n", | |
| " query_text, tokenizer, encoder, sae, device=device\n", | |
| " )\n", | |
| " query = build_query(\n", | |
| " query_text, q_sparse,\n", | |
| " sparse_weight=sparse_weight,\n", | |
| " bm25_weight=bm25_weight,\n", | |
| " scoring=scoring\n", | |
| " )\n", | |
| "\n", | |
| " try:\n", | |
| " resp = es.search(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={'size': top_k, 'query': query, '_source': ['text']}\n", | |
| " )\n", | |
| " except Exception:\n", | |
| " # Retry with saturation if linear is not supported\n", | |
| " query = build_query(\n", | |
| " query_text, q_sparse,\n", | |
| " sparse_weight=sparse_weight, bm25_weight=bm25_weight,\n", | |
| " scoring='saturation'\n", | |
| " )\n", | |
| " resp = es.search(\n", | |
| " index=INDEX_NAME,\n", | |
| " body={'size': top_k, 'query': query, '_source': ['text']}\n", | |
| " )\n", | |
| " print('(Note: fell back to saturation scoring)')\n", | |
| "\n", | |
| " return [\n", | |
| " {\n", | |
| " 'rank': i + 1,\n", | |
| " 'doc_id': int(h['_id']),\n", | |
| " 'score': h['_score'],\n", | |
| " 'text': h['_source']['text'][:120]\n", | |
| " }\n", | |
| " for i, h in enumerate(resp['hits']['hits'])\n", | |
| " ]\n", | |
| "\n", | |
| "\n", | |
| "# --- Run test queries ---\n", | |
| "test_queries_es = [\n", | |
| " 'What causes protein misfolding?',\n", | |
| " 'How does climate change affect biodiversity?',\n", | |
| " 'What is the mechanism of DNA replication?',\n", | |
| "]\n", | |
| "\n", | |
| "for q in test_queries_es:\n", | |
| " results = ssr_es_search(q, tokenizer, encoder, sae_real, top_k=3)\n", | |
| " print(f'Query: \"{q}\"')\n", | |
| " for r in results:\n", | |
| " print(f' [{r[\"rank\"]}] score={r[\"score\"]:.4f} | {r[\"text\"]}...')\n", | |
| " print()" | |
| ], | |
| "id": "717c6327d8d02958", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Query: \"What causes protein misfolding?\"\n", | |
| " [1] score=589.9712 | Successful generation of induced pluripotent stem cells entails a major metabolic switch from mitochondrial oxidative ph...\n", | |
| " [2] score=589.6083 | Dishevelled (Dvl) proteins are important signaling components of both the canonical beta-catenin/Wnt pathway, which cont...\n", | |
| " [3] score=586.7107 | Epithelial-mesenchymal transition (EMT) is implicated in converting stationary epithelial tumor cells into motile mesenc...\n", | |
| "\n", | |
| "Query: \"How does climate change affect biodiversity?\"\n", | |
| " [1] score=595.7369 | Neutrophil extracellular traps (NETs) are implicated in autoimmunity, but how they are generated and their roles in ster...\n", | |
| " [2] score=595.1238 | Oligodendrocytes, the myelin-forming glial cells of the central nervous system, maintain long-term axonal integrity. How...\n", | |
| " [3] score=592.4655 | Myeloid-derived suppressor cells (MDSCs) play critical roles in primary and metastatic cancer progression. MDSC regulati...\n", | |
| "\n", | |
| "Query: \"What is the mechanism of DNA replication?\"\n", | |
| " [1] score=659.3445 | Single-stranded DNA-binding protein (SSB) plays an important role in DNA metabolism, such as in DNA replication, repair,...\n", | |
| " [2] score=655.0951 | Epigenetic modifiers have fundamental roles in defining unique cellular identity through the establishment and maintenan...\n", | |
| " [3] score=650.9495 | RNA-binding proteins are at the heart of posttranscriptional gene regulation, coordinating the processing, storage, and ...\n", | |
| "\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 76 | |
| }, | |
| { | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:45:57.506178Z", | |
| "start_time": "2026-07-10T13:45:57.014387Z" | |
| } | |
| }, | |
| "cell_type": "code", | |
| "source": [ | |
| "import matplotlib.pyplot as plt\n", | |
| "\n", | |
| "q = test_queries_es[0]\n", | |
| "alphas = [0.0, 0.2, 0.4, 0.6, 0.8, 1.0] # SSR weight; BM25 = 1 - alpha\n", | |
| "\n", | |
| "print(f'Query: \"{q}\"')\n", | |
| "print(f'{\"alpha (SSR)\":>14} {\"beta (BM25)\":>12} {\"top-1 doc_id\":>14} {\"top-1 score\":>12}')\n", | |
| "print('-' * 60)\n", | |
| "\n", | |
| "rows = []\n", | |
| "for alpha in alphas:\n", | |
| " beta = round(1.0 - alpha, 2)\n", | |
| " res = ssr_es_search(\n", | |
| " q, tokenizer, encoder, sae_real,\n", | |
| " top_k=1, sparse_weight=alpha, bm25_weight=beta\n", | |
| " )\n", | |
| " if res:\n", | |
| " r = res[0]\n", | |
| " print(f'{alpha:>14.2f} {beta:>12.2f} {r[\"doc_id\"]:>14} {r[\"score\"]:>12.4f}')\n", | |
| " rows.append((alpha, r['score']))\n", | |
| "\n", | |
| "# Plot score vs alpha\n", | |
| "if rows:\n", | |
| " xs, ys = zip(*rows)\n", | |
| " fig, ax = plt.subplots(figsize=(7, 3))\n", | |
| " ax.plot(xs, ys, 'b-o', markersize=7)\n", | |
| " ax.set_xlabel('SSR weight alpha (BM25 weight = 1 - alpha)')\n", | |
| " ax.set_ylabel('Top-1 ES score')\n", | |
| " ax.set_title('Score vs. SSR / BM25 weight balance')\n", | |
| " ax.grid(True, alpha=0.3)\n", | |
| " plt.tight_layout()\n", | |
| " plt.show()" | |
| ], | |
| "id": "c99a358e042476d8", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Query: \"What causes protein misfolding?\"\n", | |
| " alpha (SSR) beta (BM25) top-1 doc_id top-1 score\n", | |
| "------------------------------------------------------------\n", | |
| " 0.00 1.00 0 0.0000\n", | |
| " 0.20 0.80 289 168.5632\n", | |
| " 0.40 0.60 289 337.1264\n", | |
| " 0.60 0.40 289 505.6896\n", | |
| " 0.80 0.20 289 674.2527\n", | |
| " 1.00 0.00 289 842.8160\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 700x300 with 1 Axes>" | |
| ], | |
| "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAEiCAYAAAAF9zFeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAVTlJREFUeJzt3Qd4E/UfBvBvBy2zUECm7L33XioblCGIkz8CgjJkKQiKIEMQRMSBIKjIVkCmDGXJRpAlG2QjGwplFgr3f95fvOSSpmla2iTXvJ/niSWjyeXuYt987/v7XYCmaZoQEREREZlMoLcXgIiIiIgoIRhkiYiIiMiUGGSJiIiIyJQYZImIiIjIlBhkiYiIiMiUGGSJiIiIyJQYZImIiIjIlBhkiYiIiMiUGGSJiIiIyJQYZImIyKc99dRT6pLQ3y1ZsmSiL9NHH30kAQEBcuXKFZ94n0T+ikGWyMP27t0rrVu3ljx58kjKlCklZ86cUr9+ffnqq6+4Ldy0ceNGady4sVp3WIe5c+eW5557TmbNmmX3uFu3bsngwYNVkEmTJo1kypRJypYtKz179pRz587FCCX6JUWKFJI3b17p0aOHXL9+Pd7bF8+xbdu2WB+DsGJ8vZCQEMmXL5907txZzpw5Y/fYH3/80fo4vG9HOMt4rly51P3PPvus9farV6/Kp59+KrVr15YnnnhCMmTIIFWrVpWff/45xnP88ccfdstjvGzdulX8AfYH7Ae7d+/29qIQUTwEx+fBRPR4Nm/eLE8//bQKXp06dZJs2bKp4IKw8MUXX8jbb7/NVRyHuXPnyosvvmgNpOHh4XLixAlZv369TJ48WV555RX1uAcPHqgQd+jQIWnXrp1atwi2+/fvV4G3ZcuWkiNHDrvnnjBhgqRNm1Zu374tq1evVl8udu7c6TRAxmbp0qWSJUsWqVSpksvHPfnkkzJy5Ej17/v378uBAwdk4sSJ8ttvv8nBgwclderUdo9HYMdy16xZ0+72devWydmzZyU0NNTu9i1btsgHH3wgTZo0kYEDB0pwcLD88ssv8tJLL6nXGjJkSIxlQnB3XO6CBQuKt/3+++8eCbJYJ/gCg32LiMyBQZbIgz7++GNJnz69bN++XVXIjC5duuTRbXHnzp0YYckMUDUrXry4Cv+oZMa2DhcuXCi7du2SmTNnWsOt7t69eyo8OkKlPHPmzOrfb775pgp9qGCiulq5cmW3lm/ZsmWqWoxqpivYD1577TW721CV7d69u2zatElV6Y0QSBHiv/zySxVKdQi3FSpUiHGIu0SJEnL06FFV+dd17dpV6tWrJ6NGjZJ+/fqpKrVRrVq11DrwNY7bmYhIx9YCIg86duyYChiOIRZQxXM0Y8YMFaAQOFF5RIXRsTr1zTffqOdERQ4Vxm7dusU4HK73Ce7YsUM9B57v/fffV/dFRUWpw++ovOE5cJgaIQe3u4LAheolArGjl19+WVWbHz58qK7/9ddf0rBhQxUSU6VKpQJbhw4dJKHrEFVDZ+HGuA7xOKhRo0aMx6G6GRYWFudrIdgZnysuWO+oujdt2lQSAusMjEHVuE7RLrBy5UrrbQjj8+bNixHUAevYGGIB4bpFixZq2x4/ftzpMty8eVOio6PdXmYE66CgILt97rPPPlOv1adPH+tt2BfSpUsn7733nvW2R48eybhx49T+i22SNWtW9QUiIiIizt7RU6dOSbNmzVQYx3bv3bu3qmbjddEq4QhVaBwNwb6PlpTRo0db78Pj9Up0+/btrW0VaOuIC75AtGnTRu1PaF3BUQJ8UTKaMmWKPPPMM2o58RnDFzFU/+OC7Tto0CD1RQVffPBesU+uXbvW7nEnT55UyztmzBiZNGmSFChQQL0O3hO+NDvCUQosM1pO8HksUqSIqt4b/fvvv+ozim2C58I2+uGHH+JcZiJPY5Al8iAEC4TJffv2xflYHOZs27at6tccOnSouo6QuWbNGrvqJIIrAizCQ6tWreTbb7+VBg0aqEPrRghBqBTisCnCA/6oI0ggDOAPIHpMcSgdQefzzz9Xh+9dwf04BI9D6UYItkuWLFGVPQQcVEmxPPhj279/f/Uar776aoJ7L7EOcdgfh9PjehxMmzZN9ZEmBJYZ8CXCHXqQwvuNC4IdQhAu58+fV9tV/0LhLHzjkHe1atVk9uzZ1tuWL18uN27cUJVjd124cEH91CvPRghxCGQIldg/8AUkLghW2I+M7RcbNmyQwMBA9VOH6jhaO/BFSofQ2rdvX/V+0VqD10cFHV96HPdfI+x3CIarVq1S7RAIYfgCYQzJRgjGjRo1kjJlyqjPSdGiRdVjsf6gWLFi6jMG6FOePn26uhiXNTYIhAiuaBNB1RzBHs9hhNCK/RFfHvH6+ByjOj5+/HiXzx0ZGSnfffedCvGoouPzfvnyZbV+nPXyojqPvmis1+HDh6v99/nnn7dbl3///bdUqVJF7W9ob8J6x2cen1ndxYsXVT811i++sOIx2C87duyo/t9B5FM0IvKY33//XQsKClKXatWqaf369dN+++037f79+3aPO3r0qBYYGKi1bNlSe/jwod19jx49Uj8vXbqkhYSEaA0aNLB7zNdff43Upv3www/W2+rUqaNumzhxot1zTZ8+Xb3Ohg0b7G7H4/D4TZs2xfpesBw5c+bUWrVqZXf7nDlz1O+uX79eXV+wYIG6vn37di0xfP/99+r58N6ffvpp7cMPP1TL77ie7ty5oxUpUkQ9Nk+ePNrrr7+ufvfixYsxnnPw4MHqcYcPH9YuX76snTx5Uq2/VKlSaU888YR2+/Ztt5atbdu2al3HRd8ejpdixYppx48ft3vslClTrOsP2zZdunTqvcELL7yg1gHgPTZt2tTl6169elXLkiWLVqtWLbvbsZ2xHbF+Fi1apI0cOVLLlCmTljJlSm3nzp0unxPrPSwsTO3L+n6B38WyYT+/efOmun3s2LFqX4uIiFDXsc3wvmbOnGn3fCtWrIhxO9aXcb1+9tln6jELFy603nb37l2taNGi6va1a9fGWNfTpk2z3hYVFaVly5bNbt/F+sXjsL7doe8zzZo1s7u9a9eu6vY9e/ZYb9O3l1HDhg21/Pnz293m+D6jo6PVshph/WXNmlXr0KGD9bYTJ06o18R6v3btmvV2bEvcvmTJEutttWvXVvvQqVOnnP5/BTp27Khlz55du3Llit1jXnrpJS19+vRO3w+RtzDIEnnYtm3bVEBNnTq1NcAgLOGPju7TTz9Vt+/atSvW55k1a5Z6zLJly+xuxx8+BAvjH2n8cQwNDY3xRxF/hEuUKKHCm/Fy5MgR9dzDhw93+V569eqlwp4eVgCvi4Cr/2FEqMBz4Q+/Y2BPKIQdBPgUKVJY1yFCgWPwvn79uta3b18V8vTHIUx1795du3fvXoxQ4ngpVaqU9tdff7m1TAh02I6jR4+O87HYHnnz5tVWrlypLsuXL9fGjRun5ciRQ4VvfElxFmRxe3BwsPqyEBkZqdb95MmT3QqyWL5GjRqpLwC7d++OcxnxZQrPj8AVFzxv1apV1b/379+vlnfHjh1qXePLG2CfL126tPV3evTooUIR3pPj/pc2bVrtjTfeiDXg1a9f324fcwy4jkEWz+f4WOz75cqVe+wgiy+iRgcPHlS348uAM9gn8R5HjBihHofrsb1Px+2HLyL4XWznsmXLxgiyCNFGCLW4/YsvvlDXsa5xvWfPnrG+L6ynDBkyaJ07d46xXfR9cePGjW6tIyJPYGsBkYehb23+/PnqcCcGEQ0YMED1JeJQPPr49J5MHJpFL11s0CMI6G8zQu9o/vz5rffr0Bfo2FeKwUAYxY9eOeOlcOHCbg1AQ3vB3bt3ZfHixeo6Dh1jsNMLL7xgHexUp04d1fKA1ggczm7evLnqGYyrB9cVHFrFYXz0ZWK2ArRX4P1i+injMqOvEL2QOMSKy/fff6/W19dffy3Dhg2L8bwY1Y8eVByixaFVPBd6CN2BXkQc9nW3Pxb9jhh4hQsOe6O3Euvx8OHD8sknnzj9HWwbPB7Lh30I7QnuDs7CrA0rVqxQh6pxiD0uOJSMbYV+TL3X2VV7AVpmsC+gnSB79uxSvnx59Tp6ewFaD/SeY33fQ1sE+kYd9z/sR672PWxr9IE6DqiLbYYFzBDh+Fi0izj24iZEoUKF7K5jufDZ1dtSAIP3sN2wzdEfj/eo96hjHbgydepUKV26tGr3QA8ufhftPM5+D7OhGOktMfr71PuiXc2ri30Ynyv02jpuF7R+eGNgKpErnLWAyEsQKhFqcUFwxB8JjEpHn2RScBbI0NtYqlQpGTt2rNPfQS+fKwh76N2cM2eOGnCEPjuEGWN/LQIEBiShJxb3I4BiEAl6BXEbBowlFAbuIBzhgpCMsIy+R0y35Qg9inhdTLuFoI9eTPQRGqEnUu8dRc8w1g36eRHSEE5cQYDHunD15SMu+qAehPPYYD2jtxG9ruh5djZw0BHWCwYFIiCj79pd2P4YcISeVFeD4zAlGPowMeUXgqseWPET1zG4CAHJGGSx7yHEYjs4g+CUWNCr7UxCe6ddcQzM+FJat25d1ZeLzxnWKT772F/Qi471EBsM9nz99ddVDyt6ibG+8F7Qj+tsAGJivE99eTCjhrPPESBYE/kKBlkiH1CxYkX1E4N+9KoO/qCgQhvbnJb6YCZU8BDMdAgemFcVFaC44HX27Nmj/tDGNV2Uq8EuGAyCgSmYqgphDgHXEW7DBVOQoaKIgPjTTz/JG2+8IUmxDmODKhXed1wD7hCw8aUCXzAQ1OMaUIUqGQb7PC5UP1GRjA2COAbz4EuAs5MbOMKAIgwS6tWrV6yDoWKDCh4qgXF92cDMGghnCK24IHTpXwwwty8G5+nXddgGGEyEgV7uVr2N+z4+Gwhoxv32n3/+kYRK6P6PyjJmiDAuAz67+BwAvrzh6AOq7caKqePMA87gCyA+26i+G5cvoV929f9PuNr38QUCs0tgP3Tn/yFE3sbWAiIPwh8vZ9URVGeMbQKowKACiJHUjhUb/ffxRwbhAaOkjc+Jw+c47OjOIW6EUEyzg7DhCJVVVOLiguor/lDjECgOXeM5jXBY0/E96+Hc2F6ACpM701zpoSiudYiA7uz0oTgsjRDk2JLhDMI2DktjxLgrGOWNEyckdNot4/6BEOvq0D9CJUbBI5yiauwKgi5G9eN9xFZ1B1RLHWH9IXxhBoa4qtEIuziygBkVTp8+bVeRxX6EfRTBFS0HOuwnCEvOWjww/ZerM6qhtQT7rd7SApg5wNl+7C59Tt34nsnNceYB/Qx9qJYbq6TGzwA+n2iviYuz3/3zzz9V5TshEFLxZQLTaGE7GemvgddEKxDabJwFXmf7CpE3sSJL5EHoU8T0VKiq4VAjqqeYNkivZOo9aOj1w5RC+COPMIApdDCXI/owMdUWDi3ijxL6a3HYGD2WmEYL1VkcQkaocJxs3xkcZka18a233lIhCtUxhAscCsbtaAPQK52xQS+kvrwIpo7TdiHgYpnwnhFm0A+MwIFD1cYKJqrCYOwtdAZ9m6iAIcTh+RC2UdlD5QvvWw936HVF5QrrBZVgBEBUGPFHHMuJIBgXTH2G3lVUGBHSsZ5jC9H6lFXuQpjBoWM9uGHbIaCiOolpylyJ7ZCvEfqv//e//6m+Sqxbx0P41atXt1bosM3wurgNh68R9NEjidaN2Pp1HWE/xWPRGoGWDMBz4QsD3hsOkRuhdxqVZezLmEoKgRnrGxVOtNigyh9b/y9+D33OmFsX2wcBGe8P2yCh1VXsS2jTwNnVUJFEsMU0VcZqqzM4+oF9DPsGAia2Kdo/9C8jeF/4won9EsuNLyrY/7Fu4jp6gJ5vVGPx2cGXJLwWlg/tK66q9q7gSwVaQfC5xTRheH/4zOGIgj6lF7Yj/n+A9482FrzetWvX1Jc1fNbwbyKf4ZEhZUSkYHQ6ps3BNEEYSY0R5AULFtTefvttp9NCYQoojKzGjAPh4eFqRDNGuRthSiY8H0bwY1qeLl26WKc40uH3MDuBM5hJYNSoUep+/XUqVKigDRkyRLtx44ZbW+6DDz5Qo5nxXhxh+qaXX35Zy507t3p+TP/07LPPxpgNAKPucYnL7Nmz1TRABQoUUKPqMUVU8eLF1TJgJL8O01gNGjRIjabHa2K0P2YVwIjvNWvWOB2BjpHZjrAOMLre1bRarVu31po0aaK5y3H6rYCAAC1jxoxqJD1G+xsZZy1wxXHWAv33YrsYR+djVHvlypXVMmA9Yeql1157Tc1c4K6lS5eq523cuLHd7Zh9ALdjai9nJk2apPY3bEtMC4WZIjCV17lz5+zWl+P6x/bF+9WnSHvnnXe0X375Rb3W1q1b49z327VrF2N/w8wh2JewDuKawUDfZw4cOKC2P5Ydnx3MiIGpwIwWL16sZmzAvorZKvB5w2cbv48ZB2J7n5hBALMbYDnx2cH/C3799dcYy67PWoDZThzpM4YY7du3T80igdkJsEyYKQPT2Bnh/0fdunXTcuXKpf7fgunK6tatq7YXkS8JwH+8HaaJiMwK1VRUPVFZxCT35D2YrB9n+MLJMjBLBxElfwyyRESPAVMRoXUCh42NPaCUtNB7axwkhh7ZcuXKqdaYI0eOcPUT+QkGWSIiMh0MpsIsABg4qPcbY05k9MqiR5WI/AMHexERkelg5gKc3AHBFVVYDEjCdG6Ogw2JKHljRZaIiIiITInzyBIRERGRKTHIEhEREZEpsUf2v3NLnzt3Tk2CndDTFBIRERHR48PMsDh5Dk4AFNeZBRlkRVSIzZUrVyKseiIiIiJKDGfOnFGnCXeFQVZEVWL1FYbTZnoCzj8fHh7ukdeixMVtZ27cfubG7Wde3HbmFuHB3BIZGakKjHo+c4VB1nBeboRYTwVZTBfjqdeixMVtZ27cfubG7Wde3Hbm9tALucWddk8O9iIiIiIiU2KQJSIiIqJYPXokcvu25aevYZAlIiIiohj27BFp314kdWqRXLnC1U9cx+2+gkGWiIiIiOzMni1SoYLIjBkiUVGW2/AT13E77vcFDLJEREREZIWKa9u2GOAlEh0tdnAdt+N+X6jMMsgSERERkdW4cZgxQFzC/XictzHIEhEREZGCAV1oG3CsxDrC/XicpolXMcgSERER+bn790WWLrW0DOg9sXHB4+7eFa/iCRGIiIiI/DS8rlwpMmeOyKJFIjduxO/3Q0NFUqUSr2KQJSIiIvITUVGW8Dp3bszwmi2bSKtWIseOiaxa5bq9IDhY5OWX4+6lTWoMskRERER+EF7nzBFZvNg+vGbPbgmvL7wgUqOGSFCQZTYCTLHlCnpje/USr2OQJSIiIkqG4fX3322V18jImOG1TRuR6tUt4dWoTBmR6dMt/bKouBors6jEIsTifjzO27w62Ovhw4fy4YcfSr58+SRVqlRSoEABGTZsmGiGIXD496BBgyR79uzqMfXq1ZOjR4/aPc+1a9fk1VdflbCwMMmQIYN07NhRbt265YV3REREROS98LpkiSWAZski0qyZJXAixCK8vv22yPr1ImfPinz1lUitWjFDrA5tAzt2iLz2mqUXFvAT13E77vcFXq3Ijho1SiZMmCBTp06VEiVKyF9//SXt27eX9OnTS48ePdRjRo8eLV9++aV6DAIvgm/Dhg3lwIEDkjJlSvUYhNjz58/LypUr5cGDB+o5OnfuLLNmzfLm2yMiIiJKUvfu2SqvaBswVl5z5LCvvAbGs3yJiuuUKSLffy9y7lyE5MwZ7vWeWJ8Ksps3b5bmzZtL06ZN1fW8efPK7NmzZdu2bdZq7Lhx42TgwIHqcTBt2jTJmjWrLFy4UF566SU5ePCgrFixQrZv3y4VK1ZUj/nqq6+kSZMmMmbMGMmBrUhERESUDMProkUiN2/a7kPsad3a0vOakPDqDJ4jTRrvD+zyudaC6tWry+rVq+XIkSPq+p49e2Tjxo3SuHFjdf3EiRNy4cIF1U6gQ7W2SpUqsmXLFnUdP9FOoIdYwOMDAwPlzz//dPq6UVFREhkZaXchIiIi8uXwitCKQ/toG0B9b8YMS4hFeMWB7I0bRc6cEfniC5GaNRMnxPo6r1Zk+/fvr0Jk0aJFJSgoSPXMfvzxx6pVABBiARVYI1zX78PPLNiiBsHBwZIxY0brYxyNHDlShgwZEuP2iIgItQyewPBsXtx25sbtZ27cfubFbZew8LpmTQpZtCiFLF8eIrdu2Uqi2bM/kmbN7kvz5velcuWH1tAa37lgfXH7xee1vBpk58yZIzNnzlS9rOiR3b17t/Tq1Uu1A7Rr1y7JXnfAgAHSp08fuxWWK1cuCQ8PVwPGPAWvR+bEbWdu3H7mxu1nXtx27oXXFSssbQMYuGVsG8iZ09I2gJ7XqlUDJTAQY4Us44WS0/ZDcdMUQbZv376qKoteVyhVqpScOnVKVUwRZLNhZl4RuXjxopq1QIfrZcuWVf/GYy5dumT3vNHR0WomA/33HYWGhqoLERERkS+FVwzYMk689OSTtp7XqlX9o10gPrwaZO/cuaN6WR1T+KNHj9S/MUsBwij6aPXgiuopel+7dOmirlerVk2uX78uO3bskAr/zd67Zs0a9RzopSUiIiLyNXfv2ldenYVXVF4RZRhefTTIPvfcc6onNnfu3Kq1YNeuXTJ27Fjp0KGDuj8gIEC1GgwfPlwKFSpknX4LrQctWrRQjylWrJg0atRIOnXqJBMnTlTTb3Xv3l1VeTljAREREZkhvObKZau8MryaJMhimiwE065du6r2AATPN998U50AQdevXz+5ffu2mhcWldeaNWuq6bb0OWQBfbYIr3Xr1lUV3latWqm5Z4mIiIi8HV6XL7eE119/dR5eUXmtXJmV14QI0Iyn0fJTaFfAtF43btzw2GAvzJDApndz4rYzN24/c+P2My9/2nbG8IrK6+3b9uEVVVdczBReIzy4/eKTy7xakSUiIiJKTuF1zhxL5dUYXnPntq+8+uKJBcyKQZaIiIgoAe7csW8bcAyvxsorw2vSYJAlIiIiimd4ReV16VL78Jonj63yWqkSw6snMMgSERERxRFely2zVV5x3Rhe9corw6vnMcgSERERxRJe9cqrs/CKymvFiqy8ehODLBEREZFY2gT0yqtjeM2b11Z5ZXj1HQyyREREJP4eXlF5xU/H8IqqK8IrTh7KAVu+h0GWiIiI/C68ouKqV14xdZYuXz5b5ZXh1fcxyBIREZHfhFe98uoYXvXKa/nyrLyaCYMsERERJUs4HaxeeXUMr/nz2yqvDK/mxSBLREREfhNe9cpruXKsvCYHDLJERERk+vCK+V318Hrvnu2+AgVslVeG1+SHQZaIiIiSXXjVK69ly7LympwxyBIREZEp3LxpC684TawxvBYsaKu8Mrz6DwZZIiIiMm141SuvZcqw8uqPGGSJiIgoST16ZJn+Kn16kcBA98LrkiW28BoVZbuvUCFb5ZXhlRhkiYiIKEns2SMybpzI7NkIo+ESGiry8ssivXpZQmh8wqteeS1dmpVXsmGQJSIiokSH8Nq2rSV0RkdbbkM4nTFDZPp0y6VpU1t4XbHCPrwWLmyrvDK8UmwYZImIiCjRK7EIsQ8fxrxPD7WvvioSHCzy4IF9eNUrr6VKsfJKcWOQJSIiokSFdgJUYl3RNEuILVLEVnlleKX4YpAlIiKiRB3YhbYCvfLqSkiIyIED7g0AI3KGQZaIiIgSxY0bln5XY6+rK/fvW6bTSp2aG4AShkGWiIiIHiu8Ll5sCbC//WYJp+7CLAapUnHlU8IxyBIREVG8XL9uC6+//24fXosVs7QM7NvnfLCXNYAEW6biiquXlsgVBlkiIiKKV3hF5dU42wDCqz7bQIkSllkLKlSIe7AX5pMlehwMskRERBRreF20yFZ5NYbX4sVtsw0gvBrhZAeYJ9ZxHlkVPIItIRb3O54UgSi+GGSJiIjI7fCqV17xb1fQNoDH2M7sJS7P7EXk8SB77949SZky5eM8BREREXlZRIQtvK5caR9eUW3VK69xhVdHCKtTpoh8/73IuXMRkjNnOHtiybtB9tGjR/Lxxx/LxIkT5eLFi3LkyBHJnz+/fPjhh5I3b17p2LFj4i4hEREReTy86pVX9L8+LswTmyYNB3ZR4ov3FMTDhw+XH3/8UUaPHi0hGJb4n5IlS8p3332X2MtHREREiRheUSFt0kQka1aR9u1Fli2zhNiSJUWGDLGcoAAzDgwalDghlsinKrLTpk2TSZMmSd26deWtt96y3l6mTBk5dOhQYi8fERERPWZ4XbjQVnk1DrxCeNUrr0WLcjWTHwTZf//9VwoWLOi05eCB8bgEERERecW1a7bwumqVfXgtVcrW88rwSn4XZIsXLy4bNmyQPHny2N0+b948KVeuXGIuGxERESVSeNUrr0WKcJWSH/fIDho0SLp37y6jRo1SVdj58+dLp06d1AAw3JeQCu9rr70mmTJlklSpUkmpUqXkr7/+st6vaZp63uzZs6v769WrJ0ePHrV7jmvXrsmrr74qYWFhkiFDBjXg7NatW/FeFiIiIjO5etUyI0CjRpaeV4y3XrHCEmJLlxYZNkwEXX9//y0ycCBDLCU/8a7INm/eXJYsWSJDhw6VNGnSqJBZvnx5dVv9+vXj9VwRERFSo0YNefrpp2X58uXyxBNPqJAaHh5ufQwGlX355ZcydepUyZcvn5odoWHDhnLgwAHr1F8IsefPn5eVK1eq9ob27dtL586dZdasWfF9e0RERD4fXvXK6+rV9pVXhFe98lq4sDeXksgzAjSUPN0UHR0tI0aMkA4dOsiTTz752C/ev39/2bRpk2pVcAaLliNHDnnnnXfk3XffVbfduHFDsmbNqmZOeOmll+TgwYOq3WH79u1SsWJF9ZgVK1ZIkyZN5OzZs+r34xIZGSnp06dXz42qricgxBsDO5kHt525cfuZm79uP4TXBQss4XXNGvvwirla9Z5XXw6v/rrtkosID26/+OSyeLUWBAcHqwopAm1iWLx4sQqfL7zwgmTJkkX12E6ePNl6/4kTJ+TChQuqnUCHN1alShXZsmWLuo6faCfQQyzg8YGBgfLnn386fd2oqCi1kowXIiIiXwuvmNWyYUNL20CnTpYzbeFPMMLrxx+LHD4ssnu3yAcf+HaIJfKZ1gJMu7Vu3Tp18oPHdfz4cZkwYYL06dNH3n//fVVV7dGjh5qftl27dirEAiqwRriu34efCMGOgTtjxozWxzgaOXKkDMFkeU6+bTx8+FA8geHZvLjtzI3bz9yS+/a7ejVAfv01hSxaFCIbNgTLw4cB1vtKlYqW5s0fSPPm96VAgUd202uZQXLfdsldpAe3X3xeK95BtnHjxqolYO/evVKhQgXVJ2vUrFkzt58Lg8VQSUW7AqAiu2/fPnXWMATZpDJgwAAVno0rLFeuXKpk7qnWAuAhFvPitjM3bj9zS27b78oV+7YBYz2lbFlLz2vr1iKFCuFPNi6pxKyS27bzN+Ee2n5BQUFJF2S7du2qfo4dOzbGfQEBAfGqaGImAvS3GhUrVkx++eUX9e9s2bKpnzgVLh6rw/Wy+HT/95hLly7ZPQdaHzCTgf77jkJDQ9WFiIjIGy5ftoXXtWvtwytmstR7Xp1M205EjxNkUUVNLJix4DAafAyOHDlinaMWsxQgjK5evdoaXFE9Re9rly5d1PVq1arJ9evXZceOHapCDGvWrFHLiV5aIiIiM4RXvfLK8EqUhEE2MfXu3VuqV6+uWgvatGkj27ZtU6e/xUWv8Pbq1UuGDx8uhQoVsk6/hZkIWrRoYa3gNmrUSM1li5YETL+FeW4xo4E7MxYQERElZXidP98SXv/4wz68li9vqboyvBJ5OMhisNeYMWPU1FeA9oC+fftKrVq14vU8lSpVkgULFqieVcxLi6A6btw4NS+srl+/fnL79m01LywqrzVr1lTTa+lzyMLMmTNVeMVANMxW0KpVKzX3LBERkTfDKyqvxgOZCK965bVAAW4bIo/OIwszZsxQJxx4/vnnVWsAYC5YBFLM7frKK6+I2XAeWYoPzoVobtx+5uar2w9DNYyVV2N4RdebXnn15/Dqq9uOzD2PbLwrsjgVLeaSRVuADlNmYfDXsGHDTBlkiYiIEjO8YmpzPbzmz891S5RUghMy9+tzzz0X43ZMu4W5YImIiJKrixdt4XXdOoZXItMFWcy3ilkECjoMq1y1apW6j4iIyF/Ca6VKtsprvnzeXEoi/xTvIPvOO++oVoLdu3erGQf0Hln0x37xxRdJsYxEREQehRND6uF1/XqGV6JkE2Qxfyvmdv3ss89kzpw51imwfv75Z2nevHlSLCMREZFHwysqr8ah0JUr2yqviXCGdiLy5vRbLVu2VBciIiKzh1ecTFKvvDK8EiXzILt9+3anZ83C2bZwbtyKGKpJRERkwvCKP2165fW/k0wSkQ8LjO8vdOvWTc6cORPj9n///VfdR0RE5GvOnxf5+muROnVEcNLH7t1t7QMIr2PGiJw8KbJ1K8aCMMQSJduK7IEDB6Q8Tk3ioFy5cuo+IiKipIDZAm7fFkmfXiQw0L3wqldeN2ywr7xWrWqrvObOze1F5DdBNjQ0VC5evCj5HWZ4Pn/+vAQHJ6jlloiIKFZ79oiMGycye7ZIVFS4hIaKvPyySK9eImXK2D/23DlbeN24keGVKLmLd/Js0KCBDBgwQBYtWqROHwbXr19XJ0OoX79+UiwjERH5KYTXtm1FAgJEoqMtt0VF4XTpItOnWy5oF4gtvFarZqm8tmrFyitRchTvIDtmzBipXbu25MmTR7UTAOaUzZo1q0zH/1GIiIgSqRKLEPvwYcz79FDr7KzoenhF2wDP00OUvMU7yObMmVP+/vtvmTlzpuzZs0dSpUol7du3l5dffllSpEiRNEtJRER+B+0EqMS6A+fn0SuvDK9E/iNBTa1p0qSRzp07J/7SEBER/TewC20FeuXVlZAQS0uBu6GXiPx4+q2pU6fK0qVLrdf79esnGTJkUKerPXXqVGIvHxER+Zl//7VMh4VeWHfcvy9y925SLxURJYsgO2LECNVOAFu2bJGvv/5aRo8eLZkzZ5bevXsnxTISEVEyd/aspZWgRg2RJ58Uee89938Xsxj892eJiPxMvFsLcDKEggULqn8vXLhQWrdurdoMatSoIU899VRSLCMRESVDCK/z5llmG9i82f4+BNoHD0R27HA+2EuHWR8xFRfbCoj8U7yDbNq0aeXq1auSO3du+f3336VPnz7q9pQpU8pdHtshIiIXcGJIPbxu2WK7HUEU4VUfsJUzp2XWggoVXK9OTLWF+WSJyD/FO8hirtg33nhDTb115MgRadKkibp9//79kjdv3qRYRiIiSsbhtU0bS3jFqWONcLIDzOroOI+sXolFiMX9jidFICL/Ee8gO378eBk4cKBqMfjll18kU6ZM6vYdO3aoKbiIiIhOn7aF161bbesDgbRmTVvl1TG8OsKfleLFjWf2Epdn9iIi/xKgacZzoPinyMhIdZayGzduSFhYmEdeMyIiQsLDwz3yWpS4uO3MjdvPe+EVldfnn487vLqakuvcuQjJmTOcPbEmxM+euUV4MLfEJ5claB5ZIiIiY3idM0fkzz/tw2utWpbK6+OEV6PAQMxjzoFdRGTDIEtERPGCKcP1yquz8KpXXrNn54oloqTFIEtERG6HV1Ret22zD6+1a9sqrwyvRORJDLJEROTUyZO2yivDKxElyyC7bt06uX37tlSrVo2Dl4iIkkl4ReV1+3b7ymudOrbKa7Zs3lxKIqJ4BtlRo0bJrVu3ZNiwYeo6Jjto3LixOikCZMmSRVavXi0lSpRw9ymJiMhHwiuqrrgYwysGVxnbBhheicjXBLr7wJ9//llKlixpvT5v3jxZv369bNiwQa5cuSIVK1aUIUOGJNVyEhFRIjpxQuTTT0UqVRLJl0+kXz9LiEV4ffppkW++wVRXImvXinTtyhBLRCavyJ44cUJKly5tvb5s2TJp3bq11MBpWUTUSRJewNd2IiLy2fCqV17/+st2O8KrsW0ga1ZvLiURURIE2ejoaAnF6VT+s2XLFullOMF1jhw5VGWWiIjMEV6fesoSXlu2ZHglomQeZAsUKKBaCfLnzy+nT5+WI0eOSG00T/3n7Nmz1tPVEhGR9xw/bguvO3Y4D6+ovGbJwq1ERH4SZLt16ybdu3dXPbFbt25VsxQUxwmw/7NmzRopV65cUi0nERElMLyi51WvvDK8EpFfBtlOnTpJUFCQLFmyRFViBw8ebHf/uXPnpH379kmxjERE5MSxY7bwunOn7XaGVyLyF27PWgAdOnSQBQsWyIQJEySbwzws33zzjTyPY1UJ9Mknn0hAQIBd3+29e/dUJRgtC2nTppVWrVrJxYsX7X4PbQ5NmzaV1KlTqynA+vbtq/p5iYiSa3j95BORChVEChYUGTDAEmIRXuvVE/n2W5ELF0RWrRJ5801WYIkoeXM7yM6ZM0fu379v1xP76NEj6/U7d+7I6NGjE7QQ27dvl2+//dZuVgTo3bu3qgDPnTtXnXgBVV9jWH748KEKsViuzZs3y9SpU+XHH3+UQYMGJWg5iIh80T//iIwcKVK+vH14DQqyD68rV4p07izyxBPeXmIiIg/R3BQYGKhdvHjRej1dunTasWPHrNcvXLigHhNfN2/e1AoVKqStXLlSq1OnjtazZ091+/Xr17UUKVJoc+fOtT724MGDGhZ5y5Yt6vqyZcvUa+K1dRMmTNDCwsK0qKgot5fhxo0b6nnx01OuXbvmsdeixMVtZ25m2X5Hj2raiBGaVq6cpuH/1PolKEjT6tfXtEmTNO3SJc3vmGX7UUzcduZ2zYOfvfjkMrcrsjiTl6vrCYXWAVRV66GsYLBjxw558OCB3e1FixaV3Llzq6m/AD9LlSolWQ2THjZs2FAiIyNl//79sb5mVFSUeozxQkTkbUePiowYIYJxs4UKibz/vsiuXZbKa/36IpMmWSqvOKFip06svBIRuT3YKyn89NNPsnPnTtVa4OjChQsSEhIiGTJksLsdoRX36Y8xhlj9fv2+2IwcOdLpWcgiIiJUu4InMDybF7edufna9jt2LFAWLQqRRYtSyN69tv8lBwVpUqtWtLRocV+aNn0gmTLZigcREeK3fG37kfu47cwt0oOfvfi8lteC7JkzZ6Rnz56ycuVKSZkypUdfe8CAAdKnTx+7FZYrVy4JDw+XsLAwjy0HXo/MidvO3Ly9/Y4csc02sGeP7XZUXuvWtUyV1aJFgGTOnEJEcCFf2n6UcNx25hbuoc8eZslKkiD722+/Sfr06dW/MdBr9erVsm/fPnX9+vXr8VpItA5cunRJymP0wn9QDcVJF77++mv1WhjEhec1VmUxa4E+YwJ+btu2ze559VkNHGdVMMIZyoxnKSMi8nZ4bdMG4VWE55UhIpKkCbLt2rWzu/4m5nYxwPRZ7qpbt67s3bvX7jbMQ4s+2Pfee09VSFOkSKHCMqbdgsOHD6vptnAyBsDPjz/+WAViTL0FqPCiqmo8WQMRkTfD65w5In//bbs9ONhYeWV4JSJK8iBrnGorMaRLl05Klixpd1uaNGnUnLH67R07dlQtABkzZlTh9O2331bhtWrVqur+Bg0aqMDatm1bNfUX+mIHDhyoBpCx4kpE3nD4sK3y6iy8ovLavDnDKxGR6Qd7xeXzzz+XwMBAVZHFTAOYkQAnXjD2UPz666/SpUsXFXARhFE1Hjp0qFeXm4j8M7yi8mo80ITwiolX9MprxozeXEoiouQnAHNwiZ/DYC/0/t64ccNjg70wQwKb3s2J287cEmv7HTpkq7w6C6965ZXhNXHx82de3HbmFuHB3BKfXObTFVkiIl+ih1dUXv8b52oNr5jnFZVXhlciIs9hkCUiv4FW/9u3RTD5SqCbp4M5eNBWeWV4JSLyLQyyRJTsYbqrceNEZs/Gmf3CBbPvvfyySK9eImXKxB5eUXk1niQwRQr7yiunMyUi8i4GWSJK1hBe27bF9IAi0dGW26KiRGbMEJk+3XJBqD1wwFZ5ZXglIvKzILtnzx51cgNPneKViMidSixCrLP/Lemh9tVXRT78EKeKta+8Nmhgqbw2a8bKKxGRX1RkOQECEfkStBPEdZ4WzNuCEGsMr2gbMJxQkIiIzB5kn3/+eZf3Y4qE+JzZi4goqQd2oa1Ar7y6glkHcHZr9rwSESXTILtkyRKpX7++ZM2a1en9bCkgIl+yY4elF9YdCLsYAEZERMk0yBYrVkydYQunjXVm9+7d6ixbRETegBYBDNLSB2xh5gF3IcSmSpWUS0dERF4NshUqVJCdO3fGGmRDQ0Mld+7ciblsRERuhVdMk4XwihMW6EJCRLJkETl3ztJm4KqtALMWsDOKiCgZB9mJEye6bB9AxfbEiROJtVxERLGGV5yYQK+8OobXRo0sA7aee07k5El8CY/7+TCfLBERJeMgi4orEZE3w6teeT18OPbwirN26XCyA8wT6ziPrF6JxfPifmcnRSAiomQ+/VbTpk3lu+++k+zZsyfeEhER/Rde9+61VV6N4RXfq43hNSws9lWGtoHixY1n9pI4z+xFRER+EGTXr18vd+/eTbylISK/podXvfJ65EjCwqsjhNUpU0S+/x49sxGSM2c4e2KJiJIBnqKWiLweXv/+21Z5dQyvjRtbwuuzz8YvvDoTGCiSJg0HdhERJRePFWTz5MkjKXA6HCKiBIRXvfJ69GjShVciIkq+HivI7sPoCyIiN8Prnj22yqtjeG3SxBZe06XjKiUioiQKshEREfL999/Lwf9mHMfUWx06dJCMGTMm5OmIKJmHV73y+s8/tvtSprSvvDK8EhFRkgdZDPBq1qyZhIWFScWKFdVtX331lQwbNkydxrZ27drxXggiSl7hdfduW+XVMbzqldemTRleiYjIw0G2W7du0qZNG5kwYYIEBQWp23CihK5du6r79mLIMRH5ZXjVK6/HjjkPr6i8pk3rzSUlIiK/DrL//POPzJs3zxpiAf/u06ePTJs2LbGXj4h8OLzu2mWrvDqGV1Rc9corwysREflEkC1fvrzqjS1SpIjd7bitDGcWJ/KL8KpXXo8ft92XKpV92wDDKxER+VyQ7dGjh/Ts2VNVZqtWrapu27p1q4wfP14++eQT+Rtz6vyndOnSibu0ROSV8Lpzp63y6hhe9corQizDKxER+XSQfRnndRSRfv36Ob0vICBANE1TP9E7S0TmDa+ovM6bF3t4xU+cYICIiMgUQfbEiRNJsyRE5PXwumOHrfJq/Kjr4bVNG0vlleGViIhMGWRxNi8iSl7hVa+8GsNr6tT2bQMMr0RElCxOiHDs2DEZN26c9YQIxYsXV32zBQoUSOzlI6IkCK9//WWrvJ48GTO8ovKKkxUwvBIRUbIKsr/99ps6IULZsmWlRo0a6rZNmzZJiRIl1AkR6tevnxTLSUSJEF71yqtjeMX8rnrlFdeJiIiSZZDt37+/9O7dW81Q4Hj7e++9xyBL5EPhdft2S9U1tvCqV14ZXomIyC+CLNoJ5qCs46BDhw6q3YCIvB9e9crrqVO2+9AmoFdeGV6JiMgvg+wTTzwhu3fvlkKFCtndjtuyZMmSmMtGRG6G123bbJVXx/D63HOW8NqoESuvRETkp0F26NCh8u6770qnTp2kc+fOcvz4calevbq1R3bUqFHqNLVE5LnwqldeT592Hl5RecXUWURERMmR20F2yJAh8tZbb8mHH34o6dKlk88++0wGDBig7suRI4d89NFH6qxfRJR04fXPP22VV8fw2qyZrfLK8EpERP4g0N0H4mxdgDN2YbDX2bNn5caNG+qCf2P6LdwXHyNHjpRKlSqpYIy2hBYtWsjhw4ftHnPv3j3p1q2bZMqUSdKmTSutWrWSixcv2j3m9OnT0rRpU0mdOrV6nr59+0p0dHS8loXIFz16JLJliwgOdmAK52rVRMaOtYRYnA4WJ9qbP1/k8mWRWbNEWrZkiCUiIv8Rrx5Zx6CKAPo41q1bp0IqwiyC5/vvvy8NGjSQAwcOSJr/JrBEaF66dKnMnTtX0qdPL927d5fnn39etTMAToOLEJstWzbZvHmznD9/Xv73v/9JihQpZMSIEY+1fETeCq965RWXs2dt9yG86pXXhg0ZWomIyL8FaHqpNQ6BgYEqSMZVdb127VqCF+by5cuqooqAW7t2bVXtxeCyWbNmSevWrdVjDh06JMWKFZMtW7ZI1apVZfny5fLss8/KuXPnJGvWrOoxEydOVFOB4flCQkLifN3IyEj13vB6YWFh4gkRERESHh7ukdci3992CK9bt9raBhhekw4/e+bG7Wde3HbmFuHB3BKfXBaviiz6ZPHESQULDBkzZlQ/d+zYIQ8ePJB69epZH1O0aFHJnTu3NcjiZ6lSpawhFho2bChdunSR/fv3S7ly5WK8TlRUlLoYVxiRp7kKrzjYYay8pkzJ7UNERPRYQfall15Ksim2Hj16JL169VJnCytZsqS67cKFC6qimiFDBrvHIrTiPv0xxhCr36/fF1tvLkK5s28baFXwBIZn83qcbYfwum1bkCxaFCKLF4fI+fO2NvW0aTVp3Pi+NG/+QJ555oE1vN69a7lQ4uBnz9y4/cyL287cIj1Y9IvPa7kdZOM7kCu+0Cu7b98+2bhxoyQ1zLZgnCoMKyxXrlyqZO6p1gJga4H5IIjevi2SPn24BAbGb8CWXnn991/7ymvz5pbKa4MGAZIyZaiI4EJJiZ89c+P2My9uO3ML91BrQVBQUOIHWTdbaRMEA7h+/fVXWb9+vTz55JPW2zGA6/79+3L9+nW7qixmLcB9+mO2YUJNA31WA/0xjkJDQ9WFyF179ojgxHWzZ6M1JVyw+2DGgF69RMqUcR5eN2+2hNdffrEPr/iupLcNNGjAtgEiIqIkn34Lh/4Tu60A4RghdsGCBbJmzRrJly+f3f0VKlRQsw+sXr3aehum58J0W9UwD5FgOqJqsnfvXrl06ZL1MStXrlSV1eLFiyfq8pJ/QnitUEFkxgyEWMtt+InruB336+EVBxR69hTJlUukVi2RL7+0hFiE17ZtRRYvFsGuOn26Jcyy95WIiMiDp6hN7HYCzEiwaNEiNZWX3tOKAWWpUqVSPzt27KjaADAADOH07bffVuEVA70A03UhsLZt21ZGjx6tnmPgwIHquVl1pcSoxCKAOmud1qcqfu01S0Bdv17k3Dnb/QivtrYBHAng9iAiIko2QXbChAnq51NPPWV3+5QpU+T1119X//7888/V1F84EQJmGsCMBN98841dHwXaEjBLAQIu5p9t166dOqUu0eNCO0Fc7eGoxP70ky28tmhhCa/16zO8EhER+cQ8sskZ55Gl2AJq6tS2dgJXMPBr4UJWXs2Ac1maG7efeXHbmVuEj84j63aPLJG/uXXLvRCrh966dVmBJSIi8iQGWSID9MKi17V7d5HChd1fNeh/TZWKq5KIiMhvemSJfCW8YrYBfaos43k0UqSwDOpy1YATHGyZiiuJp1omIiIiBwyy5Nfhdc4ckfnz7cMrpizWB2xhxjlMkOHqhG8IuZhPloiIiDyLQZb8BsLohg22yut/582wC69t2lh6XUNCbPdhzldMwYWKqz7lll6JRYjF/c5OikBERERJi0GW/CK86pVXY3jF4Eu98uoYXo3QNoBza9jO7CVxntmLiIiIkh6DLCXbAVuovMYWXlF5feaZ2MOrI4TVKVNEvv8eJz2IkJw5w9kTS0RE5GUMspSswqteeTWcsViF15YtbZVXDOBKKMwXmyYNB3YRERH5AgZZMi30qxorr8bwmjGjfeX1ccIrERER+SYGWTJleNUrr5cv24dXvfLK8EpERJT8MciSKcLrunW2yquz8IrK69NPs/JKRETkTxhkyafDKyqvCxbYh9dMmWyVV4ZXIiIi/8UgSz4VXv/4w1Z5vXIlZnhF5fWpp1h5JSIiIgZZ8pHwqldeHcPr889bKq8Mr0REROSIFVnySnhdu9ZSeY0tvOqVV5w9i4iIiMgZxgTyaHjVK69Xr9ruy5zZvvLK8EpERETuYJClJPPggX3l1Vl4ReW1Th2GVyIiIoo/BlnyWHh94glb5ZXhlYiIiB4XgywlSnhds8YWXq9dixleUXmtXZuVVyIiIko8DLKUJOG1VStL5ZXhlYiIiJIKgyzFK7yuXm0JrwsX2ofXLFlsbQMMr0REROQJDLLkdnhF5TUiwj68GiuvQUFcmUREROQ5DLIUw/379pVXhlciIiLyRQyyFGd4zZrVVnmtVYuVVyIiIvINDLJ+Hl5XrbKF1+vXbfcxvBIREZGvY5D1M3GF19atLZXXmjVZeSUiIiLfxiDrR+EVp4ddtMg+vGbLZmsbYHglIiIiM2GQTcbhdeVKS+XVWXjVK681arDySkRERObEIJsMw6teeb1xw3Zf9uy2yivDKxERESUHDLImFxVlX3l1Fl5xetjq1Vl5JSIiouSFQdbE4RWV18WLY4ZXY9tAYKA3l5SIiIgo6TDIesGjRyK3b4ukT+9+0ER4/f13W+U1MtJ2X44c9pVXhlciIiLyBwyyHrRnj8i4cSKzZyOYhktoqMjLL4v06iVSpkzs4VWvvDqGV73yyvBKRERE/ijZHHgeP3685M2bV1KmTClVqlSRbdu2iS9BeK1QQWTGDEtABfzEddyO++HePUtobdtWJEsWkWbNLI9BiEV47dFDZONGkTNnRL74wjJlFiuwRERE5I+SRUX2559/lj59+sjEiRNViB03bpw0bNhQDh8+LFmQBn2gEotg+vBhzPuioy0/X3vNElg3bBC5edN2f86ctsprtWoMrURERETJqiI7duxY6dSpk7Rv316KFy+uAm3q1Knlhx9+EF+AdoKAgLj7Zpcts4RYhNeePUU2bRI5fdry+xy4RURERJTMKrL379+XHTt2yIABA6y3BQYGSr169WTLli1OfycqKkpddJHG5tNEhoCKtgG98upKUJDIunWsvBIRERH5RZC9cuWKPHz4ULJmzWp3O64fOnTI6e+MHDlShgwZEuP2iIgI9VyJCbMTYGCXO/DSefNG2E2nRb4nKb/4UNLj9jM3bj/z4rYzt0gP/u2Lz2uZPsgmBKq36Kk1rrBcuXJJeHi4hIWFJeprYYotzE5gKADHCo/LkSM8zjYE8j7sK2Re3H7mxu1nXtx25hbuob99QThE7S89spkzZ1Zv+OLFi3a343q2bNmc/k5oaKgKrMZLUsGMAphiKziOrwy4H49jiCUiIiLykyAbEhIiFSpUkNWrV1tve/TokbpeDcP8fQDmidU014/B/XgcEREREflJkAW0CUyePFmmTp0qBw8elC5dusjt27fVLAa+ACc7mD7dMpjLsTKL67gd9zs7KQIRERERJeMe2RdffFEuX74sgwYNkgsXLkjZsmVlxYoVMQaAeRPaBooXN57ZS+I8sxcRERERxS5A0+I66J38YbBX+vTp5caNG0naL2uckuvcuQjJmZMDu8wIs1twwIJ5cfuZG7efeXHbmVuEB//2xSeXJYvWArPBALA0aTiwi4iIiOhxMMgSERERkSklix7Zx6V3V3h6st/4zJNGvoPbzty4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" | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "execution_count": 77 | |
| }, | |
| { | |
| "metadata": { | |
| "ExecuteTime": { | |
| "end_time": "2026-07-10T13:46:02.143705Z", | |
| "start_time": "2026-07-10T13:46:01.732461Z" | |
| } | |
| }, | |
| "cell_type": "code", | |
| "source": [ | |
| "import time\n", | |
| "\n", | |
| "def compare(query_text, top_k=5, sparse_weight=0.7, bm25_weight=0.3):\n", | |
| " # --- Elasticsearch (rank_features + BM25) ---\n", | |
| " t0 = time.perf_counter()\n", | |
| " es_res = ssr_es_search(\n", | |
| " query_text, tokenizer, encoder, sae_real,\n", | |
| " top_k=top_k, sparse_weight=sparse_weight, bm25_weight=bm25_weight\n", | |
| " )\n", | |
| " es_ms = (time.perf_counter() - t0) * 1000\n", | |
| " es_ids = [r['doc_id'] for r in es_res]\n", | |
| "\n", | |
| " # --- Native Python SSR++ ---\n", | |
| " inputs = tokenizer(query_text, return_tensors='pt',\n", | |
| " truncation=True, max_length=64)\n", | |
| " with torch.no_grad():\n", | |
| " q_emb = encoder(**inputs).last_hidden_state.squeeze(0)\n", | |
| " t0 = time.perf_counter()\n", | |
| " native_res = retriever_real.retrieve(q_emb, top_k=top_k, mode='ssr++')\n", | |
| " native_ms = (time.perf_counter() - t0) * 1000\n", | |
| " native_ids = [doc_id for doc_id, _ in native_res]\n", | |
| "\n", | |
| " overlap = len(set(es_ids) & set(native_ids))\n", | |
| "\n", | |
| " print(f'Query: \"{query_text}\"')\n", | |
| " print(f' {\"Rank\":<5} {\"ES doc_id\":<12} {\"Native doc_id\":<14}')\n", | |
| " for i in range(top_k):\n", | |
| " e = str(es_ids[i]) if i < len(es_ids) else '-'\n", | |
| " n = str(native_ids[i]) if i < len(native_ids) else '-'\n", | |
| " mark = ' <<' if e == n else ''\n", | |
| " print(f' {i+1:<5} {e:<12} {n:<14}{mark}')\n", | |
| " print(f' Overlap top-{top_k}: {overlap}/{top_k}')\n", | |
| " print(f' ES: {es_ms:.1f}ms Native SSR++: {native_ms:.1f}ms')\n", | |
| " print()\n", | |
| " return overlap / top_k\n", | |
| "\n", | |
| "\n", | |
| "overlaps = [compare(q, top_k=5) for q in test_queries_es]\n", | |
| "print(f'Average top-5 overlap: {sum(overlaps)/len(overlaps):.0%}')" | |
| ], | |
| "id": "3c94dac567f18d4f", | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Query: \"What causes protein misfolding?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 289 57 \n", | |
| " 2 57 289 \n", | |
| " 3 326 52 \n", | |
| " 4 189 335 \n", | |
| " 5 93 93 <<\n", | |
| " Overlap top-5: 3/5\n", | |
| " ES: 55.2ms Native SSR++: 59.1ms\n", | |
| "\n", | |
| "Query: \"How does climate change affect biodiversity?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 189 57 \n", | |
| " 2 480 335 \n", | |
| " 3 370 289 \n", | |
| " 4 289 187 \n", | |
| " 5 335 248 \n", | |
| " Overlap top-5: 2/5\n", | |
| " ES: 57.2ms Native SSR++: 28.1ms\n", | |
| "\n", | |
| "Query: \"What is the mechanism of DNA replication?\"\n", | |
| " Rank ES doc_id Native doc_id \n", | |
| " 1 350 57 \n", | |
| " 2 442 442 <<\n", | |
| " 3 169 289 \n", | |
| " 4 370 350 \n", | |
| " 5 480 187 \n", | |
| " Overlap top-5: 2/5\n", | |
| " ES: 57.8ms Native SSR++: 28.1ms\n", | |
| "\n", | |
| "Average top-5 overlap: 47%\n" | |
| ] | |
| } | |
| ], | |
| "execution_count": 78 | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "name": "python", | |
| "version": "3.10.0" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment