Paithon Book Paithon Book
Esegui il codice

Quattro modi di fabbricare il segnale#

I nomi in circolazione sono decine e sembrano tutti diversi. Se si guarda che cosa fanno invece di come si chiamano, i metodi auto-supervisionati rispondono tutti alla stessa domanda, e la domanda nasce da una difficoltà sola.

Il pretesto, come l’ha definito l’apertura del capitolo, è un compito la cui risposta sta già nei dati. Ma un compito costruito così ha un difetto di fabbrica: quasi sempre ammette una soluzione banale, che lo vince senza aver capito niente. Prendiamo due viste della stessa foto, cioè due versioni trasformate della stessa immagine (un ritaglio e un altro, oppure la stessa scena con i colori spostati), e chiediamo che le loro rappresentazioni coincidano. La soluzione banale è dare a tutte le foto la stessa rappresentazione: l’accordo è perfetto, la perdita è nulla, e il modello non ha guardato niente. Questa soluzione costante, la risposta vuota, si chiama collasso, ed è il guasto che i modelli a energia hanno già incontrato: un’energia bassa dappertutto, che dà ragione a ogni coppia.

Quindi la domanda vera non è «quale pretesto». È: che cosa impedisce la risposta vuota. Le quattro famiglie sono quattro risposte a questa domanda, e messe in fila si ricordano molto meglio di quattro elenchi di sigle.

La prima: respingere#

Al modello si dà una delle due viste. L’altra, il suo gemello, viene nascosta in mezzo a una folla di viste prese da foto tutte diverse, i rivali, e il compito è ritrovarla; nel gergo il gemello è il positivo e i rivali sono i negativi, le coppie sbagliate da respingere. Non si chiede soltanto di avvicinarsi al gemello, quindi, ma anche di allontanarsi dai rivali, e la risposta vuota diventa impossibile per costruzione: se tutte le foto hanno la stessa rappresentazione, il gemello non si distingue da nessun rivale, e la perdita sale al valore che avrebbe tirando a caso fra i \(K\) candidati, cioè \(\log K\).

È la famiglia contrastiva, già percorsa per intero in Imparare a vedere senza etichette: la ricetta di base, il costo dei rivali, e la coda di rivali già elaborati che permette di averne molti senza doverli calcolare tutti insieme. Qui interessa solo il posto che occupa nello schema: il collasso lo impedisce una forza che allontana.

Il prezzo di questa famiglia sono i rivali: perché la perdita dica qualcosa ne servono migliaia, e costano. È quel prezzo che ha spinto la seconda e la terza famiglia a cercare un’altra strada. La quarta, quella che ricostruisce il pezzo coperto, ha un’origine indipendente: sul testo, con BERT, esisteva dal 2018, prima delle altre due.

La seconda: rendere le due reti diverse#

Si tolgono i rivali, e al loro posto si mettono due reti con ruoli diversi, che la letteratura chiama studente e insegnante. Guardano due viste della stessa foto, e lo studente deve indovinare che cosa produce l’insegnante. Niente allontana più niente; a impedire il collasso è che le due reti non sono intercambiabili. Solo lo studente si corregge: la correzione, cioè il gradiente della perdita, scorre lungo un ramo solo, mentre l’insegnante resta fermo per quel passo (in gergo, stop-gradient). Come si rompa la simmetria cambia da metodo a metodo. In BYOL l’insegnante è una copia lenta dello studente, i cui pesi inseguono quelli dello studente con una media mobile, e solo lo studente ha una testa di predizione, un passaggio in più prima del confronto. In SimSiam le due reti hanno gli stessi pesi, e servono insieme la testa di predizione su un ramo e lo stop-gradient sull’altro: tolta l’una o l’altro, il modello collassa. In DINO le architetture sono identiche, e servono la copia lenta e due ritocchi all’uscita dell’insegnante: la centratura, che sottrae la risposta media e gli impedisce di dire sempre la stessa cosa, e l’affilatura, che rende la risposta più netta e gli impedisce di dire un po” di tutto.

È la famiglia della distillazione, perché una rete impara da quello che dice l’altra, e anche questa è già stata percorsa in Imparare a vedere senza etichette, con le formule di BYOL e la scena dell’allievo e dell’insegnante. Qui basta il posto nello schema: il collasso lo impedisce un’asimmetria, cioè una differenza costruttiva fra i due rami.

