We ran several additions on the 8-bit adder NCA and baked each rollout frame-by-frame. Pick one from the buttons at the top: a long carry chain, an all-ones sum, a no-carry case, and more. Scrub the movie, and every view moves with it. Under the movie, a row of the most active hidden channels appears as spatial maps. Watch the carry "spine" move up the column. On the right, a t-SNE map follows a fixed grid of cells through the whole rollout, so each cell traces a path. Colour that map by what a cell is, by how it moves, or by where it sits on the grid. Filter it down to the input and output bits, or to the band between them where the computation has to happen. Turn on recent only to drop the whole run and watch just the current step. ← back to the live demo
Every cell holds 16 numbers. Channel 0 is the picture in the movie. Channel 1 holds the frozen input. The rule fills the other 14 as it likes. This figure draws those 14.
We follow a fixed grid of cells through every frame of the run. Each cell at each frame is one point in 14 dimensions. t-SNE flattens those points to 2 so we can draw them.
We embed every frame together, in one run. That is what makes paths work. A cell at one frame lands near the same cell at the next frame, so its run reads as a route. One embedding per frame would turn the axes each time, and no route would survive.
All paths start in one small spot in the upper half, because the hidden channels hold zero at the first frame. The cells leave it within a few frames. It marks the start, not a group the rule learned.
The filters remove cells. The colour choice changes what colour means. The two work together.
By role: blue is an input bit, orange an output bit, green the band between the columns, grey the field. The band holds no input and no output, so whatever crosses it is the computation. The field is most of the grid, so we draw it faint and behind the rest.
By movement: we cluster the cells on their whole path, so cells that travel together share a colour. We redo this for each example.
By position: hue runs left to right across the grid and darkens toward the bottom.
Colour never shows time. The trail does that. Each cell lights its recent steps and fades behind itself. A large dot reads 1, and a small dot reads 0.
Output cells settle. Late in the run their steps shrink to 3 % of their early steps. Input cells still drift at 13 %.
Output cells also split by the bit they hold. At the end the 1 cells and the 0 cells sit apart, with a gap 5.9 times their own spread. For input cells that gap is 0.85 of their spread, so the two groups overlap.
The loss reads only the output disks. Only those cells must settle on a correct value. Nothing holds the input cells, so they never sort by their bit and never stop moving. Turn on I/O cells to watch both at once.
The output paths are not straighter, though. Net travel over path length is 0.25 for output cells and 0.21 for input cells. Every role wanders by about the same amount. What differs is where a cell ends up, not the route it takes.
Long lines that cross the map are seams in the embedding, not real jumps. We keep them faint so that paths stay joined.