Un’introduzione al Q-Learning Parte 1

Introducing Q-Learning Part 1

Unità 2, parte 1 del corso di Deep Reinforcement Learning con Hugging Face 🤗

⚠️ Una nuova versione aggiornata di questo articolo è disponibile qui 👉 https://huggingface.co/deep-rl-course/unit1/introduction

Questo articolo fa parte del corso di Deep Reinforcement Learning. Un corso gratuito dalla base all’esperto. Controlla il programma qui.


⚠️ Una nuova versione aggiornata di questo articolo è disponibile qui 👉 https://huggingface.co/deep-rl-course/unit1/introduction

Questo articolo fa parte del corso di Deep Reinforcement Learning. Un corso gratuito dalla base all’esperto. Controlla il programma qui.

Nel primo capitolo di questa classe , abbiamo appreso il Reinforcement Learning (RL), il processo RL e i diversi metodi per risolvere un problema RL. Abbiamo anche addestrato il nostro primo agente lander per atterrare correttamente sulla Luna 🌕 e l’abbiamo caricato su Hugging Face Hub.

Quindi oggi, andremo a esplorare in dettaglio uno dei metodi di Reinforcement Learning: i metodi basati sul valore e studieremo il nostro primo algoritmo di RL: Q-Learning.

Inoltre, implementeremo il nostro primo agente RL da zero: un agente di Q-Learning e lo addestreremo in due ambienti:

  1. Frozen-Lake-v1 (versione non scivolosa): dove il nostro agente dovrà andare dallo stato di partenza (S) allo stato di destinazione (G) camminando solo su piastrelle ghiacciate (F) e evitando buche (H).
  2. Un taxi autonomo dovrà imparare a navigare in una città per trasportare i suoi passeggeri dal punto A al punto B.

Questa unità è divisa in 2 parti:

Nella prima parte, impareremo sui metodi basati sul valore e sulla differenza tra Monte Carlo e Temporal Difference Learning.

E nella seconda parte, studieremo il nostro primo algoritmo di RL: Q-Learning e implementeremo il nostro primo agente RL.

Questa unità è fondamentale se vuoi essere in grado di lavorare sul Deep Q-Learning (unità 3): il primo algoritmo di Deep RL che è stato in grado di giocare ai giochi Atari e battere il livello umano in alcuni di essi (breakout, space invaders…).

Quindi cominciamo!

  • Cos’è RL? Un breve riassunto
  • I due tipi di metodi basati sul valore
    • La funzione di valore di stato
    • La funzione di valore di azione
  • L’equazione di Bellman: semplificare la nostra stima del valore
  • Monte Carlo vs Temporal Difference Learning
    • Monte Carlo: apprendimento alla fine dell’episodio
    • Temporal Difference Learning: apprendimento ad ogni passo

Cos’è RL? Un breve riassunto

In RL, costruiamo un agente che può prendere decisioni intelligenti. Ad esempio, un agente che impara a giocare a un videogioco. O un agente di trading che impara a massimizzare i suoi benefici prendendo decisioni intelligenti su quali azioni comprare e quando venderle.

Ma, per prendere decisioni intelligenti, il nostro agente imparerà dall’ambiente interagendo con esso attraverso prove ed errori e ricevendo ricompense (positive o negative) come feedback unico.

Il suo obiettivo è massimizzare la sua ricompensa cumulativa attesa (a causa dell’ipotesi della ricompensa).

Il processo decisionale dell’agente è chiamato politica π: dato uno stato, una politica restituirà un’azione o una distribuzione di probabilità sulle azioni. Cioè, dato un’osservazione dell’ambiente, una politica fornirà un’azione (o più probabilità per ogni azione) che l’agente dovrebbe prendere.

Il nostro obiettivo è trovare una politica ottimale π *, anche nota come una politica che porta alla migliore ricompensa cumulativa attesa.

E per trovare questa politica ottimale (risolvendo quindi il problema RL), ci sono due tipi principali di metodi RL:

  • Metodi basati sulla politica: Addestrare direttamente la politica per imparare quale azione intraprendere dato uno stato.
  • Metodi basati sul valore: Addestrare una funzione di valore per imparare quali stati sono più preziosi e utilizzare questa funzione di valore per intraprendere l’azione che porta ad esso.

E in questo capitolo, approfondiremo i metodi basati sul valore.

I due tipi di metodi basati sul valore

Nel metodo basato sul valore, apprendiamo una funzione di valore che associa uno stato al valore atteso di trovarsi in quello stato.

