<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flying memes &#187; Apprendimento con Rinforzo</title>
	<atom:link href="http://sandropaganotti.com/tag/apprendimento-con-rinforzo/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 08 Jan 2012 16:00:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Q-learning con processing.org</title>
		<link>http://sandropaganotti.com/2009/01/18/q-learning-con-processingorg/</link>
		<comments>http://sandropaganotti.com/2009/01/18/q-learning-con-processingorg/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 16:00:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Algoritmi]]></category>
		<category><![CDATA[Apprendimento con Rinforzo]]></category>
		<category><![CDATA[Processing]]></category>
		<category><![CDATA[Q-learning]]></category>
		<category><![CDATA[Reinforcement Learning]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=102</guid>
		<description><![CDATA[Il reinforcement learning (o apprendimento con rinforzo) è una approcio che appartiene alla categoria dei sistemi intelligenti e che si applica a tutte quelle casistiche nelle quali un agente deve esplorare ed interagire con l&#8217;ambiente circostante. Il principio base che sottende tutti gli algoritmi di reinforcement learning è lo stesso: ad ogni interazione con l&#8217;ambiente [...]]]></description>
			<content:encoded><![CDATA[<p>Il reinforcement learning (o apprendimento con rinforzo) è una approcio che appartiene alla categoria dei sistemi intelligenti e che si applica a tutte quelle casistiche nelle quali un agente deve esplorare ed interagire con l&#8217;ambiente circostante.</p>
<p><span id="more-102"></span><br />
Il principio base che sottende tutti gli algoritmi di reinforcement learning è lo stesso: ad ogni interazione con l&#8217;ambiente circostante l&#8217;agente viene premiato o punito a seconda dell&#8217;azione intrapresa in quel particolare stato. A fronte di questi premi/punizioni l&#8217;agente impara col tempo a collezionare il maggior numero di premi possibili evitando le punizioni.</p>
<p>Possiamo formalizzare quanto appena enunciato come segue: dato un&#8217;insieme di stati  S={s0,s1&#8230;,sn}, un&#8217;insieme di azioni A={a1,a2&#8230;,am} dobbiamo trovare una corrispondenza stato-azione (detta policy p[s,a] ) in modo da massimizzare il reward R={r1,r2&#8230;,rl} che l&#8217;ambiente ci fornisce ogniqualvolta in un determinato stato eseguiamo una determinata azione.</p>
<p>Chiaramente a questo enunciato devono seguire alcune considerazioni (che ci porteranno poi alla stesura dell&#8217;algoritmo Q-learning), ad esempio risulta ovvio pensare che se dall&#8217;azione che eseguo all&#8217;istante t ottengo una punizione questa non sarà (probabilmente) legata solo a quello che ho scelto di fare in quell&#8217;istante ma anche da tutte le scelte che ho fatto prima.</p>
<p>Ecco dunque che nasce la necessità di aggiungere una nuova definizone a quanto già espresso precedentemente, definiamo q[s,a] come la misura del premio/punizione che mi dovrebbe attendere a lungo termine se intraprendo quella azione in quello stato. Quindi una q[s,a] abbastanza alta dovrebbe rassicurare il mio agente e fargli intraprendere quell&#8217;azione in quanto, se prendiamo come esempio gli scacchi, poche mosse dopo quella che stò per fare potrei vincere.</p>
<p>Ottenere un buon indicatore di questa q non è esattamente facile. Per farlo deve necessariamente esplorare l&#8217;ambiente in modo da collezionare un po di &#8216;esperienza&#8217; sul campo, esperienza che poi potrò utilizzare proprio per stillare la policy (perchè unendo i concetti fin qui esposti risulta ben chiaro che se dovessi mai avere la q &#8216;perfetta&#8217; per ogni copia di stato/azione la mia policy si risolverebbe nell&#8217;eseguire di volta in volta l&#8217;azione con la q più alta per quello stato).</p>
<p>L&#8217;algoritmo Q-learning che stò per enunciare unisce il concetto di &#8216;calcolo della q&#8217; al concetto di &#8216;elaborazione della policy&#8217; semplicemente accontentandosi di volta in volta di scelgiere l&#8217;azione con la q più alta tra quelle disponibili in quello stato e successivamente di retro-modificare la q scelta incrementandola se l&#8217;azione (e quelle successive) hanno portato ad un premio e decrementandola viceversa.</p>
<p>In questo modo dopo un certo numero di &#8216;episodi&#8217; la q che l&#8217;agente si è calcolato dovrebbe essere almeno vicina a quella reale.</p>
<p>Scrivo ora l&#8217;algoritmo del Q-learning cosi come descritto nei paragrafi precedenti:</p>
<pre><code>
Variabili iniziali:
S = {s1,s2,...sn}   # Stati  (ad esempio in un labirinto ogni casella)
A ={a1,a2,...an}    # Azioni (potrebbero non esserci tutte per ogni stato, in un labirinto
                    # potrebbero essere su, giu, sx, dx)

Setup iniziale:
q = 0               # Per ogni coppia di stato/azione
r =  0              # Per ogni coppia di stato/azione imposto il reward a zero
imposta_reward()    # Per ogni coppia di stato azione significativa ( ad esempio in un
                    # labirinto l'uscita) imposto un
                    # reward diverso dallo zero ( ad esempio uscita: +10, rovi: -5 )
stati_terminali = s1,s2  # Vanno identificati gli stati terminali (quelli in cui,
                         # cioè l'episodio finisce - ad esempio l'uscaita dal labirinto)
stato_corrente = stato_inizale      # Va impostato uno stato iniziale
azione_corrente = azione_iniziale   # Va impostata la prima azione
alpha = xx          # costante, indica quanto la variazione dei q futuri incida sul q
                    # corrente
gamma = xx          # costante, indica quanto 'ridimensionare' la variazione dei q futuri 

Algoritmo:
Finche la policy non converge:
   prossimo_stato   =  recupera_prossimo_stato(stato_corrente,azione_corrente)
   reward = recupera_reward(stato_corrente,azione_corrente)
   prossima_azione =  recupera_l_azione_col_q_maggiore(prossimo_stato)
   q[stato_corrente,azione_corrente] =  q[stato_corrente,azione_corrente] + alpha * ( reward +
                                        gamma * q[prossimo_stato,prossima_azione] -
                                        q[stato_corrente,azione_corrente])

   # se prossimo_stato è una stato terminale stato_corrente deve tornare ad
   # essere stato_iniziale a meno che la policy non si sia stabilizzata.
   stato_corrente = prossimo_stato
   azione_corrente = prossima_azione
end

</code></pre>
<p>Ho implementato questo algoritmo in Processing.org ma a differenza del post precedente non posso visualizzarlo nel browser in quanto computazionalmente è troppo impegnativo; potere comunque scaricarlo <a href="http://github.com/sandropaganotti/processing.org-q-learning-td-lambda-">dal mio accounti di GitHub.</a></p>
<div id="attachment_122" class="wp-caption aligncenter" style="width: 260px"><img src="http://sandropaganotti.com/wp-content/uploads/2009/01/ishot-88.png" alt="Q-learning in processing.org" title="ishot-88" width="250" height="272" class="size-full wp-image-122" /><p class="wp-caption-text">Q-learning in processing.org</p></div>
<p>Ecco la spiegazione del programma: il quadrato arancio è lo stato terminale, e frutta al nostro agente +1 di ricompensa, i bordi invece quando colpiti fruttano -1 (quindi l&#8217;agente tenderà ad evitarli). Dopo qualche minuto dovreste cominciare a notare dei cambiamenti di colore sulla griglia, le celle con q negativo tendono a colorarsi di blu  mentre quelle con q positivo tendono ad un viola molto acceso.</p>
<p>L&#8217;agente è rappresentato da un quadrato verde e viene disegnato con un scia al seguito; tale scia rappresenta (e lo vedremo meglio la prossima volta) il modo in cui la variazione di q si distribuisce sulle scelte precedenti.</p>
<p>Se avete la pazienza di attendere 5-6 minuti dovreste scorgere con chiarezza una specie di &#8216;percorso più chiaro&#8217;, rappresentato da tutte quelle celle che hanno un q positivo, che parte dallo stato iniziale e guida l&#8217;agente verso quello terminale.</p>
<p><a href="http://github.com/sandropaganotti/processing.org-q-learning-td-lambda-">Scarica Q-learning con Processing.org dal mio account di GitHub</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/01/18/q-learning-con-processingorg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