Ed è un posto diverso da quello delle altre tre famiglie, perché qui la perdita non vieta niente. In BYOL e in SimSiam la perdita è la distanza fra la predizione dello studente e l’uscita dell’insegnante, normalizzate, e sulla soluzione costante vale zero, cioè il suo minimo: il collasso è una soluzione perfetta, e a tenerlo lontano non è la funzione da minimizzare ma la strada che l’addestramento percorre per minimizzarla. Per questo è anche la famiglia di cui si capisce meno perché funzioni: funziona, e la spiegazione è arrivata dopo, un pezzo alla volta e su modelli semplificati [TCG21]. La terza famiglia prende la strada opposta, e scrive l’anti-collasso dentro la perdita, dove si può leggere.

La terza: vincolare le statistiche#

Qui si entra in materia nuova. La rappresentazione che il modello produce per ogni foto è un vettore \(\mathbf{z}\) di \(D\) numeri, le sue coordinate. Invece di allontanare gli esempi gli uni dagli altri, o di affidarsi a un’asimmetria fra i rami, la perdita guarda le statistiche di ciascuna coordinata e di ogni coppia di coordinate, calcolate su un batch di esempi, e impone una condizione che la risposta vuota non può soddisfare. È la famiglia della riduzione di ridondanza, che LeCun chiama dei metodi regolarizzati.

L’idea non nasce nell’informatica. In un saggio raccolto nel volume Sensory Communication del 1961 [Bar61], il neurofisiologo Horace Barlow propose che il compito dei primi stadi del sistema sensoriale fosse ridurre la ridondanza: ricodificare il segnale in modo che le sue componenti dicessero ciascuna una cosa propria, invece di ripetersi a vicenda. Sessant’anni dopo un metodo di apprendimento prende il nome da lui proprio per questo, e sono gli autori stessi a dichiararlo [ZJM+21].

Ogni fotografia va descritta riempiendo una scheda con otto caselle. Le caselle non hanno un significato deciso da noi: è il modello a scoprire che cosa metterci.

Perché la scheda sia buona devono valere due regole, e chiedono cose diverse.

La somiglianza: se compilo la scheda guardando due ritagli diversi della stessa foto, le due schede devono venire uguali. Uguali, però, in un senso preciso, perché una casella che scrive sempre lo stesso numero è uguale su tutto e non dice niente. Per questo, prima di confrontare, si guarda che cosa ogni casella ha scritto sulle altre foto del mucchio. Se la casella 4 scrive 7 per un gatto, 7 per una barca e 7 per una montagna, il fatto che scriva 7 anche sui due ritagli non prova niente: per la regola della somiglianza conta solo una casella che cambia da foto a foto, e cambia allo stesso modo sui due ritagli. Due schede identiche perché tutte le caselle sono bloccate, allora, per quella regola non si somigliano affatto.

La varietà: le otto caselle devono dire otto cose diverse. Se la casella 3 dice sempre la stessa cosa della casella 5, ho una scheda da otto caselle che ne vale sette, e sto sprecando spazio. Quanto pesi la varietà rispetto alla somiglianza lo decidiamo noi, con una manopola.

Ecco perché questa famiglia non ha bisogno né di rivali né di trucchi costruttivi: le due regole vietano guasti diversi, e insieme li coprono. La risposta vuota, cioè descrivere tutte le foto allo stesso modo, la ferma la somiglianza: caselle bloccate non si somigliano, non c’è niente da premiare, e quella regola resta insoddisfatta per intero. La varietà ferma un guasto più educato, la scheda che cambia da foto a foto ma dice otto volte la stessa cosa: lì i due ritagli si somigliano quanto devono, e a pagare è lo spreco. In tutti e due i casi la penalità è scritta nel punteggio, e non arriva per vie traverse.