Il valore di uno stato è il ritorno scontato atteso che l’agente può ottenere se inizia da quello stato e poi agisce secondo la nostra politica.

Se hai dimenticato cosa significa scontare, puoi leggere questa sezione .

Ma cosa significa agire secondo la nostra politica? Alla fine, nei metodi basati sul valore, non abbiamo una politica, poiché addestriamo una funzione di valore e non una politica.

Ricorda che l’obiettivo di un agente RL è avere una politica ottimale π.

Per trovarla, abbiamo appreso che ci sono due metodi diversi:

  • Metodi basati sulla politica: Addestrare direttamente la politica per selezionare quale azione intraprendere dato uno stato (o una distribuzione di probabilità sulle azioni in quello stato). In questo caso, non abbiamo una funzione di valore.

La politica prende uno stato in input e restituisce quale azione intraprendere in quello stato (politica deterministica).

E di conseguenza, non definiamo manualmente il comportamento della nostra politica; è l’addestramento che lo definirà.

  • Metodi basati sul valore: Indirettamente, addestrando una funzione di valore che restituisce il valore di uno stato o di una coppia stato-azione. Data questa funzione di valore, la nostra politica intraprenderà azioni.

Ma, poiché non abbiamo addestrato la nostra politica, dobbiamo specificarne il comportamento. Ad esempio, se vogliamo una politica che, dato la funzione di valore, intraprenda azioni che portino sempre alla ricompensa più grande, creeremo una politica avida.

Data uno stato, la nostra funzione di valore dell'azione (che addestriamo) restituisce il valore di ogni azione in quello stato, quindi la nostra politica avida (che abbiamo definito) seleziona l'azione con il valore coppia stato-azione più grande.

Di conseguenza, qualunque metodo tu usi per risolvere il tuo problema, avrai una politica, ma nel caso dei metodi basati sul valore non la addestri, la tua politica è solo una semplice funzione che specifici (ad esempio politica avida) e questa politica utilizza i valori dati dalla funzione di valore per selezionare le sue azioni.

Quindi la differenza è:

  • Nel metodo basato sulla politica, la politica ottimale viene trovata addestrando direttamente la politica.
  • Nel metodo basato sul valore, trovare una funzione di valore ottimale porta ad avere una politica ottimale.

In realtà, nella maggior parte dei casi, nei metodi basati sul valore, si utilizza una politica epsilon-greedy che gestisce il compromesso tra esplorazione e sfruttamento; ne parleremo quando parleremo di Q-Learning nella seconda parte di questa unità.

Quindi, abbiamo due tipi di funzioni basate sul valore:

La funzione di valore di stato

Scriviamo la funzione di valore di stato in base a una politica π in questo modo:

Per ogni stato, la funzione di valore di stato restituisce il ritorno previsto se l’agente parte da quell’ stato, e poi segue la politica per sempre (per tutti i futuri passaggi di tempo, se preferisci).

Se prendiamo lo stato con valore -7: è il ritorno previsto partendo da quell' stato e prendendo azioni secondo la nostra politica (politica avida), quindi destra, destra, destra, giù, giù, destra, destra.

La funzione di valore d’azione

Nella funzione di valore d’azione, per ogni coppia stato-azione, la funzione di valore d’azione restituisce il ritorno previsto se l’agente parte da quell’ stato e compie l’azione, e poi segue la politica per sempre.

Il valore di compiere l’azione a in stato s secondo una politica π è:

Vediamo che la differenza è:

  • Nella funzione di valore di stato, calcoliamo il valore di uno stato S t S_t S t ​
  • Nella funzione di valore d’azione, calcoliamo il valore della coppia stato-azione ( S t , A t S_t, A_t S t ​ , A t ​ ) quindi il valore di compiere quell’azione in quell’ stato.
Nota: Non abbiamo riempito tutte le coppie stato-azione per l'esempio della funzione di valore d'azione

In entrambi i casi, qualunque funzione di valore scegliamo (funzione di valore di stato o di valore d’azione), il valore è il ritorno previsto.

Tuttavia, il problema è che ciò implica che per calcolare OGNI valore di uno stato o di una coppia stato-azione, dobbiamo sommare tutte le ricompense che un agente può ottenere se parte da quell’ stato.

Questo può essere un processo tedioso, ed è qui che entra in aiuto l’equazione di Bellman.

L’equazione di Bellman: semplifica la nostra stima del valore

