Introduction to Robot Learning · Lecture 8 of 25 · CMU 16-831

Q-Learning & Variants

Learning to act with no model of the world — only trial-and-error samples. From the temporal-difference idea, to the off-policy max that makes Q-learning special, to the two tricks (replay + target network) that let a neural network do it from raw pixels.

Prerequisites: the MDP language (state, action, reward, γ, return) and value iteration from Lecture 7. A little Python. No deep-RL assumed.
10
Chapters
7
Simulations
3
Code Labs

Chapter 0: A Maze With the Lights Off

In Lecture 7 you learned to solve a Markov Decision Process when you know everything: the reward function r(s,a) and the transition probabilities P(s′|s,a). Value iteration sweeps the whole table, the Bellman backup contracts to the optimal values, and you read off the policy. Clean. Powerful. And, for a real robot, unavailable.

Drop a robot into an unfamiliar building. It does not know the floor plan. It does not know that turning left near the kitchen leads to a staircase. It does not know what reward it will get until it actually tries something and sees what happens. There is no P, no r written down anywhere. There is only the loop: take an action, land somewhere, collect a number, repeat.

The whole lecture in one sentence. When the dynamics are unknown, we cannot do the sum ∑s′ P(s′|s,a)… that value iteration needs. So we replace that expectation we can't compute with samples we can collect. That single substitution — "sample instead of sum" — is the engine of all model-free reinforcement learning, and Q-learning is its most famous instance.

This is called model-free learning: we never build a model of P or r. Instead we directly learn a value — a number attached to each situation telling us how good it is — from raw experience. Specifically we learn the action-value Q(s,a): "if I am in state s and take action a, then act well afterward, how much total reward should I expect?"

Why Q and not just the state-value V(s)? Because Q already names the action. If you have Q(s,a) for every action, choosing what to do is trivial — take the action with the biggest Q. With V alone you would need the model to look one step ahead and ask "which action lands me in the best next state?" — and the model is exactly what we don't have. Q is the model-free-friendly value.

The robot that learns a maze with no map — watch the Q-table fill in

Press Run. A robot wanders a 5×5 gridworld it has never seen. It does not know where the goal (teal) or the pit (red) are. Each cell's color shows its current estimated value — grey = unknown, warming up as the robot learns. The arrows are the greedy policy that emerges from the values, with no model at all.

Learning rate α 0.50
Ready. The table starts blank.

Notice what is happening: the robot is not told the answer. It bumps into the pit, gets a big negative number, and the value of the cell it came from drops. It stumbles into the goal, gets a reward, and the value flows backward toward it over many episodes. The map of values builds itself out of nothing but rewards and the structure of the loop.

Where this is going. Three questions organize the whole lecture. (1) How do we turn a sampled transition into a value update — the temporal-difference idea (Ch 1–2)? (2) Do we learn the value of the policy we're following, or the value of the best policy — the on-policy vs off-policy split that separates SARSA from Q-learning (Ch 3–4)? (3) When the state space is huge (Atari pixels), how do we replace the table with a neural network without it blowing up — DQN (Ch 7–8)?

A robot is dropped into an unknown building with no floor plan and no reward function written down. Why can't it just run value iteration from Lecture 7?

Chapter 1: Monte Carlo vs Temporal Difference

We want to estimate a value — say the value of a state under our current policy, V(s) = the expected return starting from s. We have no model. We only have episodes: sequences of state, action, reward, state, action, reward, … that we collected by acting. How do we squeeze a value out of those?

Idea 1 — Monte Carlo: wait for the truth

Monte Carlo (MC) takes the honest, patient route. Run an episode all the way to the end. Add up the actual discounted rewards you actually received from state s onward — that is one sample of the return, call it G. Then nudge your estimate of V(s) a little toward that observed return:

V(s) ← V(s) + α · ( G − V(s) )

Here α (alpha) is the learning rate or step size — a small number that says "move this fraction of the way toward the new evidence." The bracket (G − V(s)) is the error: how far off our current guess was from the return we actually saw. Average enough returns and V(s) converges to the true expected return.

MC is unbiased — it uses the real return, no assumptions. But it has two problems. First, you must wait until the episode ends to get G; you cannot learn during a long episode, and you cannot learn at all in a task that never terminates. Second, G has high variance: it depends on every random thing that happened for the whole rest of the episode, so a single return can be wildly lucky or unlucky.

Idea 2 — Temporal Difference: guess from a guess