Un secondo metodo, VICReg, scrive le stesse pretese in un altro modo. La somiglianza diventa soltanto «le due schede vicine», senza il controllo sulle altre foto; la casella bloccata, invece di non contare, si paga: ogni casella deve variare almeno un tanto da una foto all’altra, e se varia meno scatta una multa. Resta la varietà, che fa pagare due caselle che dicono la stessa cosa. La multa e la varietà guardano ciascuna scheda per conto suo, senza confrontarla con l’altra, e questo ha una conseguenza pratica: le due schede possono compilarle due persone che lavorano in modo diverso, o perfino su materiali diversi, perché nessuna delle due deve somigliare all’altra nel modo di scrivere, solo nel risultato.

Siano \(\mathbf{Z}^A, \mathbf{Z}^B \in \mathbb{R}^{N \times D}\) le rappresentazioni di un batch di \(N\) esempi nelle due viste, con \(D\) coordinate, ciascuna standardizzata sul batch (media nulla, varianza unitaria). Si costruisce la matrice di cross-correlazione

\[ \mathbf{C} = \frac{1}{N} \, (\mathbf{Z}^A)^\top \mathbf{Z}^B \in \mathbb{R}^{D \times D}, \qquad C_{ij} = \frac{1}{N} \sum_{n=1}^{N} Z^A_{ni} \, Z^B_{nj}, \]

dove \(C_{ij}\) è la correlazione fra la coordinata \(i\) della prima vista e la coordinata \(j\) della seconda. Barlow Twins [ZJM+21] chiede che \(\mathbf{C}\) sia il più vicino possibile alla matrice identità:

\[ \mathcal{L} = \underbrace{\sum_{i=1}^{D} (1 - C_{ii})^2}_{\text{invarianza}} \; + \; \lambda \underbrace{\sum_{i=1}^{D} \sum_{j \neq i} C_{ij}^2}_{\text{riduzione di ridondanza}}, \]

con \(\lambda > 0\) a pesare i due termini. La lettura è diretta: la diagonale a uno impone che ogni coordinata sia invariante alla vista; la fuori diagonale a zero impone che coordinate diverse siano scorrelate, cioè che non si ripetano. Nel lavoro originale \(\lambda = 5 \cdot 10^{-3}\), il proiettore esce con \(D = 8192\) coordinate e il batch è di \(N = 2048\) esempi; gli autori riportano che la prestazione resta quasi la stessa fino a batch di \(256\), dove SimCLR perde circa quattro punti. Con \(N < D\), però, l’identità non è raggiungibile: le colonne di \(\mathbf{Z}^A\) sono centrate sul batch, quindi \(\mathbf{C}\) ha rango al più \(N - 1\), e la perdita non è un vincolo da soddisfare ma una penalità da rendere piccola.

L’anti-collasso non è una proprietà emergente, ed è utile vedere quale dei due termini ferma quale collasso, perché i due collassi sono diversi. Se l’uscita è costante, la standardizzazione ha numeratore e deviazione standard nulli, e con l’\(\varepsilon\) che ogni implementazione tiene al denominatore manda a zero tutte le celle di \(\mathbf{C}\): a pagare è allora il termine di invarianza, che vale \(D\), mentre quello di ridondanza vale zero e non serve a niente. Se invece l’uscita varia ma tutte le coordinate portano lo stesso segnale, che è la forma interessante del collasso, dopo la standardizzazione le colonne di \(\mathbf{Z}^A\) sono identiche fra loro, e così quelle di \(\mathbf{Z}^B\): ogni cella di \(\mathbf{C}\) vale allora lo stesso numero \(\rho\), quello che sta sulla diagonale, e il termine di ridondanza paga \(\lambda \, D(D-1) \, \rho^2\), cioè \(D(D-1)\) celle piene quanto la diagonale, mentre una rappresentazione con la stessa diagonale e coordinate scorrelate pagherebbe zero. Non serve un argomento sulla dinamica dell’ottimizzazione: la penalità si legge sul valore della perdita, perché è scritta nell’obiettivo.

VICReg [BPL22] arriva alla stessa meta con tre termini espliciti. Con \(\mathbf{z}_n\) le righe di \(\mathbf{Z}\), \(\boldsymbol{\Sigma}(\mathbf{Z}) = \frac{1}{N-1}\sum_n (\mathbf{z}_n - \bar{\mathbf{z}})(\mathbf{z}_n - \bar{\mathbf{z}})^\top\) la covarianza di un solo ramo e \(\mathbf{z}^{j}\) la colonna \(j\),

