Come implementare uno spazio d'azione limitato nell'apprendimento per rinforzo?


13

Sto codificando un modello di apprendimento di rinforzo con un agente PPO grazie all'ottima libreria Tensorforce , costruita su Tensorflow.

La prima versione era molto semplice e ora mi sto tuffando in un ambiente più complesso in cui tutte le azioni non sono disponibili ad ogni passaggio.

Diciamo che ci sono 5 azioni e la loro disponibilità dipende da uno stato interno (che è definito dall'azione precedente e / o dal nuovo spazio stato / osservazione):

  • 2 azioni (0 e 1) sono sempre disponibili
  • 2 azioni (2 e 3) sono disponibili solo quando internal_state == 0
  • 1 azione (4) è disponibile solo quando internal_state == 1

Quindi, ci sono 4 azioni disponibili quando internal_state == 0 e 3 azioni disponibili quando internal_state == 1.

Sto pensando ad alcune possibilità per implementarlo:

  1. Cambia lo spazio di azione ad ogni passaggio, a seconda di stato_interno. Presumo che sia una sciocchezza.
  2. Non fare nulla: fai capire al modello che la scelta di un'azione non disponibile non ha alcun impatto.
  3. Non fare quasi nulla: impatta leggermente la ricompensa quando il modello sceglie un'azione non disponibile.
  4. Aiuta il modello: incorporando un numero intero nello spazio stato / osservazione che informa il modello qual è il valore stato_interno + punto elenco 2 o 3

Esistono altri modi per implementarlo? In base alla tua esperienza, quale sarebbe la migliore?

Risposte:


5

La soluzione più semplice è semplicemente rendere "legale" ogni azione, ma implementando una mappatura coerente e deterministica da azioni potenzialmente illegali a diverse azioni legali. Ogni volta che l'implementazione PPO che stai utilizzando seleziona un'azione illegale, devi semplicemente sostituirla con l'azione legale a cui è associata. Il tuo algoritmo PPO può quindi aggiornarsi come se fosse selezionata l'azione illegale (l'azione illegale diventa semplicemente come ... un "soprannome" per l'azione legale).

Ad esempio, nella situazione che descrivi:

  • 2 azioni (0 e 1) sono sempre disponibili
  • 2 azioni (2 e 3) sono disponibili solo quando internal_state == 0
  • 1 azione (4) è disponibile solo quando internal_state == 1

Nei casi in cui internal_state == 0, se è 4stata selezionata un'azione (un'azione illegale), puoi sempre scambiarla con una delle altre azioni e giocarla invece. Non importa (teoricamente) quale scegli, purché tu sia coerente al riguardo. L'algoritmo non deve sapere che ha scelto un'azione illegale, ogni volta che sceglie di nuovo la stessa azione illegale in futuro in stati simili, verrà invece costantemente mappata alla stessa azione legale, quindi ti rinforzi solo in base a quel comportamento.


01


Per la prima "soluzione", ho scritto sopra che non importa "teoricamente" come scegli la tua mappatura. Mi aspetto assolutamente che le tue scelte qui avranno un impatto sulla velocità di apprendimento in pratica. Questo perché, nelle fasi iniziali del processo di apprendimento, probabilmente avrai una selezione di azioni quasi casuali. Se alcune azioni "compaiono più volte" nelle uscite, avranno una maggiore probabilità di essere selezionate con la selezione iniziale dell'azione di chiusura. Quindi, ci sarà un impatto sul tuo comportamento iniziale, che ha un impatto sull'esperienza che raccogli, che a sua volta ha anche un impatto su ciò che impari.

Mi aspetto certamente che sarà utile per le prestazioni se è possibile includere funzionalità di input per la internal_statevariabile.

Se è possibile identificare alcune azioni legali che sono in qualche modo "semanticamente vicine" a determinate azioni illegali, potrebbe anche essere utile per le prestazioni collegare in modo specifico quelle azioni "simili" nella "mappatura" da azioni illegali a azioni legali se si sceglie di procedere con quella soluzione. Ad esempio, se hai un'azione "salta in avanti" che diventa illegale negli stati in cui il soffitto è molto basso (perché ti sbattere la testa), potrebbe essere meglio mappare quell'azione a un'azione "sposta in avanti" (che è ancora un po 'simile, vanno entrambi in avanti), che sarebbe mapparlo su un'azione "sposta indietro". Questa idea di azioni "simili" sarà applicabile solo a determinati domini, tuttavia in alcuni domini potrebbero non esserci simili similitudini tra le azioni.


2

L'obiettivo è progettare un componente di ottimizzazione della politica prossimale che abbia vincoli specifici sullo spazio d'azione dipendente dalle regole guidate dallo stato, usando un framework come Tensorforce.

