This is a native 2D re-derivation of the Gated Recurrent Unit — not a flattened camera view of a 3D bar scene. The same eight-unit cell runs the exact GRU equations, but instead of extruded 3D bars, every quantity is drawn as it naturally lives: a scrolling oscilloscope trace over time, and a flat per-unit heatmap grid at the current step.
r_t = σ(W_r·[h_(t-1), x_t] + b_r) reset gate
z_t = σ(W_z·[h_(t-1), x_t] + b_z) update gate
h̃_t = tanh(W_h·[r_t⊙h_(t-1), x_t] + b_h) candidate state
h_t = (1 − z_t)⊙h_(t-1) + z_t⊙h̃_t new hidden state
- Oscilloscope (top) — input xt, mean reset rt, mean update zt, and ‖ht‖ scroll left across the last ~140 steps, so you can watch the gates react to the live sequence in real time.
- Heatmap (bottom) — four rows (reset, update, candidate, hidden) × 8 columns, one cell per hidden unit, colour-coded by value. This is where you can see individual units disagree — some staying open while others close.
- Reset gate r — near 0, it wipes ht-1 out of the candidate computation, so h̃t is built almost fresh from xt alone; near 1, the full memory feeds the candidate. Verified numerically: with the reset bias pinned to −20, the candidate becomes independent of ht-1 to within 1e-12.
- Update gate z — near 0, ht barely changes (the cell "holds" its memory across the step); near 1, ht is replaced almost entirely by the new candidate h̃t. This convex blend is also why h stays bounded — it can never explode the way a plain RNN's hidden state can (‖h‖ ≤ √8 ≈ 2.83 for 8 tanh-bounded units, confirmed to stay under 0.7 across 500 steps in testing).
- Bias sliders — shift every gate's pre-activation before the sigmoid, the same way a trained bias vector would after learning to always-forget or always-remember in a particular regime.
The weight matrices are fixed at load (Xavier-scaled random, seeded so the run is reproducible), so what you're watching is a genuine — if untrained — GRU cell reacting to the sequence in real time.