Chapter 12 left the recurrent network with a precise complaint rather than a vague one. Equation (12.5) showed that a gradient travelling back through time is multiplied by one Jacobian per step, and each Jacobian is , so the product behaves like a number raised to the power of the distance. Below one it vanishes, above one it explodes, and nothing holds it at one.
The diagnosis contains the cure. If repeated multiplication is what destroys the gradient, then give the state a path that does not multiply. A gated network does exactly that, keeping a memory that is updated by addition and learning how much of the old memory to carry forward.
The long short-term memory network (Hochreiter and Schmidhuber 1997) carries two vectors rather than one, where the cell state is the memory and the hidden state is what the rest of the network sees.
Three gates control the traffic, each a sigmoid layer reading the same input, which is the previous hidden state concatenated with the current word, so each produces numbers between and .
A gate value of closes the channel completely while a value of opens it, and everything in between is a partial opening, which is what makes the whole thing differentiable.
The cell state is then updated in one line, and that line is the reason the architecture exists:
Read it as two decisions, where the forget gate says what fraction of the old memory survives and the input gate says how much of the new candidate to admit. The hidden state is then a filtered view of that memory:
So the network can hold something in for many steps without exposing it, revealing it only when the output gate opens.
Differentiate Equation (13.1) along the cell state path, and the result is startlingly simple:
There is no weight matrix and no derivative, because the gradient is multiplied by the forget gate and nothing else. Compare the two routes directly.
| distance | RNN, factor | LSTM, | LSTM, |
|---|---|---|---|
| 1 | |||
| 10 | |||
| 47 | |||
| 100 | |||
| 500 |
At a gradient still carries a little under one per cent of its strength after steps, whereas at it is gone before step .
Be careful about what has changed, because the LSTM did not remove the decay but put the decay rate under the network’s control. That is enough, and it is the whole contribution, since is learned and the network can therefore decide to keep a memory alive when the task rewards it, while was never anybody’s decision.
Here is a detail the lectures single out, and it is worth a section because skipping it is so common. At the start of training the weights are small and random, so Equation (13.4) gives , and the default initialisation sets , which makes .
| after 10 | after 47 | after 100 | ||
|---|---|---|---|---|
| 0 | 0.5000 | |||
| 1 | 0.7311 | |||
| 2 | 0.8808 | |||
| 3 | 0.9526 | |||
| 5 | 0.9933 |
Look at the first row against the previous table, where a default-initialised LSTM decays at exactly the rate the plain RNN did. It therefore starts out no better than the architecture it was invented to replace, and it has to climb out of that by learning.
Set instead, as Gers et al. (2002) recommend, and begins at , so that after steps the gradient retains rather than . That is times more signal, from changing one number before training starts.
The lesson generalises past LSTMs, because a model that appears incapable of a task is sometimes a model whose initialisation put it somewhere it could not leave.
Take a cell with two units and an input of size two, and set with every other bias at zero.
Every gate reads the same concatenated vector:
| gate | formula | value |
|---|---|---|
| forget | ||
| input | ||
| candidate | ||
| output | ||
| cell | ||
| hidden |
Split the cell update into its two terms and the arithmetic becomes plain enough.
| kept from the past, | |
| added this step, | |
| new cell state, |
The forget gate sits at and , so most of the old memory survives the very first step, which is the initialisation already doing its job.
And notice how was reached, which was by addition rather than by a matrix multiplication. That single structural fact is the difference from Equation (12.8), and it is why Equation (13.3) looks the way it does.
The gated recurrent unit (Cho et al. 2014) asks whether four gates were ever necessary, and it keeps one state vector instead of two with two gates instead of three.
Equation (13.11) is the interesting line, because the coefficients are and , so they sum to one. The LSTM used two independent gates for those two jobs and could in principle forget everything while adding nothing, whereas the GRU ties them so that forgetting more means admitting more.
The reset gate does a different job, deciding how much of the old state the candidate may see, which lets the unit propose something genuinely new when the topic changes. Running the same numbers as above through a GRU gives this.
| gate | formula | value |
|---|---|---|
| update | ||
| reset | ||
| candidate | ||
| hidden |
Each gate reads a vector of length and produces numbers, so it costs parameters, and counting the gates gives the recurrent core of the model, leaving the embedding and output matrices aside since those are the same in all three.
| model | gates | parameters | what they are |
|---|---|---|---|
| plain RNN | 1 | 300,500 | one state update |
| GRU | 3 | 901,500 | update, reset, candidate |
| LSTM | 4 | 1,202,000 | forget, input, candidate, output |
Those figures use and . A GRU is three quarters the size of an LSTM, which here is fewer parameters and a proportionally faster step. On most tasks the two score within noise of each other (Jozefowicz et al. 2015), so the choice is usually made on size and speed rather than on quality, and the GRU often wins on those.
Try it yourself.
code/worked_examples/gated.pyproduces every table in this chapter.--highwaycompares the two decay routes,--biasshows what does,--stepruns the single cell through both architectures, and--paramscounts the gates.
Gating worked. From roughly 2014 to 2017 the LSTM was the default for almost every sequence task, and it powered the first generation of neural machine translation.
Two problems remained, and neither is about gradients. The first is sequential computation, because Equation (13.1) needs before it can compute , so the time steps cannot be computed in parallel however many processors are available. That is a hard ceiling on training speed, and it arrived exactly when hardware was becoming massively parallel.
The second is the bottleneck, since everything the model knows about the prefix has to fit in one fixed size vector. Gating made that vector’s contents last longer without making the vector bigger, and a whole paragraph still has to be squeezed into it.
Both problems have the same shape, in that they come from insisting information travel through the sequence one step at a time. The next idea removes that insistence by letting every position look directly at every other position with no intervening steps, so distance stops mattering and the computation parallelises because nothing waits for anything. That is attention, and it is the subject of Chapter 16.
Before that, one chapter closes Part III on a different note. Everything from Chapter 10 to here has built models, and none of it has said how you would know whether one is any good. Chapter 14 answers that, taking the simplest task these models are put to and using it to establish the evaluation discipline the rest of the book depends on.
Hochreiter and Schmidhuber (1997) published the original LSTM. Gers
et al. (2002) introduce the forget gate and the bias initialisation of
Section 13.3. Cho et al. (2014) propose the
GRU. Jozefowicz et al. (2015) search thousands of gated architectures
and find no consistent winner, which is the best evidence that the
gating idea matters more than its packaging. For the clearest
diagram-led explanation of the LSTM in existence, read Olah (2015)
alongside this chapter. Both units ship as torch.nn.LSTM
and torch.nn.GRU, and the exercise below asks you to count
what they actually allocate.
Trace one cell. Using the numbers of this chapter, verify , , and , then confirm and . Now set to zero by hand and recompute. What has the cell become, and what has it forgotten?
The gradient highway. Derive Equation (13.3) from Equation (13.1), treating as constant. Then explain why the corresponding derivative for the plain RNN, Equation (12.6), cannot be made this simple.
Initialise it wrong. Compute the surviving gradient after steps for and for . Express the ratio as a power of ten. Then argue why a paper reporting that LSTMs cannot learn long dependencies should be read with this table in hand.
Count the gates. For and , compute the parameter count for a plain RNN, a GRU and an LSTM. What fraction does the GRU save, and is that fraction independent of and ?
Tie the gates. The GRU uses and where the LSTM uses independent and . Describe a sequence for which the independent pair can do something the tied pair cannot. Then say why this rarely matters in practice.
What the reset gate is for. Set in Equation (13.10) and describe the resulting unit. Now set . Which of the two settings would you expect at a topic boundary, and why?
Name the remaining limit. Gating solved the vanishing gradient. State the two problems it did not solve, and for each one explain in two sentences why attention removes it.
Count what the library allocates. Build
torch.nn.RNN, torch.nn.GRU and
torch.nn.LSTM at
and
and sum their parameters. You will get
,
and
against the
,
and
counted above, an excess of exactly
for every gate. Find the tensor responsible, explain why the arithmetic
of this chapter does not need it, and say what it would take to convince
yourself the library is not simply wasting memory.
Each one reproduces the tables above. Open it in Colab, change an input and watch which numbers move.
gated.pyThe gradient highway
What the cell state replaces the Jacobian product with, and what one number does to it.
pip install numpy Run it in Colab Notebook SourceFrom Natural Language Processing: From Corpus Statistics to Grounded LLMs, by Ramaseshan Ramachandran.