Opzioni di progettazione elencate nella domanda

Queste opzioni sono elencate qui per un rapido riferimento durante la lettura dell'analisi iniziale di seguito.

  • Cambia lo spazio di azione ad ogni passaggio, a seconda di stato_interno. Presumo che sia una sciocchezza.
  • Non fare nulla: fai capire al modello che la scelta di un'azione non disponibile non ha alcun impatto.
  • Non fare quasi nulla: impatta leggermente la ricompensa quando il modello sceglie un'azione non disponibile.
  • Aiuta il modello: incorporando un numero intero nello spazio stato / osservazione che informa il modello qual è il valore stato_interno + punto elenco 2 o 3

Analisi iniziale

È davvero sensato cambiare lo spazio d'azione per ogni mossa. Questa è, in effetti, una rappresentazione adeguata del problema come affermato e del modo normale in cui gli umani giocano e il modo in cui i computer battono gli umani in Chess and Go.

L'apparente insensatezza di questa idea è semplicemente un artefatto del progresso lungo la road map del progetto Tensorforce e del progresso lungo la teoria del rinforzo, entrambi giovani nel quadro generale. Leggendo la documentazione e le FAQ di Tensorforce, non sembra che il framework sia progettato per collegare un motore di regole per determinare lo spazio di azione. Questo non è un difetto dell'open source. Non sembra esserci alcun documento che fornisca teoria o proponga algoritmi per la decisione della catena di Markov condizionata.

L'opzione do-nothing è quella che si adatta alle attuali strategie disponibili rappresentate in letteratura. Il quasi nulla è probabilmente l'approccio che produrrà comportamenti desiderabili più affidabili e forse più immediati.

Il problema con l'idea di aiutare il modello è che non è un'idea così forte che estendere il modello. In open source, questo sarebbe fatto estendendo le classi che rappresentano il modello, che richiederebbe un lavoro teorico prima della codifica a

    a. Represent rule-conditioned learning in nomenclature
    b. Represent convergence mathematically using the new nomenclature
    c. Determining a method of convergence
    d. Proving convergence
    e. Rechecking
    f. Defining a smooth and efficient algorithm
    g. Providing PAC learning information for planning
    f. Peer review
    g. Extending the classes of the library
    h. Proof of concept with the current problem above
    i. Additional cases and metrics comparing the approach with the others
    j. Extending the library flexibility to support more such dev

L'estensione dei sistemi di apprendimento per coprire il caso vincolato dalle regole è un'ottima idea per una tesi di dottorato e potrebbe volare nei laboratori di ricerca come proposta di progetto con molte possibili applicazioni. Non lasciare che tutti i passaggi dissuadano il ricercatore. Sono essenzialmente un elenco di passaggi per qualsiasi tesi di dottorato o progetto di laboratorio di intelligenza artificiale finanziato.

Per una soluzione a breve termine, aiutare il modello potrebbe funzionare, ma non è una strategia valida per promuovere le idee di intelligenza artificiale lungo il percorso di apprendimento di rinforzo. Come soluzione a breve termine per un problema particolare, potrebbe funzionare correttamente. L'idea del quasi nulla può essere più valida, poiché si adatta alle prove di convergenza che hanno portato alla particolare implementazione che Tensorforce probabilmente utilizzerà.

Rinominarlo dal fare quasi nulla per favorire la convergenza può aiutare a sviluppare la giusta prospettiva prima di provarlo. Potresti scoprire che devi attenuare l'assistenza mentre ti avvicini alla convergenza per evitare il superamento così come con un tasso di apprendimento.


3
Ciò che accade in genere, ad esempio AlphaGo, è che la rappresentazione di basso livello nella rete neurale rappresenta uno spazio d'azione molto ampio, la maggior parte del quale è impossibile nello stato attuale (lo fa a causa delle limitazioni di NN semplici che generano vettori di dimensioni fisse ). Quindi un'altra parte del codice applica un filtro per selezionare e normalizzare le probabilità solo per le mosse consentite. L'NN e il filtro combinati fanno parte dell'agente. Quindi è giusto affermare che l'agente nel suo insieme "cambierà lo spazio d'azione per ogni mossa" - non so come si possa ottenere all'interno della biblioteca di Tensorforce.
Neil Slater,

1

Normalmente, l'insieme di azioni che l'agente può eseguire non cambia nel tempo, ma alcune azioni possono diventare impossibili in diversi stati (ad esempio, non tutte le mosse sono possibili in qualsiasi posizione del gioco TicTacToe).

Dai un'occhiata ad esempio a pice di codice https://github.com/haje01/gym-tictactoe/blob/master/examples/base_agent.py :

ava_actions = env.available_actions()
action = agent.act(state, ava_actions)
state, reward, done, info = env.step(action)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.