L’equazione di Bellman semplifica il calcolo del valore di uno stato o di una coppia stato-azione.

Con quello che abbiamo imparato finora, sappiamo che se calcoliamo V ( S t ) V(S_t) V ( S t ​ ) (valore di uno stato), dobbiamo calcolare il ritorno partendo da quell’ stato e poi seguire la politica per sempre. (La nostra politica che abbiamo definito nell’esempio seguente è una politica avida, e per semplificazione, non scontiamo la ricompensa).

Quindi, per calcolare V ( S t ) V(S_t) V ( S t ​ ) , dobbiamo fare la somma delle ricompense previste. Quindi:

Per calcolare il valore dello Stato 1: la somma delle ricompense se l'agente è partito da quell' stato e ha seguito la politica avida (prendendo azioni che portano ai migliori valori degli stati) per tutti i passaggi di tempo.

Poi, per calcolare V ( S t + 1 ) V(S_{t+1}) V ( S t + 1 ​ ) , dobbiamo calcolare il ritorno partendo da quell’ stato S t + 1 S_{t+1} S t + 1 ​ .

Per calcolare il valore dello stato 2: la somma delle ricompense se l'agente è partito in quello stato e poi ha seguito la politica per tutti i passaggi temporali.

Quindi vedete, è un processo piuttosto tedioso se è necessario farlo per ogni valore di stato o valore di stato-azione.

Al posto di calcolare il rendimento atteso per ogni stato o ogni coppia stato-azione, possiamo utilizzare l’equazione di Bellman.

L’equazione di Bellman è un’equazione ricorsiva che funziona nel seguente modo: invece di partire per ogni stato dall’inizio e calcolare il rendimento, possiamo considerare il valore di qualsiasi stato come:

La ricompensa immediata R t + 1 R_{t+1} R t + 1 ​ + il valore scontato dello stato successivo ( g a m m a ∗ V ( S t + 1 ) ).

Per semplificazione qui non scontiamo, quindi gamma = 1.

Se torniamo al nostro esempio, il valore dello stato 1 è il rendimento cumulativo atteso se iniziamo da quello stato.

Per calcolare il valore dello stato 1: la somma delle ricompense se l’agente è partito in quello stato 1 e poi ha seguito la politica per tutti i passaggi temporali.

Che è equivalente a V ( S t ) = Ricompensa immediata R t + 1 R_{t+1} R t + 1 ​ + Valore scontato del prossimo stato ( g a m m a ∗ V ( S t + 1 ) ).

Per semplificazione, qui non scontiamo, quindi gamma = 1.

  • Il valore di V ( S t + 1 ) = Ricompensa immediata R t + 2 R_{t+2} R t + 2 ​ + Valore scontato del prossimo stato ( g a m m a ∗ V ( S t + 2 ) ).
  • E così via.

Per riassumere, l’idea dell’equazione di Bellman è che invece di calcolare ogni valore come la somma del rendimento atteso, che è un processo lungo. Questo è equivalente a la somma della ricompensa immediata + il valore scontato dello stato successivo.

Monte Carlo vs Apprendimento Temporale Differenziale

L’ultima cosa di cui dobbiamo parlare prima di approfondire il Q-Learning sono i due modi di apprendimento.

Ricordate che un agente RL impara interagendo con il suo ambiente. L’idea è che utilizzando l’esperienza acquisita, dato il premio ottenuto, aggiorni il suo valore o la sua politica.

Monte Carlo e Apprendimento Temporale Differenziale sono due diverse strategie su come allenare la nostra funzione di valore o la nostra funzione di politica. Entrambe utilizzano l’esperienza per risolvere il problema RL.

Da un lato, Monte Carlo utilizza un’intera episodio di esperienza prima di apprendere. D’altra parte, l’Apprendimento Temporale Differenziale utilizza solo un passo ( S t , A t , R t + 1 , S t + 1 ) per apprendere.

Spiegheremo entrambi usando un esempio di metodo basato sul valore.

Monte Carlo: apprendimento alla fine dell’episodio

Monte Carlo attende fino alla fine dell’episodio, calcola G t G_t G t ​ (restituzione) e lo usa come obiettivo per l’aggiornamento di V ( S t ) V(S_t) V ( S t ​ ) .

Quindi richiede un <strong'intero episodio completo di interazione prima di aggiornare la nostra funzione di valore.

