Home Fondamenti Storia dell'AI Reti Neurali Backpropagation Architetture Token Modelli AI Case Studies Tecniche RAG RAG Avanzato GraphRAG MCP Orchestrazione LangChain LangGraph Prompt Engineering Usare l'AI ChipsBot News

Introduzione all'Apprendimento per Rinforzo: Simulazione Multi-Armed Bandit in Python

Towards Data Science 14 ottobre 2026

L'apprendimento per rinforzo (Reinforcement Learning, RL) rappresenta uno dei campi più affascinanti e promettenti dell'intelligenza artificiale. A differenza dell'apprendimento supervisionato, dove l'algoritmo impara da etichette predefinite, o dell'apprendimento non supervisionato, che cerca pattern nei dati non etichettati, il RL si concentra sul processo di prendere decisioni sequenziali in un ambiente per massimizzare una ricompensa cumulativa. Questo approccio è ispirato al comportamento animale e alla psicologia cognitiva, dove gli organismi apprendono tramite interazione con l'ambiente e le conseguenze delle loro azioni.

Il problema del Multi-Armed Bandit (MAB) è uno dei problemi fondamentali e più intuitivi nel campo del reinforcement learning. Immaginiamo di trovarci di fronte a una fila di slot machine, ognuna con una probabilità sconosciuta di pagare una vincita. Ogni slot machine rappresenta un "braccio" (arm) con una distribuzione di ricompensa sconosciuta. L'obiettivo è determinare quale slot machine offra la ricompensa attesa più alta nel tempo, bilanciando la necessità di esplorare le opzioni meno conosciute con lo sfruttare le opzioni che hanno già dimostrato di essere redditizze. Questo dilemma tra esplorazione ed esploitation è centrale nel reinforcement learning e ha implicazioni in numerosi campi, dal marketing alla finanza, dalla medicina all'ottimizzazione di sistemi.

Il Problema del Multi-Armed Bandit

Il problema del Multi-Armed Bandit può essere formalizzato come un processo decisionale sequenziale. A ogni passo temporale t, l'agente sceglie un braccio a(t) dalla collezione di bracci disponibili. In risposta, l'ambiente restituisce una ricompensa r(t) secondo una distribuzione di probabilità specifica per il braccio scelto. L'obiettivo dell'agente è massimizzare la somma delle ricompense ricevute nel tempo, o equivalentemente, la ricompensa media per azione. La sfida risiede nel fatto che le distribuzioni di ricompensa sono inizialmente sconosciute e devono essere apprese attraverso l'interazione.

Esistono diverse strategie per affrontare il problema del Multi-Armed Bandit, ognuna con i propri compromessi. Una strategia semplice è quella della scelta greedy, in cui l'agente seleglie sempre il braccio che attualmente ha la stima di ricompenza più alta. Tuttavia, questa approccio può portare a un'esplorazione insufficiente, poiché potrebbe non esplorare mai un braccio che in realtà ha una ricompresa attesa più alta ma che ha avuto sfortuna nelle prime selezioni. Per affrontare questo problema, sono state sviluppate strategie che bilanciano esplicitamente esplorazione ed esploitation.

Strategie Esempio: Epsilon-Greedy e UCB

Una delle strategie più popolari è l'algoritmo Epsilon-Greedy. In questo approccio, l'agente sceglie il braccio con la stima più alta con probabilità 1-ε, e con probabilità ε sceglie un braccio in modo casuale. Il parametro ε, che varia tipicamente tra 0 e 1, controlla il livello di esplorazione. Un valore di ε alto promuove l'esplorazione, mentre un valore basso favorisce l'esplorazione. Una variante comune è l'epsilon decrescente, in cui ε viene ridotto gradualmente nel tempo, permettendo all'agente di esplorare ampiamente all'inizio e poi convergere verso la scelta del braccio migliore.

Un'altra classe di algoritmi molto efficace è basata sul concetto di Upper Confidence Bound (UCB). L'algoritmo UCB1, ad esempio, seleziona il braccio che massimizza la stima della sua ricompensa media più un termine di "confidenza" che dipende dal numero di volte che il braccio è stato selezionato. Questo termine di confidenza è più alto per i bracci che sono stati esplorati meno, incentivando l'agente a provare opzioni meno conosciute. L'idea è bilanciare la stima attuale della ricompensa con l'incertezza associata a tale stima. Questo approccio ha il vantaggio teorico di garantire che il tasso di regret (la differenza tra la ricompensa ottenuta e quella che si sarebbe ottenuta scegliendo sempre il braccio ottimo) cresca solo come logaritmo del numero di passi temporali, che è il limite ottimale per questo problema.

Implementazione in Python

L'implementazione di una simulazione del Multi-Armed Bandit in Python è un'ottima opportunità per comprendere i concetti teorici in modo pratico. Per iniziare, è necessario definire le classi fondamentali: una classe per rappresentare un braccio (con una distribuzione di ricomperta, ad esempio una Bernoulli o una Normale) e una classe per l'agente che implementa una specifica strategia (come Epsilon-Greedy o UCB). L'agente dovrebbe mantenere traccia delle stime di ricomperta per ogni braccio e del numero di volte che ciascun braccio è stato selezionato.

Ecco un esempio semplificato di come potrebbe apparire l'implementazione di un agente Epsilon-Greedy in Python. Si crea una classe `EpsilonGreedyAgent` con un metodo `choose_arm` che implementa la logica della strategia. All'interno di questo metodo, si genera un numero casuale per decidere se esplorare (scegliere un braccio a caso) o sfruttare (scegliere il braccio con la stima più alta). Un altro metodo, `update`, viene chiamato dopo ogni selezione per aggiornare la stima della ricomperta del braccio scelto in base alla ricomperta ricevuta. Questo processo viene poi iterato per un numero definito di passi temporali, e le performance dell'agente possono essere valutate tramite metriche come il regret cumulativo o la ricomperta media.

Valutazione e Visualizzazione

Una volta implementato l'algoritmo, è cruciale valutarne le performance. La metrica più comune è il regret, definito come la differenza tra la ricomperta massima possibile (sempre scegliendo il braccio ottimo) e la ricomperta effettivamente ottenuta. Tracciando il regret cumulativo nel tempo, è possibile visualizzare quanto bene l'agente sta imparando a identificare il braccio migliore. Un buon algoritmo dovrebbe mostrare un regret che cresce lentamente, indicando che l'agente sta convergendo rapidamente verso la soluzione ottimale.

La visualizzazione dei risultati è fondamentale per un'interpretazione intuitiva. Utilizzando librerie come Matplotlib o Seaborn, si possono creare grafici che mostrano l'andamento del regret cumulativo, la stima della ricomperta per ciascun braccio nel tempo, e il numero di volte che ciascun braccio è stato selezionato. Questi grafici aiutano a comprendere il comportamento dell'algoritmo: ad esempio, si può osservare come un agente Epsilon-Greedy con ε alto esplori molto all'inizio ma poi converga, mentre un agente UCB mostra un pattern di esplorazione più bilanciato durante tutto il processo. Queste intuizioni sono preziose per applicare con successo il reinforcement learning a problemi reali, dove il trade-off tra esplorazione ed esploitation può avere conseguenze significative.

Leggi l'articolo originale →
← Torna alle news