Quando un algoritmo non è...
RSS • Permalink • Created 25 Apr 2016 • Written by Alberto Pettarin
Questo post è la traduzione in italiano di questo pezzo divulgativo di Suresh Venkatasubramanian, Professore di Informatica presso l'Università dello Utah, USA. Suresh si occupa soprattutto di algoritmi e geometria computazionale, e in particolare di algoritmi per grandi moli di dati, algoritmi per problemi multidimensionali, e di algorithmic fairness (NdT: vagamente traducibile come "algoritmi equi").
Lo scopo di questa traduzione è introdurre il lettore che non mastica bene l'inglese ad un paio di concetti interessanti che riguardano l'uso (e l'abuso) delle parole "algoritmo" e "intelligenza artificiale", soprattutto da parte dei mass media.
Naturalmente il lettore avvezzo a leggere in lingua inglese è invitato a leggere il post originale; è sufficiente una padronanza basilare dell'inglese: il testo originale non presenta tecnicismi.
Nel tradurre si è cercato di utilizzare il più possibile la lingua italiana, eccetto nel caso di termini tecnici inglesi comunemente utilizzati anche in italiano.
Quando un algoritmo non è... (di Suresh Venkatasubramanian)
Recentemente la stampa generalista propone sempre più articoli che parlano di "algoritmi", "algorithm fairness", e "algoritmi che discriminano". Come informatico (e, in particolare, come ricercatore che si occupa di algoritmi), trovo quest'attenzione piuttosto gratificante, e nient'affatto fastidiosa.
Ancor più piacevole è il fatto che la definizione che viene data di algoritmo ricalca la definizione che usiamo praticamente da sempre:
Un algoritmo è un elenco che consiste in un numero finito di passi (istruzioni), dove ciascun passo è semplice e ben definito.
Se vogliamo una versione un po' meno ostica di algoritmo, traiamo ispirazione dalla cucina:
Un algoritmo è come una ricetta. Richiede degli input (gli ingredienti), consiste di un elenco di passi semplici e (sperabilmente) ben definiti, e termina dopo aver prodotto un output (il piatto cucinato).
Ho utilizzato questa analogia culinaria più e più volte, quando ho dovuto spiegare che cosa fosse un algoritmo: ai miei parenti digiuni di tecnologia, a persone comuni semplicemente curiose del mio lavoro, e agli studenti che vengono alle mie lezioni e mi chiedono cosa siano gli algoritmi.
E funziona! Cattura infatti ciò che è importante (la serie di istruzioni ben definite) e ignora dettagli irrilevanti (in che linguaggio sono scritte tali istruzioni, che tipo di computer le esegue, eccetera). Inoltre, è un'analogia di successo, perché è arrivata nella cultura di massa come spiegazione di cosa siano gli algoritmi e il software.
C'è però un problema: è un'analogia dannatamente sbagliata, almeno quando si tratta di capire lo strabiliante universo di algoritmi che collettivamente chiamiamo "machine learning" (NdT: apprendimento automatico) o "deep learning" (NdT: apprendimento profondo) o "big AI" (NdT: intelligenza artificiale profonda): tutti algoritmi che oramai approdano sui mass media ogni giorno.
Per capire come mai questa comune concezione di algoritmo non vada bene per il machine learning, facciamo un esempio con una vera ricetta di cucina.
Io (o, almeno, i miei antenati) sono originario del sud dell'India, e se mai hai mangiato del cibo indiano, avrai sicuramente assaggiato un sambar, un caposaldo della cucina dell'India meridionale, che essenzialmente consiste in una zuppa piccante.
Questa è la ricetta di mia madre per il sambar:
Ingredienti:
- Piselli secchi (1/2 tazza)
- Tamarindo (1 pezzetto da 1/2 pollice)
- Curcuma (1 cucchiaio)
- Sambar masala (spezia) (1 cucchiaio)
- Verdure a piacere, tagliate a tocchetti (1/2 tazza)
- Sale, senape, cumino q.b.
Preparazione
- Cuocere i piselli, le verdure, il tamarindo, un pizzico di sale e il sambar masala.
- Cuocere in una pentola a pressione i piselli e la curcuma (gli altri ingredienti a parte).
- Togliere il tamarindo e stillarne il succo.
- Unire tutti gli ingredienti e portare a bollore.
- Scaldare un po' d'olio in una padella, aggiungere 1/4 di cucchiaio di senape e cumino, e quindi unire il sambar quando fischia.
Questa ricetta ha un insieme di ingredienti e produce un piatto finale. Ciascuna istruzione è (relativamente) ben definita, e il programmatore attento può persino riconoscervi un costrutto condizionale (se succede questo, allora fai questa cosa).
Ancor più importante, con questa ricetta posso prepare del sambar ogni volta che voglio. Se qualcuno mi chiede come lo prepari, posso spiegarne la procedura di preparazione. E se il gusto risultante fosse insolito, potrei riesaminarne gli ingredienti per capirne il motivo.
Immaginiamo per un momento che io abbia perduto la mia ricetta per il sambar, e debba prepararlo per una festa, e non possa telefonare a mia madre a causa della terribile differenza di fuso orario tra l'India e gli USA. O magari io voglia semplicemente imparare da solo la mia ricetta per il sambar a modo mio.
Mi ricordo vagamente la lista degli ingredienti. Scrivo su un foglietto spiegazzato sulla tavola della cucina:
- Tamarindo
- (illeggibile) masala
- Cumino
- Piselli
- Patate? Pomodoro? Moringa? (NdT: nell'originale inglese: potato/tomato/moringa)
So che devono essere uniti in qualche modo, ma come? Come scienziato, decido di fare un esperimento. Stabilisco vari modi di combinare questi ingredienti in quello che io penso sia un sambar, sfruttando il vago ricordo che ho delle quantità e della procedura originali. Procedo quindi a produrre piccole quantità (nano-sambar!), una per ciascuna differente "ricetta sperimentale", e le faccio provare ai miei amici man mano che arrivano alla festa.
Grida di orrore! Sputacchi schifati! A volte, complimenti biascicati! Alla fine della festa ho un'idea abbastanza precisa di quali ricette sembrano funzionare e quali invece non vanno bene per niente. Alcuni miei amici mi hanno pure portato dei campioni di autentico sambar affinché possa provarlo e migliorare la mia ricetta.
Quindi faccio nuovi esperimenti secondo la stessa modalità. (Ho degli amici molto pazienti e desiderosi di mangiare buon sambar.)
Ripeto l'esperimento.
Ripeto l'esperimento, ancora e ancora.
Alla fine, ottengo una ricetta che produce un sambar decente. Per qualche motivo, devo fare due giravolte su me stesso mentre tengo in mano i piselli e l'acqua di cottura prima di mettere tutto sui fornelli, e il sale deve essere dosato usando un cucchiaio di plastica e non di metallo, ma che importa? Il gusto del sambar risultante è ottimo!
Ma c'e' un problema. Immagina ora che esistano tre miei sosia, uno a Tokyo, uno ad Aarhus, e uno a Rio de Janeiro. Immagina che tutti e tre stiano cercando la ricetta del sambar per i propri amici. Riusciremo noi quattro a produrre la medesima ricetta? Compresi i dettagli come la giravolta prima di mettere a scaldare?
Non credo.
Eppure è così che funziona un algoritmo di apprendimento (NdT: "learning algorithm"). Non è una ricetta. È una procedura per costruire una ricetta. È come un giro di roulette, con una ruota a 50 dimensioni, dove la pallina atterra su una particolare casella (una ricetta) solamente in base a come la ruota è stata costruita, quali esempi ha visto, e quanto tempo è stato concesso affinché imparasse dagli esempi. Ogni volta la pallina finisce su una ricetta accettabile, ma queste ricette alternative possono essere incredibilmente differenti, e spesso chi le deve adoperare non riesce a capirne il motivo.
Certo, possiamo "dare un'occhiata al codice" che le ha generate, ma spesso ciò che vi vediamo è una misteriosa alchimia in cui ogni passo è comprensibile individualmente, ma qualunque spiegazione del perché il codice produca una particolare ricetta richiede la comprensione di come si sia evoluto e di quali "esperienze" abbia vissuto mentre veniva "allenato". E, persino allora, non sempre è semplice spiegare perché l'algoritmo "fa quello che fa". Se non ci credi, prova a trovare una spiegazione a quello che certe reti neurali possono generare.
Trascorro le mie giornate facendo ricerca e spiegando cosa sia l'algorithmic fairness e quando gli algoritmi possano "discriminare". La maggior parte delle reazioni che ricevo consiste in osservazioni come "Ma gli algoritmi sono solo codice! Fanno quello che tu ordini loro!". Queste reazioni mi suggeriscono che esiste un fondamentale scollamento tra come la gente pensa agli algoritmi di learning e come gli algoritmi di learning effettivamente lavorano. Questo scollamento è ciò che mi ha spinto a scrivere questo post.
Quanto dissi a braccio in un'intervista tempo fa mi appare sempre più vero ogni volta che ci ripenso:
Stiamo cercando di progettare algoritmi che mimano quello che gli esseri umani possono fare. In questo modo, progettiamo algoritmi che hanno le stesse zone d'ombra, le stesse esperienze uniche, e gli stessi comportamenti insondabili che noi esseri umani esibiamo. Non possiamo semplicemente "dare un'occhiata al codice degli algoritmi", non più di quanto possiamo dare un'occhiata al nostro stesso "codice".