Temporal-difference (TD) learning refuses to wait. After just one step — you took action a in s, got reward r, landed in s′ — it asks: what is a good estimate of the return from s? Well, the return is "the reward I just got, plus the discounted value of where I ended up." We don't know the true value of s′, but we have a current estimate V(s′). So use it:

target = r + γ · V(s′)

This quantity — one real reward plus our discounted guess about the rest — is the TD target. We then nudge V(s) toward it exactly as before. Because the target itself contains an estimate V(s′), TD is bootstrapping: it updates a guess using another guess.

The trade made explicit. Monte Carlo waits for the true return G — unbiased, high variance, episodic only. TD substitutes its own current estimate of the future r + γV(s′) — biased early on (the estimate is wrong), low variance, learns from every single step, works without episodes ending. Robotics lives on the TD side: episodes are long or unending, and we cannot afford to wait.

MC vs TD — learning the value of a 6-step chain

A robot walks a 6-state chain; only the last step pays +1, every step is noisy. The warm bars are Monte-Carlo estimates (updated only at episode end, from the full return); the teal bars are TD(0) estimates (updated every step from r + γV(s′)). The dashed line is the true value. Press Run and watch TD's smooth, low-variance crawl vs MC's jumpier convergence.

Episodes per Run 40
Ready.
Take-away. TD is the workhorse. It learns online, step by step, with low variance, by bootstrapping off its own value estimates. The price — bias from a wrong bootstrap — shrinks as the estimates improve, and is worth paying for a robot that must learn while it acts. Every algorithm in the rest of this lecture (SARSA, Q-learning, DQN) is a TD method on the action-value Q.

What is the defining difference between a Monte Carlo update and a TD(0) update?

Chapter 2: Deriving the TD Update, Symbol by Symbol

Let us build the update from the ground up, because every Q-learning variant is a tweak of these four symbols. We start where Lecture 7 left off: the Bellman equation for the value of a policy. It says the value of a state equals the immediate reward plus the discounted value of the next state, averaged over what the world does:

Vπ(s) = E[ r + γ · Vπ(s′) ]

The expectation E[·] is the troublemaker. To evaluate it exactly you would average over all next states s′ weighted by P(s′|s,a) — and we don't have P. But here is the saving grace: a single sampled transition is an unbiased sample of that expectation. When the robot actually takes the step and observes (s, r, s′), the quantity r + γV(s′) is one draw whose average is exactly the right-hand side.

Step 1 — turn the equation into an error

If our estimate V were perfect, then V(s) would equal r + γV(s′) on average, so the gap between them would be zero on average. That gap is the TD error, written δ (delta):

δ = ( r + γ · V(s′) ) − V(s)

Read it aloud: "what I now think the value is" (the TD target r + γV(s′)) "minus what I used to think" (the old V(s)). A positive δ means this state turned out better than expected; a negative δ means worse. δ is the surprise.

Step 2 — nudge the estimate toward the truth

We don't want to overreact to one noisy sample, so we move only a fraction α of the way along the error:

V(s) ← V(s) + α · δ

Expanding δ, this is V(s) ← V(s) + α(r + γV(s′) − V(s)). The learning rate α in [0,1] is a trust dial: α = 0 ignores all new evidence (never learns); α = 1 throws away the old estimate and believes this one sample completely (jittery); a small α like 0.1 blends slowly and smoothly. This is the famous TD(0) update for state values.

Step 3 — do it for actions, to get Q

For control we want the action-value Q(s,a), because (Chapter 0) Q lets us pick actions without a model. The same logic gives the TD update on Q. We need a value for the next state too — and the next-state value is some Q(s′, a′) for some next action a′. Which a′ we plug in is the entire question of the next chapter. The skeleton is:

Q(s,a) ← Q(s,a) + α · ( r + γ · Q(s′, a′) − Q(s,a) )
Observe (s, a, r, s′)
One sampled transition from acting in the world. No model used.
↓ build the TD target
target = r + γ Q(s′, a′)
One real reward + discounted guess about the rest. Bootstrapping.
↓ the surprise
δ = target − Q(s,a)
How wrong the old estimate was for this state-action.
↓ nudge by a fraction α
Q(s,a) ← Q(s,a) + αδ
Move toward the target. Repeat forever.
↻ this single state-action's estimate creeps toward its true value
The trust dial — one value, repeated TD updates

A single state has a true value of 10 (dashed line). Each step we feed a noisy sample of the target and apply the TD update. Slide α: tiny α crawls smoothly but slowly; α near 1 snaps to each noisy sample and jitters forever. This is the bias–variance dial of every TD method.

