Learn machine learning by seeing it move.
Stop staring at static equations. Drag the data, tune the learning rate, and watch gradient descent, decision boundaries, and backprop respond in real time.
Random Forest
Many decision trees vote — the majority wins.
Learned by students at
Your textbook tells you the math.
It never lets you feel it.
Reading the gradient descent chapter for the fourth time won’t make it click. Watching the optimizer overshoot when you crank the learning rate will. Every concept here is a live system you control.
One growing library
Built to be poked, not read.
Drag the data. Watch the model chase it.
Move a point and the best-fit line refits instantly. Tune the learning rate and watch gradient descent converge, crawl, or blow up. Nothing is pre-rendered, it responds to you.
The rigor stays. The fog lifts.
Every equation is rendered cleanly with each symbol explained on hover. You came for the math, so we keep it front and center, just no longer abstract.
hover a symbol to see what it means
A clear route from regression to transformers.
Follow a structured path, always knowing the next step. Progress saves per concept, with quick checks that prove you understand rather than just recognize.
Too small, and you crawl.
A timid learning rate barely moves the weights. You converge eventually, but it takes forever. Watch the optimizer inch down the slope.
Slow convergence
loss surface · gradient descent
This is where it all comes together.
A focused workspace for every concept: visualization on one side, the controls in your hands, the math always within reach.
Gradient Descent
Watch the optimizer roll toward the minimum.
See it here. Write it there.
The intuition you build dragging sliders maps straight onto the frameworks you’ll actually ship with. Same gradient descent, five ways — each shown the way that framework thinks about it.
Autograd — forward, then backward
loss.backward() fills w.grad with ∂L/∂w. Then w -= lr * grad is the exact step the ball takes downhill.
import torchw = torch.zeros(1, requires_grad=True)lr = 0.1for _ in range(100): y_pred = X @ w loss = ((y_pred - y) ** 2).mean() loss.backward() # autograd with torch.no_grad(): w -= lr * w.grad # one GD step w.grad.zero_()Start seeing the math move today.
Free to start, no credit card. Pick a concept and watch it come alive in your browser.