This page trains a real neural network — forward pass, backprop, mini-batches, the lot — live in your browser, on data you choose. No library, no server: ~60 lines of the same math you'll write in BYO-1. Your job: discover why hidden layers exist by watching a net with none fail, then watching one hidden layer bend the impossible into the easy.
Strip the mystique: one neuron computes w·x + b — a dot product and a shift — then squashes it. From Phase 2 you know exactly what that is: a line (in 2-D) with a smooth yes/no gradient across it. A network with no hidden layers is just that one line-drawer, however long you train it. So here's the experiment the whole field was stuck on for a decade: give the line-drawer the XOR dataset — blue in two opposite corners, green in the other two. No single line can ever separate them. Press train and watch it flail. Then add one hidden layer and watch the problem dissolve.
Run the script of history yourself: (1) XOR + 0 hidden layers → the loss jams near 0.69 (that's −log 0.5 — the net is literally guessing) and the background stays a helpless single gradient. (2) Slide hidden layers to 1 → within a few hundred epochs the background folds into a curved region and accuracy hits ~100%. Nothing about the training algorithm changed — only the shape of the function family the net can express. That's why an MLP is defined by having at least one hidden layer: the hidden layer is what upgrades "a line" to "a composition of lines", and compositions can bend.
Look at the gallery under the board while a 1-layer net trains on XOR. Each mini-map is one hidden neuron's view of the plane — and every one of them is still just a line (a straight color boundary). The magic is one level up: the output neuron takes a weighted vote of the folds, and "above line A but below line B" is a corner — something no single line can say. Depth stacks this: layer 2 draws lines in the feature space layer 1 built, which look like curves in pixel space. Try the spiral with 1 layer (struggles, wobbles) then 2 × 8 with tanh — features of features.
This playground holds 240 points and trains on mini-batches of 24, so one pass through the data — one epoch — takes exactly 10 iterations (weight updates). That's the whole relationship tests: iterations per epoch = samples ÷ batch size (1000 samples at batch 100 → 10 iterations). Batches exist because the full-data gradient is expensive and the single-sample gradient is noisy; 24-at-a-time is the compromise that also happens to love GPU parallelism. The "epoch" counter above is honest — it increments every 10 updates.
Curated companion: TensorFlow Playground — the original browser net, with feature engineering knobs ours deliberately hides.