\[ \mathcal{L} = \lambda_{\text{inv}} \frac{1}{N}\sum_{n} \big\lVert \mathbf{z}^A_n - \mathbf{z}^B_n \big\rVert^2 + \lambda_{\text{var}} \big[v(\mathbf{Z}^A) + v(\mathbf{Z}^B)\big] + \lambda_{\text{cov}} \big[c(\mathbf{Z}^A) + c(\mathbf{Z}^B)\big], \]
\[ v(\mathbf{Z}) = \frac{1}{D}\sum_{j=1}^{D} \max\!\Big(0,\; \gamma - \sqrt{\operatorname{Var}(\mathbf{z}^{j}) + \varepsilon}\Big), \qquad c(\mathbf{Z}) = \frac{1}{D}\sum_{i \neq j} \Sigma_{ij}(\mathbf{Z})^2, \]

con soglia \(\gamma = 1\) e pesi \(25\), \(25\), \(1\) nel lavoro originale. Rispetto a Barlow Twins cambiano due cose: la varianza è una hinge che paga solo sotto soglia, e la decorrelazione si impone dentro ciascun ramo, senza standardizzare e senza incrociare i rami. Gli autori lo scrivono come una critica alla seconda famiglia: il collasso, dicono, «è spesso evitato attraverso bias impliciti nell’architettura di apprendimento, che spesso mancano di una giustificazione o di un’interpretazione chiara», e VICReg «evita esplicitamente il problema del collasso» con un termine di regolarizzazione sulla varianza. Due conseguenze concrete: le due reti non hanno bisogno di condividere i pesi né di essere una la copia lenta dell’altra, e i due rami possono avere architetture diverse o perfino ingressi di natura diversa.

SwAV [CMM+20] sta a cavallo fra questa famiglia e la prima. Non confronta le rappresentazioni a coppie: assegna ogni vista a un insieme di prototipi e predice l’assegnazione di una vista dalla rappresentazione dell’altra, con un vincolo di equipartizione fra i prototipi che è il pezzo anti-collasso. Con \(J\) prototipi, le colonne di \(\mathbf{M} \in \mathbb{R}^{D \times J}\), e le rappresentazioni del batch nelle righe di \(\mathbf{Z}\), le assegnazioni \(\mathbf{Q} \in \mathbb{R}_{+}^{J \times N}\) si cercano nell’insieme

\[ \Big\{\, \mathbf{Q} \;:\; \mathbf{Q}\,\mathbf{1}_N = \tfrac{1}{J}\,\mathbf{1}_J, \;\; \mathbf{Q}^\top \mathbf{1}_J = \tfrac{1}{N}\,\mathbf{1}_N \,\Big\}, \]

che dà a ogni prototipo la stessa quota del batch: mandare tutte le viste sullo stesso prototipo, che sarebbe la risposta vuota, è escluso per costruzione. La soluzione ha la forma \(\mathbf{Q}^* = \operatorname{Diag}(\mathbf{u})\, \exp\!\big(\mathbf{M}^\top \mathbf{Z}^\top / \eta\big)\, \operatorname{Diag}(\mathbf{v})\), dove \(\eta\) regola quanto le assegnazioni restano sfumate (gli autori lo chiamano \(\varepsilon\) e lo fissano a \(0{,}05\)), e i vettori \(\mathbf{u}\) e \(\mathbf{v}\) si trovano con l’algoritmo di Sinkhorn-Knopp, di cui tre iterazioni bastano. Mathilde Caron firma come prima autrice anche il metodo di distillazione della famiglia precedente [CTM+21], e l’equipartizione fa qui il mestiere che là fa la centratura: impedire che una componente dell’uscita assorba tutta la massa. Là quel mestiere richiede un contrappeso, perché la centratura da sola spinge verso l’uniformità e a tirare dall’altra parte serve l’affilatura; qui il vincolo è uno solo.

Che chiedere «otto caselle, otto cose diverse» sia un’operazione e non una metafora si vede in una cinquantina di righe, senza dataset e senza addestrare niente di grosso. Partiamo apposta dal caso interessante, cioè da un modello ridondante: otto coordinate che all’inizio dicono quasi tutte la stessa cosa.

