La ricerca classica prevede di individuare i documenti doc più rilevanti all'interno di un corpus D, relativamente ad una query q formata da parole o token w.
La misura di questa rilevanza nella sua forma più elementare può essere data dalla sommatoria della rilevanza di ogni singolo token della query rispetto ad uno specifico documento del corpus.
RelevanceScore(q,doc,D)=∑w∈QWeight(w,doc,D)
Vediamo alcune delle funzioni più utilizzate a tale riguardo:
Per un corpus di documenti D, per ogni parola w , per ogni documento doc, definiamo:
Term Frequency: TF(w,doc)=count(w,doc)|doc| indica la frequenza relativa di una parola w all'interno di un documento doc.
Document Frequency: df(w,D)=|{doc∈D:w∈doc}| indica la frequenza assoluta dei documenti che contengono w nel corpus D.
Inverse Document Frequency: IDF(w,D)=log(|D|df(w,D)) indica la frequenza inversa relativa dei documenti che contengono w nel corpus D, in termini di logaritmo. Quindi sarà massima se il termine compare in un solo documento e nulla se compare in tutti i documenti.
TF-IDF(w,doc,D)=TF(w,doc)⋅IDF(w,D)
è quindi una misura della rilevanza di un documento doc rispetto a un termine w , tenendo conto della frequenza del termine w all'interno del corpus D. Termini comuni nella gran parte dei documenti comporteranno un basso TF-IDF a prescindere dalla frequenza del termine nel singolo documento, mentre termini rari nel corpus e concentrati in pochi documenti, avranno un alto grado di significatività/specificità e quindi un elevato TF-IDF.
Più attuale evoluzione del TF-IDF, utilizzata nei più noti retrieval engine come ElasticSearch, prevede due componenti secondo logiche analoghe, sebbene più strutturate:
ScoreBM25(w,doc)=TF(w,doc)⋅(k+1)TF(w,doc)+k⋅(1−b+b|doc|avgdoclen)
analogo del semplice TF, presenta due parametri sui quali agire:
k (tipicamente k∼1.2) che mitiga l'effetto di un'alta frequenza del termine nel documento quando k tende a zero, facendo convergere la misura a 1.
b (tipicamente k∼0.75) che a parità di condizioni penalizza documenti più lunghi della media e premia documenti più corti della media.
IDFBM25(w,D)=log(1+|D|−df(w,D)+sdf(w,D)+s)
con s convenzionalmente pari a 0.5 è l'analogo del IDF, rispetto al quale presenta un effetto di maggiore smussamento specie per i casi estremi in cui df è nulla o si avvicina a |D|.
Anche in questo caso avremo BM25(w,doc,D)=ScoreBM25(w,doc)⋅IDFBM25(w,D)
Come valutare la bontà di un sistema di ricerca? Le metriche tradizionali sono orientate generalmente a valutare l'accuratezza nel restituire risultati effettivamente significativi, tuttavia mettiamo l'attenzione sul fatto che è sempre più necessario prendere in considerazione anche altre metriche, relative alla latenza, al throughput, ai FLOPs, all'utilizzo dei dischi e della memoria, al costo totale del sistema.
Il tipo di dati che normalmente abbiamo a disposizione per effettuare le valutazioni di accuratezza su di un ranking restituito dal sistema D=[doc1,…,docN], in riferimento a una query q e un insieme di N documenti D, può frequentemente essere quello di una semplice label (generata manualmente o anche in parte automaticamente) che ci dice se un documento è effettivamente rilevante per q oppure no. Raramente avremo un gold ranking di riferimento, dispendioso sia pure se incompleto.
Vediamo ora alcune metriche di accuratezza per valutare un ranking. Definiamo innanzitutto Rank(q,D) come la posizione del primo documento rilevante per la query q nel ranking D.
Successo: La metrica binaria Success@K(q,D)={1 se Rank(q,D)≤K0 altrimenti ci dice se il nostro ranking è almeno di rank K.
Rank reciproco: RR@K(q,D)={1Rank(q,D) se Rank(q,D)≤K0 altrimenti è una metrica più elaborata che può assumere valori compresi tra 1 (migliore) a 0 (peggiore). Nella pratica si utilizza la media su varie query per ottenere l'indicatore MRR@K.
Definendo invece Ret(D,K) come l'insieme dei documenti di D fino alla posizione K, e Rel(D,q) l'insieme dei documenti di D rilevanti per la query q, possiamo estendere le tradizionali metriche di accuratezza:
Precisione: Prec@K(q,D)=|Ret(D,K)∩Rel(D,q)|K
Richiamo: Rec@K(q,D)=|Ret(D,K)∩Rel(D,q)||Rel(D,q)|
E la più bilanciata precisione media AvgPrec(q,D)=∑|D|i=1{Prec@i(q,D)seRel(q,doci)0altrimenti|Rel(q,D)| , ovvero la media delle Precisioni calcolate in corrispondenza della posizione di ogni documento rilevante presente nel ranking.
Prendendo un Encoder quale BERT, si concatenano Query e Documenti, addestrandolo su documenti sia positivi che su insiemi di negativi, a partire quindi da una tupla ⟨qi,doc+i,{doc−i,k}⟩, per ottenere un classificatore che ne restituisca la rilevanza, secondo una funzione di costo di negative log-likelihood per ogni qi pari a −logeRep(qi,doc+i)eRep(qi,doc+i)+∑nj=1eRep(qi,doc−i,j) dove Rep(q,doc)=Dense(Enc([q;doc]N,0)) è l'output del classificatore a partire dalla rappresentazione finale sul primo token dell'encoder.
Il sistema è poco scalabile, in quanto a prescindere dal training, ogni verifica richiederà |D| forward pass sull'encoder per ogni ricerca.
Rispetto al modello precedente abbiamo 2 encoder, uno per le query ed uno per i documenti, anche in questo caso da addestrare su documenti sia positivi che su set di negativi, a partire quindi da una tupla ⟨qi,doc+i,{doc−i,k}⟩, in base ad una funzione di costo di negative log-likelihood per ogni qi pari a −logeSim(qi,doc+i)eSim(qi,doc+i)+∑nj=1eSim(qi,doc−i,j) dove Sim(q,doc)=(EncQ(q)N,0))⊤(EncD(doc)N,0)) è una semplice funzione di similitudine, quale è il prodotto scalare, tra le rappresentazioni finali ricavate dal primo token degli encoder.
Il sistema è scalabile in quanto è possibile generare in anticipo tutti gli EncD , anche se l'interazione tra q è doc è limitata a quelle delle 2 singole rappresentazioni.
ColBERT
Questa ulteriore evoluzione del modello vede l'utilizzo di 2 encoder come per il precedente DPR, ma utilizzando le rappresentazioni finali di tutti i token sia della query che del documento, calcolando quindi una matrice dei relativi prodotti scalari e individuando per ogni token della query (riga) il corrispondente massimo del prodotto scalare con un token del documento (colonna). La somma di questi massimi ci fornirà quindi la nostra misura MaxSim(q,doc)=L∑iMmaxj Enc(q)N,i⊤ Enc(doc)N,j da utilizzare in modo analogo ai 2 casi precedenti ai fini del training.
Il vantaggio ulteriore introdotto da questo modello è un'elevata interazione contestuale attraverso l'allineamento tra le componenti di query e documento.
Un modello come ColBERT può essere utilizzato anche in un contesto ibrido, ad esempio come Reranker su di un set di document già ricavati attraverso un modello di ricerca classica, oppure attraverso la similitudine tra vettori delle rappresentazioni dei token delle query con quelle dei token dei documenti - in questo ultimo caso anche attraverso l'uso di centroidi ricavati tramite algoritmi di clustering (k-means) sui token dei documenti.
SPLADE
Questo modello si distacca dai precedenti e mira a costruire una misura mettendo in relazione gli embedding dei token dell'intero dizionario, con le rappresentazioni dei token ricavate dall'ultimo layer di un unico encoder.
In particolare si costruisce una matrice tra le M rappresentazioni t1⋯tM in uscita dall'encoder, e i |V| embedding del dizionario w1⋯w|V| , e si ricavano gli elementi sij=transform(Enc(t)N,i⊤Emb(wj)+bj) dove la trasformazione non è un mero prodotto scalare ma avviene tramite la trasformazione transform(x)=LayerNorm(GeLU(xW+b)) .
Dagli sij ricaviamo per ogni elemento del dizionario le |V| componenti del vettore SPLADE(t,wj)=∑Milog(1+ReLU(sij)) che andrà a rappresentare il contesto esteso del documento.
La misura di similitudine tra due documenti sarà il prodotto scalare tra i relativi vettori SPLADE, quindi SimSPLADE(q,doc)=SPLADE(q)⊤SPLADE(doc) e su questa andremo ad addestrare la nostra rete con le modalità già vista e la funzione di costo di negative log-likelihood più una componente di regolarizzazione per bilanciare la sparsità delle componenti (lavoriamo con vettori di cardinalità |V|).
La traduzione automatica è storicamente il compito "principe" del Natural Language Processing, e probabilmente quello più impattato dall'applicazione delle reti neurali e del deep learning al NLP, permettendo il passaggio da sistemi estremamente complessi e strutturati a modelli end-to-end di Neural Machine Translation essenziali e performanti.
Il punto di svolta si ha nel 2014 con la presentazione del modello sequence-to-sequence[1] , basato su una RNN di encoding che riceve in input gli embedding delle parole del testo da tradurre nella lingua di origine e il cui stato finale, rappresentazione dell’intero significato del testo, va ad inizializzare una RNN di decoding che produce in output di ogni cella RNN una distribuzione di probabilità sul dizionario della lingua di destinazione; la parola opportunamente scelta può essere passata come embedding in input alla cella successiva, sino al completamento della frase, dato dalla predizione del token <END>.
Una prima variante con performance generalmente superiori, in grado di cogliere il significato di costrutti e relazioni più articolate tipiche del linguaggio, prevede di utilizzare un encoder costituito da una RNN bidirezionale (BRNN) come quello della figura successiva, il cui stato finale da passare al decoder (che rimane ovviamente monodirezionale) può essere assunto come la concatenazione [→h(T),←h(T)] degli stati finali delle singole RNN dell'encoder nelle due direzioni.
L’addestramento del Seq2Seq viene realizzato sulla funzione di costo data dalla media delle Cross Entropy tra la predizione di ogni cella del decoder e il vettore one-hot della parola successiva attesa. Tuttavia anziché dare in input alla successiva cella del decoder la predizione ottenuta dalla cella precedente, in fase di addestramento viene “forzata” la parola effettivamente presente nella traduzione, utilizzando l'approccio di c.d. teacher forcing che agevola sensibilmente la convergenza del modello.
In fase di predizione invece ogni cella del decoder produce in output una distribuzione di probabilità ˆy sulle |V| parole del dizionario di destinazione. Come scegliere la parola da utilizzare nella traduzione?
La strategia più intuitiva e immediata per predire la relativa parola è quella della Greedy Search, ovvero selezionare la parola alla quale corrisponde la massima probabilità nella distribuzione.
Risulta tuttavia un approccio generalmente poco efficace per individuare la traduzione y che massimizza la complessiva P(y|x); ricodiamo difatti che la parola individuata come output della cella costituisce l’input della cella successiva e ne condiziona l’output, per cui abbiamo che la probabilità da massimizzare effettivamente è P(y|x)=∏Tt=1P(yt|y1,…,yt−1,x) .
Un approccio che generalizza la Greedy Search, è quella della Random Search.
In questo caso viene effettuato un campionamento pseudocasuale sulla distribuzione di probabilità ˆy con un parametro di temperatura T compreso tra 0 e 1; per T=0 abbiamo un argmaxiˆyi corrispondente a una Greedy Search , mentre per T=1 un campionamento prettamente casuale sulla distribuzione. Anche per la Random Search valgono le considerazioni sulla limitata efficacia per individuare la migliore traduzione.
Una strategia utilizzata per il decoding di buona efficacia è la Beam Search[2], nella quale ad ogni passo di decoding si tiene traccia delle k traduzioni parziali con maggiore probabilità (per k=1 ritroviamo quindi una semplice Greedy Search). Vediamo in esempio una Beam Search con k=2 nel quale sono evidenziale le probabilità logaritmiche delle traduzioni parziali.
Quando si genera un token di <END> l’ipotesi di traduzione si dice completa; solitamente si prosegue la beam search sino ad ottenere n ipotesi complete o al raggiungimento di una lunghezza massima T dell’ipotesi, selezionando infine la traduzione con la maggiore probabilità normalizzata rispetto alla lunghezza, in modo da non penalizzare traduzioni più lunghe.
Un'altra strategia di decoding frequentemente utilizzata e di discreta efficacia si basa sull’approccio statistico di Minimum Bayes Risk[3]: si procede alla generazione di n traduzioni candidate attraverso un campionamento con Random Search. Successivamente per ciascuna traduzione candidata si procede a calcolarne la similarità rispetto a tutte le altre traduzioni candidate, utilizzando una opportuna metrica come ROUGE-N o l’indice di Jaccard. Viene infine selezionata la traduzione che risulta più simile rispetto a tutte le altre.
Il limite più evidente del modello Seq2Seq è il fatto che l’intera informazione estrapolata dal testo da tradurre è concentrata nello stato finale dell'encoder. Questa sintesi in una unica grandezza costituisce il più rilevante collo di bottiglia del sistema, specie per testi lunghi.
Inoltre, sebbene le celle RNN di tipo LSTM e GRU mitighino gli effetti del problema, anche le reti ricorrenti sono soggette al fenomeno della scomparsa del gradiente, con la conseguenza che le ultime parole trattate dall’encoder tendono ad assumere forte rilevanza, tanto che negli encoder con RNN monodirezionale è frequente predisporre il testo in input all’encoder in senso inverso per alimentare il decoder con uno stato più efficace sull'incipit della traduzione.
Risulta quindi chiaro che le performance del modello Seq2Seq concepito originariamente degradano progressivamente con l’aumentare della lunghezza del testo da tradurre. Per risolvere tale problema sarà necessario, come vedremo in seguito, introdurre un c.d. meccanismo di attention in grado di alimentare in modo selettivo ogni cella del decoder con una opportuna combinazione degli stati dell'encoder.
[1] I. Sutskever, O. Vinyals, & Q.V. Le, 2014, Sequence to sequence learning with neural networks, arXiv preprint arXiv:1409.3215.
[2] C. Manning, 02/02/2021, Machine Translation, Sequence-to-Sequence and Attention, in CS224n: NLP with Deep Learning, Stanford University, ultimo accesso: 04/05/2021, http://web.stanford.edu/class/cs224n/slides/cs224n-2021-lecture07-nmt.pdf , pp.31-46
[3] S.Kumar & W.J. Byrne, 2004, Minimum Bayes-risk decoding for statistical machine translation, in Proceedings of the Human Language Technology Conference of the North American Chapter of the Association for Computational Linguistics (HLT-NAACL'04), Omnipress, pp. 169-176