Come gestire le mosse non valide nell'apprendimento per rinforzo?


20

Voglio creare un'intelligenza artificiale in grado di giocare a cinque di fila / gomoku. Come ho già detto nel titolo, voglio usare l'apprendimento per rinforzo per questo.

Uso il metodo del gradiente delle politiche , vale a dire REINFORCE, con baseline. Per l'approssimazione del valore e della funzione politica, utilizzo una rete neurale . Ha strati convoluzionali e completamente collegati. Tutti i livelli, ad eccezione dell'output, sono condivisi. Il livello di output della politica ha (la dimensione della scheda) unità di output e softmax su di essi. Quindi è stocastico. Ma cosa succede se la rete produce una probabilità molto alta per una mossa non valida? Una mossa non valida è quando l'agente vuole controllare un quadrato che contiene una "X" o "O". Penso che possa rimanere bloccato in quello stato di gioco.8×8=64

Potresti consigliare qualche soluzione per questo problema?

La mia ipotesi è di usare il metodo dell'attore-critico . Per una mossa non valida, dovremmo dare una ricompensa negativa e passare il turno all'avversario.

Risposte:


10

Ignora le mosse non valide.

Per l'esplorazione è probabile che non solo eseguirai la mossa con la probabilità più alta, ma sceglierai le mosse in modo casuale in base alla probabilità emessa. Se punisci solo le mosse illegali, manterranno comunque una certa probabilità (per quanto piccola) e pertanto verranno eseguite di volta in volta (per quanto raramente). Quindi manterrai sempre un agente che occasionalmente compie mosse illegali.

Per me ha più senso impostare a zero le probabilità di tutte le mosse illegali e rinormalizzare il vettore di output prima di scegliere la tua mossa.


Grazie. probabilmente non ero chiaro ma ho scelto la mossa in modo casuale dalle probabilità emesse. Proverò il tuo consiglio di impostare a zero la probabilità di mosse illegali e vedere cosa succederà. Buona giornata.
Molnár István,

8

Solitamente i metodi softmax nei metodi con gradiente di politica che usano l'approssimazione di funzioni lineari usano la seguente formula per calcolare la probabilità di scegliere l'azione a . Qui, i pesi sono θ , e le caratteristiche ϕ è una funzione dello stato attuale s e un'azione dal set di azioni A .

π(θ,a)=eθϕ(s,a)bAeθϕ(s,b)

Per eliminare le mosse illegali, si limiterebbe l'insieme di azioni solo a quelle che erano legali, quindi Legal(A) .

π(θ,a)=eθϕ(s,a)bLegal(A)eθϕ(s,b),aLegal(A)

Nello pseudocodice la formula può apparire così:

action_probs = Agent.getActionProbs(state)
legal_actions = filterLegalActions(state, action_probs)
best_legal_action = softmax(legal_actions)

Sia che si utilizzi l'approssimazione di funzioni lineari o non lineari (la propria rete neurale), l'idea è di usare le mosse legali solo quando si calcola il softmax. Questo metodo significa che l'agente fornirà solo mosse valide, il che è utile se si desidera cambiare il gioco in seguito, e che la differenza di valore tra la scelta limitata nelle azioni sarà più facile da discriminare da parte dell'agente. Sarà anche più veloce quando diminuisce il numero di azioni possibili.


Molto utile. Grazie per aver pubblicato sia le equazioni che lo pseudocodice!
DukeZhou

1
La matematica e lo pseudocodice non corrispondono qui. Softmax sulle probabilità di spostamento legale regolerà le probabilità relative. Ad esempio (0,3, 0,4, 0,2, 0,1) filtrato con il primo e il terzo elemento rimossi sarebbe (0,0, 0,8, 0,0, 0,2) con la formula, ma sarebbe (0,0, 0,57, 0,0, 0,42) utilizzando lo pseudocodice. Lo pseudocodice deve eseguire i log, prima dei calcoli della probabilità di azione.
Neil Slater

4
Come si calcola il gradiente della versione filtrata di Softmax? Sembra che questo sarebbe necessario per il corretto funzionamento della backpropagation, sì?
brianberns,

@brianberns Sei riuscito a trovare una risposta? Sembra che sarebbe il caso per me, ma in qualche modo nel mio esempio giocattolo che sto ottenendo soltanto la risposta giusta quando si utilizzano le probabilità di log del SoftMax unfilitered ...
tryingtolearn