Learning rate α 0.20
Ready.
The one substitution to remember. Value iteration computed r + γ ∑s′P(s′|s,a)V(s′) — an exact expectation needing the model. TD computes r + γQ(s′,a′) on a single sampled s′ and nudges. "Replace the sum over s′ with the s′ you actually landed in." That is how a robot does dynamic programming without a model.

In the TD error δ = (r + γV(s′)) − V(s), what does a large positive δ tell you about the state you just left?

Chapter 3: SARSA vs Q-Learning — the Off-Policy max

We left one slot blank: in the TD target r + γQ(s′, a′), which next action a′ do we evaluate? There are two natural answers, and they define the two most famous control algorithms in all of RL. They differ by one symbol and that one symbol changes everything.

SARSA — evaluate the action you actually took next

SARSA is named after the five things it uses: State, Action, Reward, next State, next Action — (s, a, r, s′, a′). It plugs in the action a′ that the agent actually takes next, drawn from its own behavior policy (with all that policy's exploration randomness):

Q(s,a) ← Q(s,a) + α · ( r + γ · Q(s′, a′) − Q(s,a) )

Because the target uses the action the current policy chose, SARSA learns the value of the policy it is actually following, exploration warts and all. This makes it an on-policy method: learn about the policy you use to act.

Q-learning — evaluate the best next action

Q-learning ignores what the agent did next. In the target it inserts the maximum Q over all next actions — the value of acting greedily from s′:

Q(s,a) ← Q(s,a) + α · ( r + γ · maxa′ Q(s′, a′) − Q(s,a) )

That little maxa′ is the most important symbol in the lecture. The agent might be exploring — wandering randomly, taking bad actions to learn — but the target always assumes it will behave optimally from the next state onward. So Q-learning learns the value of the optimal greedy policy while following a different, exploratory behavior policy. That gap between "the policy I learn about" and "the policy I act with" is what makes it off-policy.

The difference is exactly one symbol. SARSA's target uses Q(s′, a′) — the action actually taken. Q-learning's target uses maxa′ Q(s′, a′) — the best action available. Q-learning's max comes straight from the Bellman optimality equation Q*(s,a) = E[r + γ maxa′Q*(s′,a′)], whereas SARSA's a′ comes from the Bellman evaluation equation for the current policy.

Why "off-policy" is a superpower

Recall the FQI slide from lecture: given (s, a), the Q-learning update is independent of the policy π that collected the data — π only influences which transitions we see. The max throws away any dependence on how the action a′ would have been chosen. Concretely this buys three things robotics cares about deeply:

SARSAQ-Learning
TD target next-actiona′ actually takenargmax over a′ (the max)
Learns the value of…the policy it follows (with exploration)the optimal greedy policy
ClassOn-policyOff-policy
From the Bellman…evaluation equationoptimality equation
Can reuse old / others' data?No (target depends on current policy)Yes (target independent of π)
Behavior near dangercautious (accounts for own slips)aggressive (assumes perfect future)

We will see that last row come alive in Chapter 6 on the cliff. For now hold the picture: SARSA values what it will really do; Q-learning values what it could ideally do.

Why is Q-learning called off-policy while SARSA is on-policy?

Chapter 4: One Q-Update by Hand

Formulas hide until you push real numbers through them. Let us do exactly one Q-learning update with our pencil, then one SARSA update on the same transition, so the single-symbol difference becomes a single-number difference.

The setup

Suppose γ = 0.9 and α = 0.5. The robot is in state s, takes action a, gets reward r = 1, and lands in s′. From s′ there are two available actions with current estimates:

Q(s′, up) = 5,    Q(s′, down) = 8

Our current estimate for the state-action we are updating is Q(s,a) = 4. Because the robot is exploring, the action it actually takes next happens to be up (the worse one) — an exploratory choice.

Q-learning: use the max

The target uses the best next action, ignoring what the robot did:

maxa′ Q(s′,a′) = max(5, 8) = 8
target = r + γ · 8 = 1 + 0.9 × 8 = 1 + 7.2 = 8.2
δ = target − Q(s,a) = 8.2 − 4 = 4.2
Q(s,a) ← 4 + 0.5 × 4.2 = 4 + 2.1 = 6.1

SARSA: use the action actually taken (up)

Same transition, same reward — but SARSA plugs in Q(s′, up) = 5, because up is what the robot really did next:

target = r + γ · Q(s′, up) = 1 + 0.9 × 5 = 1 + 4.5 = 5.5
δ = 5.5 − 4 = 1.5
Q(s,a) ← 4 + 0.5 × 1.5 = 4 + 0.75 = 4.75
The single symbol became a single number. Same data — r = 1, the same s′, the same exploratory next action up. Q-learning moved Q(s,a) to 6.1 (it credited the state with the value of the best next move, 8). SARSA moved it to 4.75 (it credited only the value of the move actually made, 5). Q-learning is optimistic about the future; SARSA is honest about the present behavior. When that exploratory up would have walked off a cliff, SARSA's caution is exactly what saves the robot.

Now let's implement the bare tabular Q-learning update and let it solve a tiny gridworld from scratch — no model, only transitions. You will write the one line that is Q-learning: the TD update with the max.

With γ = 0.9, α = 0.5, r = 1, Q(s,a) = 4, and next-state values Q(s′,up) = 5, Q(s′,down) = 8, why does Q-learning push Q(s,a) higher (to 6.1) than SARSA does (to 4.75) when the robot actually took up?

Chapter 5: Exploration — the ε-Greedy Dilemma

Q-learning's convergence has a hidden condition that the math quietly assumes: every state-action pair must be tried infinitely often. You cannot learn the value of an action you never take. But the whole point of learning Q is to exploit — take the action with the highest Q to earn reward. These pull in opposite directions. This is the exploration vs exploitation dilemma, and it is the oldest problem in RL.

The simplest workable answer is ε-greedy (epsilon-greedy). With probability 1 − ε take the greedy action (exploit the best you know); with probability ε take a uniformly random action (explore something new):

a = argmaxa Q(s,a)   with prob. 1 − ε;   random  with prob. ε

Why does this matter for off-policy Q-learning specifically? Because Q-learning's target uses the max regardless of what we do, we are free to explore as recklessly as we like without biasing the learned values — exploration only changes which transitions we sample (the coverage), never what they teach. So ε-greedy is a clean fit: it guarantees coverage, and the off-policy max guarantees the values stay correct.

Decay ε over time. From the DQN slide: early in training the Q-values are basically a guess — explore widely to see rewards; later they are mostly right — exploit. So we start with high ε (say 1.0, fully random) and decay it toward a small floor (say 0.05). High exploration first, then reduce. This is exactly how the Atari DQN agent was trained.

How greedy is ε-greedy, really? With n actions, the greedy action is taken with probability (1 − ε) + ε/n — the explicit exploit term plus the chance the random draw happens to land on it. Each non-greedy action is taken with probability ε/n. Let's watch the trade-off as a slider.

The exploration–exploitation slider

A 5-armed bandit: one arm pays much more, but the agent must find it. Slide ε. Left (ε→0): pure exploitation — it locks onto whatever looked best first and may never discover the real winner. Right (ε→1): pure exploration — it finds the winner but keeps throwing reward away on random arms. The sweet spot is a small positive ε that decays.

ε (explore rate) 0.10
Ready.

Let's nail the probabilities down in code — both the per-action selection probabilities and the empirical greedy fraction over many draws.

With 4 actions and ε = 0.4, how often does an ε-greedy policy take the current greedy action?

Chapter 6: The Cliff — Where On-Policy and Off-Policy Visibly Split

Chapter 3 promised that SARSA and Q-learning behave differently, not just compute differently. The classic demonstration is Sutton & Barto's cliff-walking gridworld, and it is worth understanding deeply because it exposes what "on-policy" really means.

The world: a grid. Start bottom-left, goal bottom-right. Along the bottom edge between them runs a cliff: stepping into it gives a huge −100 reward and snaps you back to the start. Every ordinary step costs −1. The robot still uses ε-greedy exploration the whole time, so it always has a chance of a random misstep.

Both algorithms learn the same Q* in the limit. But the paths they walk while learning differ sharply:

The misconception to kill. "Q-learning is better because it finds the optimal path." True about the learned policy — but if you act with exploration (and a real robot always has some noise), the on-policy SARSA path is safer and earns more reward in practice, because it factors its own slips into the value. On a real cliff, falling once costs you the robot. Off-policy optimality and on-policy safety are different goals. Choose deliberately.

Cliff-walk: Q-learning hugs the edge, SARSA takes the safe road

Both agents are trained on the same cliff with the same ε. After training, the warm path is the policy Q-learning learned (the risky optimal edge); the teal path is SARSA's (the safe detour one row up). The red strip is the cliff. Press Train, then watch how often each falls when you act ε-greedily.

Exploration ε (while acting) 0.10
Press Train both.

The deeper lesson: the max in Q-learning is optimistic. It assumes flawless future execution. That optimism is exactly right when you want the truly optimal policy and exploration will eventually vanish. It is dangerous when you must act under the very exploration you are using to learn. SARSA's on-policy honesty is a feature, not a bug, in safety-critical settings.

On the cliff, with continued ε-greedy exploration, why does SARSA earn more reward during training than Q-learning even though both eventually learn Q*?

Chapter 7: From Table to Network — and Why It Explodes

So far Q has been a table: one cell per (state, action). For our 5-cell corridor that is 10 numbers. For Atari it is hopeless. The state is the screen: roughly 210×160 pixels, and the lecture uses 4 stacked frames to capture motion. The number of distinct screens is astronomically larger than the number of atoms in the universe. You will never visit the same pixel-state twice, so a table learns nothing — this is Bellman's curse of dimensionality.

The fix: function approximation

Replace the table with a parametric function Qφ(s,a), where φ (phi) is a vector of weights — for Atari, a convolutional neural network. The good news from the lecture: the optimal Q has structure, smooth patterns over states, and "that is exactly what deep learning is good at." Input a screen, output one Q-value per action. We fit φ by regression, minimizing the squared TD error:

L(φ) = E[ ( Qφ(s,a) − ( r + γ · maxa′ Qφ(s′,a′) ) )² ]

This is fitted Q-iteration: collect transitions, form the regression targets y = r + γmax Q, fit Qφ to them, repeat. Done in one batch it is offline FQI; done one sample at a time with a gradient step it is online Q-learning:

φ ← φ − η · ( Qφ(s,a) − y ) · ∇φ Qφ(s,a)

The catch: this is not gradient descent

Look carefully at the target y = r + γmaxa′Qφ(s′,a′). It also depends on φ — the same weights we are updating! A true gradient would differentiate through y as well. Q-learning does not; it freezes y and only differentiates Qφ(s,a). The lecture calls this a semi-gradient method. You are chasing a target that moves every time you take a step toward it.

The deadly triad. Three ingredients are each fine alone but together can make the values diverge to infinity: (1) bootstrapping (the target r + γmax Q contains an estimate), (2) off-policy learning (the data comes from a different policy than the greedy one we evaluate), and (3) function approximation (one weight update at a state nudges Q at other states it generalizes to, breaking the local fix). Naive Q-learning with a neural network is all three at once. This is why early attempts blew up — and why DQN exists.

Concretely the failure mode is a feedback loop: you raise Qφ(s,a) toward its target; generalization also raises Qφ(s′,·); but that raises the target y for (s,a); so you raise Qφ(s,a) again; and the estimates spiral upward without bound. Add correlated, non-stationary data (consecutive frames are nearly identical, and the data distribution shifts as the policy improves) and the regression has none of the i.i.d. comfort supervised learning relies on.

Chasing a moving target — why a fixed target stabilizes the bootstrap

A single Q-value (warm dot) chases its bootstrap target (teal). With moving target on, every step we move toward the target also drags the target up (generalization) — watch them race off to infinity. Toggle fixed target (DQN's idea): freeze the target for a while and the estimate settles onto it cleanly.

Ready. Moving target = the deadly triad in action.
What are the three ingredients of the "deadly triad" that can make naive deep Q-learning diverge?

Chapter 8: DQN — Two Tricks That Tame the Triad

In 2013 (workshop) and 2015 (Nature), DeepMind's Deep Q-Network (DQN) trained a single network to play Atari from raw pixels and the score alone — no game-specific features, the same architecture across games. The lecture's framing is the cleanest: every algorithmic idea in DQN aims to make Q-learning "closer" to standard supervised learning with an SGD update. Two ideas do most of the work, and each attacks one leg of the deadly triad.

The data flow

State s = 4 stacked frames
Raw pixels in. Stacking frames captures motion (which way the ball moves).
↓ convolutional network Qφ
Output: one Q-value per action
Not Q(s,a) one at a time — the whole row Q(s,·) in a single forward pass, so the max is cheap.
↓ act ε-greedily, observe (s,a,r,s′)
Store transition in replay buffer
A big ring buffer of past (s,a,r,s′) tuples.
↓ sample a random minibatch
Target y = r + γ maxa′ Qφ−(s′,a′)
Computed with the frozen target network φ−, not the live φ.
↓ SGD step on (Qφ(s,a) − y)²
Periodically copy φ → φ−
Refresh the target every C steps (or slowly: φ− ← (1−λ)φ + λφ−).

Trick 1 — the experience replay buffer (decorrelate the data)

Instead of training on the stream of consecutive, highly correlated transitions, store every transition in a large replay buffer and train on random minibatches sampled from it. This does two things. It breaks the temporal correlation — a random minibatch looks much more like the i.i.d. data SGD expects. And it reuses each transition many times, which is precious when robot data is expensive. This is only legal because Q-learning is off-policy: a transition collected long ago by a stale policy is still a valid sample of r + γmax Q, since the target ignores how the action was chosen (Chapter 3).

Trick 2 — the target network (stop chasing yourself)

The remaining problem is the moving target from Chapter 7: y depends on φ. DQN keeps a second copy of the network, the target network with parameters φ−, identical architecture but lagging weights. All targets are computed with φ−:

y = r + γ · maxa′ Qφ−(s′, a′)

For C steps φ− is frozen, so the target is a fixed regression target — exactly the stability that offline FQI enjoyed. Every C steps we copy φ− ← φ (or blend it slowly). Now the SGD step really is fitting a static target, and the feedback loop that diverged in Chapter 7's widget is broken — just as the "fixed target" toggle showed.

How the tricks map to the triad. Replay buffer → tames the correlated, non-stationary data problem (and exploits off-policy reuse). Target network → tames the bootstrapping problem by freezing the estimate inside the target. Together they make the unstable semi-gradient behave enough like supervised regression to converge in practice — even if there is still no full convergence proof.

One more bug, one more fix: overestimation

The max in the target has a subtle flaw. Note r + γmaxa′Qφ−(s′,a′) = r + γQφ−(s′, argmaxa′Qφ−(s′,a′)). The same noisy network both picks the best action (argmax) and evaluates it. The argmax systematically selects whichever action got a lucky positive noise bump, so the max is biased upward — a "guess of a guess" that overestimates. Double DQN (DDQN) fixes it in three lines: use the live network φ to pick the action, the target network φ− to evaluate it:

y = r + γ · Qφ−( s′, argmaxa′ Qφ(s′,a′) )

Decoupling selection from evaluation removes most of the optimistic bias. Two more lecture extensions round it out: prioritized experience replay samples high-TD-error transitions more often (replay the surprising data), and the dueling architecture splits the network into a state-value V(s) and per-action advantages A(s,a) = Q(s,a) − V(s), so the agent learns "this state is good" without needing to nail every action.

Replay buffer — consecutive correlated stream vs random minibatch

The strip is a replay buffer of stored transitions, colored by recency. Stream mode trains on the latest few in order (highly correlated — the red bracket). Replay mode samples a random minibatch from the whole buffer (the scattered teal picks — decorrelated, and old data reused). Toggle and press Step.

Ready.
Why is the experience replay buffer only valid for Q-learning (and not, say, for plain on-policy SARSA)?

Chapter 9: Cheat Sheet & Connections

You arrived with value iteration and a known model. You leave able to learn the optimal action-values of an unknown world from raw experience, and to scale that to a neural network on pixels. Here is the whole lecture on one page.

The update ladder

MethodTargetClassNeeds model?
Value iteration (L7)r + γ∑s′P(s′|s,a)max QplanningYes
Monte Carlofull return Gmodel-freeNo
TD(0) (state value)r + γV(s′)model-freeNo
SARSAr + γQ(s′,a′)on-policyNo
Q-learningr + γmaxa′Q(s′,a′)off-policyNo
FQI / DQNr + γmaxa′Qφ−(s′,a′)off-policy + neural netNo
Double DQNr + γQφ−(s′, argmaxa′Qφ)off-policy, debiased maxNo

The five things to remember

The frontier from the slides. Continuous actions break the max (you can't enumerate infinitely many actions). Fixes: discretize (not scalable), optimize the action with a stochastic method like CEM, use a structured easy-to-max Q (NAF), or learn an actor μθ(s) ≈ argmaxaQ(s,a) — which is DDPG, and the doorway to actor-critic methods. That actor idea is the bridge to the next lecture.

Where to go next

The throughline of the course. Lecture 1 said robotics is "learning to make sequential decisions in the physical world." Q-learning is the purest model-free answer to how: estimate the long-run value of each action from samples, then act greedily. Everything after — actor-critic, offline RL, model-based RL — is built on the value-bootstrapping machinery you just derived by hand.

"The best way to learn about algorithms is to implement them." — from the lecture's own closing slide. You just did, three times.