Il programma mette ogni coordinata della prima vista contro ogni coordinata della seconda, e ne esce una tabella quadrata di correlazioni, la \(\mathbf{C}\) di Barlow Twins: sulla diagonale ciascuna coordinata sta di fronte a sé stessa, e lì si legge se le due viste hanno ricevuto la stessa descrizione; fuori diagonale ciascuna sta di fronte alle altre, e lì si legge quanto si ripetono. Le due viste sono lo stesso contenuto con un disturbo diverso, che il codice chiama rumore, e per questo la loro somiglianza non può arrivare al massimo: ha un tetto, che il programma calcola e stampa prima di cominciare.

import torch

torch.manual_seed(0)
N, D_IN, D = 512, 32, 8      # esempi, dimensioni in ingresso, coordinate finali

# Due VISTE dello stesso esempio: stesso contenuto, disturbi indipendenti.
contenuto = torch.randn(N, D_IN)
RUMORE_VISTA = 0.3
vista_a = contenuto + RUMORE_VISTA * torch.randn(N, D_IN)
vista_b = contenuto + RUMORE_VISTA * torch.randn(N, D_IN)

# Partenza RIDONDANTE, ed e' il caso interessante: le otto coordinate nascono
# quasi uguali fra loro, cioe' il modello dice otto volte la stessa cosa.
proiettore = torch.nn.Linear(D_IN, D, bias=False)
with torch.no_grad():
    proiettore.weight.copy_(proiettore.weight[0] + 0.05 * torch.randn(D, D_IN))

def correlazione(za, zb):
    """Cross-correlazione fra le due viste, ogni coordinata standardizzata."""
    za = (za - za.mean(0)) / (za.std(0) + 1e-9)
    zb = (zb - zb.mean(0)) / (zb.std(0) + 1e-9)
    return (za.T @ zb) / za.shape[0]

def barlow(c, lam=0.05):
    """Diagonale verso 1 (invarianza), fuori diagonale verso 0 (ridondanza)."""
    diag = torch.diagonal(c)
    fuori = c - torch.diag_embed(diag)
    return ((diag - 1) ** 2).sum() + lam * (fuori ** 2).sum()

def referto(eti, va=None, vb=None):
    va, vb = (vista_a if va is None else va), (vista_b if vb is None else vb)
    with torch.no_grad():
        c = correlazione(proiettore(va), proiettore(vb))
        d, f = torch.diagonal(c), c - torch.diag_embed(torch.diagonal(c))
        print(f"{eti:14s} diagonale {d.mean():5.2f}   "
              f"fuori diagonale {f.abs().sum() / (D * D - D):5.2f}")

# La diagonale non potra' arrivare a 1: le due viste hanno rumore indipendente,
# quindi la loro correlazione ha un tetto, ed e' questo.
print(f"tetto della diagonale, imposto dal rumore: "
      f"{1 / (1 + RUMORE_VISTA ** 2):.2f}\n")

referto("all'inizio")
ott = torch.optim.SGD(proiettore.parameters(), lr=0.05)
for passo in range(1, 601):
    ott.zero_grad()
    barlow(correlazione(proiettore(vista_a), proiettore(vista_b))).backward()
    ott.step()
    if passo in (100, 600):
        referto(f"dopo {passo}")

# Lo stesso proiettore su esempi MAI VISTI. Serve a separare due cose che sulla
# diagonale si confondono: il tetto imposto dal rumore delle viste, e il fatto
# che un proiettore lineare si adatti anche alle 512 righe che ha davanti.
nuovo = torch.randn(4 * N, D_IN)
referto("su dati nuovi",
        nuovo + RUMORE_VISTA * torch.randn(4 * N, D_IN),
        nuovo + RUMORE_VISTA * torch.randn(4 * N, D_IN))
tetto della diagonale, imposto dal rumore: 0.92

all'inizio     diagonale  0.92   fuori diagonale  0.70
dopo 100       diagonale  0.92   fuori diagonale  0.01
dopo 600       diagonale  0.93   fuori diagonale  0.01
su dati nuovi  diagonale  0.92   fuori diagonale  0.03

Le due colonne stampate raccontano due storie diverse, ed è esattamente il punto. La fuori diagonale crolla da \(0{,}70\) a \(0{,}01\): le otto coordinate smettono di ripetersi e cominciano a dire otto cose distinte. La diagonale invece parte già in cima e ci resta, al tetto imposto dal rumore, \(0{,}92\).

