In the last post we built gradient descent: measure the slope, step against it, repeat. It works, but it has habits that make real training slow and fragile. It zigzags across narrow valleys. It crawls on flat ground. And it uses one step size for every weight, even when some weights sit on steep slopes and others on gentle ones.
The methods that fix this are called optimisers. An optimiser is just a rule for turning the gradient into a step. In this post we build the four you will meet everywhere (stochastic gradient descent, momentum, RMSProp and Adam), then add learning-rate schedules, which change the step size as training goes on.
We will keep using the same landscape as post 2, so you can see the same terrain walked better and better:
| What | Value |
|---|---|
| The bowl | |
| Its slopes (the gradient) | |
| Starting point | , where the loss is 20 |
| The bottom | , where the loss is 0 |
Later we will also use a long valley, : the same narrow direction, but the gentle direction made ten times flatter.
Plain gradient descent and its three problems
Recall the rule from post 2. In one sentence: move every weight a step against its own slope, with one shared step size.
- is one weight; the arrow means “replace with”.
- is that weight’s slope, . We write for “gradient” to keep formulas short.
- (eta) is the learning rate.
When is computed on a random mini-batch rather than all the data, this is stochastic gradient descent (SGD), and in practice people call the whole family SGD. On our toy bowls the gradient is exact, but every idea below works the same with noisy gradients.
On the bowl, with , post 2 found the zigzag: . Each step multiplies by and by .
That small example already shows the three problems.
- Zigzag in narrow valleys. The steep direction () overshoots and flips sign every step, while the gentle direction () creeps. Raise to speed up , and explodes once passes 0.25.
- Slow on flat ground. On the long valley the slope in is , tiny. With , is multiplied by per step: after 10 steps it has only gone from 4 to 2.66.
- One step size for every weight. The best for and the best for are different numbers, but plain descent must pick one, and the steepest direction always wins that argument.
Each optimiser below fixes one or more of these. Here is the race we are building towards.
Momentum: a heavy ball with a memory
The idea
Plain descent is a walker with no memory: every step looks only at the slope underfoot. Imagine instead a heavy ball rolling downhill. It builds up speed along directions where the slope keeps pointing the same way, and when the slope flips back and forth (as in the zigzag), the pushes cancel and the ball calms down.
In one sentence: keep a running velocity that adds up recent gradients, fading old ones, and step along the velocity instead of the raw gradient.
- is the velocity, one number per weight, starting at 0.
- (beta) is the momentum coefficient, usually 0.9. It says how much of the old velocity survives each step: 90%.
- is the gradient now; is the learning rate.
Everyday picture: pushing a child on a swing, or a shopping trolley. Each push adds to the motion you already have. Pushes in the same direction pile up; pushes that alternate mostly cancel.
This is the heavy ball method of Boris Polyak (1964).
Why it adds up to “ten times”
If the gradient stays the same, say , the velocity goes , then , then , and settles towards 10. So on a steady slope, momentum with learning rate moves like plain descent with learning rate . That is why momentum is usually paired with a smaller learning rate. Below we use .
(Some libraries write the velocity as an average, , which settles at instead of . Same idea, with the factor of 10 moved into . We will meet this averaging form properly in the moving average.)
Three steps by hand
Bowl , start , , , velocity starts at .
Step 1.
- Gradient: .
- Velocity: .
- Update: . Loss 14.4.
Step 2.
- Gradient: .
- Velocity: .
- Update: . Loss 8.2944.
Step 3.
- Gradient: .
- Velocity: .
- Update: . Loss 4.9455.
Look at the two directions.
- In , where the slope always points the same way, the velocity grows: 8, 14.4, 18.72. The steps grow too: 0.4, 0.72, 0.936. That is the speed-up on gentle slopes.
- In , step 3 is interesting. The gradient is exactly 0 (we are on the valley floor), yet the ball keeps moving to , because the velocity remembers. This is overshoot: a heavy ball rolls past the bottom and has to come back.
What would change with a smaller ? At the velocity is just the gradient, and we are back to plain descent. At old pushes fade twice as fast, so the ball overshoots less but speeds up less.
Honest result: on this small, fairly round bowl, momentum at these settings is not faster than plain descent at . After 10 steps momentum’s loss is 6.61 (it is swinging past the bottom) against plain descent’s 0.0007. Momentum’s real wins are on long, flat valleys (on the long valley it reaches 0.0020 after 60 steps against 0.0119) and, as the next figure shows, on bumpy ground.
Rolling through a small dip
The heavy ball has a second gift. Here is a 1-D loss with a small dent on the way down:
- The first part, , is a wide bowl with its bottom at .
- The second part digs a small dip near . Together they make a local minimum at 2.667 (loss 0.311), guarded on the left by a small hump at 2.193 (loss 0.345). The true bottom is at , loss 0.
Start at with . The slope there is 1.0013.
- Plain descent walks into the dip and stays: and after about 21 steps it sits at 2.667 for ever. At the bottom of the dip the slope is zero, so nothing pushes it out.
- Momentum with gathers speed on the way down. Its positions are , and at step 6 it reaches 1.6457, past the hump. Inside the dip the gradient pushes back (at step 6 the gradient is ), but the velocity of 3.645 carries it through. It swings as far as −2.144 at step 15, then settles towards 0.
What would change with a smaller ? At the ball does not build enough speed and is caught in the dip; at it just escapes. Momentum is not a guarantee, just a better chance, the same way the noise from mini-batches helped escape the saddle in post 2.
Nesterov momentum: look before you leap
A small improvement, due to Yurii Nesterov (1983) and brought into deep learning by Sutskever and colleagues (2013). In one sentence: measure the gradient not where you stand, but where the velocity is about to carry you.
The only change is inside the gradient: is a look-ahead point, roughly where the ball will be next. Everyday picture: a cyclist who looks at the road ahead rather than at the front wheel, and starts braking before the bend.
Step 1 is the same as plain momentum (velocity is 0, so the look-ahead point is where we stand): . Step 2:
- Look-ahead: .
- Gradient there: , smaller in than the at the current point, because the look-ahead is closer to the valley floor.
- Velocity: .
- Update: .
Compare with plain momentum’s and then : Nesterov’s third point is , overshooting by much less. It brakes earlier.
Moving averages and their early bias
Before the next optimisers we need one tool, used three times in Adam. It deserves its own section.
In one sentence: an exponential moving average (EMA) keeps a running summary that is mostly the old summary plus a little of the new value.
- counts steps: 1, 2, 3, …
- is the new value at step (for us, a gradient).
- is the average after step ; it starts at .
- is how much of the old average to keep; is how much of the new value to let in.
Everyday picture: the “feels like” temperature of a room. Open a window for a second and the room barely changes; leave it open and it slowly follows the outside. With , each new value gets a 10% say, and a value from 10 steps ago still has about of its original weight. Roughly, the average remembers the last values.
Worked example: smoothing a noisy gradient
Suppose a weight’s gradients over eight mini-batches are . Their true average is 3.5; the jumps are mini-batch noise. With :
- 0.4
- 0.56
- 1.104
Something is wrong. The gradients are around 3.5, but the average says 0.4, then 0.56, then 1.104. After 8 steps it has only reached 1.954. The average is badly biased towards zero at the start.
Where the bias comes from
The reason is the starting value . Unroll the formula when every gradient equals the same number :
(The middle bracket is a geometric sum, and times it is exactly .) So after steps, the average holds only a fraction of the true value. The rest of the weight is still sitting on the made-up 0 we started with.
With and a steady gradient of 8, as at the first step on our bowl: 0.8, 1.52, 2.168, and even 5.21. Ten steps in, still a third short.
The fix: divide by what is missing
In one sentence: since the average holds only of the truth, divide by .
- (read “m hat”) is the bias-corrected average.
- At step 1, , so exactly: the first estimate is just the first value, which is the most honest thing it could be.
- As grows, shrinks to 0, the divisor becomes 1, and the correction switches itself off.
Back to the noisy gradients:
| Step | True mean so far | ||||
|---|---|---|---|---|---|
| 1 | 4 | 0.4 | 0.1 | 4.0 | 4.0 |
| 2 | 2 | 0.56 | 0.19 | 2.947 | 3.0 |
| 3 | 6 | 1.104 | 0.271 | 4.074 | 4.0 |
| 4 | 3 | 1.2936 | 0.3439 | 3.762 | 3.75 |
| 8 | 3 | 1.9542 | 0.5695 | 3.431 | 3.5 |
The corrected average tracks the real values from the very first step. What would change with a smaller ? At the bias disappears faster ( by step 3) but the average jumps around more: it goes , following each noisy value closely.
Per-weight step sizes: AdaGrad and RMSProp
Now the third problem: one step size for every weight. The idea is to give each weight its own step size, based on how big its gradients usually are. Big gradients get a smaller step size; small gradients get a larger one.
AdaGrad
AdaGrad (adaptive gradient) by Duchi, Hazan and Singer (2011). In one sentence: keep a running total of each weight’s squared gradients, and divide the step by its square root.
- is the running total of squared gradients for this weight, starting at 0.
- measures “how big this weight’s gradients have been so far”.
- (epsilon) is a tiny number, such as , that only stops a division by zero. It is too small to change any number below.
Everyday picture: a thermostat that has learned which radiators run hot. A weight that always gets big pushes has its pushes turned down; a weight that rarely gets pushed is turned up. This made AdaGrad popular for rare features, such as uncommon words, whose weights get few updates.
By hand on the bowl with :
- Step 1: gradient . , . Step for both. New point , loss 13.25.
- Step 2: gradient . , . Steps and . New point , loss 10.359.
- Step 3: steps and . New point , loss 8.593.
Notice step 1: both weights moved by exactly , whatever the size of the gradient. No zigzag at all. But notice also that only ever grows, so the steps shrink for ever, even on flat ground where we would like to keep going. After 50 steps, AdaGrad’s loss is still 0.062.
RMSProp
RMSProp (root mean square propagation) was proposed by Tieleman and Hinton in a 2012 online lecture, never in a paper. In one sentence: like AdaGrad, but replace the growing total with a moving average of squared gradients, so old gradients are forgotten.
- is the moving average of the squared gradient, starting at 0. Its square root is the root mean square (RMS) of recent gradients: a typical gradient size.
- is usually 0.9 here.
- Everything else is as before.
Dividing by a typical makes the step roughly in size for every weight, steep or gentle. The step’s direction still comes from the gradient’s sign and recent history.
By hand on the bowl with , :
Step 1. Gradient .
- ; .
- Step: for both.
- New point . Loss 9.321.
Step 2. Gradient .
- ; .
- ; .
- Steps: and .
- New point . Loss 6.036.
Step 3. Gradient . , , step . New point , loss 4.046.
Two things to notice.
- In step 2 the gradient shrank from 8 to 0.411, but still remembers the old 64, so the step is small and lands almost exactly on the valley floor. No zigzag.
- Step 1 was bigger than : instead of . That is the early bias again: holds only 10% of , so is only of , and the step is times too big. Adam will fix this.
Same path on both bowls
Here is the striking part. Run RMSProp on the long valley, . The gradient is now ten times smaller: instead of . But is times smaller ( instead of ), so is also ten times smaller, and the ratio is unchanged: , the same step. RMSProp follows exactly the same path on both bowls: , , .
Plain descent at on the long valley does much worse: , , , loss 1.439 after three steps against RMSProp’s 0.405. Its barely moves because the slope is flat, and it cannot raise because would explode.
Dividing each weight’s step by its own typical gradient size cancels out how steep or flat that direction is. That is the whole point of per-weight step sizes.
The weakness shows later. Near the bottom, gradients become tiny, shrinks to match, and the step stays roughly in size. So RMSProp with a fixed learning rate never settles: on the bowl its loss reaches 0.0003 at step 20, then jitters back up to 0.19 at step 40. Keep that in mind for schedules.
Adam: momentum plus RMSProp, with bias correction
Adam (adaptive moment estimation), by Diederik Kingma and Jimmy Ba (2015), is the default optimiser for most of deep learning today, including the Transformers behind speech models like Pocket TTS. It is three ideas you now know, stacked:
- A moving average of the gradient, : momentum (direction, with memory).
- A moving average of the squared gradient, : RMSProp (typical size, per weight).
- Bias correction for both, because both start at 0.
The formulas
In one sentence: step along the remembered direction, divided by the remembered size, after correcting both for their zero start.
- is the first moment: an average of the gradient. “Moment” is the statistics word; the first moment is the mean.
- is the second moment: an average of the squared gradient. (This is not the velocity from the momentum section; Adam’s paper uses for this.)
- and are the defaults. is much closer to 1, so the size estimate remembers about 1000 steps.
- , are the bias-corrected versions.
- is the learning rate (the paper’s default is 0.001 for real networks; we use 0.5 on our toy bowl so the steps are visible). .
Everyday picture: a hiker with a compass and a stride length. The compass () is an average of recent directions, so a single odd reading does not throw it off. The stride () is shortened on ground that has been rough and lengthened on ground that has been smooth.
Why bias correction matters even more here
Look at the step at without correction. With gradient :
- (10 times too small).
- , so (about 31.6 times too small).
- The ratio .
So the uncorrected first step is about 3.16 times bigger than . The small numerator is underestimated, but the denominator is underestimated far more, because is closer to 1. With and : 1.581 instead of 0.5. Without the correction, Adam’s first steps would be about three times bigger than the learning rate asks for, and bigger still with closer to 1. Kingma and Ba added the correction for exactly this reason.
With correction, and , so the first step is : exactly one learning rate, in the downhill direction, for every weight.
Three Adam steps by hand
Bowl , start , , , , .
Step 1 (; corrections and ).
| Gradient | ||
| 0.8 | 0.8 | |
| 0.064 | 0.064 | |
| 8 | 8 | |
| 64 | 64 | |
| 8 | 8 | |
| Step | 0.5 | 0.5 |
| New weight | 3.5 | 0.5 |
Loss 13.25.
Step 2 (; corrections and ).
| Gradient | ||
| 7.474 | 5.895 | |
| 56.496 | 39.988 | |
| 7.516 | 6.324 | |
| Step | 0.497 | 0.466 |
| New weight | 3.003 | 0.034 |
Loss 9.022.
Step 3 (; corrections and ).
| Gradient | 6.006 | 0.271 |
| 1.879 | 1.035 | |
| 0.14889 | 0.07993 | |
| 6.932 | 3.820 | |
| 49.680 | 26.670 | |
| 7.048 | 5.164 | |
| Step | 0.492 | 0.370 |
| New weight | 2.511 | −0.336 |
Loss 6.757.
What to notice:
- Every step is close to in size, for both weights, even though the gradient fell from 8 to 0.271. That is the RMSProp half.
- In step 3, ‘s gradient is nearly 0 but is still 3.820, so overshoots past 0 to . That is the momentum half, with the same overshoot we saw by hand earlier.
- What would change with ? Every step would be about 0.1 instead of 0.5: , then , then . Steady, but slow: Adam’s step size is set by , not by the gradient.
Like RMSProp, Adam’s path is the same on both bowls, since stretching a direction scales and alike. On the long valley after 10 steps, Adam’s loss is 0.147 against plain descent’s 0.707. And like RMSProp, with a fixed learning rate it never quite settles: on the bowl its loss is 0.30 at step 10 but 1.17 at step 20, as it circles the bottom.
The race, honestly
Here are the losses in Figure 1, with the defaults (plain descent ; momentum , ; RMSProp , ; Adam , , ).
| Loss after step | 10 | 20 | 40 | 60 |
|---|---|---|---|---|
| Bowl | ||||
| Plain descent | 0.0007 | 0.0000 | 0.0000 | 0.0000 |
| Momentum | 6.61 | 2.12 | 0.216 | 0.025 |
| RMSProp | 0.215 | 0.0003 | 0.188 | 0.038 |
| Adam | 0.301 | 1.168 | 0.038 | 0.006 |
| Long valley | ||||
| Plain descent | 0.707 | 0.313 | 0.061 | 0.012 |
| Momentum | 1.685 | 0.239 | 0.031 | 0.002 |
| RMSProp | 0.022 | 0.0000 | 0.188 | 0.038 |
| Adam | 0.147 | 0.322 | 0.004 | 0.001 |
Three honest lessons.
- On a small, round-ish bowl, well-tuned plain descent wins. Fancier is not always faster.
- Stretch the valley and the per-weight methods win easily early on, because their behaviour does not depend on how flat a direction is. In real networks, directions differ in steepness by factors far bigger than 40, and you do not know them in advance. That robustness is why Adam is the default.
- With a fixed learning rate, RMSProp and Adam wander near the bottom. They need the learning rate to come down. That is the job of a schedule.
AdamW and decoupled weight decay
A common trick against overfitting, covered fully in the regularisation post, is weight decay: pull every weight a little towards zero each step. With plain descent, the usual way to do it is to add a penalty to the loss, which adds to the gradient. (, lambda, sets the strength.)
With Adam, that goes wrong. The extra is mixed into , so it is averaged into and then divided by like everything else. Weights with big gradients get their decay shrunk; weights with small gradients get it blown up.
A tiny example. One weight, , true gradient , , , first step.
- Penalty in the gradient (Adam with L2): . Then , , . Step 0.5. A whisper of decay became a full learning-rate step.
- Decoupled (AdamW): leave the gradient alone, and shrink the weight separately:
Here the Adam part is and the decay is 0.02, exactly what the strength asked for.
This fix is AdamW, by Ilya Loshchilov and Frank Hutter (2019). The “W” stands for weight decay. AdamW is what most large models, including language and speech Transformers, are trained with today.
Learning-rate schedules
So far has been fixed. But the best step size changes during training. Early on, the weights are far from good and big steps help. Late in training, the weights are close, mini-batch noise and the wandering we saw above dominate, and small steps help. A schedule is a rule for as a function of the step number .
For all three examples: training lasts steps, and the peak learning rate is .
Step decay
In one sentence: hold fixed, then cut it by a factor at chosen milestones.
Example: multiply by 0.1 at steps 50 and 75. So for steps 0 to 49, 0.01 for steps 50 to 74, 0.001 for steps 75 to 100. Everyday picture: driving on the motorway, then the main road, then your street. Simple and still common for image models, but the sudden drops cause sudden jumps in the loss curve, and you must choose the milestones.
Cosine decay
In one sentence: glide smoothly from the peak to zero along half a cosine wave.
- is the current step, the total number of steps.
- goes from at the start to at the end, so goes from 2 to 0.
- is the floor; here 0.
Worked values with , :
- : 0.1.
- : , so 0.0854.
- : , so 0.05, exactly half.
- : , so 0.0146.
- : 0.
It stays high for a long time, then falls steeply in the middle, then eases gently into zero. Cosine decay comes from SGDR (stochastic gradient descent with warm restarts) by Loshchilov and Hutter (2017), who also restarted the cosine several times; most people now use a single cosine.
Linear warm-up
In one sentence: start near zero and raise it in a straight line to the peak over the first few steps, then decay.
With 10 warm-up steps followed by a cosine over the remaining 90:
- : . So gives 0.01, gives 0.05, gives 0.1.
- : the cosine formula with in place of and in place of . At : , so 0.0933. At : 0.0587. At : 0.0179.
Why warm up? Two reasons.
- Large batches. Goyal and colleagues (2017) trained an image classifier with very large batches and a correspondingly large learning rate. Starting at the full rate made early training unstable; ramping up over the first 5 epochs fixed it.
- Adam’s early estimates are thin. In the first steps, is an average of only one or two squared gradients, so it is a shaky estimate of the typical gradient size. We saw that Adam’s first step moves every weight by a full , whatever its gradient, because . If is already at its peak, every weight in the network takes a full-sized step on the evidence of a single mini-batch. Warm-up keeps those early steps small until the averages have seen enough data. Liu and colleagues (2020) analysed this problem in detail.
Warm-up followed by cosine decay is the most common schedule for Transformers today.
Back to the race: give RMSProp or Adam a decaying schedule in Figure 1 (turn on “Cosine decay over 60 steps”) and the wandering near the bottom fades as the step size shrinks.
Choosing a learning rate
Every optimiser above still has a learning rate, and it still matters most. How do you pick one without knowing the landscape?
Try a range
The simplest honest method: try several values spread over orders of magnitude, run each briefly, and compare. On the 1-D bowl from post 2, from , each step multiplies the distance by , so after 5 steps the loss is :
| 0.001 | 0.01 | 0.03 | 0.1 | 0.3 | 0.5 | 0.9 | 1.0 | 1.1 | |
|---|---|---|---|---|---|---|---|---|---|
| Loss after 5 steps | 8.82 | 7.35 | 4.85 | 0.966 | 0.0009 | 0 | 0.966 | 9.0 | 55.7 |
The picture you get is always the same shape: a long flat stretch where nothing happens (too small), a dip where learning is fast, then a sharp rise (too big). The best value sits in the dip, a little below the cliff edge.
The learning-rate range test
Leslie Smith (2017) made this cheap. In one sentence: run one short training run in which the learning rate starts tiny and increases every mini-batch, and record the loss as you go. Plot loss against learning rate. Smith plotted accuracy against the learning rate: where accuracy starts rising, the rate is large enough to learn; where it stops rising or turns ragged, it is too large, and the good range lies between. Most people now read the loss curve the same way, picking a rate somewhat below the point where the loss is lowest.
It costs one short run instead of many, and it works with any optimiser.
What to remember
- Plain (stochastic) gradient descent has three problems: it zigzags in narrow valleys, crawls on flat ground, and uses one step size for every weight. The steepest direction sets the limit for all.
- Momentum keeps a velocity and steps along it. Consistent directions speed up (by up to times), alternating ones cancel, and the ball can roll through small dips, at the cost of overshoot. Nesterov measures the gradient at the look-ahead point and brakes earlier.
- An exponential moving average started at zero is biased low by a factor ; dividing by it fixes the early estimates.
- AdaGrad and RMSProp divide each weight’s step by its typical gradient size, so steep and flat directions take similar steps. AdaGrad’s total only grows, so it slows for ever; RMSProp’s average forgets.
- Adam is momentum plus RMSProp plus bias correction. Its first step moves every weight by exactly . AdamW applies weight decay separately so it is not distorted by the per-weight scaling.
- Schedules (step, cosine, warm-up then cosine) lower the learning rate when the noise near the bottom matters; warm-up keeps Adam’s early, poorly estimated steps small.
- Choose the learning rate by sweeping it: too small is flat, too big is a cliff, the dip in between is the target. The range test does it in one run.
Try it yourself
- Figure 1. Defaults, bowl. After 3 steps: plain descent at (0.864, −0.216), momentum at (1.944, −0.54), RMSProp at (2.011, 0.000), Adam at (2.511, −0.336). After 10 steps the losses are 0.0007, 6.61, 0.215, 0.301. Switch to the long valley: after 10 steps 0.707, 1.685, 0.022, 0.147.
- Figure 2. After 6 steps, momentum () is at 1.646, past the hump at 2.193; plain descent is at 3.829 and will stop at 2.667. Set and momentum is trapped too.
- Figure 3. : after step 3 the raw average reads 1.104 and the corrected one 4.074; after step 8, 1.954 and 3.431. Set : corrected step 2 is 2.667.
- Figure 4. After 3 steps on the long valley, plain descent is at (3.539, −0.216) with loss 1.439, RMSProp at (2.011, 0.000) with loss 0.405. RMSProp’s points match those on the bowl.
- Figure 5. Gradients 8, 7, 6.006 with : reads 8, 7.474, 6.932, reads 64, 56.496, 49.680, steps 0.5, 0.497, 0.492. Turn off bias correction: step 1 becomes 1.581.
- Figure 6. At step 25: step decay 0.1, cosine 0.0854, warm-up plus cosine 0.0933. At step 75: 0.001, 0.0146, 0.0179.
- Figure 7. Learning rate 0.3: loss after 5 steps 0.0009. Learning rate 1.1: 55.7.
Sources
- B. T. Polyak (1964). “Some methods of speeding up the convergence of iteration methods.” USSR Computational Mathematics and Mathematical Physics, 4(5), 1–17. The heavy ball (momentum) method.
- Y. Nesterov (1983). “A method for solving the convex programming problem with convergence rate O(1/k²).” Soviet Mathematics Doklady, 27, 372–376 (Russian original in Doklady Akademii Nauk SSSR, 269, 543–547).
- I. Sutskever, J. Martens, G. Dahl and G. Hinton (2013). “On the importance of initialization and momentum in deep learning.” ICML 2013. Nesterov momentum in deep learning.
- J. Duchi, E. Hazan and Y. Singer (2011). “Adaptive Subgradient Methods for Online Learning and Stochastic Optimization.” Journal of Machine Learning Research, 12, 2121–2159. AdaGrad.
- T. Tieleman and G. Hinton (2012). “Lecture 6.5, rmsprop: Divide the gradient by a running average of its recent magnitude.” Neural Networks for Machine Learning, Coursera. RMSProp (unpublished lecture).
- D. P. Kingma and J. Ba (2015). “Adam: A Method for Stochastic Optimization.” ICLR 2015. arXiv:1412.6980.
- I. Loshchilov and F. Hutter (2019). “Decoupled Weight Decay Regularization.” ICLR 2019. arXiv:1711.05101. AdamW.
- I. Loshchilov and F. Hutter (2017). “SGDR: Stochastic Gradient Descent with Warm Restarts.” ICLR 2017. arXiv:1608.03983. Cosine schedule.
- P. Goyal, P. Dollár, R. Girshick, P. Noordhuis, L. Wesolowski, A. Kyrola, A. Tulloch, Y. Jia and K. He (2017). “Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour.” arXiv:1706.02677. Linear scaling and gradual warm-up.
- L. N. Smith (2017). “Cyclical Learning Rates for Training Neural Networks.” WACV 2017. arXiv:1506.01186. The learning-rate range test.
- L. Liu, H. Jiang, P. He, W. Chen, X. Liu, J. Gao and J. Han (2020). “On the Variance of the Adaptive Learning Rate and Beyond.” ICLR 2020. arXiv:1908.03265.