5

L'idea di mosse non valide non è di per sé valida. Immagina di posizionare una "X" alle coordinate (9, 9). Potresti considerarlo una mossa non valida e dargli una ricompensa negativa. Assurdo? Sicuro!

Ma in realtà le tue mosse non valide sono solo una reliquia della rappresentazione (che a sua volta è semplice e corretta). Il miglior trattamento per loro è quello di escluderli completamente da qualsiasi calcolo.

Questo diventa più evidente negli scacchi:

  • In una rappresentazione posizionale, potresti considerare la mossa a1-a8, che appartiene al gioco solo se c'è una Torre o una Regina in a1(e alcune altre condizioni valgono).

  • In una rappresentazione diversa, potresti considerare la mossa Qb2. Ancora una volta, questo potrebbe appartenere o meno al gioco. Quando il giocatore attuale non ha una regina, sicuramente non lo è.

Poiché le mosse non valide sono legate alla rappresentazione piuttosto che al gioco, non dovrebbero essere considerate affatto.


1
Ottimo punto Nei giochi [M], che si giocano su Sudoku, i vincoli rendono illegali molte posizioni (coordinate + valore) dopo il primo piazzamento. Non ha alcun valore considerare queste posizioni illegali dal punto di vista del posizionamento, ma un importante livello strategico sta riconoscendo quali posizionamenti minimizzano il valore delle posizioni rimanenti non giocate. (cioè se metto un 8 qui, impedisce al mio avversario di piazzare un 8 in quella riga, colonna o regione. In sostanza, "quante posizioni strategiche rimuove questo posizionamento dal tabellone?")
DukeZhou

5

Di recente ho riscontrato un problema simile con Minesweeper.

Il modo in cui l'ho risolto è stato ignorando completamente le mosse illegali / non valide.

  1. Utilizza la rete Q per prevedere i valori Q per tutte le tue azioni (valide e non valide)
  2. Pre-elaborare i valori Q impostando tutti gli spostamenti non validi su un valore Q pari a zero / numero negativo (dipende dallo scenario)
  3. Usa una politica a tua scelta per selezionare un'azione tra i raffinati valori Q (es. Goloso o Boltzmann)
  4. Esegui l'azione selezionata e riprendi la tua logica DQN

Spero che sia di aiuto.


1
L'unica cosa che aggiungerei a questo è che devi ricordare di fare un backprop sul DQN quando imposti i valori Q per coppie illegali (s, a) su un valore negativo elevato, quindi è addestrato a non scegliere quello stato, azione paia la prossima volta.
SN

Ma mi chiedo che cosa faccia l'impostazione di valori Q target di grandi dimensioni per la continuità o la forma della funzione di perdita / errore (influenzando così la ricerca del gradiente). Qual è stata la tua esperienza?
SN

1
@SN Vedo il tuo punto. L'idea è di scegliere l'azione con il valore Q più alto che non sia un'azione non valida . Successivamente, esegui quell'azione e usi quell'azione nella tua regola di aggiornamento (ad esempio, allena il tuo DQN per favorire questa azione a lungo termine). Ciò che fa è aumentare i valori Q futuri dell'azione selezionata e quindi più favorevoli. NON ridurrà il valore Q delle azioni illegali, il che non ha importanza perché vengono sempre filtrate (non considerate). Fammi sapere se vuoi che elabori di più con un esempio. :)
Sanavesa il

1
@Sanavesa ha sicuramente senso, stai essenzialmente contando sul DQN alla fine imparando quali sono le scelte giuste attraverso la scuola dei duri. Ma in situazioni in cui c'è solo una o poche scelte legali, finirai con un apprendimento molto lento. L'approccio che sto suggerendo è un modo per incorporare il dominio K nel problema per accelerare tale apprendimento. È anche quello che pensavo stessi facendo nel tuo post originale in cui hai scritto di "impostare mosse non valide su un valore Q di zero / numero negativo"
SN

1
@SNPrecisely! Entrambi gli approcci hanno i loro meriti. Dipende dall'applicazione se è più facile imparare le mosse legali o semplicemente ignorarle. Per applicazioni complesse di grandi dimensioni, sento che ignorare le mosse non valide è molto più veloce per l'agente da imparare, ma non citarmi su questo.
Sanavesa,
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.