Immaginate di trovarvi in una stanza, da soli.

Vi guardate intorno. La stanza non ha porte o finestre, solo una fessura in una delle pareti e scaffali colmi di libri e tomi. Sono pieni di numerosi strani simboli e contengono istruzioni in inglese su come convertirli in nuovi simboli altrettanto strani.

A un certo punto cade un pezzo di carta dalla fessura. Contiene una serie di simboli che non capite, simili a quelli trovati nei libri. Sfogliate tutte le pagine dei libri finché non trovate i caratteri corrispondenti, quindi seguite le istruzioni che vi dicono cosa scrivere sotto il messaggio originale e rimettete il pezzo di carta nella fessura.

Non si tratta di simboli senza significato scarabocchiati su un pezzo di carta. Dall’altro lato della stanza ci sono madrelingua cinesi che hanno appena ricevuto una risposta perfetta alla loro domanda. Giungono alla naturale conclusione che ci sia un madrelingua cinese nell’altra stanza. Solo noi sappiamo che non è così.

È la Stanza cinese, un controverso esperimento proposto nel 1980, dal filosofo John Searle. Nell’esperimento, i libri non sono dizionari cinese-inglese, poiché non spiegano mai il significato dei simboli. Danno semplicemente istruzioni su come prendere un input, manipolare i caratteri in base alle loro relazioni e fornire un output. I libri svolgono lo stesso compito di un programma informatico.

Searle affermava che il test di Turing non fosse un test affidabile per l’intelligenza artificiale. Qualsiasi programma IA efficace sarebbe in grado di apprendere le regole alla base di una determinata lingua e dare l’illusione che riesca a comprenderla come lo farebbe un madrelingua.

Queste interazioni tra computer e lingue umane assumono un’importanza centrale nel campo dell’elaborazione del linguaggio naturale, o NLP (dall’inglese Natural Language Processing).  Riconoscimento vocale, sintesi del testo, analisi del sentiment, traduzione automatica: l’NLP è ovunque. E dagli anni ’80 ha subito notevoli miglioramenti. Sebbene la traduzione automatica non abbia ancora raggiunto un livello del tutto accettabile, abbiamo fatto molti progressi dai tempi di Babelfish. Noi — e in particolare io, una monolingue americana che vive a Lisbona — accediamo a traduzioni veloci e abbastanza precise come se nulla fosse.  

Vi siete mai chiesti come i programmi informatici siano in grado di elaborare le parole?

Dopotutto, anche le frasi più semplici possono essere molto semantiche, ricche di connotazioni e sfumature grammaticali che solo i madrelingua riescono subito a comprendere. Prendiamo ad esempio la seguente frase: “Yesterday, I went to the bank and ran into my friend” (“Ieri sono andato in banca e ho incrociato il mio amico”). Un computer come lo tradurrebbe in francese? Il modo più rozzo, forse, sarebbe quello di sostituire ogni parola usando un dizionario bilingue. Probabilmente avremmo una traduzione di questo tipo: “Hier, je allé à le banque et couru dans mon ami”. Tanto per iniziare, ci sono problemi di coniugazione dei verbi e di concordanza di genere tra articolo e sostantivo (“le banque” dovrebbe essere “la banque”). Ma se davvero volessimo tradurre in questo modo, potremmo definire una serie di regole che risolverebbero questi pasticci grammaticali. Dopo averle applicate, potremmo avere la seguente traduzione: “Hier, je suis allé à la banque et j’ai couru dans mon ami”. È senza dubbio migliorata, ma in questa versione continuo a “scontrarmi” fisicamente con il mio amico.

Al momento di scrivere questo articolo, Google Traduttore — che non è propriamente noto per le traduzioni perfette — la traduce in: “Hier, je suis allé à la banque et suis tombé sur mon ami”. Traduce correttamente l’espressione idiomatica di incontrare qualcuno per caso. Questa traduzione non può consistere in una semplice sostituzione di parole.

