Proximal Policy Optimization (PPO)

'PPO' is short for 'Proximal Policy Optimization'.

Unità 8 del corso di Deep Reinforcement Learning con Hugging Face 🤗

⚠️ È disponibile una nuova versione aggiornata di questo articolo 👉 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.


⚠️ È disponibile una nuova versione aggiornata di questo articolo 👉 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.

Nell’ultima unità, abbiamo imparato su Advantage Actor Critic (A2C), un’architettura ibrida che combina metodi basati sul valore e metodi basati sulla politica che aiutano a stabilizzare l’addestramento riducendo la varianza con:

  • Un Attore che controlla come si comporta il nostro agente (metodo basato sulla politica).
  • Un Critico che misura quanto buona è l’azione intrapresa (metodo basato sul valore).

Oggi impareremo su Proximal Policy Optimization (PPO), un’architettura che migliora la stabilità dell’addestramento del nostro agente evitando aggiornamenti di politica troppo grandi. Per farlo, utilizziamo un rapporto che indica la differenza tra la nostra politica corrente e quella vecchia e limitiamo questo rapporto a un intervallo specifico [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] .

Facendo ciò, ci assicuriamo che l’aggiornamento della nostra politica non sia troppo grande e che l’addestramento sia più stabile.

E dopo la teoria, scriveremo un’architettura PPO da zero usando PyTorch e rafforzeremo la nostra implementazione con CartPole-v1 e LunarLander-v2.

Sembra emozionante? Iniziamo!

  • L’intuizione dietro PPO
  • Introduzione dell’Obiettivo Sostituto Clippato
    • Ricapitolazione: La Funzione Obiettivo della Politica
    • La Funzione del Rapporto
    • La parte non clippata dell’Obiettivo Sostituto Clippato
    • La parte clippata dell’Obiettivo Sostituto Clippato
  • Visualizzare l’Obiettivo Sostituto Clippato
    • Caso 1 e 2: il rapporto è compreso nell’intervallo
    • Caso 3 e 4: il rapporto è al di sotto dell’intervallo
    • Caso 5 e 6: il rapporto è al di sopra dell’intervallo
  • <li+Codifichiamo il nostro Agente PPO

L’intuizione dietro PPO

L’idea con Proximal Policy Optimization (PPO) è che vogliamo migliorare la stabilità dell’addestramento della politica limitando il cambiamento che apporti alla politica ad ogni epoca di addestramento: vogliamo evitare aggiornamenti di politica troppo grandi.

Per due ragioni:

  • Sappiamo empiricamente che gli aggiornamenti di politica più piccoli durante l’addestramento sono più probabili di convergere verso una soluzione ottimale.
  • Un passo troppo grande in un aggiornamento di politica può portare a cadere “dalla scogliera” (ottenendo una politica sbagliata) e avere molto tempo o addirittura nessuna possibilità di riprendersi.
Prendere aggiornamenti di politica più piccoli migliora la stabilità dell'addestramento

Quindi con PPO, aggiorniamo la politica in modo conservativo. Per farlo, dobbiamo misurare quanto la politica corrente è cambiata rispetto a quella precedente usando un calcolo del rapporto tra la politica corrente e quella precedente. E clippiamo questo rapporto in un intervallo [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] , il che significa che rimuoviamo l’incentivo per la politica corrente di allontanarsi troppo da quella vecchia (da qui il termine politica prossimale).

Introduzione dell’Obiettivo Sostituto Clippato

Riepilogo: La Funzione Obiettivo della Policy

Ricordiamo qual è l’obiettivo da ottimizzare in Reinforce:

L’idea era che prendendo un passo di incremento del gradiente su questa funzione (equivalente a prendere il gradiente discendente della negazione di questa funzione), avremmo spinto il nostro agente a prendere azioni che portano a ricompense più alte e ad evitare azioni dannose.

Tuttavia, il problema deriva dalla dimensione del passo:

  • Troppo piccolo, il processo di addestramento era troppo lento
  • Troppo grande, c’era troppa variabilità nell’addestramento