Dopo seicento passi la diagonale segna \(0{,}93\), cioè un centesimo sopra quel tetto, e il centesimo non è un errore di conto: il punteggio si calcola sulle cinquecentododici coppie che il modello ha davanti, non sulla sorgente da cui vengono, e su un campione finito un po” di somiglianza in più si trova sempre. Che sia questo lo dice l’ultima riga, dove lo stesso proiettore descrive esempi che non ha mai visto: lì la diagonale torna a \(0{,}92\), e la fuori diagonale sale appena, da \(0{,}01\) a \(0{,}03\).

E la diagonale non deve andare a uno per forza: è l’errore che si fa più volentieri. Deve andare il più in alto che il rumore consente, e in una situazione reale quel tetto è imposto dalle trasformazioni che abbiamo scelto noi. Quello che l’ottimizzazione può davvero guadagnare, in questo esempio, è tutto nell’altra colonna.

La quarta: ricostruire#

L’ultima famiglia non chiede al modello di riconoscere né di confrontare: gli copre un pezzo di dato e gli chiede di rifarlo. La risposta vuota qui non paga: con la stessa rappresentazione per tutte le immagini, la ricostruzione migliore possibile è l’immagine media, la stessa per tutte, e la perdita resta alta quanto le immagini sono diverse fra loro. Il collasso completo non è un minimo di questa perdita.

È la famiglia generativa mascherata, ed è già stata percorsa due volte: sul testo, con l’esercizio di BERT, in GPT, BERT, T5: tre esercizi di pre-addestramento, e sulle immagini, con il MAE, in Imparare a vedere senza etichette. Il posto nello schema: il collasso lo impedisce il compito stesso, perché ricostruire un dato specifico richiede di averlo descritto in modo specifico. Resta però una scorciatoia, che è un guasto diverso: se si copre poco, il pezzo mancante si ricava dai vicini senza capire la scena, ed è per questo che il MAE copre i tre quarti dell’immagine.

Il prezzo, che le altre tre non pagano, è che il conto si fa sul dato grezzo: ricostruire i pixel vuol dire spendere capacità anche sul granello di polvere e sul riflesso, cioè su dettagli che nessuno potrebbe indovinare e che a nessuno interessano. È l’obiezione da cui parte la JEPA di LeCun, un’architettura che invece dei pixel prova a prevedere la rappresentazione del pezzo coperto, e che La via di LeCun racconta per esteso.

Una rinuncia annunciata, e chi l’ha firmata#

C’è un filo rimasto aperto, e adesso si può finalmente chiudere.

In Le quattro rinunce compare l’elenco che Yann LeCun ripete nelle sue conferenze, e una di quelle dice: abbandonare i metodi contrastivi in favore di quelli regolarizzati. Cioè, nel lessico delle quattro famiglie: smettere di mostrare al modello dei controesempi da respingere, e costruirlo invece in modo che non possa dire di sì a tutto.

I metodi regolarizzati sono la terza famiglia, e i due lavori portano una firma che dice qualcosa: Barlow Twins e VICReg hanno LeCun stesso fra gli autori. La rinuncia e la sua attuazione sono la stessa persona, il che non la rende né più né meno vera, ma spiega perché quella riga della diapositiva non fosse una previsione generica.

Se la scommessa sia giusta resta una questione aperta, e non c’è motivo di chiuderla al posto della ricerca. L’argomento di chi ci scommette è che al crescere della complessità del dato, e soprattutto sul video, le risposte possibili diventano così tante che nessuna quantità di controesempi basterebbe a puntellare il modello; l’argomento di chi non ci scommette è che i metodi contrastivi hanno prodotto, nel frattempo, rappresentazioni che si usano ovunque, come quella che CLIP costruisce fra immagini e testo.

Le quattro famiglie in una tabella#

famiglia

il pretesto

che cosa impedisce la risposta vuota

dove sta la difficoltà

contrastiva (respingere)

ritrovare il gemello fra molti rivali

una forza che allontana

nella scelta delle trasformazioni, cioè di che cosa conta come «la stessa foto»

distillazione (rendere le due reti diverse)