Quindi cosa è accaduto? In primo luogo dobbiamo considerare il modo in cui gli umani imparano a risolvere le ambiguità verbali. Quando da bambini assistiamo a un numero sufficiente di esempi, iniziamo ad assegnare un valore semantico alle parole e isoliamo ed elaboriamo questi valori semantici da determinate combinazioni di parole. Per farla più semplice, senza un insegnamento esplicito possiamo capire il significato delle parole e il modo in cui sono influenzate dal rispettivo contesto. Tornando al suddetto esempio dall’inglese al francese, il nostro primo istinto è quello di pensare che abbiamo incontrato il nostro amico, non che ci siamo scontrati fisicamente con lui. Abbiamo esperienze del mondo fisico e una vita di input linguistici che ci aiutano a contestualizzare.

Quale significato hanno le parole e le frasi per un computer, che è in grado di comprendere solo zero e uno?

Benché i computer non possano davvero “comprendere” la lingua a livello umano, addestrarli per produrre informazioni utili a partire da un testo non è poi così diverso dalla nostra esperienza di apprendimento della lingua. Basta mostrare un numero sufficiente di esempi a un computer e quest’ultimo inizierà a riconoscere gli schemi. Ma cosa può sostituire la comprensione umana? I word embedding, l’unità fondamentale di ogni processo di elaborazione del linguaggio naturale.

Un word embedding è essenzialmente una sequenza di numeri — un vettore — che conserva informazioni sul significato della parola.

La creazione dei word embedding può avere due obiettivi: migliorare gli altri processi NLP, come la traduzione automatica, o analizzare le somiglianze tra parole e gruppi di parole.

In seguito a diverse innovazioni nei metodi di word embedding, il 2018 è stato considerato l’anno d’oro dell’NLP. Questi nuovi metodi hanno apportato notevoli miglioramenti alla nostra capacità di modellare il linguaggio, che dovrebbero presto concretizzarsi nei prodotti di consumo e nelle aziende.

Analizziamo un semplice esempio per avere un’idea di cosa sia un word embedding.

Supponiamo di voler creare dei word embedding bidimensionali (ovvero ogni parola è rappresentata da una serie di due numeri) per determinati animali: ippopotamo, serpente, farfalla e ornitorinco. Inoltre supponiamo che le due dimensioni rappresentino due caratteristiche che gli animali possono più o meno presentare: “pericolosità” e “pelosità”.

Ecco degli esempi di word embedding per questi animali:

AnimalePericolosoPeloso
Ippopotamo0.850.13
Serpente0.88-0.97
Farfalla-0.91-0.86
Ornitorinco0.610.79

Nell’esempio, “ippopotamo” è associato al vettore [0.85, 0.13], il serpente a [0.88, -0.97] e così via. Ora abbiamo una rappresentazione numerica, seppur molto semplificata, di ciascuno di questi animali in relazione alle due caratteristiche. Su questi vettori è possibile eseguire ogni tipo di operazione matematica che permette di ricavare nuove informazioni.

Un esempio citato di frequente che evidenza l’efficacia delle operazioni sui word embedding è: reuomo + donna = regina. In questo diagramma, si può dire che le frecce blu rappresentino il genere e le frecce arancioni la regalità.

Una di queste operazioni è il confronto. Quanto è simile una parola all’altra? Nell’esempio con gli animali, possiamo immaginare la rappresentazione numerica di “ippopotamo”, “serpente”, “farfalla” e “ornitorinco” in un grafico 2D come una linea che parte dall’origine e attraversa i punti indicati dai numeri. La somiglianza di queste parole può quindi essere determinata dall’angolo tra i loro vettori (chiamiamo questa somiglianza “coseno“). Sostanzialmente, le parole separate da un angolo di 90° non hanno alcuna relazione semantica, mentre quelle separate da un angolo di 180° sono esatte opposte.