Qui con PPO, l’idea è di vincolare l’aggiornamento della nostra policy con una nuova funzione obiettivo chiamata Clipped surrogate objective function che constringerà il cambiamento della policy in un piccolo intervallo utilizzando un limite.

Questa nuova funzione è progettata per evitare aggiornamenti distruttivi di pesi molto grandi :

Studiamo ogni parte per capire come funziona.

La Funzione del Rapporto

Questo rapporto viene calcolato in questo modo:

È la probabilità di prendere l’azione a t a_t a t ​ nello stato s t s_t s t ​ nella policy corrente diviso quella precedente.

Come possiamo vedere, r t ( θ ) r_t(\theta) r t ​ ( θ ) indica il rapporto di probabilità tra la policy corrente e quella vecchia:

  • Se r t ( θ ) > 1 r_t(\theta) > 1 r t ​ ( θ ) > 1 , l’ azione a t a_t a t ​ nello stato s t s_t s t ​ è più probabile nella policy corrente rispetto a quella vecchia.
  • Se r t ( θ ) r_t(\theta) r t ​ ( θ ) è compreso tra 0 e 1, l’ azione è meno probabile nella policy corrente rispetto a quella vecchia .

Quindi questo rapporto di probabilità è un modo semplice per stimare la divergenza tra la policy vecchia e quella corrente.

La parte non limitata della Clipped Surrogate Objective function

Questo rapporto può sostituire la log-probabilità che usiamo nella funzione obiettivo della policy . Ciò ci dà la parte sinistra della nuova funzione obiettivo: moltiplicare il rapporto per l’avvantaggio.

Proximal Policy Optimization Algorithms

Tuttavia, senza un vincolo, se l’azione intrapresa è molto più probabile nella nostra policy corrente rispetto a quella precedente, ciò porterebbe a un significativo passo di gradiente della policy e, quindi, un aggiornamento eccessivo della policy.

La parte limitata della Clipped Surrogate Objective function

Di conseguenza, dobbiamo vincolare questa funzione obiettivo penalizzando i cambiamenti che portano a un rapporto lontano da 1 (nel paper, il rapporto può variare solo da 0.8 a 1.2).

Clippano il rapporto per assicurarsi che non abbiamo un aggiornamento della policy troppo grande perché la policy corrente non può essere troppo diversa da quella precedente.

Per fare ciò, abbiamo due soluzioni:

  • TRPO (Trust Region Policy Optimization) utilizza vincoli di divergenza KL al di fuori della funzione obiettivo per vincolare l’aggiornamento della policy. Ma questo metodo è complicato da implementare e richiede più tempo di calcolo.
  • PPO limita direttamente il rapporto di probabilità nella funzione obiettivo con la sua Clipped surrogate objective function.

Questa parte tagliata è una versione in cui rt(theta) è tagliato tra [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] .