indovinare che cosa dice l’altra rete

un’asimmetria fra i due rami

nel come le due reti sono fatte diverse

riduzione di ridondanza (vincolare le statistiche)

accordo fra due viste, coordinate scorrelate

un vincolo sulle coordinate scritto nella perdita

in quali statistiche si decide di vincolare

generativa mascherata (ricostruire)

rifare il pezzo coperto

il compito stesso

in quanta informazione si toglie

L’ultima colonna è quella che si porta via chi legge. Fabbricare un pretesto significa decidere dove mettere la difficoltà, e ognuna delle quattro famiglie la mette in un posto diverso: nelle nostre scelte a monte, nella forma dell’architettura, in una condizione scritta nella perdita, o nella dose di informazione nascosta. Non c’è una risposta migliore in assoluto, c’è una risposta che si adatta meglio al tipo di dato e a quanto siamo disposti a mettere di nostro dentro il compito.

Un avvertimento sulle tassonomie#

Le famiglie si possono contare in più di un modo, e quale sia quello usato qui va detto. Il taglio è che cosa impedisce la risposta vuota, ed è la terza colonna della tabella, «che cosa impedisce la risposta vuota»; ne escono quattro famiglie. La colonna di destra, «dove sta la difficoltà», è invece l’asse che usa Imparare a vedere senza etichette. In Tre famiglie per imparare senza etichette si taglia invece secondo dove avviene la previsione, cioè se il modello prova a rifare il dato (i pixel, i token) oppure la sua rappresentazione: da lì escono tre famiglie, e la terza, quella che predice nello spazio delle rappresentazioni, qui non compare affatto perché non è un modo diverso di evitare il collasso.

Non è una contraddizione ed è utile che sia così: i due assi sono indipendenti, e un metodo ha una posizione su ciascuno dei due. Una JEPA, per dire, sull’asse del dove predice nello spazio delle rappresentazioni, e sull’asse del come non collassa si affida a un’asimmetria, oppure a un vincolo sulle statistiche. Quando si leggono due elenchi con due numeri diversi, quasi sempre non significa che uno dei due sbagli a contare: stanno guardando la stessa cosa da due lati.

Da ricordare

  • Ogni esercizio inventato ha un modo di essere vinto senza aver capito niente: descrivere tutto allo stesso modo. È il collasso, e le famiglie di metodi si distinguono per come lo impediscono, non per come si chiamano.

  • Respingere: si mettono in campo dei rivali, e descrivere tutto uguale fa perdere. Funziona, ma i rivali servono a migliaia e costano.

  • Rendere le due reti diverse: niente rivali, ma le due reti non sono intercambiabili. Una impara, l’altra fa da insegnante e in quel giro non si corregge. Qui il punteggio non vieta la risposta vuota, anzi la premierebbe: a tenerla lontana è il modo in cui i due si correggono, uno sì e l’altro no. Funziona, e la spiegazione del perché è arrivata dopo il risultato.

  • Vincolare le statistiche: si compila una scheda con otto caselle e si chiedono due cose insieme, la somiglianza e la varietà. La somiglianza vuole che due ritagli della stessa foto diano la stessa scheda; la varietà vuole che le otto caselle dicano otto cose diverse. Le due richieste fermano due guasti diversi: la risposta vuota, dove ogni casella scrive sempre lo stesso numero, la ferma la somiglianza, perché caselle bloccate non si somigliano; la scheda che dice otto volte la stessa cosa la ferma la varietà. Nessuna delle due arriva per vie traverse: è scritto nel punteggio. L’idea viene dalla neurofisiologia degli anni Sessanta.

  • Ricostruire: si copre un pezzo e si chiede di rifarlo. Qui la risposta vuota non serve nemmeno a niente, perché per rifare quella foto bisogna averla descritta in modo suo. Bisogna però coprire molto, perché un buco piccolo si riempie guardando i vicini, senza capire niente. E si paga altrove: si spreca fatica su dettagli che nessuno può indovinare.

  • Cinquanta righe di codice fanno vedere il vincolo all’opera: le caselle smettono di ripetersi (il numero della ridondanza crolla da \(0{,}70\) a \(0{,}01\)) mentre la somiglianza fra le due schede resta dov’era, perché era già al massimo che il disturbo consentiva.

