Introducció

L'aprenentatge per reforç (Reinforcement Learning, RL) és una branca de l'aprenentatge automàtic que es basa en la idea d'entrenar agents perquè prenguin decisions seqüencials per maximitzar una recompensa acumulada. En el context dels videojocs, l'agent pot ser un personatge no jugador (NPC) que aprèn a jugar o a completar tasques específiques dins del joc.

Conceptes Clau

  1. Agent: L'entitat que pren decisions en l'entorn.
  2. Entorn: El món amb el qual interactua l'agent.
  3. Acció: Una decisió presa per l'agent que afecta l'entorn.
  4. Estat: Una representació de la situació actual de l'entorn.
  5. Recompensa: Un valor numèric que l'agent rep després de prendre una acció, indicant el resultat d'aquesta acció.
  6. Política: Una estratègia que l'agent segueix per decidir quina acció prendre en cada estat.
  7. Funció de valor: Una funció que estima la recompensa esperada a llarg termini per a cada estat o estat-acció.

Funcionament de l'Aprenentatge per Reforç

L'agent interactua amb l'entorn en una sèrie de passos. En cada pas, l'agent observa l'estat actual de l'entorn, pren una acció basada en la seva política, i rep una recompensa juntament amb el nou estat resultant. L'objectiu de l'agent és aprendre una política que maximitzi la recompensa acumulada a llarg termini.

Algoritmes d'Aprenentatge per Reforç

Q-Learning

Q-Learning és un dels algoritmes més coneguts d'aprenentatge per reforç. Utilitza una taula Q per emmagatzemar els valors de les accions en cada estat. La taula Q s'actualitza iterativament utilitzant la següent fórmula:

\[ Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] \]

On:

  • \( s \) és l'estat actual.
  • \( a \) és l'acció presa.
  • \( r \) és la recompensa rebuda.
  • \( s' \) és el nou estat resultant.
  • \( \alpha \) és el ritme d'aprenentatge.
  • \( \gamma \) és el factor de descompte.

Deep Q-Learning (DQN)

Deep Q-Learning utilitza xarxes neuronals per aproximar la funció Q en lloc d'utilitzar una taula. Això permet manejar entorns amb espais d'estats molt grans o continus. La xarxa neuronal pren com a entrada l'estat actual i produeix els valors Q per a totes les accions possibles.

Exemple Pràctic: Implementació de Q-Learning

A continuació, es presenta un exemple d'implementació de Q-Learning en Python per a un agent que aprèn a moure's en una quadrícula.

import numpy as np
import random

# Paràmetres de l'entorn
n_estats = 5
n_accions = 2
gamma = 0.9
alpha = 0.1
episodis = 1000

# Inicialitzar la taula Q
Q = np.zeros((n_estats, n_accions))

# Funció de recompensa
def recompensa(s, a):
    if s == 4:
        return 1
    else:
        return 0

# Entrenament de l'agent
for episodi in range(episodis):
    s = random.randint(0, n_estats - 1)
    while s != 4:
        a = random.randint(0, n_accions - 1)
        s_prime = (s + a) % n_estats
        r = recompensa(s, a)
        Q[s, a] = Q[s, a] + alpha * (r + gamma * np.max(Q[s_prime, :]) - Q[s, a])
        s = s_prime

# Política resultant
política = np.argmax(Q, axis=1)
print("Política:", política)

Exercici Pràctic

Exercici: Implementa un agent de Q-Learning per a un entorn de laberint on l'objectiu és trobar la sortida. Defineix l'entorn, les recompenses i les accions possibles. Entrena l'agent i mostra la política resultant.

Solució:

import numpy as np
import random

# Definició de l'entorn del laberint
laberint = [
    [0, 0, 0, 1],
    [1, 1, 0, 1],
    [0, 0, 0, 0],
    [0, 1, 1, 0],
    [0, 0, 0, 0]
]

n_files = len(laberint)
n_columnes = len(laberint[0])
n_accions = 4  # Amunt, Avall, Esquerra, Dreta
gamma = 0.9
alpha = 0.1
episodis = 1000

# Inicialitzar la taula Q
Q = np.zeros((n_files, n_columnes, n_accions))

# Funció de recompensa
def recompensa(s):
    if s == (4, 3):
        return 1
    else:
        return -0.1

# Funció per obtenir el nou estat després de prendre una acció
def nou_estat(s, a):
    if a == 0:  # Amunt
        return (max(s[0] - 1, 0), s[1])
    elif a == 1:  # Avall
        return (min(s[0] + 1, n_files - 1), s[1])
    elif a == 2:  # Esquerra
        return (s[0], max(s[1] - 1, 0))
    elif a == 3:  # Dreta
        return (s[0], min(s[1] + 1, n_columnes - 1))

# Entrenament de l'agent
for episodi in range(episodis):
    s = (0, 0)
    while s != (4, 3):
        a = random.randint(0, n_accions - 1)
        s_prime = nou_estat(s, a)
        r = recompensa(s_prime)
        Q[s[0], s[1], a] = Q[s[0], s[1], a] + alpha * (r + gamma * np.max(Q[s_prime[0], s_prime[1], :]) - Q[s[0], s[1], a])
        s = s_prime

# Política resultant
política = np.argmax(Q, axis=2)
print("Política:")
print(política)

Resum

En aquesta secció, hem explorat els conceptes bàsics de l'aprenentatge per reforç, incloent-hi els components clau com l'agent, l'entorn, les accions, els estats, les recompenses i les polítiques. Hem vist com funciona l'algoritme de Q-Learning i hem implementat un exemple pràctic. A més, hem proposat un exercici per reforçar els coneixements adquirits. En el proper tema, explorarem com implementar agents d'aprenentatge per reforç més avançats utilitzant xarxes neuronals.

© Copyright 2024. Tots els drets reservats