transcoder-bilinear-2layer-seed2-layer1

A TopK transcoder fitted to layer 1 of itzPotato/arithmetic-bilinear-2layer-seed2, a 2-layer arithmetic transformer with a bilinear MLP.

A transcoder approximates one MLP sublayer: it reads the MLP's input activation and predicts the MLP's output, through a k-sparse bottleneck. It is not an autoencoder of the residual stream.

Architecture

d_model (in and out) 32
features 1024 (32x expansion)
active features per input (k) 32
decoder rows unit norm
parameters 66,592

y_hat = TopK_k(W_enc x + b_enc) @ W_dec + b_dec

Training

Adam at lr 0.0003, batches of 4096 activation vectors (not problems), one pass over 500,000 problems from the base model's train split only, with a separate 10,000-problem validation subset. The base model's val and test splits are never touched.

Trained on 7,999,488 activation vectors over 1,953 steps.

Reconstruction

normalized reconstruction error 0.0456
fraction of variance unexplained 0.0593
raw MSE 12.7492

Normalized reconstruction error is MSE / mean(target^2). That is the number to compare across architectures: a ReLU MLP's output and a bilinear MLP's output have very different scales, so raw MSE compares the targets as much as the fits. Predicting a constant zero scores 1.0.

Across all 18 transcoders in this set, bilinear MLPs are consistently ~1.55x harder to reconstruct than ReLU ones (0.0387 vs 0.0249), in all three depth/layer cells with three seeds each.

Initialisation

The decoder bias is set to the mean target and the encoder is rescaled once from the first training batch, so the single allowed pass is spent learning features rather than undoing an initial scale mismatch. Measured: calibration_scale 1.88, init_normalized_after 1.32, init_normalized_before 0.911.

Provenance

Fitted to base weights with sha256 e944379d255365b5519c7fcb06dd8e5aa17274f9f38293ad40a6ce8e00b1448e, which is the checkpoint published at itzPotato/arithmetic-bilinear-2layer-seed2.

Loading

from src.transcoder.source import load_transcoder
transcoder, provenance = load_transcoder("hub:itzPotato/transcoder-bilinear-2layer-seed2-layer1", require_pinned=True)

require_pinned=True refuses anything but the registered commit sha in TRANSCODER_MODEL_REVISIONS (src/transcoder/config.py), so a run cannot silently load a moving branch.

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support