Apprendimento di rinforzo semplice in Tensorflow: Parte 1 - Bandito a due braccia

introduzione

L'apprendimento per rinforzo ci offre la capacità non solo di insegnare ad un agente artificiale come agire, ma di consentirgli di imparare attraverso le sue interazioni con un ambiente. Combinando le complesse rappresentazioni che le reti neurali profonde possono apprendere con l'apprendimento guidato dagli obiettivi di un agente RL, i computer hanno realizzato talenti incredibili, come battere gli umani in oltre una dozzina di giochi Atari e sconfiggere il campione del mondo Go.

Imparare a costruire questi agenti richiede un po 'di cambiamento nel modo di pensare per chiunque sia abituato a lavorare in un ambiente di apprendimento supervisionato. È finita la capacità di ottenere semplicemente l'algoritmo per accoppiare determinati stimoli con determinate risposte. Gli algoritmi RL devono invece consentire all'agente di apprendere gli accoppiamenti corretti attraverso l'uso di osservazioni, premi e azioni. Dal momento che non esiste più un'azione "vera" corretta da parte di un agente in una determinata circostanza che possiamo solo dire, le cose diventano un po 'complicate. In questo post e in quelli successivi seguirò la creazione e la formazione di agenti per l'apprendimento del rinforzo. L'agente e l'attività inizieranno in modo semplice, in modo che i concetti siano chiari e quindi funzionino fino a compiti e ambienti più complessi.

Bandito a due braccia

Il più semplice problema di apprendimento del rinforzo è il bandito armato. In sostanza, ci sono n-molte slot machine, ognuna con una diversa probabilità di pagamento fissa. L'obiettivo è scoprire la macchina con il miglior pagamento e massimizzare la ricompensa restituita scegliendola sempre. Lo renderemo ancora più semplice, avendo solo due possibili slot machine tra cui scegliere. In realtà, questo problema è così semplice che è più un precursore di problemi RL reali di uno stesso. Lasciatemi spiegare. Gli aspetti tipici di un'attività che lo rendono un problema RL sono i seguenti:

  • Azioni diverse producono ricompense diverse. Ad esempio, quando cerchi un tesoro in un labirinto, andare a sinistra può portare al tesoro, mentre andare a destra può portare a una fossa di serpenti.
  • I premi sono ritardati nel tempo. Questo significa solo che anche se andare a sinistra nell'esempio sopra è la cosa giusta da fare, potremmo non saperlo fino a tardi nel labirinto.
  • La ricompensa per un'azione è subordinata allo stato dell'ambiente. Continuando l'esempio del labirinto, andare a sinistra può essere l'ideale in corrispondenza di un certo bivio nel percorso, ma non in altri.

Il bandito n-armato è un buon punto di partenza perché non dobbiamo preoccuparci degli aspetti n. 2 e 3. Tutto ciò di cui dobbiamo concentrarci è imparare quali ricompense otteniamo per ciascuna delle possibili azioni e assicurarci di scegliere l'ottimale quelli. Nel contesto del linguaggio RL, questo si chiama apprendimento di una politica. Utilizzeremo un metodo chiamato gradienti delle politiche, in cui la nostra semplice rete neurale apprende una politica per selezionare le azioni regolandone i pesi attraverso la discesa dei gradienti utilizzando il feedback dall'ambiente. Esiste un altro approccio all'apprendimento per rinforzo in cui gli agenti apprendono funzioni di valore. In quegli approcci, invece di apprendere l'azione ottimale in un determinato stato, l'agente impara a prevedere quanto sarà buono un determinato stato o azione per l'agente. Entrambi gli approcci consentono agli agenti di apprendere un buon comportamento, ma l'approccio con gradiente politico è un po 'più diretto.

Gradiente politico

Il modo più semplice di pensare a una rete con gradiente di policy è quello che produce output espliciti. Nel caso del nostro bandito, non abbiamo bisogno di condizionare questi output in nessun stato. In quanto tale, la nostra rete consisterà solo in una serie di pesi, ognuno dei quali corrisponde a ciascuno dei bracci possibili per tirare il bandito e rappresenterà quanto è buono il nostro agente pensa che sia tirare ogni braccio. Se inizializziamo questi pesi su 1, allora il nostro agente sarà in qualche modo ottimista sulla potenziale ricompensa di ogni braccio.

Per aggiornare la nostra rete, proveremo semplicemente un braccio con una politica e-golosa (vedere la Parte 7 per ulteriori informazioni sulle strategie di selezione delle azioni). Ciò significa che il più delle volte il nostro agente sceglierà l'azione che corrisponde al valore atteso più grande, ma occasionalmente, con ogni probabilità, sceglierà in modo casuale. In questo modo, l'agente può provare ciascuna delle diverse armi per continuare a saperne di più. Una volta che il nostro agente ha intrapreso un'azione, riceve una ricompensa di 1 o -1. Con questo premio, possiamo quindi effettuare un aggiornamento alla nostra rete utilizzando l'equazione di perdita delle polizze:

Perdita = -log (π) * A

A è un vantaggio ed è un aspetto essenziale di tutti gli algoritmi di apprendimento per rinforzo. Intuitivamente corrisponde a quanto è stata migliore un'azione rispetto a una linea di base. Nei futuri algoritmi, svilupperemo linee di base più complesse con cui confrontare i nostri premi, ma per ora supponiamo che la linea di base sia 0 e possa essere considerata semplicemente la ricompensa che abbiamo ricevuto per ogni azione.

π è la politica. In questo caso, corrisponde al peso dell'azione scelta.

Intuitivamente, questa funzione di perdita ci consente di aumentare il peso per le azioni che hanno prodotto una ricompensa positiva e di diminuirle per le azioni che hanno prodotto una ricompensa negativa. In questo modo l'agente avrà più o meno probabilità di scegliere tale azione in futuro. Agendo, ottenendo ricompense e aggiornando la nostra rete in questo modo circolare, convergere rapidamente in un agente in grado di risolvere il nostro problema di bandito! Non crederci sulla parola però. Provalo tu stesso.

(Aggiornamento del 09/10/2016): ho riscritto la procedura dettagliata di iPython per questo tutorial oggi. L'equazione di perdita utilizzata in precedenza era meno intuitiva di quanto mi sarebbe piaciuto. L'ho sostituito con una versione più standard e interpretabile che sarà sicuramente più utile per coloro che sono interessati ad applicare metodi di gradiente politico a problemi più complessi.)

Se desideri seguire il mio lavoro su Deep Learning, AI e Cognitive Science, seguimi su Medium @Arthur Juliani o su Twitter @awjliani.

Se questo post ti è stato prezioso, ti preghiamo di prendere in considerazione una donazione per aiutarti a supportare tutorial, articoli e implementazioni future. Qualsiasi contributo è molto apprezzato!

Altro dal mio Simple Reinforcement Learning con la serie Tensorflow:

  1. Parte 0 - Agenti Q-Learning
  2. Parte 1 - Bandito a due braccia
  3. Parte 1.5 - Banditi contestuali
  4. Parte 2 - Agenti basati su criteri
  5. Parte 3 - RL basata sul modello
  6. Parte 4 - Deep Q-Networks e oltre
  7. Parte 5 - Visualizzazione dei pensieri e delle azioni di un agente
  8. Parte 6 - Osservabilità parziale e reti Q ricorrenti profonde
  9. Parte 7 - Strategie di selezione dell'azione per l'esplorazione
  10. Parte 8 - Asynchronous Actor-Critic Agents (A3C)