Buckets:

Rishik001's picture
download
raw
2.45 kB
"""
Neural network modules for SAE-based topic classification.
"""
import torch
import torch.nn as nn
class TopKSAE(nn.Module):
"""Sparse autoencoder that keeps only the top-k activations per token (Qwen-Scope format)."""
def __init__(self, d_model, d_sae, k):
super().__init__()
self.d_model = d_model
self.d_sae = d_sae
self.k = k
# W_enc stored as (d_sae, d_model) — Qwen convention; note Gemma Scope uses (d_model, d_sae)
self.register_buffer("W_enc", torch.zeros(d_sae, d_model))
self.register_buffer("b_enc", torch.zeros(d_sae))
def fired_mask(self, x):
"""Return (n_tokens, d_sae) bool mask with True at each token's top-k feature positions."""
# W_enc is (d_sae, d_model), so x @ W_enc.T gives (n_tokens, d_sae)
pre = x @ self.W_enc.T + self.b_enc
topk_idx = pre.topk(self.k, dim=-1).indices # (n_tokens, k)
mask = torch.zeros(x.shape[0], self.d_sae, dtype=torch.bool, device=x.device)
mask.scatter_(1, topk_idx, True)
return mask
class JumpReLUSAE(nn.Module):
"""JumpReLU sparse autoencoder as used in Google Gemma Scope (v1 .npz and v2 .safetensors)."""
def __init__(self, d_model, d_sae):
super().__init__()
self.d_model = d_model
self.d_sae = d_sae
# W_enc is (d_model, d_sae) — Gemma Scope convention, transposed vs TopKSAE
self.register_buffer("W_enc", torch.zeros(d_model, d_sae))
self.register_buffer("b_enc", torch.zeros(d_sae))
self.register_buffer("threshold", torch.zeros(d_sae))
# b_dec is the pre-encoder bias (mean of the residual stream); must be subtracted
# before encoding so that thresholds are calibrated against centred activations
self.register_buffer("b_dec", torch.zeros(d_model))
def fired_mask(self, x):
"""Return (n_tokens, d_sae) bool mask: True where pre-activation exceeds the JumpReLU threshold."""
pre = (x - self.b_dec) @ self.W_enc + self.b_enc
return pre > self.threshold
class TopicClassifier(nn.Module):
"""Two-layer MLP that maps SAE feature vectors to topic logits."""
def __init__(self, n_in, n_classes, hidden):
super().__init__()
self.net = nn.Sequential(
nn.Linear(n_in, hidden),
nn.ReLU(),
nn.Linear(hidden, n_classes),
)
def forward(self, x):
return self.net(x)

Xet Storage Details

Size:
2.45 kB
·
Xet hash:
bfd6165613aee679b07209c719d403a21669b9bf35196f1e6134cc6a2a533a96

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.