Nell’articolo precedente abbiamo visto la libreria per l’ambiente virtuale, ora vediamo come utilizzarla implementandola in un programma che fa uso delle q-table per addestrare una rete neurale.
Lo spunto e la formula li ho presi da QUI, dove peraltro è ben spiegato il funzionamento con un semplice esempio in python. Ma io volevo qualcosa di più complesso di un su e giù e quindi ho realizzato un ambiente virtuale più complesso.
Il sorgente del programma è il seguente
from env_tallo import * import keyboard import time mtable_pilota = [] mtable_memoria = [] LEARNING_RATE = 0.1 DISCOUNT = 0.95 EPISODES = 25000 SHOW_EVERY = 3000 xcasual = 1 casuali = scelte = vuote = 0 crea_mondo(100,50,30) disegna_mondo() tallo = [random.randrange(1, at_mondo_colonne-1), random.randrange(1, at_mondo_righe-1)] griglia = '0'*(at_vista+at_vista+1)**2 for x in range(0,500000): pygame.draw.rect(at_sfondo, at_col_visitato, (1, 505, 1500 ,700)) if mtable_pilota.count(griglia) == 0: mtable_pilota.append(griglia) t = [] for i in range(0,9): t.append(random.randrange(-2,0)) mtable_memoria.append(t) puntatore = mtable_pilota.index(griglia) azione = mtable_memoria[puntatore].index(max(mtable_memoria[puntatore])) if random.randint(1,xcasual) < 100: xcasual += 1 azione = random.randint(0, 8) casuali += 1 else: scelte += 1 memoria = mtable_memoria[puntatore] at_sfondo.blit(at_font.render('Casuali '+format(casuali, ',d'), True, at_col_ostacolo), (10, 530)) at_sfondo.blit(at_font.render('Scelte '+format(scelte, ',d'), True, at_col_ostacolo), (10, 550)) at_sfondo.blit(at_font.render('M-table '+format(len(mtable_pilota), ',d'), True, at_col_ostacolo), (10, 570)) pygame.display.flip() punteggio, griglia = azione_tallo(tallo, azione) if mtable_pilota.count(griglia) == 0: mtable_pilota.append(griglia) t = [] for i in range(0,9): t.append(random.randrange(-2,0)) mtable_memoria.append(t) if punteggio <= 0: nuovo_puntatore = mtable_pilota.index(griglia) max_future_q = max(mtable_memoria[nuovo_puntatore]) current_q = mtable_memoria[puntatore][azione] reward = punteggio new_q = (1 - LEARNING_RATE) * current_q + LEARNING_RATE * (reward + DISCOUNT * max_future_q) mtable_memoria[puntatore][azione] = new_q else: mtable_memoria[puntatore][azione] = 0 #time.sleep(0.4) if keyboard.is_pressed("q"): break input('premi invio')
Il programma richiama l’ambiente di prova ed esegue un ciclo selezionando ogni volta l’azione più promettente dalla situazione attuale del tallo (omino) e facendo girare l’ambiente ne riceve l’esito (punteggio).
Il punteggio è negativo di poco se non si è ottenuto nessun risultato, molto negativo se si è sbattuto ad un muro (o si è finiti fuori dall’ambiente), è invece molto alto e positivo se si mangia.
Verifica
Mi aspetto che con un po’ di addestramento il numero degli urti vada a diminuire mentre quelli del cibo mangiato vadano ad aumentare. Per verificare che questo avvenga ho fatto eseguire lo stesso numero di cicli con movimenti casuali e il risultato è stato che il numero degli urti era 8 volte quelli del cibo.
Eseguendo il programma indicato sopra, il risultato è stato notevolmente migliore:
Numero di cicli | Urti | Cibo |
1.000.000 | 1570 | 1058 |
2.000.000 | 2066 | 2139 |
3.000.000 | 2543 | 3386 |
4.000.000 | 3399 | 4067 |
5.000.000 | 4015 | 5646 |
6.000.000 | 4558 | 6934 |
7.000.000 | 5181 | 8036 |
8.000.000 | 5749 | 8787 |
L’obiettivo era ottenere un numero di cibo superiore agli urti, che nel movimento causale sono circa 12 volte, e sembra raggiunto, già con 2.000.000 di cicli il cibo è superiore e va migliorando man mano che aumenta l’addestramento.
Ci sono tanti parametri da modificare per migliorare l’addestramento, sia per quanto riguarda la formula della q-table sia le risposte dell’ambiente, sicuramente modificando i valori restituiti quando si fanno mosse senza esito o quando sbatte o quando mangia, cambierà la velocità e l’efficienza della rete neurale.
Ma poichè io sono un programmatore e non mi accontento, prima di andare avanti con la sperimentazione ho intenzione di provare un metodo di allenamento differente, più informatico diciamo, provarlo e metterlo in competizione con la q-table.
Nel prossimo articolo ve lo spiego e vi dico com’è andata.
Prosegue QUI
Maurizio