Before you can read a single GRU equation, you need to recognise the pieces it is built from. This page defines every symbol and every tool the parent note uses — from what a vector even is, up to the mixing formula — with a picture attached to each. Read top to bottom; each block earns the next.
A GRU reads a sequence: an ordered list of things, one after another. In text, that list is the words of a sentence, left to right.
We label positions with a counter called the timestep, written t. The first item is at t=1, the next at t=2, and so on. "t" is just "which step are we on right now".
Look at the figure: reading the sentence is like walking a row of stepping stones. On each stone we do the same computation, but with new input. That "same computation, new input, memory carried across" pattern is exactly what a basic RNN does, and GRU is a smarter version of that stone.
A word cannot be fed to math as letters. We turn it into a vector: a fixed-length list of numbers.
The symbol R just means "the real numbers" (any decimal, positive or negative). Rdh means "a point in dh-dimensional space". You never have to picture 200 dimensions — picture an arrow of numbers whose length is dh.
Because GRU (unlike LSTM, which also carries a separate cell state ct) keeps onlyht, this single vector is the machine's complete memory. That simplicity is the whole selling point.
The equations always feed the network both the old memory and the new word together. To do that we glue the two vectors into one taller vector.
Why concatenate? So a single matrix (next section) can look at old memory and new input simultaneously and decide based on their combination — e.g. "this word is 'but' and the memory so far is positive → prepare to flip".
Inside every gate you see the pattern W⋅v+b. This is the one operation neural nets are built from.
The parent note has three of these boards: Wr,Wz,Wh (with biases br,bz,bh) — one for the reset gate, one for the update gate, one for the candidate.
A gate must output a fraction between 0 (fully closed) and 1 (fully open). Raw W⋅v+b can be any number, huge or negative. We need to squash it.
Why this tool and not another? We want a smooth, always-increasing knob that can never leave [0,1], so its output can be read directly as "keep this fraction". Sigmoid is the classic function with exactly those properties, and being smooth means we can train through it. This is why gates (zt, rt) use σ.
Here e is Euler's number (≈2.718); e−x shrinks fast as x grows, which is what drags the output toward 1.
Now that we have σ, a concatenation, and a mixing board, we can build the two dials the whole topic is named for. Each gate is one linear layer followed by a sigmoid, so its output is a vector of dials in [0,1].
Notice both gates read the same input [ht−1,xt] but have their own weights (Wr vs Wz), so they can learn to answer two different questions from the same evidence.
The candidate new memory h~t uses tanh, not sigmoid. Different job, different squasher.
Why tanh here and sigmoid there? A gate answers "what fraction, 0 to 1?" → sigmoid. A memory value wants to represent features that can be positive or negative (e.g. "very positive sentiment" = +0.9, "very negative" = −0.9), so it needs the [−1,1] range centred at 0 → tanh. Centring at 0 also keeps values from drifting, which helps training.
Now we can write the candidate hidden state — the "proposed new memory":
Once all the above exist, the final GRU update reads cleanly:
ht=(1−zt)⊙h~t+zt⊙ht−1
Every symbol is now defined: zt=σ(Wz[ht−1,xt]+bz) is a sigmoid dial-vector, h~t=tanh(Wh[rt⊙ht−1,xt]+bh) a tanh candidate (built using the reset gate rt), ht−1 the old memory (with h0=0), ⊙ the per-slot scaling, and (1−zt)=1−zt the leftover fraction.
The parent topic exists to beat the vanishing gradient problem. The key symbol there is ∂ht−1∂ht: "how much does a tiny change in old memory change new memory?" Multiplied across many steps, if this is <1 the effect shrinks toward zero and long-range learning dies. Because ht contains the term zt⊙ht−1, this derivative gets a zt contribution — and when zt≈1, information (and gradient) travels across many steps almost undamped. That is the whole payoff of building the update gate.