Özer Cem KELAHMETKELAHMET
Tools · Reinforcement learning

Double DQN

Double DQN explained: how splitting action selection from evaluation reduces overestimated Q-values in DQN, with a worked example, code, limits and tabular uses.

Overview

Double DQN is a small but important change to DQN that reduces a systematic error called overestimation bias. In plain DQN, the same network picks the best next action and also scores it. When estimates are noisy, taking the maximum tends to pick values that are too high by luck. Double DQN splits the two jobs: the main network chooses the action and the target network evaluates it. The result is more accurate value estimates and often a more stable, better policy.

The change is only a line or two of code, it costs almost nothing in compute, and it needs no new hyperparameters. That is why many practitioners treat it as the default form of DQN. It belongs to the wider reinforcement learning family and is one of the building blocks of Rainbow. For discrete-action decision problems with tabular state, such as dispatching or scheduling, it is a sound first choice.

What it is

DQN learns an action-value function Q(s, a) by regression toward a bootstrapped target. The target uses a maximum over the next actions. A maximum of noisy numbers is biased upward. Double DQN corrects the target so that the maximum is not taken over the same noisy numbers that are then used as the answer.

An everyday analogy: a hiring panel picks the candidate who got the highest interview score, and then that same score is used as a forecast of job performance. The top scorer was likely lucky on the day, so the forecast is too rosy. A fairer process lets one panel choose the candidate and a second, independent panel rate them. Double DQN does exactly this with two sets of weights.

Where the bias comes from

Say there are three actions whose true values are all 0. A network estimates each with random error, so the estimates might be +0.3, -0.1 and +0.2. The maximum is 0.3, while the true maximum is 0. In expectation, max of estimates ≥ estimate of max. The inequality is a general fact about random variables. It never helps and often hurts.

In reinforcement learning the problem repeats. Overestimated values enter the target, the network learns them, and the next targets are built on these inflated values. Small biases pile up over many bootstrapping steps. In some environments the overestimates lead to poor policies, because actions with merely lucky estimates look best.

The fix in one line

Plain DQN target:

y = r + γ × max over a' of Q_target(s', a')

Double DQN target:

y = r + γ × Q_target(s', argmax over a' of Q_main(s', a'))

The main network picks the action, argmax Q_main. The target network then gives its value. If the main network's pick is lucky, the target network's value for that action is not likely to be equally lucky, since its errors are partly independent. So the upward bias shrinks.

What stays the same

Everything else in DQN is unchanged: replay buffer, epsilon-greedy exploration, the periodic or soft update of the target network, the loss and the optimizer. Double DQN is a drop-in change to how the target is computed.

Where it came from

The roots are in tabular reinforcement learning. "Double Q-learning" (2010) showed that Q-learning overestimates action values because of the maximum operator, and proposed keeping two independent estimates. One estimate selects the best action, and the other evaluates it. The two roles are swapped at random on different updates. In small tables this removed the bias.

When deep Q-networks appeared in 2013 and 2015, researchers noticed that DQN also overestimates, sometimes severely, on some Atari games. They observed that the problem was not caused by function approximation alone, and that overestimation could hurt performance. The paper "Deep Reinforcement Learning with Double Q-learning" (2015) adapted the idea in the cheapest possible way. DQN already has two networks, the main one and the target one. Rather than train a second pair, the method simply reuses them for the two roles. The paper reported lower value estimates and better scores on many games.

Later work built on this. Prioritized replay and dueling networks were combined with the double target. Rainbow (2017) included it among several components. Actor-critic methods for continuous control borrowed the same idea: TD3 uses two critics and takes the smaller of their estimates to fight overestimation, a close cousin of the same concern. Clipped double Q-learning is the name for that variant.

How it works

Step 1: keep the DQN machinery