In questo esempio, la distanza tra ippopotamo e ornitorinco è di circa 16°, mentre la distanza tra ippopotamo e farfalla è di 104°.

Ovviamente si tratta solo di un esempio divertente e ipotetico, che si limita a evidenziare cosa sono i word embedding e ad accennarne l’utilità. All’atto pratico vengono utilizzati vettori con ben più dimensioni (tipicamente centinaia); provare ad assegnare campi semantici come “pericoloso” e “peloso” a queste dimensioni sarebbe difficoltoso e scorretto, poiché l’algoritmo non conosce davvero il significato delle parole. Inoltre sono necessari dei corpora molto grandi, nell’ordine di decine di milioni di parole, per “apprendere” word embedding adeguati.

Ma prima dobbiamo fare un rapido cenno a un campo della linguistica chiamato semantica distributiva.

I word embedding colgono in modo efficace il concetto di “ipotesi distributiva”, adeguatamente riassunto dal linguista britannico John Rupert Firth nel suo scritto del 1957, A synopsis of linguistic theory:

“Conoscerai una parola dalla compagnia che frequenta.”

Il campo della semantica distributiva ipotizza che parole e frasi che si trovano in contesti simili — ovvero distribuzioni simili — abbiano significati simili.

Ad esempio, supponiamo di avere un corpus di più frasi:

  • Accarezzò il cane peloso.
  • Accarezzò il gatto peloso.
  • Giocò a riporto con il cane.

Per un umano, è subito evidente che gatti e cani sono correlati (entrambi animali domestici), così come “accarezzare” e “giocare a riporto” (entrambe attività relative all’animale domestico). Inoltre risulta subito evidente come non sia possibile giocare a riporto con il gatto, per quanto uno ci possa provare!

I metodi di word embedding computazionali traggono vantaggio da questa idea: il contesto di una parola ci aiuta a capire il suo significato se l’abbiamo vista in un numero sufficiente e vario di esempi.

Infine arriviamo ai veri e propri algoritmi per il calcolo dei word embedding, come Word2Vec, introdotto da Tomas Mikolov e dai suoi colleghi ricercatori di Google nel 2013. L’idea principale alla base dell’algoritmo è quella di prevedere, per ogni parola data, i termini vicini, usando molto testo come dati di training.

Torniamo a una leggera variazione della nostra frase iniziale: “Yesterday, I went to the bank and I read the newspaper” (“Ieri sono andato in banca e ho letto il giornale”).

Con Word2Vec, definiremo prima una finestra contestuale di parole, diciamo due. Quindi, per ogni parola presente nei nostri dati di training, guarderemo le due parole che la precedono e quelle che la seguono e creeremo degli abbinamenti con la parola in questione e con ciascuna delle quattro parole contestuali. La parola centrale è l’input e la parola contestuale è l’output, per cui utilizzeremo la parola in input per prevedere la parola in output.

Ad esempio, se la parola centrale è “bank”, gli abbinamenti saranno: (bank, to), (bank, the), (bank, and) e (bank, I).

La creazione degli abbinamenti viene ripetuta per ogni parola nella frase; utilizzare la parola in input per prevedere quella in output di ciascun abbinamento è ciò che alla fine produce i word embedding.

Se pensiamo che abbiamo a disposizione milioni di righe di testo, gli abbinamenti più comuni saranno più frequenti in tali esempi, per cui le probabilità che il modello apprenda queste combinazioni sono maggiori. Anche nella suddetta frase possiamo vedere che (bank, the)/(newspaper, the) e (went, I)/(read, I) sono abbinamenti simili, in quanto seguono rispettivamente i paradigmi sostantivo-articolo e pronome personale-verbo.

Il passo successivo è quello di trasformare queste parole in vettori distributivi, come nell’esempio con gli animali, dove i numeri hanno un significato in relazione l’uno con l’altro.