Da ricordare

  • Le famiglie auto-supervisionate si classificano meglio per come evitano il collasso che per il pretesto: repulsione (contrastivi), asimmetria architetturale (distillazione), vincolo esplicito sulle statistiche dell’embedding (regolarizzati), specificità del bersaglio (generativi mascherati). Si leggono sul valore della perdita nella soluzione costante: \(\log K\) per l’InfoNCE con \(K\) candidati, cioè il caso; \(0\) per BYOL e SimSiam, cioè un minimo globale che solo la dinamica evita; \(D\) per Barlow Twins, pagato dall’invarianza; e per la ricostruzione la varianza del dato (sul testo, l’entropia dei token presi da soli), perché la previsione migliore diventa la media.

  • Distillazione: stop-gradient sul ramo insegnante, testa di predizione sul solo ramo studente, insegnante come media mobile dello studente (BYOL, DINO; in SimSiam pesi condivisi), e in DINO centratura e affilatura dell’uscita dell’insegnante. La spiegazione del perché la dinamica eviti il collasso è arrivata dopo, su modelli lineari semplificati [TCG21].

  • Barlow Twins [ZJM+21]: si standardizzano le rappresentazioni sul batch, si costruisce la cross-correlazione \(\mathbf{C} = \frac{1}{N}(\mathbf{Z}^A)^\top \mathbf{Z}^B\) e la si porta verso l’identità. Diagonale a uno: invarianza. Fuori diagonale a zero: riduzione di ridondanza. I due termini fermano due collassi diversi: l’uscita costante la ferma l’invarianza (la standardizzazione manda \(\mathbf{C}\) a zero e quel termine vale \(D\)), mentre le coordinate tutte uguali le ferma la ridondanza, perché allora ogni cella di \(\mathbf{C}\) vale lo stesso numero \(\rho\) della diagonale e il termine paga \(\lambda D(D-1)\rho^2\), cioè \(D(D-1)\) celle piene quanto la diagonale, e coordinate scorrelate pagherebbero zero. Nel lavoro originale \(\lambda = 5 \cdot 10^{-3}\), \(D = 8192\) e \(N = 2048\): con \(N < D\) la matrice \(\mathbf{C}\) ha rango al più \(N - 1\), l’identità non è raggiungibile e la perdita fa da penalità.

  • VICReg [BPL22]: varianza, invarianza, covarianza. Il termine di varianza tiene la deviazione standard di ogni coordinata sopra una soglia, con una hinge che paga solo sotto, quindi l’anti-collasso è esplicito e non un bias implicito dell’architettura. I due rami non devono condividere i pesi né essere l’uno la media mobile dell’altro, e possono avere architetture o ingressi diversi.

  • SwAV [CMM+20]: si predice l’assegnazione a prototipi di una vista dalla rappresentazione dell’altra, con equipartizione fra i prototipi come vincolo anti-collasso (\(\mathbf{Q}\mathbf{1}_N = \tfrac{1}{J}\mathbf{1}_J\), \(\mathbf{Q}^\top\mathbf{1}_J = \tfrac{1}{N}\mathbf{1}_N\), risolto con Sinkhorn-Knopp). Sta a cavallo fra i contrastivi e i metodi che vincolano le statistiche.

  • Nell’esperimento con otto coordinate ridondanti la fuori diagonale scende da \(0{,}70\) a \(0{,}01\) mentre la diagonale parte già al tetto imposto dal rumore delle viste, \(1/(1+\sigma^2) = 0{,}92\) con \(\sigma = 0{,}3\), che non è un limite dell’ottimizzazione. Il \(0{,}93\) che si legge dopo seicento passi sta un centesimo sopra quel tetto, perché la perdita si calcola sulla correlazione empirica del batch: lo stesso proiettore su esempi nuovi torna a \(0{,}92\). La diagonale non deve tendere a uno in assoluto, ma al massimo che le trasformazioni consentono.

  • I metodi regolarizzati sono la rinuncia ai contrastivi dell’elenco di LeCun discusso in Le quattro rinunce, e Barlow Twins e VICReg hanno LeCun fra gli autori. La scommessa è che sul video nessuna quantità di negativi basti; la questione è aperta.