Double DQN still needs:

  • A main network Q(s, a; θ) that is trained.
  • A target network Q(s, a; θ⁻) that is a delayed copy.
  • A replay buffer of transitions (s, a, r, s', done).
  • Epsilon-greedy exploration.

If these are unfamiliar, read DQN and experience replay first.

Step 2: sample a mini-batch

Draw a random batch of transitions from the buffer. For each one, you need the state, the action taken, the reward, the next state and whether the episode ended.

Step 3: select with the main network

For each next state s', run the main network and take the index of its highest output:

a* = argmax over a' of Q(s', a'; θ)

This is the choice step. No value from this pass is used in the target.

Step 4: evaluate with the target network

Run the target network on s' and read the value at index a*:

Q_target(s', a*; θ⁻)

This is the evaluation step.

Step 5: build the target and update

y = r + γ × (1 - done) × Q_target(s', a*; θ⁻)

Update the main network by minimizing the Huber or squared loss between Q(s, a; θ) and y. Every so often, copy or softly blend the main weights into the target.

Step 6: repeat

All other parts of the loop are as in DQN. The agent acts, stores, samples, updates and occasionally syncs.

Why reusing the target network is enough

For the double estimator to work, the two networks need errors that are not perfectly correlated. The target network is an older copy, trained on earlier data, so its errors differ from the main network's current ones. They are not independent, since the target is derived from the main, but they are different enough to reduce the bias in practice. A longer delay between target updates makes the networks more different, which strengthens the correction, though it also slows learning.

A numeric walk-through

Say the next state has three actions. The two networks give:

Action Main network Target network
Wait 2.0 2.1
Move 3.4 2.6
Stop 2.9 3.0

Use r = 1 and γ = 0.9.

  • Plain DQN takes the target network's maximum: 3.0 (Stop). Target = 1 + 0.9 × 3.0 = 3.70.
  • Double DQN picks the action with the main network's highest value: Move (3.4). It then reads the target network's value for Move: 2.6. Target = 1 + 0.9 × 2.6 = 3.34.

The double target is lower. The main network liked "Move" more than the target network did, which hints that its high score for "Move" could be partly noise. The target network's more modest 2.6 gives a more careful estimate. Across thousands of updates, this difference prevents the steady upward drift.

Code: a one-line change

Starting from a standard DQN update in PyTorch, the difference is only in how target is computed.

python
import torch
from torch import nn

def dqn_target(target_net, bs2, br, bd, gamma):
    with torch.no_grad():
        nxt = target_net(bs2).max(dim=1).values
        return br + gamma * nxt * (1 - bd)

def double_dqn_target(main_net, target_net, bs2, br, bd, gamma):
    with torch.no_grad():
        best_a = main_net(bs2).argmax(dim=1, keepdim=True)      # choose
        nxt = target_net(bs2).gather(1, best_a).squeeze(1)      # evaluate
        return br + gamma * nxt * (1 - bd)

def train_step(main_net, target_net, opt, batch, gamma=0.97, double=True):
    bs, ba, br, bs2, bd = batch
    if double:
        target = double_dqn_target(main_net, target_net, bs2, br, bd, gamma)
    else:
        target = dqn_target(target_net, bs2, br, bd, gamma)
    pred = main_net(bs).gather(1, ba.unsqueeze(1)).squeeze(1)
    loss = nn.functional.smooth_l1_loss(pred, target)
    opt.zero_grad()
    loss.backward()
    nn.utils.clip_grad_norm_(main_net.parameters(), 10.0)
    opt.step()
    return loss.item()

Keeping both targets in one function and switching with a flag makes it easy to run an A/B comparison on your own problem, which is the best way to see whether the change matters for you.

Measuring overestimation

A direct way to see the bias is to log the average maximum Q-value on a fixed set of states during training, and compare it with the actual discounted return that the policy collects from those states.

python
def estimate_gap(main_net, states, rollout_returns):
    with torch.no_grad():
        q_pred = main_net(states).max(dim=1).values.mean().item()
    true_ret = float(sum(rollout_returns) / len(rollout_returns))
    return q_pred - true_ret    # positive gap = overestimation

Plot the gap over training for plain DQN and Double DQN. A large positive gap that grows is the signature of overestimation. Double DQN usually keeps the gap smaller.

A toy experiment you can run

Take a bandit-like problem with ten actions, each with a true value of zero and noisy reward. Train a plain value estimator and a double one, and compare the learned value of the best action.

python
import numpy as np
rng = np.random.default_rng(0)
n_actions, trials = 10, 20000
plain, double = [], []
for _ in range(trials):
    est_a = rng.normal(0, 1, n_actions)      # estimator A, true values all 0
    est_b = rng.normal(0, 1, n_actions)      # estimator B, independent noise
    plain.append(est_a.max())                # select and evaluate with A
    double.append(est_b[est_a.argmax()])     # select with A, evaluate with B
print("plain  mean:", round(float(np.mean(plain)), 3))
print("double mean:", round(float(np.mean(double)), 3))

The plain value comes out clearly above zero, about 1.5 for ten unit-variance estimates, while the double value hovers around zero. The true value of every action is zero, so the double estimate is the honest one. The gap in the toy case is larger than in real training, since real errors are smaller, but the mechanism is the same.

Key concepts and terms

Term Plain meaning
Overestimation bias Value estimates that are on average too high
Maximization bias The same thing, caused by taking a maximum of noisy values
Double Q-learning Using two estimators, one to select and one to evaluate
Action selection Choosing which next action looks best
Action evaluation Reading the value of a chosen action
Main network The network trained at each step
Target network A delayed copy of the main network
Bootstrapped target A training label built from the network's own later estimate
Soft update Moving the target weights a little toward the main weights each step
Clipped double Q Taking the lower of two value estimates
Underestimation Estimates that are too low, a possible side effect of double estimators
Q-value drift Values rising or falling without matching real returns
Overoptimism A policy that takes risks because it thinks values are high

A worked example

Setting

A plant dispatches jobs to one of four machines. The state is a vector of the four queue lengths, a job size and the hour of day. Rewards are the negative of total waiting time that the choice causes. The goal is to train a policy that keeps waiting low.

Training setup

python
import copy
import random
from collections import deque
import numpy as np
import torch
from torch import nn

def build_net(n_in, n_actions):
    return nn.Sequential(
        nn.Linear(n_in, 128), nn.ReLU(),
        nn.Linear(128, 128), nn.ReLU(),
        nn.Linear(128, n_actions),
    )

class Agent:
    def __init__(self, n_in, n_actions, double=True, gamma=0.97, tau=0.005):
        self.main = build_net(n_in, n_actions)
        self.target = copy.deepcopy(self.main)
        self.opt = torch.optim.Adam(self.main.parameters(), lr=5e-4)
        self.buf = deque(maxlen=200_000)
        self.double, self.gamma, self.tau = double, gamma, tau
        self.n_actions = n_actions

    def act(self, state, eps):
        if random.random() < eps:
            return random.randrange(self.n_actions)
        with torch.no_grad():
            return int(self.main(torch.as_tensor(state)).argmax())

    def remember(self, *transition):
        self.buf.append(transition)

    def learn(self, batch_size=128):
        if len(self.buf) < 5000:
            return None
        s, a, r, s2, d = map(np.array, zip(*random.sample(self.buf, batch_size)))
        s, s2 = torch.as_tensor(s, dtype=torch.float32), torch.as_tensor(s2, dtype=torch.float32)
        a = torch.as_tensor(a).long().unsqueeze(1)
        r, d = torch.as_tensor(r, dtype=torch.float32), torch.as_tensor(d, dtype=torch.float32)
        with torch.no_grad():
            if self.double:
                best = self.main(s2).argmax(dim=1, keepdim=True)
                nxt = self.target(s2).gather(1, best).squeeze(1)
            else:
                nxt = self.target(s2).max(dim=1).values
            y = r + self.gamma * nxt * (1 - d)
        pred = self.main(s).gather(1, a).squeeze(1)
        loss = nn.functional.smooth_l1_loss(pred, y)
        self.opt.zero_grad(); loss.backward()
        nn.utils.clip_grad_norm_(self.main.parameters(), 10.0)
        self.opt.step()
        # soft update of the target network
        with torch.no_grad():
            for p_t, p_m in zip(self.target.parameters(), self.main.parameters()):
                p_t.mul_(1 - self.tau).add_(self.tau * p_m)
        return loss.item()

How to compare the two variants

  1. Create two agents, one with double=False and one with double=True, with the same seeds, network sizes and environment.
  2. Train both for the same number of steps, for at least five seeds each.
  3. Log three things every few thousand steps: average evaluation return, average max Q-value on a fixed set of states, and the gap between predicted and realized return.
  4. Compare the curves. A typical outcome is similar returns early, a growing Q-value gap for plain DQN, and a smaller gap for Double DQN. On some problems returns are also higher with Double DQN. On others the two are equal.

Reading the outcome

Observation Meaning Action
Plain and double give the same returns and gaps Overestimation is not an issue here Keep either, prefer double for safety
Plain has larger gap, similar returns Bias exists but did not hurt yet Use double to avoid later trouble
Plain has larger gap and lower returns Bias is harming the policy Use double, check other fixes too
Both have large gaps Other causes, such as noisy rewards or high learning rate Lower learning rate, scale rewards, add the dueling head
Double has lower returns Possible underestimation or too small a delay in target Check target update rate and exploration

Strengths and limitations

Strengths

  • A very small code change with almost no extra cost.
  • No new hyperparameters.
  • Reduces overestimation, which makes Q-values closer to real returns.
  • Often improves stability and, on many problems, final performance.
  • Combines cleanly with replay, prioritized replay, dueling heads, multi-step returns and noisy networks.
  • Easy to test: switch a flag and compare.

Limitations

  • It reduces overestimation but does not remove it. The two networks are correlated.
  • It can introduce mild underestimation. This is usually less harmful than overestimation, but it is not zero.
  • It does not fix the other weaknesses of DQN: discrete actions only, sample hunger, poor exploration with sparse rewards and sensitivity to hyperparameters.
  • Gains are problem dependent. On some tasks plain DQN does equally well.
  • It needs a target network that differs meaningfully from the main one. With a very fast target update the two roles blur.
  • It gives no help for noisy rewards, which call for averaging, larger batches or distributional methods.
  • Offline use from a fixed log still needs conservative methods.

How it compares with alternatives

Method Handles overestimation how Cost Notes
DQN Not addressed Lowest Baseline
Double DQN Select with main, evaluate with target Almost none A sound default
Dueling DQN Not its aim; improves value learning Slight Can be combined with Double DQN
Averaged DQN Averages several past target networks Memory for copies Smooths targets
Ensemble Q-networks Uses the minimum or mean over members Several networks Strong but heavier
Clipped double Q (TD3) Min of two critics Two critics For continuous actions
SAC Two critics plus entropy bonus Two critics For continuous actions
Rainbow Includes the double target among several parts Most complex Strong all-round result
Conservative offline Q-learning Penalizes values for unseen actions Extra loss term For fixed logs

The ranking in practice is simple. Plain DQN is the reference. Double DQN is the first upgrade. The other parts are added based on the symptoms you observe.

Role in tabular foundation models

Double DQN is a decision algorithm, so its relationship with tabular foundation models is about how states, data and checks are supplied, not about the same task. It helps to be concrete.

Value estimation is a regression problem on tables

At the heart of any Q-learning method is a regression on a table of transitions. Each row holds a state, an action, a reward, the next state and a done flag. The label is the bootstrapped target. Double DQN changes how the label is built. For tabular problems, this means the quality of the label matters as much as the model: a biased label teaches a biased value function, however good the regressor.

Better labels for models that learn from rows

Anyone building a value model from logged transitions, with a neural network, a tree ensemble such as XGBoost or an in-context tabular model like TabPFN, faces the same maximization bias in the target. The double construction applies directly: use one fitted model to pick the next action and another, trained on different data or from an earlier iteration, to score it. This is the same idea as cross-fitting in statistics, and it matters whenever a maximum is taken over predictions.

Mixed types, missing values and no column names in the state

The state in business settings is often a row with numbers, categories and gaps, and the column names may be uninformative. A pre-trained table encoder, as described on the architecture page, can turn the row into a fixed-size embedding that handles mixed types and masked cells. Both the main and target networks then share this encoder or hold copies of it. If the encoder is shared and updated, the target's delay should include it, or the two roles will drift together and lose the benefit of the double estimate.

Imputation inside the loop

When a sensor value is missing, an imputation model can fill it, but the filled value is uncertain. A policy built on imputed states inherits that uncertainty. Reporting an explicit mask alongside the value lets the network learn how much to trust it. Imputation networks and masked pre-training make the state more reliable, which reduces one source of the noise that feeds overestimation.

Anomaly detection and safe use

Overestimation often shows up as confident, wrong values in unfamiliar states. Pairing the agent with anomaly detection over state embeddings flags such states, so that a fallback rule can act instead. Large disagreement between the main and target networks on a state can itself be used as a simple uncertainty signal.

Offline logs and counterfactual risk

Training from historical tables is attractive, but the log only shows actions the old policy took. A maximum over all actions will reach for actions the log barely contains, and their values are pure extrapolation. Double DQN reduces random noise-driven optimism, but it does not solve this structural problem. Constrain the policy to actions with enough support in the data, and use conservative objectives when learning from fixed logs.

Simulation and synthetic data

If a simulator is fitted from tables, the policy trained in it can learn to exploit simulator errors. Overestimation in the learned values can mask this. Using the double target together with held-out simulator checks makes such exploitation easier to see. Extending the log with synthetic data generation can add coverage, as long as the generator is validated.

Continual learning and drift

As operations change, the Q-function must follow. Forgetting is a risk when new data dominate. Elastic weight consolidation and replay of older transitions are standard tools. Monitoring the Q-value gap over time also acts as a drift alarm: a widening gap suggests the value model no longer matches what the environment returns. See also domain adaptation.

Sector and semantic context

When one decision agent is rolled out to many sites or customers, each with its own schema, semantic labelling of columns can map fields to a shared state definition. See semantic sector heads. With a consistent state, one Double DQN design can be trained per site, or one shared model can be adapted.

What not to claim

Double DQN is not a tabular foundation model, and a tabular foundation model does not make a policy safe by itself. The practical pairing is modular: the table model provides representations, imputations and flags, and the reinforcement-learning method makes the sequence of decisions. Evaluate each part separately. The research and benchmarks pages cover the table-learning side.

Practical guidance and best practices

  1. Make it your default. Use Double DQN instead of plain DQN unless you have a reason not to.
  2. Run an A/B test on your problem. Same seeds, same budget. Keep the better one.
  3. Log the Q-value gap. Predicted max Q on fixed states versus realized return is the cleanest bias monitor.
  4. Keep the target network meaningfully delayed. Use a soft update rate around 0.005 or a hard copy every few thousand steps, then tune.
  5. Combine with other proven parts, one at a time. Prioritized replay, dueling heads and multi-step returns often add value. Measure each.
  6. Scale rewards and inputs. Value scale affects the size of the overestimation.
  7. Use Huber loss and gradient clipping.
  8. Use several seeds. Overestimation effects vary from run to run.
  9. Check for underestimation too. If Q-values fall far below returns, loosen the target delay or revisit the learning rate.
  10. Guard unfamiliar states. Use anomaly flags or network disagreement to trigger a safe fallback.
  11. Document the setup. Record the target update rule, discount, reward scaling and seeds for reproducibility.
  12. Compare with simple heuristics. A greedy dispatching rule is a useful floor.

A small configuration sketch

yaml
double_dqn:
  enabled: true
  env: dispatch_sim_v2
  state_features: [queue_1, queue_2, queue_3, queue_4, job_size, hour_sin, hour_cos]
  missing_values:
    strategy: mask_and_zero
  network:
    hidden: [128, 128]
  gamma: 0.97
  target:
    update: soft
    tau: 0.005
  replay:
    capacity: 200000
    warmup_steps: 5000
  diagnostics:
    fixed_probe_states: 500
    log_q_gap_every: 5000
  compare_with:
    - plain_dqn
  seeds: [1, 2, 3, 4, 5]
  logging:
    server: tracking.example.internal

A short debugging checklist

When a Double DQN agent does not learn, work through the same few checks in order.

  • Confirm that the online network chooses the action and the target network scores it. A swapped line is easy to miss.
  • Confirm that terminal transitions zero out the bootstrap term.
  • Plot the mean maximum Q-value over time. A steady climb far beyond the possible return signals a bug or a bias.
  • Plot the loss, but do not trust it alone. A low loss can sit next to poor behaviour.
  • Check the replay buffer. It should hold varied transitions and be large enough to break correlation.
  • Check the target update rule. Hard copies every few thousand steps and soft updates with a small rate both work, but mixing them by mistake does not.
  • Check reward scale. Clipping or normalising rewards keeps gradients in a sane range.
  • Run several seeds. One lucky run says little about a method.

A note on evaluation

Compare plain DQN and Double DQN on the same environments, seeds and budgets. Report the average return and also the gap between predicted and observed returns. The second number shows whether the overestimation fix did its job, even when the final scores look similar.

When the fix matters most

The gain is largest when action values are close to each other and noisy. In such cases the maximum over noisy estimates is most likely to pick a lucky overestimate. When one action is clearly best, the bias is small and the two methods behave alike. This is why the method is cheap insurance rather than a guaranteed boost.

Common mistakes

  • Selecting and evaluating with the same network. If you take the max of the target network, you have plain DQN, not Double DQN.
  • Using the target network for selection and the main network for evaluation. The roles are reversed, and the benefit is lost or muddled.
  • Making the target network identical to the main one. A target that is updated every step removes the difference between the roles.
  • Forgetting no_grad when computing the target. Gradients must not flow through the target.
  • Ignoring the done flag. At terminal states the future term should be zero.
  • Assuming it fixes everything. Slow learning, bad rewards and poor exploration remain.
  • Judging by one run. Differences are often small compared with seed variation.
  • Not measuring the bias. Without the Q-value gap, you cannot tell whether overestimation was the problem.
  • Mixing up bias and variance. Double estimation lowers bias. It does not cut the variance of noisy targets.
  • Letting the shared encoder drift. If a state encoder is shared and trained at full speed, the two roles move together.
  • Trusting a high Q-value in a state the data never covered. Offline logs need constraints, not just a double target.

Frequently asked questions

What is Double DQN in simple terms?

Double DQN is a version of DQN that avoids inflating its own value estimates. It uses one network to choose the best next action and a different, older copy to score that action. Because the two networks make partly different errors, the score is less likely to be inflated by luck, and the learned values are closer to the truth.

Why does DQN overestimate Q-values?

Because the target uses a maximum over noisy estimates, and the maximum of noisy numbers tends to be higher than the true maximum. The inflated value is then used to train the network, and the error is passed on and can build up over many updates.

How is Double DQN different from DQN in code?

Only the target changes. DQN takes the maximum of the target network's outputs for the next state. Double DQN takes the index of the maximum of the main network's outputs and then reads the target network's value at that index. Everything else in the training loop is the same.

Does Double DQN always perform better than DQN?

No. It often improves stability and sometimes improves final scores, but on some problems the two perform about the same. Since it adds almost no cost, it is still a sensible default. The best check is to compare both on your own problem across several seeds.

Does Double DQN need a second target network?

No. It reuses the two networks that DQN already has: the main network and the target network. That is part of why the change is so cheap.

Can Double DQN cause underestimation?

It can, mildly. Using a different network to evaluate the chosen action sometimes picks an action whose target value is lower than the maximum, which can bias estimates down. In practice underestimation is usually less harmful than overestimation, but it is worth watching the Q-value gap.

Can I use Double DQN with continuous actions?

Not directly, since it relies on taking an argmax over a discrete set of actions. For continuous control, related ideas appear in actor-critic methods such as TD3, which uses two critics and takes the smaller estimate, and SAC, which also uses two critics.

How do I know if overestimation is a problem in my project?

Log the average maximum Q-value on a fixed set of states and compare it with the discounted returns the policy actually collects from those states. If predicted values keep rising well above realized returns, overestimation is likely. Running plain DQN and Double DQN side by side confirms how much it matters.

Is Double DQN useful for tabular business data?

It is useful when the decision problem has a table-like state and a small discrete set of actions, such as dispatching, routing choices or treatment decisions. Its benefit is a more reliable value estimate, which leads to safer decisions. It does not replace a tabular prediction model for classification or regression, but it can sit on top of one.

What other changes are usually combined with Double DQN?

Common companions are prioritized replay, a dueling network head, multi-step returns, noisy exploration layers and distributional value heads. Rainbow combines several of these. Add them one at a time and measure each, since benefits depend on the problem.

Glossary

  • Argmax: The index of the largest value in a list.
  • Bootstrapping: Updating an estimate using another estimate.
  • Clipped double Q-learning: Taking the smaller of two critic estimates to curb overestimation.
  • Cross-fitting: Using separate models or data to select and to evaluate.
  • Double Q-learning: Using two estimators to separate selection from evaluation.
  • Main network: The network updated by gradient descent each step.
  • Maximization bias: Upward bias that comes from taking a maximum of noisy values.
  • Overestimation: Value estimates that exceed the true values on average.
  • Q-value gap: The difference between predicted and realized return.
  • Replay buffer: Storage for past transitions.
  • Soft update: Gradual blending of main weights into the target network.
  • Target network: A delayed copy used for stable targets and for evaluation in Double DQN.
  • Underestimation: Value estimates below the true values on average.

Summary

Double DQN keeps everything about DQN and changes one thing: the main network picks the next action, and the target network scores it. That small split cuts the upward bias that comes from taking a maximum over noisy estimates, which makes learned values more honest and training steadier. It costs almost nothing, has no new hyperparameters, and is easy to test against plain DQN with a Q-value gap plot.

For tabular work, the lesson reaches beyond reinforcement learning. Any value model fitted to rows of logged transitions suffers the same maximization bias, and separating selection from evaluation is the cure. Table encoders that handle mixed types and missing values supply better states, anomaly checks guard unfamiliar ones, and conservative methods are needed when learning from fixed logs. Start from DQN, then explore the architecture, research and benchmarks pages.

It belongs to Reinforcement learning in my stack, under AI and machine learning. Others in the same group:

Type to search.
    ↑↓ navigate↵ open