Deep Q Learning

Martedì, 15 Settembre 2026 | Reinforcement Learning |

Abbiamo visto che il Q-learning converge alla funzione ottimale \(Q^*(s,a)\) quando viene utilizzata una rappresentazione tabulare.

 Nell’approssimazione di funzione, invece, il Q-learning minimizza la perdita MSE tramite discesa stocastica del gradiente, usando una stima  \(\hat{Q^\pi}(s;a;w)\approx Q^\pi\) per quanto riguarda la policy evaluation.

Ricordiamo a fronte di una funzione di costo del tipo \(J(w)=\Bbb E_\pi[(r+\gamma \max_{a'} \hat{Q}(s';a';w)-\hat{Q}(s;a;w)^2]\)   avremmo con la discesa del gradiente un aggiornamento dei pesi del modello \(\Delta w=\alpha(r+\gamma \max_{a'} \hat{Q}(s';a';w)-\hat{Q}(s;a;w))\nabla_w\hat{Q}(s;a;w)\)

Tuttavia, il Q-learning con approssimazione di funzione di valore può divergere. Si rilevano dei problemi di stabilità relativi alla compresenza  dell'approssimazione di funzione (potenziale espansione), del bootstrapping (contrazione)  e dell'off-policy learning, tali da non garantire la convergenza.

Due delle principali cause di questo problema sono: correlazioni tra i campioni e target non stazionari.

Il Deep Q-learning (DQN) affronta queste difficoltà introducendo due meccanismi fondamentali: l’experience replay, che riduce le correlazioni tra i dati campionati, e i fixed Q-targets, che stabilizzano l’apprendimento limitando la variazione dei target.

Experience replay

Per ridurre le correlazioni tra campioni (molti potenzialmente simili, tali da rompere l'ipotesi di IID) , nel Deep Q-learning viene utilizzato un dataset chiamato replay buffer \(\mathcal{D}\), che memorizza le esperienze passate sotto forma di tuple \((s, a, r, s')\), relative a tutte le tuple differenti incontrate nel passato, per rendere l'aggiornamento il più indipendente possibile.

L’experience replay si realizza ripetendo i seguenti passi:

• Campionare una tupla di esperienza \((s, a, r, s') \sim \mathcal{D}\) dal replay buffer.
• Calcolare il valore target per lo stato campionato: \(r + \gamma \max_{a'} \hat{Q}(s', a'; w)\).
• Aggiornare i pesi della rete neurale tramite discesa stocastica del gradiente  \[ \Delta w = \alpha \Big(r + \gamma \max_{a'} \hat{Q}(s', a'; w) - \hat{Q}(s, a; w)\Big) \nabla_w \hat{Q}(s, a; w) \]

Fixed Q-Targets

Il target \(r+\gamma \max_{a'} \hat{Q}(s';a';w)\)  prevede una parte dipendente a sua volta dai pesi w che vengono aggiornati in ogni iterazione del SGD; per migliorare la stabilità, è possibile far utilizzare un insieme differente di pesi \(\overline w\) rispetto a quelli aggiornati, da tenere fissi più a lungo per permettere un raggiungimento dell'obiettivo più stabile.

In questo caso il calcolo del target value prevederà:

  • Campionare dal dataset  \((s,a,r,s') \sim \mathscr D\)
  • Calcolare il target value \(r+\gamma \max_{a'} \hat{Q}(s';a'; \overline w)\)
  • Usare SGD per aggiornare i pesi della rete \(\Delta w=\alpha(r+\gamma \max_{a'} \hat{Q}(s';a';\overline w)-\hat{Q}(s;a;w))\nabla_w\hat{Q}(s;a;w)\)

Algoritmo DQN

Vediamo un algoritmo base per implementare il DQN, tenendo conto che vi sono numerosi iperparametri e strategie che  possono essere perfezionate e specificate, quali la gestione del replay buffer, 

  • Set parametri \(C\), \(\alpha\), \(D=\{\}\); inizializza \(w\), \(w^{-}=w\), \(t=0\)
  • Ottieni lo stato iniziale \(s_0\)
  • loop
    • Campiona l’azione \(a_t\) con politica \(\varepsilon\)-greedy rispetto a \(\hat Q(s_t,a;w)\)
    • Osserva ricompensa e prossimo stato \((r_t, s_{t+1})\)
    • Memorizza la transizione nel replay buffer \(D\): \((s_t, a_t, r_t, s_{t+1})\)
    • Estrai un minibatch casuale di tuple \((s_i, a_i, r_i, s_{i+1})\) da \(D\)
    • per ciascun indice \(i\) nel minibatch
      • se l’episodio termina allo step \(i+1\), imposta il target \(y_i = r_i\)
      • altrimenti imposta target \(y_i = r_i + \gamma \max_{a'} \hat Q(s_{i+1}, a';\, w^{-})\)
      • Esegui un passo di discesa del gradiente sulla perdita \(\big(y_i - \hat Q(s_i,a_i;\,w)\big)^2\) aggiornando \(\Delta w = \alpha \big(y_i - \hat Q(s_i,a_i;\,w)\big)\,\nabla_w \hat Q(s_i,a_i;\,w)\)
    • Aggiorna il tempo: \(t \leftarrow t+1\)
    • Se \(\mathrm{mod}(t,C)=0\) allora sincronizza la rete target: \(w^{-} \leftarrow w\)
  • end loop

In sintesi rispetto al Q-Learning tabulare le Deep Q-Networks (DQN) combinano due tecniche fondamentali: l’experience replay e l’uso di target fissi. Le transizioni \((s_t, a_t, r_{t+1}, s_{t+1})\) vengono memorizzate in un buffer di replay \(\mathcal{D}\) e da questo si estrae in modo casuale un mini-batch di tuple \((s,a,r,s')\). I target di Q-learning vengono calcolati rispetto a parametri congelati \(w^-\), mentre la rete Q viene aggiornata minimizzando l’errore quadratico medio (MSE) tra le stime della rete e i target di Q-learning. L’ottimizzazione avviene attraverso lo stochastic gradient descent, migliorando la stabilità e l’efficacia dell’apprendimento.