Con la funzione oggettivo surrogato tagliato, abbiamo due rapporti di probabilità, uno non tagliato e uno tagliato in un intervallo (tra [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] , epsilon è un iperparametro che ci aiuta a definire questo intervallo di taglio (nel paper ϵ = 0.2 ϵ = 0.2 ϵ = 0 . 2 .).

Quindi, prendiamo il minimo tra l’obiettivo tagliato e non tagliato, quindi l’obiettivo finale è un limite inferiore (limite pessimistico) dell’obiettivo non tagliato.

Prendere il minimo tra l’obiettivo tagliato e non tagliato significa selezionare l’obiettivo tagliato o non tagliato in base al rapporto e alla situazione di vantaggio .

Visualizzare l’Obiettivo Surrogato Tagliato

Non preoccuparti. È normale se sembra complesso da gestire in questo momento . Ma andremo a vedere com’è fatta questa Funzione Obiettivo Surrogata Tagliata, e questo ti aiuterà a visualizzare meglio ciò che sta accadendo.

Tabella tratta da "Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization" di Daniel Bick

Abbiamo sei situazioni diverse. Ricorda prima di tutto che prendiamo il minimo tra gli obiettivi tagliati e non tagliati.

Caso 1 e 2: il rapporto è tra l’intervallo

Nelle situazioni 1 e 2, il taglio non si applica poiché il rapporto è compreso tra l’intervallo [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ] [ 1 − ϵ , 1 + ϵ ]

Nella situazione 1, abbiamo un vantaggio positivo: l’azione è migliore della media di tutte le azioni in quello stato. Pertanto, dovremmo incoraggiare la nostra politica attuale ad aumentare la probabilità di prendere quell’azione in quello stato.

Dato che il rapporto è compreso tra gli intervalli, possiamo aumentare la probabilità della nostra politica di prendere quell’azione in quello stato.

Nella situazione 2, abbiamo un vantaggio negativo: l’azione è peggiore della media di tutte le azioni in quello stato. Pertanto, dovremmo scoraggiare la nostra politica attuale dal prendere quell’azione in quello stato.

Dato che il rapporto è compreso tra gli intervalli, possiamo diminuire la probabilità che la nostra politica prenda quell’azione in quello stato.

Caso 3 e 4: il rapporto è sotto l’intervallo

Tabella tratta da "Towards Delivering a Coherent Self-Contained Explanation of Proximal Policy Optimization" di Daniel Bick

Se il rapporto di probabilità è inferiore a [ 1 − ϵ ] [ 1 − ϵ ] , la probabilità di prendere quell’azione in quello stato è molto più bassa rispetto alla vecchia politica.

Se, come nella situazione 3, la stima del vantaggio è positiva (A>0), allora si desidera aumentare la probabilità di prendere quell’azione in quello stato.

Ma se, come nella situazione 4, la stima del vantaggio è negativa, non vogliamo diminuire ulteriormente la probabilità di prendere quell’azione in quello stato. Pertanto, il gradiente è = 0 (poiché siamo su una linea piatta), quindi non aggiorniamo i nostri pesi.

Caso 5 e 6: il rapporto è sopra l’intervallo

Tabella da "Verso la consegna di una spiegazione coerente e autocontenuta di Proximal Policy Optimization" di Daniel Bick

Se il rapporto di probabilità è superiore a [ 1 + ϵ ] [1 + \epsilon] [ 1 + ϵ ] , la probabilità di prendere quell’azione in quello stato nella politica corrente è molto più alta rispetto alla politica precedente.

Se, come nella situazione 5, l’avvantaggio è positivo, non vogliamo diventare troppo avidi. Abbiamo già una probabilità più alta di prendere quell’azione in quello stato rispetto alla politica precedente. Pertanto, il gradiente è = 0 (poiché siamo su una linea piatta), quindi non aggiorniamo i nostri pesi.

Se, come nella situazione 6, l’avvantaggio è negativo, vogliamo diminuire la probabilità di prendere quell’azione in quello stato.

Quindi, se facciamo il recap, aggiorniamo solo la politica con la parte obiettivo non troncata. Quando il minimo è la parte obiettivo troncata, non aggiorniamo i nostri pesi della politica poiché il gradiente sarà uguale a 0.

Quindi aggiorniamo la nostra politica solo se:

  • Il nostro rapporto è nell’intervallo [ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ]
  • Il nostro rapporto è al di fuori dell’intervallo, ma l’avvantaggio porta a avvicinarsi all’intervallo
    • Essere al di sotto del rapporto ma l’avvantaggio è > 0
    • Essere al di sopra del rapporto ma l’avvantaggio è < 0

Potresti chiederti perché, quando il minimo è il rapporto troncato, il gradiente è 0. Quando il rapporto è troncato, la derivata in questo caso non sarà la derivata di r t ( θ ) ∗ A t r_t(\theta) * A_t r t ​ ( θ ) ∗ A t ​ ma la derivata di ( 1 − ϵ ) ∗ A t (1 – \epsilon)* A_t ( 1 − ϵ ) ∗ A t ​ o la derivata di ( 1 + ϵ ) ∗ A t (1 + \epsilon)* A_t ( 1 + ϵ ) ∗ A t ​ che entrambi sono = 0.

Per riassumere, grazie a questo obiettivo sostitutivo troncato, limitiamo l’intervallo in cui la politica corrente può variare rispetto a quella precedente. Perché rimuoviamo l’incentivo per il rapporto di probabilità di spostarsi al di fuori dell’intervallo, poiché il troncamento ha l’effetto sul gradiente. Se il rapporto è > 1 + ϵ 1 + \epsilon 1 + ϵ o < 1 − ϵ 1 – \epsilon 1 − ϵ il gradiente sarà uguale a 0.

La perdita finale dell’obiettivo sostitutivo troncato per lo stile PPO Actor-Critic è così, è una combinazione di funzione obiettivo sostitutivo troncato, funzione di perdita di valore e bonus di entropia:

È stato abbastanza complesso. Prenditi del tempo per capire queste situazioni guardando la tabella e il grafico. Devi capire perché tutto ciò ha senso. Se vuoi approfondire, la migliore risorsa è l’articolo “Verso la consegna di una spiegazione coerente e autocontenuta di Proximal Policy Optimization” di Daniel Bick, soprattutto la parte 3.4.

Codifichiamo il nostro Agente PPO

Ora che abbiamo studiato la teoria dietro PPO, il modo migliore per capire come funziona è implementarlo da zero.

Implementare un’architettura da zero è il modo migliore per capirla ed è una buona abitudine. Lo abbiamo già fatto per un metodo basato su valori con Q-Learning e un metodo basato su politiche con Reinforce.

Quindi, per essere in grado di codificarlo, useremo due risorse:

  • Un tutorial realizzato da Costa Huang. Costa è il creatore di CleanRL, una libreria di Deep Reinforcement Learning che fornisce un’implementazione di un solo file di alta qualità con funzionalità adatte alla ricerca.
  • Oltre al tutorial, per approfondire, puoi leggere i 13 dettagli di implementazione principali: https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/

Quindi, per testarne la robustezza, lo addestreremo in 2 diversi ambienti classici:

  • Cartpole-v1
  • LunarLander-v2

E infine, caricheremo il modello addestrato nell’Hub per valutare e visualizzare il tuo agente in azione.

LunarLander-v2 è il primo ambiente che hai utilizzato all’inizio di questo corso. All’epoca, non sapevi come funzionasse, e ora puoi codificarlo da zero e addestrarlo. Quanto incredibile è 🤩.

via GIPHY

Inizia il tutorial qui 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit8/unit8.ipynb


Congratulazioni per aver completato questo capitolo! C’era molta informazione. E congratulazioni per aver completato il tutorial. 🥳, questo è stato uno dei più difficili del corso.

Non esitare ad addestrare il tuo agente in altri ambienti. La migliore strada per imparare è provare da soli!

Voglio che tu rifletta sui tuoi progressi dalla prima Unità. Con queste otto unità, hai costruito una solida base nel Deep Reinforcement Learning. Congratulazioni!

Ma questo non è la fine, anche se la parte delle fondamenta del corso è terminata, questo non è la fine del percorso. Stiamo lavorando su nuovi elementi:

  • Aggiunta di nuovi ambienti e tutorial.
  • Una sezione sugli agenti multipli (self-play, collaborazione, competizione).
  • Un’altra sulla offline RL e Decision Transformers.
  • Articoli spiegati di paper.
  • E altro ancora.

Il modo migliore per rimanere in contatto è iscriversi al corso in modo che possiamo tenerti aggiornato 👉 http://eepurl.com/h1pElX

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

Infine, con i tuoi commenti, vogliamo migliorare e aggiornare il corso in modo iterativo. Se ne hai, per favore compila questo modulo 👉 https://forms.gle/3HgA7bEHwAmmLfwh9

A presto!

Continua ad imparare, rimani fantastico 🤗,