Intelligenza artificiale e Q-table 2 di 2

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 cicliUrtiCibo
1.000.00015701058
2.000.00020662139
3.000.00025433386
4.000.00033994067
5.000.00040155646
6.000.00045586934
7.000.00051818036
8.000.00057498787

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

Lascia un commento