Se prendiamo un esempio:

  • Iniziamo sempre l’episodio dallo stesso punto di partenza.

  • L’agente esegue azioni utilizzando la politica. Ad esempio, utilizzando una strategia epsilon-greedy, una politica che alterna tra esplorazione (azioni casuali) e sfruttamento.

  • Ottieniamo la ricompensa e lo stato successivo.

  • Terminiamo l’episodio se il gatto mangia il topo o se il topo si muove > 10 passi.

  • Alla fine dell’episodio, abbiamo una lista di Stato, Azioni, Ricompense e Stati Successivi

  • L’agente somma le ricompense totali G t G_t G t ​ (per vedere quanto bene ha fatto).

  • Poi aggiorna V ( s t ) V(s_t) V ( s t ​ ) sulla base della formula

  • Quindi inizia un nuovo gioco con questa nuova conoscenza

Eseguendo sempre più episodi, l’agente imparerà a giocare sempre meglio.

Ad esempio, se addestriamo una funzione di valore di stato utilizzando Monte Carlo:

  • Abbiamo appena iniziato ad addestrare la nostra funzione di Valore, quindi restituisce un valore 0 per ogni stato
  • Il nostro tasso di apprendimento (lr) è 0.1 e il nostro tasso di sconto è 1 (= nessuno sconto)
  • Il nostro topo esplora l’ambiente e compie azioni casuali

  • Il topo ha fatto più di 10 passi, quindi l’episodio termina.

  • Abbiamo una lista di stato, azione, ricompense, stato successivo, dobbiamo calcolare il ritorno G t G{t} G t
  • G t = R t + 1 + R t + 2 + R t + 3 . . . G_t = R_{t+1} + R_{t+2} + R_{t+3} … G t ​ = R t + 1 ​ + R t + 2 ​ + R t + 3 ​ . . .
  • G t = R t + 1 + R t + 2 + R t + 3 … G_t = R_{t+1} + R_{t+2} + R_{t+3}… G t ​ = R t + 1 ​ + R t + 2 ​ + R t + 3 ​ … (per semplicità non scontiamo le ricompense).
  • G t = 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 G_t = 1 + 0 + 0 + 0+ 0 + 0 + 1 + 1 + 0 + 0 G t ​ = 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0
  • G t = 3 G_t= 3 G t ​ = 3
  • Ora possiamo aggiornare V ( S 0 ) V(S_0) V ( S 0 ​ ) :

  • Nuovo V ( S 0 ) = V ( S 0 ) + l r ∗ [ G t — V ( S 0 ) ] V(S_0) = V(S_0) + lr * [G_t — V(S_0)] V ( S 0 ​ ) = V ( S 0 ​ ) + l r ∗ [ G t ​ — V ( S 0 ​ ) ]
  • Nuovo V ( S 0 ) = 0 + 0.1 ∗ [ 3 – 0 ] V(S_0) = 0 + 0.1 * [3 – 0] V ( S 0 ​ ) = 0 + 0 . 1 ∗ [ 3 – 0 ]
  • Nuovo V ( S 0 ) = 0.3 V(S_0) = 0.3 V ( S 0 ​ ) = 0 . 3

Apprendimento a Differenza Temporale: apprendimento ad ogni passo

  • D’altra parte, la differenza temporale si basa solo su un’interazione (un passo) S t + 1 S_{t+1} S t + 1 ​
  • per formare un target TD e aggiornare V ( S t ) V(S_t) V ( S t ​ ) usando R t + 1 R_{t+1} R t + 1 ​ e g a m m a ∗ V ( S t + 1 ) gamma * V(S_{t+1}) g a m m a ∗ V ( S t + 1 ​ ) .

L’idea con TD è di aggiornare V ( S t ) V(S_t) V ( S t ​ ) ad ogni passo.

Ma poiché non abbiamo giocato per un intero episodio, non abbiamo G t G_t G t ​ (ritorno atteso). Invece, stimiamo G t G_t G t ​ aggiungendo R t + 1 R_{t+1} R t + 1 ​ e il valore scontato dello stato successivo.

Questo viene chiamato bootstrapping. Si chiama così perché TD basa la sua parte di aggiornamento su una stima esistente V ( S t + 1 ) V(S_{t+1}) V ( S t + 1 ​ ) e non su un campione completo G t G_t G t ​ .

Questo metodo viene chiamato TD(0) o TD a un passo (aggiorna la funzione di valore dopo ogni singolo passo).

