Interactive figures
Every figure in the track. Each one is a small experiment: drag, slide, and watch the numbers. The link under each figure takes you to the lesson that explains it.
Lesson 1 · MLPs and universal approximation
Fit with ReLU units. The aqua curve is the target ; the blue curve is the network ; the thin blue lines are its single units ; the violet knots set the weights; the magenta bar is the largest error. Predict first: if you double the number of units , by what factor does the largest error fall? Then move the slider from 2 to 4 to 8. Try , and the step, which is not continuous: its error never falls below . Outside the network is a straight line.
Pieces multiply with depth. Move the slider . Top left: the deep network (blue) with hidden layers of 2 units has pieces. Top right: a network with one hidden layer and the same units (grey) can have at most pieces; here it passes through points of the aqua target . It is exact for and then fails (largest error in magenta). Bottom: pieces against units on a log scale; the yellow line is the current .
Three layers, with and without ReLU. A grid of inputs in goes through three layers . With "none", the image after every layer is a grid of parallelograms, and the readout shows the single affine map that does the same job. Switch to ReLU and look at layer 1 first: the parts of the plane where a unit is negative are flattened onto an axis. The yellow segment – (drag its ends in the input view) stays straight only without ReLU; the midpoint test measures the gap between the image of the midpoint and the midpoint of the images.
Lesson 2 · Training a network
Train a network in your browser. Press Play (or +100 steps). The background shows the predicted class: blue for class 0, yellow for class 1, pale where the network is unsure. The chart shows the training loss and the validation loss on a log scale; at the start both are near , the loss of a 50/50 guess. Then try: (1) the spiral with SGD, then with Adam, width 16 and 3 layers; (2) a learning rate above 3 with SGD: the loss stops falling or jumps around; (3) moons with noise 0.6, width 16, 3 layers, Adam, , batch 32, for a few thousand steps: the training loss keeps falling while the validation loss turns up. That is overfitting.
Mini-batch gradients on a linear regression. The violet point is the parameter ; the grey ellipses are level sets of the training loss, with its minimum in aqua. The thick orange arrow is the full gradient step; the thin arrows are 50 mini-batch steps. Predict first: if you make four times larger, how much smaller does the spread get? Move the slider and compare with the chart, where the measured spread (dots) follows the line . Drag close to : the full gradient almost vanishes, but the mini-batch steps still scatter.
Find the stability limit. Move the learning rate . The blue parabola is the loss; the violet points are the iterates (magenta when they diverge). The chart shows on a log scale: a straight line with slope . Use the presets: a small step is slow, jumps to the minimum in one step, between and it zig-zags but converges, and above it diverges.
Two losses for one logit. Top: the losses, cross-entropy (solid) and squared error after a sigmoid (dashed), in blue. Bottom: their gradients in orange. Move into the magenta band, where the model is confidently wrong: the BCE loss grows like and its gradient stays near , while the MSE loss is flat near and its gradient is close to 0. Switch the target to to see the mirror image.
Lesson 3 · Backpropagation
Press Forward step until the loss appears, then Backward step. Forward values are blue, adjoints are orange, parameters are violet, and the node being computed is yellow. The panel shows "upstream × local" for each step. Watch node : two orange contributions arrive and add up. Move the sliders and compare the backprop gradients with the finite differences in the table.
Build the Jacobian one pass at a time. Press Run all passes in both modes. A forward pass (JVP) fills one column of ; a reverse pass (VJP) fills one row. For a loss ( output) one reverse pass gives the whole gradient. Switch to the simulator shape ( inputs, outputs): now forward mode needs fewer passes.
Step through a 2-layer MLP on a batch. Each matrix is drawn to scale: forward values blue, weights violet, gradients orange. In each product the inner sizes must match (they are marked). Change , the widths and the classes, and check that every gradient has the shape of its variable. Press Show a wrong version to see the shape error of a common bug in magenta.
Choose the number of layers and of segments . Each box is a layer.
Blue marks an activation stored in the forward pass and
orange a layer that is run a second time in the backward pass. The chart shows
the peak number of stored activations against ; find its minimum and compare it with .
The counts follow PyTorch's checkpoint_sequential, which does not checkpoint its last segment.
Move the point and switch the function and the precision. The chart shows the error of the central difference and of the forward difference against the step , on log-log axes. The dashed lines are the two error models: truncation (falls as gets smaller) and round-off (grows). Notice the V shape, its minimum near in float64, and how float32 moves the minimum up and to the right.
Lesson 4 · Activations and initialization
Choose an activation and an initialization. A 50-layer MLP of width 200 runs on 32 random inputs, and the figure updates after each change. The top chart shows the mean square of the pre-activations (forward, blue) and of the gradients (backward, orange) at each layer, on a log axis. The dashed aqua lines are the variance recursion of section 3. The bottom chart is the histogram of the activations at the layer you select. Try ReLU with Xavier, then with He. Then try tanh with a large gain and look at the histogram: most units are saturated.
Pick an activation and move the input scale . The curve is (blue), its derivative is (orange), and the magenta band marks where : there the unit is saturated (or dead) and passes almost no gradient. The grey bell is the distribution of the input . The panel shows the two numbers that enter the variance recursion, (forward) and (backward). Compare tanh at and at .
Move the hidden width (in units of ) and pick a model width. The lines are the weight counts of a GELU FFN (two matrices) and of a SwiGLU FFN (three matrices); the dashed aqua line is the budget of a GELU FFN of width . The SwiGLU line meets the budget at (yellow point). Switch on rounding to see the widths that LLaMA models use.
Press Play with "identical" start, then with "identical + δ". A network with 2 inputs, 2 hidden tanh units and 1 output learns XOR by gradient descent. The plane shows, for each hidden unit, its bias and its outgoing weight during training: unit 1 (violet) and unit 2 (yellow). With an identical start the two paths lie on top of each other for ever and the loss stops near 0.67. A tiny difference δ grows until the units separate and the loss falls to 0. Smaller δ takes longer.
Lesson 5 · Normalization and residuals
Drag the blue dots, then press the shift and scale buttons. Row 2 (training mode, batch statistics) does not move when you shift or scale the whole batch. Now press Training step a few times. In eval mode (row 3, magenta) BatchNorm uses the running statistics (the magenta band in row 1). After one step they are still far from the batch, so the same input gives a very different output. Blue = forward values computed with the batch; magenta = the train/eval mismatch.
Pick a layer and click any cell. Each panel is one example of the batch. The yellow cells share one mean and one variance. BatchNorm lights up one channel in every example; LayerNorm stays inside one example (images) or one token (tokens). Switch to tokens (B, T, D) and BatchNorm: the group contains other sequences and also future tokens.
Move the depth and the size . Both stacks use the same layer derivatives . The plain product has size : a straight line on the log axis, down for and up for . The residual product stays near 1 for small . Now choose all + and a large : the residual product grows too. The identity path helps only while the branches are small.
Step through the backward pass. Start at step 1: the faint bars are the upstream gradient (drag their tops). Step 2 removes the mean, so . Step 3 removes the part along (thin blue bars), so . Step 4 divides by . Orange = gradients, blue = forward values. Try Random g and the other batches: both checks are always 0 after step 3.
Change the depth, then switch to the residual stream. These are measurements at initialization (PyTorch encoder blocks, width 64, Xavier init, random data, mean of 5 seeds). The post-LN gradient of the last block stays near 0.35 for every depth. The pre-LN one shrinks like : the column "pre " stays near 0.5. In the second view, the pre-LN residual stream grows about linearly with depth, while post-LN keeps it at 1.
Lesson 6 · Regularization
Press One training step a few times, then Sample 1000 masks. Each step drops some units (magenta) and scales the kept ones (blue) by ; the violet lines are the weights. The histogram shows the output over many masks. Its mean (blue line) meets the eval output (aqua line). Move : the spread grows like , but the mean stays.
Move the logit gap and watch the dot on the loss curve. The left chart compares the smoothed target with the prediction . With smoothing (aqua curve), the loss has a minimum at a finite gap (the dashed lines); beyond it the gradient pushes the gap back down. Without smoothing (grey) the loss keeps falling as . Set to see that case.
Change the number of steps and the gradient size . The chart shows how much the decay term alone shrank each weight (the run with decay minus the run without). With AdamW, both weights shrink by about (the two aqua lines almost overlap). With Adam + L2, the weight with no gradient (solid) is pulled to 0 within about 100 steps, while the weight with large gradients (dashed) shrinks about 10 times less than under AdamW.
Move the number of steps . The violet path is gradient descent from 0 (the dots are steps); the aqua dashed curve is the ridge solution for all , and the aqua dot is ridge with . Both first move along the steep direction of the loss (large eigenvalue ) and reach along the flat direction () only later. The right chart shows the two filter factors; the dots mark and .
Lesson 7 · Convolutional networks
Move the yellow window over either image (hover, tap, or focus the figure and use the arrow keys). The panel shows the dot product of the kernel with the pixels under the window. Then pick another kernel or edit one entry. Notice: edge-x answers only on vertical edges, edge-y only on horizontal edges, and both are 0 where the image is constant. Output colours: blue = positive, magenta = negative. The image is padded with zeros, so the feature map has the same size, .
Change one slider at a time and predict the output size before you look. The violet squares are the kernel taps of the current output position (yellow), dashed squares are zero padding. Press Play or Next position to slide the window. Try the preset floor drops a pixel: input pixels that no window ever touches turn magenta. Try dilation 2: the same 9 taps cover a area.
Click a unit in any row (the input is at the bottom). The units it depends on light up in blue, layer by layer, and the yellow bracket is its receptive field. The panel shows the recursion. Compare three 3-convs with one 7-conv: the same . With dilation 1, 2, 4 the field grows fast; edit the table to use dilation 3 in one layer and look for holes.
Step through the 9 patches. Each patch of the 4 × 4 input is copied into one column of cols; the kernel becomes one row; the product is the output, read row by row. Then switch to backward: the gradient of the columns is , and col2im adds each column back onto its patch. Watch the centre pixels of collect four contributions.
Move the shift slider and switch the stride. Row 2 is the stride-1 output of the shifted input; the yellow rings mark the samples that stride keeps. Row 3 compares the strided output of the shifted input (blue) with the best shift of the strided output of the original input (aqua rings; magenta where they disagree). With , even shifts match exactly and odd shifts do not.
Lesson 8 · RNNs and LSTMs
Step through BPTT. Press Forward step three times: each cell computes its blue state from the cell on its left. Then press Backward step: the orange gradient moves to the left, and each arrow multiplies it by . The defaults are the worked example of section 4. Now set : the factors stay below 1 because large states saturate tanh. Set and a small pulse : the factors are above 1 (magenta) and the gradient grows.
How far back can a gradient travel? The curves show against the lag , on a log axis, for a hidden state of size 16. The dashed orange curve is the linear RNN, the solid one the tanh RNN; the grey line is and the dotted line is the bound . Move across 1 and watch the linear curve leave the blue (vanishing) region for the magenta (exploding) one. Then raise the input scale : saturation pulls the tanh curve down, even when . Switch to the random : now , and the linear curve first rises before it falls.
Two ways to clip. Drag the orange gradient . Clipping by norm (solid orange) moves it back to the dashed circle along the same line, so the direction is kept. Clipping by value (magenta) moves it into the square ; the readout shows the angle it turned. Try a short gradient: neither rule changes it, so clipping cannot make a vanishing gradient larger.
The LSTM keeps a gradient alive through the forget gate. The top shows the cell at step ; the small blue bars are the values of the 8 units of each gate, and the yellow box is the forget gate. The chart shows in orange: solid for all paths, dashed for the cell path alone. Try , and . The mean forget gate moves from about 0.5 to 0.74 to 0.95, and after 50 steps the gradient moves from about to to about 1.
Lesson 9 · Attention
Drag the yellow query in the left plane. The scores are dot products with the violet keys; the table shows them and their softmax weights. In the right plane the blue output is the weighted average of the grey values; the rings show the weights. Try a short query and a long query: a longer query (or a smaller temperature ) makes the weights nearly one-hot and the output jumps to one value. Notice that the keys decide the weights, but the values decide where the output lands.
The whole matrix of one head, for six tokens and head size 2 (this figure is shared with linear-algebra lesson 15, which writes for and uses the column convention). Left: the scaled scores; right: the weights . Click a row to pick a query; its output is drawn as the weighted average of the values. Move the scale to 0: every row becomes uniform. Turn on the causal mask: the upper triangle of becomes 0.
Move the head size and switch the scaling. Top: the 16 softmax weights of one query, sorted. Bottom: the median size of the softmax Jacobian over many random draws, with the scaling and without it; the yellow dot is the current draw. Without scaling, a larger gives larger logits, one weight close to 1, and a Jacobian close to 0: almost no gradient reaches the queries and keys. With scaling, the picture is the same for every .
Choose a mask and look at the weights on the right. Masked cells are magenta; the column "sum" is the sum of each row. Try "causal + padding" with left padding: rows 1 and 2 have no visible key and become NaN. Then choose "after softmax (bug)": the masked weights are set to 0 after the softmax, and the rows no longer sum to 1.
Step through the reshapes. Each cell is one number of ; its text is the token it came from, and its colour is the head it belongs to (in this figure, colours mark heads). With "view, then transpose" every head block holds all 4 tokens and only its own features. Switch to "reshape directly (bug)" at step 3: the shapes are the same, but each block now mixes tokens and features. No error is raised, and the model is silently wrong.
Lesson 10 · Positional encodings
Move the position . The heatmap shows the encodings of 64 positions (columns) in 32 dimensions (rows): orange is positive, blue is negative. The yellow column and the clock hands show position : fast pairs turn quickly, slow pairs hardly move. The chart shows the dot product of with every other position. Notice that the bump moves with but keeps its shape: the dot product depends only on the offset .
Press "Shift both by +1" several times. The query and the key turn together, the angle between them stays, and the log shows the same score each time. Then press "Swap m and n": the offset changes sign and the score changes, so RoPE can tell "before" from "after". Drag the faint tips to change the contents and .
Each dot is one pair of a RoPE head; its height is the wavelength (positions per turn, log scale). Pairs above the aqua line never complete a turn in training. With and no change, the magenta pairs see angles they never saw. Switch to "position interpolation": no magenta dots remain, but the fastest pair now turns only rad between neighbours. Switch to "base scaling": the fast pairs stay as they were and the slowest pair is slowed by exactly .
Pick a head and a query row. The matrix shows the bias of the selected head (masked future cells are grey); the bars show the attention weights of the yellow query row when all content scores are 0. The chart shows the factor for every head (the selected head in yellow). Switch the bias form to : the matrix changes, but the weights do not.
Lesson 11 · Transformers and ViT
Click a box (or tab to it and press Enter) to see its formula, its parameter count and its FLOPs. The blue arrows carry the residual stream; each label is the shape of the tensor on that arrow, for the batch size , length , width and heads you choose. Boxes with weights are violet; the selected box is yellow. Notice that every arrow between boxes has the same shape : only the inside of the attention ( weights per head) and of the MLP (width ) is different. Switch to post-LN to see where the LayerNorms move.
Choose the patch size and click a patch of the image. The right panel is the sequence the transformer sees: the violet [CLS] token first, then the patches in reading order. The yellow frame shows where your patch lands in the sequence. Notice how fast the token count grows when gets smaller: halving gives 4 times the tokens and about 16 times the size of each attention matrix. Switch to a image with the same : the patches stay the same size, but there are more of them.
Pick a preset, then move the sliders. The top bar splits the parameters, the bottom bar the forward FLOPs per token. In this figure the colors mark the parts of the model: embeddings and unembedding, attention weights, MLP, and the attention matrix, the only term that grows with the context . Notice that the MLP is always twice the attention weights. Then push past : the yellow part of the FLOPs bar becomes the largest.
Press Next token several times. A tiny hand-made model with one attention head writes a sentence. Each step adds one row to the cache of keys and values (the new row is yellow). The bars next to the cache are the attention weights of the newest token: it reads every cached row, but it computes only its own key and value. Below the cache: the probabilities of the next token at temperature . Set near 0 (greedy) or to 2, and compare the counters "with cache" and "without cache": the second grows like .
Lesson 12 · Training dynamics
Compare the two runs. Both use the same peak learning rate. In this toy model the curvature falls from 20 to 2 during the first steps. The magenta run uses the peak learning rate from step 0: starts far above the dashed edge 2 and explodes. The blue run warms up linearly and stays below 2 at every step. Shorten the warmup until the blue run fails too, and find the largest constant that is safe without warmup.
Switch between the schedules and move the sliders. The violet curve is the selected schedule; the grey dashed curves are the other two. The yellow dot reads the learning rate at step . Notice that WSD stays at the peak for most of the run, so its mean learning rate is the largest of the three.
Move the weight scale . Every plain logit grows like : on the log–log chart the magenta curve has slope 2, and the blue attention weights of query 1 become one-hot (look at the entropy). Switch on qk-layernorm: the aqua curve is flat and stays below the dashed bound , whatever is.
Move . The top chart is the gap between neighboring numbers near for bf16, fp16 and fp32: a staircase that doubles at every power of 2. bf16's gap is 8 times fp16's at every where both are normal. Try 1e−8: fp16 underflows to 0, bf16 does not. Try 70000: fp16 overflows.
Lost updates. A weight gets the same update for 1,000 steps. The aqua line is an fp32 master weight; the 16-bit weight is magenta when every update is lost and blue otherwise. Try u = 0.6 ulp: each update is rounded up to a full ulp and the 16-bit weight moves too fast. Then switch to loss scaling: the orange histogram shows gradient sizes; move until no gradient becomes 0 or inf (magenta), and switch to bf16 to see why it needs no scaling.
Lesson 13 · Graph neural networks
Press One round and watch the value spread. Node colour shows the value of the node (blue = forward values; darker = larger). The start is an impulse at one node. Click a node to select it: the yellow ring marks the nodes it can see after the rounds done so far (its -hop neighbourhood). Notice that a node stays at 0 until the number of rounds reaches its distance to the impulse. Switch to sum aggregation and see the values grow at the high-degree nodes.
Follow both paths around the square. Relabel the nodes, then apply the layer; or apply the layer, then relabel the outputs. For the GCN layer the two results match (the error is at round-off level), but only when the adjacency matrix is relabelled together with the features. Choose GCN, A not relabeled or dense layer: the error becomes large, because these layers depend on the numbering.
Press Refine to run one round of colour refinement on both graphs. Colours here are 1-WL colour classes (the number in each node is the colour id); one colour table is shared by both graphs. The table below lists each colour, the signature it was made from, and how many nodes of each graph have it (counts that differ are magenta). With path vs triangle + edge, round 1 gives equal histograms (both have degrees 1, 1, 2, 2, 2), but round 2 separates them. With two triangles vs hexagon, every node keeps one colour forever: 1-WL, and so every message-passing GNN, sees no difference.
Build two neighbour multisets with the + and − buttons. Type a is blue, type b is violet. The table shows the sum, mean and max of the one-hot vectors for both multisets. An aggregator that gives the same output for two different multisets is marked confused (magenta); one that separates them is marked separates (aqua). Try the presets: mean loses the size, max loses the counts, and the sum separates every pair.
Move the slider (the number of applications of ). The graph has three communities (blue, aqua, violet), and each node has a noisy 2-D feature. The right panel shows the features of all nodes. A few steps remove the noise inside each community and the three groups separate. Many steps push every node towards one common direction (the dashed ray), scaled by : the nodes then differ only by their degree. The first chart splits into three parts, as fractions of on a log scale: the spread inside the communities (noise, magenta), the spread between them (signal, aqua), and the smooth part , which carries only degree information (blue). The second chart shows the accuracy of a nearest-class-mean classifier (a linear probe) on the features: it rises from 0.75 to 1, then falls towards chance as the smooth part takes over.
Lesson 14 · Self-supervised learning
Drag the points on the unit circle. Each blue point is an image embedding and each aqua point is a text embedding , all of length 1. The first table is the cosine similarity (darker = larger, aqua outline = matching pair); the second is the softmax of each row of (the probability that image picks caption ). Notice: with aligned pairs the diagonal wins and the loss is small; with collapsed embeddings every row is uniform and the loss is ; a smaller makes the rows sharper. The bound never exceeds .
Press Play to train a tiny encoder. Ten images have two noisy views each (a filled and a hollow blue dot, joined by a line); a linear encoder maps them to the unit circle. With alignment only, the two views of each image meet, but all points also slide to one spot: collapse. With alignment + uniformity, the pairs stay close and the images spread around the circle. The magenta arrow is the mean embedding ; its length is near 1 after collapse and near 0 when the embeddings are well spread.
Move the temperature slider. One anchor has a positive with similarity and seven negatives. The bars show the share of the total push that each negative gets ( divided by the sum over the negatives). At the push is spread over all negatives; at almost all of it goes to the hardest one. Lower below the hardest negative and watch approach the hinge .
Move the mask ratio. The left panel is the image, cut into patches. The middle panel is what the encoder sees: only the visible patches (masked patches are grey). The right panel fills the masked pixels by repeated averaging of neighbouring pixels: a "reconstruction" with no learning at all. Notice: at 25% masking this smooth fill is already good (relative error about 0.08), so the task teaches little; at 75% the error is about 3 times larger, and whole shapes are lost. A model must understand the picture to do better. The magenta curve is this error against the mask ratio; the readout gives the number of encoder tokens and the cost relative to the full image.
Lesson 15 · Mixture of experts
Drag the router vectors. Here the colors name the four experts: blue, orange, aqua and violet. Each dot is a token, colored by its first choice; the shaded regions show where each expert wins. The bars are the loads, with the capacity as a dashed line. Assignments above the capacity are dropped and shown in magenta. Try one expert wins: one expert gets most tokens and many are dropped. Then set (rings show the second choice) and raise the capacity factor.
Pick a model, then move and . The top bar is all parameters, the bottom bar the parameters one token uses. Blue is shared (always active), violet the experts that work on the token, faint violet the experts that are stored but idle. Notice that changes only the top bar: memory grows, compute per token does not.
Press "1 descent step" a few times. The left chart shows the dispatch shares and the mean probabilities ; the aqua line is the uniform share . The right chart shows one token's probabilities and the orange gradient on its logits: positive (pushed down) for the busy expert 1, negative for the idle ones. Watch the loss fall to about 1 as the loads become equal.
Move the shift . All three logits get the same , so the aqua exact softmax never changes. The blue bars use the logits rounded to bf16. Try : rounds to (the bf16 spacing there is 0.5) and the probabilities change by about 0.05. The z-loss is the only quantity that sees ; it is 0 at the preset lse = 0.
Lesson 16 · State-space models
Two computations, one answer. Press Next step a few times. In the recurrence view the state moves one step: . Switch to the convolution view: the violet kernel, flipped, sits under the blue input, with under , and is the sum of the products. The blue dots (recurrence) always sit inside the aqua rings (convolution). The defaults are the worked example of section 4. A larger or a more negative makes the kernel shorter.
Poles, steps and kernels. Drag the violet eigenvalues in the left panel (the faint points are the conjugates). The right panel shows , one step of the recurrence, inside the aqua unit circle. The chart shows the kernel (thick) and each mode's term (dashed). Move a pole to the left: it decays faster. Move it up: it oscillates faster. Raise : every moves toward 0 and the kernel gets shorter in steps. Try one unstable: a pole with maps outside the circle (magenta) and its term grows.
Why padding is needed. A length-8 DFT product multiplies by this circulant matrix . Each row is the row above, shifted one place to the right with wrap-around. Its upper-right corner is the wrap-around: these entries make early outputs use late inputs. A causal SSM kernel needs only the lower triangle; padding to length pushes the wrap-around into rows that we throw away.
Selection by hand. Each token has an input and a logit (slider); . The yellow bars show the gate , the blue line the state. In the worked example the large input gets , a tiny , and is mostly ignored: its weight in the last state is 0.024. Try reset at token 4: one large copies into the state, and the very negative after it keep it. With same z the weights depend only on the distance to the end, as for a fixed kernel.
A scan for . Each box shows which elements it has combined: "2–5" means . Press Next round: the combines of the round are yellow. Hillis–Steele needs 3 rounds () and 17 combines. The sequential loop needs 7 rounds and 7 combines. Blelloch needs more rounds but only combines. The last row is , and it equals the plain loop.
Lesson 17 · Generalization
Drag the violet start . The violet path is gradient descent; it always moves along , perpendicular to the aqua line of zero-loss solutions, so it lands on the point of the line closest to . From this is the minimum-norm solution (black). The dashed grey segment is the part of that gradient descent never changes. The orange arrow is the first step . Try above 0.4: the path diverges. Then switch on Adam (blue): it moves along and lands on a different solution.
Move the ridge and the label noise . We fit noisy points with frozen random ReLU features and plot the median test error over 6 random draws. The orange curve is the minimum-norm fit (): a U for , a peak at , and a second descent. The aqua curve is ridge with your : the peak disappears. Set : the peak gets smaller but stays, because the part of the target that the features cannot represent acts like noise. Set : now a larger is needed.
Choose and move . First chart: the smallest singular value of a random Gaussian matrix (orange: median of 9 draws) against , and the large- prediction (aqua). It dips to almost 0 at . Second chart: the variance factor (orange, median) and its exact mean (aqua), which is infinite for . The yellow line marks your .
Change the slow-feature scale and the noise , and move the stopping time . A linear model with 150 fast features and 5 slow features (variance ), , trained by gradient descent from 0 (computed exactly with the filter factors, average of 20 draws). The orange curve is the test error; the blue and violet curves are the parts from the fast and the slow weights. The shaded bands show how many steps each group needs, . With : down to 4.47, up to 7.77, and down to 0.87. With the speeds are close and the bump disappears.
Switch between training loss, training accuracy and test accuracy, and move the epoch. The same MLP (64–512–512–10, Adam) is trained on 500 images of the scikit-learn digits with true labels, with 50% random labels and with 100% random labels. All three reach 100% training accuracy; random labels need about three times as many epochs. Only the true labels give a good test accuracy. With 50% random labels, the test accuracy first rises to 0.90 (epoch 9) and then falls to 0.60 while the network memorizes the wrong labels.