A tal scopo, analizziamo ogni abbinamento di training che abbiamo creato e applichiamo la seguente procedura. Per prima cosa inizializziamo l’embedding della parola in input come un vettore di numeri casuali. Dopodiché viene applicata al vettore una serie di funzioni matematiche. Il risultato di queste operazioni è un altro vettore che a sua volta rappresenta una parola, che vogliamo sia la parola in output del nostro abbinamento di training. Se la parola prevista non è quella in output, modifichiamo leggermente i numeri del word embedding in input in modo che le operazioni producano un risultato più vicino al vettore della parola in output.

In questo esempio, il nostro abbinamento di training è (bank, the). Dopo aver applicato le funzioni di output al word embedding per “bank” (in arancione), guardiamo al vettore della parola prevista (verde) per vedere se corrisponde alla parola attesa “the”. Infine modifichiamo l’embedding arancione di “bank” in modo che il vettore previsto di colore verde sia più vicino a “the”.

Aggiorniamo questi word embedding per massimizzare la probabilità che, data una parola in input, quella prodotta in output appaia spesso come parola contestuale nei dati. Parole simili avranno contesti simili e quindi word embedding simili.

Per evidenziare la solidità di questi modelli, ecco alcuni esempi tratti da pubblicazioni originali in cui si introduce Word2Vec.

RelazioneEsempio 1Esempio 2Esempio 3
Francia: ParigiItalia: RomaGiappone: TokyoFlorida: Tallahassee
Einstein: scienziatoMessi: centrocampistaMozart: violinistaPicasso: pittore
Microsoft: BallmerGoogle: YahooIBM: McNealyApple: Jobs

Nota: come si può vedere, la precisione è discreta, anche se vi è chiaramente un ampio margine di miglioramento.

Tramite i word embedding, possiamo chiedere al modello di effettuare analogie come “La Francia sta a Parigi come l’Italia sta a ___?”. Il computer non è ancora in grado di comprendere, ma è come se sapesse che Roma è la capitale d’Italia e Picasso era un pittore. Sulla base dell’ipotesi distributiva, il nome “Steve Jobs” verrebbe tradotto in “Steve Jobs” in un articolo di tecnologia, ma “jobs” diventerebbe “emplois” in un rapporto economico. Rileverebbe che non ho placcato il mio amico a terra, ma che l’ho semplicemente incontrato in banca.

Utilizzando questo tipo di tecnica di word embedding, sono emersi risultati sorprendenti su diversi processi, come l’analisi del sentiment, la produzione di testi e soprattutto la traduzione automatica di Unbabel.

Tuttavia il problema linguistico dell’IA non è stato risolto e passerà ancora molto tempo prima che i computer riescano a comprendere davvero il linguaggio naturale. Dopotutto il linguaggio è un’attività intrinsecamente umana, che contraddistingue la nostra intelligenza. Occorre saper astrarre, associare e interagire con il mondo fisico che ci circonda, e magari anche un pizzico di ingegno umano, qualcosa che noi abbiamo in abbondanza, ma che all’IA manca.

Quando si tratta di puntare a macchine davvero intelligenti, è difficile immaginare un sistema di IA complesso che non abbia la lingua nella sua essenza. Tuttavia, al contrario di ciò che vogliono far credere alcune aziende e titoli di giornale, non si tratta di un futuro prossimo.

Fonti:

Herbelot, A. Distributional semantics: a light introduction. https://aurelieherbelot.net/research/distributional-semantics-intro/

McCormick, C. (19 aprile 2016). Word2Vec Tutorial – The Skip-Gram Model. Estratto da http://www.mccormickml.com

Mikolov, T. et al. Efficient Estimation of Word Representations in Vector Space. 2013. https://arxiv.org/pdf/1301.3781.pdf., Mikolov, T. et al. Distributed Representations of Words and Phrases and their Compositionality. 2013. https://arxiv.org/pdf/1301.3781.pdf.