Se prendiamo lo stesso esempio,

  • Abbiamo appena iniziato ad addestrare la nostra funzione di valore, quindi restituisce il valore 0 per ogni stato.
  • Il nostro tasso di apprendimento (lr) è 0.1 e il nostro tasso di sconto è 1 (nessuno sconto).
  • Il nostro topo esplora l’ambiente e compie un’azione casuale: andare a sinistra
  • Ottiene una ricompensa R t + 1 = 1 R_{t+1} = 1 R t + 1 ​ = 1 poiché mangia un pezzo di formaggio

Ora possiamo aggiornare V ( S 0 ) V(S_0) V ( S 0 ​ ) :

Nuovo V ( S 0 ) = V ( S 0 ) + l r ∗ [ R 1 + g a m m a ∗ V ( S 1 ) − V ( S 0 ) ] V(S_0) = V(S_0) + lr * [R_1 + gamma * V(S_1) – V(S_0)] V ( S 0 ​ ) = V ( S 0 ​ ) + l r ∗ [ R 1 ​ + g a m m a ∗ V ( S 1 ​ ) − V ( S 0 ​ ) ]

Nuovo V (S 0) = 0 + 0.1 ∗ [1 + 1 ∗ 0 – 0] V(S_0) = 0 + 0.1 * [1 + 1 * 0–0] V (S 0) = 0 + 0.1 ∗ [1 + 1 ∗ 0 – 0]

Nuovo V (S 0) = 0.1 V(S_0) = 0.1 V (S 0) = 0.1

Quindi abbiamo appena aggiornato la nostra funzione di valore per lo stato 0.

Ora continuiamo ad interagire con questo ambiente con la nostra funzione di valore aggiornata.

Se riassumiamo:

  • Con Monte Carlo, aggiorniamo la funzione di valore da un episodio completo, quindi utilizziamo il rendimento scontato reale e accurato di questo episodio.
  • Con l’apprendimento TD, aggiorniamo la funzione di valore da un passo, quindi sostituiamo G t G_t G t ​ che non abbiamo con un rendimento stimato chiamato target TD.

Quindi adesso, prima di addentrarci nel Q-Learning, riassumiamo ciò che abbiamo appena appreso:

Abbiamo due tipi di funzioni basate sul valore:

  • Funzione di valore di stato: restituisce il rendimento atteso se l’agente parte da uno stato specifico e agisce in base alla politica per sempre.
  • Funzione di valore dell’azione: restituisce il rendimento atteso se l’agente parte da uno stato specifico, compie una determinata azione in quel stato e poi agisce in base alla politica per sempre.
  • In metodi basati sul valore, definiamo la politica manualmente perché non la addestriamo, addestriamo una funzione di valore. L’idea è che se abbiamo una funzione di valore ottimale, avremo una politica ottimale.

Ci sono due tipi di metodi per apprendere una politica per una funzione di valore:

  • Con il metodo Monte Carlo, aggiorniamo la funzione di valore da un episodio completo, quindi utilizziamo il rendimento scontato reale e accurato di questo episodio.
  • Con il metodo TD Learning, aggiorniamo la funzione di valore da un passo, quindi sostituiamo Gt che non abbiamo con un rendimento stimato chiamato target TD.


Quindi è tutto per oggi. Congratulazioni per aver completato questa prima parte del capitolo! C’era molta informazione.

È normale se ti senti ancora confuso con tutti questi elementi. Anche per me e per tutte le persone che hanno studiato RL era così.

Dedica del tempo per comprendere davvero il materiale prima di proseguire.

E poiché il modo migliore per imparare e evitare l’illusione della competenza è testarsi. Abbiamo scritto un quiz per aiutarti a capire dove devi rafforzare il tuo studio. Verifica le tue conoscenze qui 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit2/quiz1.md

Nella seconda parte, studieremo il nostro primo algoritmo RL: il Q-Learning e implementeremo il nostro primo agente RL in due ambienti:

  1. Frozen-Lake-v1 (versione non scivolosa): dove il nostro agente dovrà andare dallo stato iniziale (S) allo stato obiettivo (G) camminando solo su piastrelle congelate (F) ed evitando buche (H).
  2. Un taxi autonomo dovrà imparare a navigare in una città per trasportare i passeggeri dal punto A al punto B.

E non dimenticare di condividere con i tuoi amici che vogliono imparare 🤗!

Infine, vogliamo migliorare e aggiornare il corso in modo iterativo grazie ai tuoi feedback. Se ne hai, compila questo modulo 👉 https://forms.gle/3HgA7bEHwAmmLfwh9

Continua ad imparare, resta fantastico,