Salta ai contenuti

Canali, rumore, capacità

Prima del 1948 si pensava che, per ridurre gli errori su una linea disturbata, bisognasse rassegnarsi a rallentare verso lo zero. Shannon dimostrò il contrario: esiste una soglia netta, la capacità, sotto la quale si può comunicare quasi senza errori, e oltre la quale nessun ingegno basta. Questo capitolo spiega quella soglia, da dove viene e cosa significa per chi oggi parla con un modello linguistico attraverso un prompt.

Una pagina prima, in Informazione come riduzione di incertezza, abbiamo misurato quanta informazione c’è in un messaggio: l’entropia come incertezza media di una sorgente, l’informazione come sorpresa. Quello era il lato della sorgente — quanto c’è da dire. Resta l’altra metà del problema di Shannon: quanto se ne può far passare attraverso un mezzo che lo corrompe, e con quale affidabilità.

Il problema è concreto e antico. Una linea telefonica raccoglie rumore. Un disco magnetico si smagnetizza col tempo. Una trasmissione radio dallo spazio profondo arriva sepolta sotto disturbi termici. In tutti questi casi il segnale che arriva non è quello partito. La domanda dell’ingegnere è: quanti dati posso spingere senza che gli errori rovinino tutto? E quella del teorico è più radicale: qual è il massimo possibile, indipendentemente da quale tecnologia inventeremo?

La risposta di Claude Shannon (1916-2001, matematico e ingegnere americano dei Bell Telephone Laboratories) è uno dei risultati più controintuitivi del Novecento. Ogni canale ha un numero, la capacità, che fissa un confine duplice: sotto quel numero la comunicazione affidabile è possibile fino a rendere l’errore arbitrariamente piccolo; sopra, è impossibile, per quanto sofisticato sia il codice. Non “meno errori se vai più piano”, ma “errori che spariscono fino a una soglia, poi un muro”.

Per chi costruisce sistemi AI questo capitolo non è solo telecomunicazioni. L’informazione mutua che useremo per definire la capacità è la stessa quantità che riemerge in feature selection, in representation learning e nella teoria — discussa e contestata — dell’information bottleneck applicata alle reti profonde. E il modello del canale rumoroso offre una lente, da maneggiare con cura come analogia, per pensare alla comunicazione tra un umano e un modello linguistico: il prompt come messaggio che attraversa un canale con perdita e ambiguità.

C’è anche una ragione di metodo per fermarsi su questi concetti. La teoria del canale è uno dei pochi posti, in tutta questa wiki, dove un limite è dimostrato invece che osservato: non “i modelli attuali fanno così”, ma “nessun sistema, mai, potrà fare meglio di così”. Imparare a riconoscere la differenza tra un limite teorico invalicabile e un limite ingegneristico aggirabile è una competenza che si trasferisce ben oltre le telecomunicazioni, fino a come si leggono le promesse e i confini dei sistemi AI. Buona parte di questo capitolo, di conseguenza, insegna anche a marcare con onestà quali affermazioni sono teoremi e quali sono analogie utili — una disciplina che la sezione finale mette alla prova proprio sui ponti verso l’AI.

Il riferimento fondante resta il paper di Shannon del 1948, A Mathematical Theory of Communication, sul Bell System Technical Journal. Lì compare lo schema a cinque blocchi — sorgente, codificatore, canale con sorgente di rumore, decodificatore, destinatario — che Informazione come riduzione di incertezza ha già introdotto e che qui diamo per noto. Questo capitolo entra dentro il terzo blocco, il canale, e ne tira fuori i due risultati che il capitolo precedente aveva soltanto anticipato: la definizione di capacità e il teorema della codifica di canale.

Cosa c’era prima è istruttivo. Fino agli anni ‘40 ridurre gli errori su una linea era una questione di forza bruta fisica: amplificatori migliori, ripetitori, più potenza. L’idea diffusa era che affidabilità e velocità fossero in conflitto diretto, e che per avvicinarsi all’errore zero si dovesse pagare avvicinandosi alla velocità zero. Shannon rompe questo presunto compromesso mostrando che esiste una soglia sotto la quale si può avere quasi-zero errori senza sacrificare il rate: si paga in ridondanza e in complessità, non in velocità.

Il filo storico di questo capitolo non si ferma al 1948. Il teorema di Shannon dimostra che i codici buoni esistono, ma non dice come costruirli. La caccia a codici pratici che si avvicinassero davvero alla capacità ha occupato quasi mezzo secolo, dai codici di Richard Hamming del 1950 fino ai turbo code del 1993 e ai codici LDPC, che hanno finalmente toccato il limite di Shannon a frazioni di decibel di distanza. È una storia che attraversa CD, modem, telefonia mobile, Wi-Fi e sonde spaziali, e che chiuderemo nella sezione storica.

I capitoli vicini della Parte XIII raccolgono i pezzi che qui solo sfioriamo: la ridondanza e i codici a correzione d’errore in dettaglio sono il tema di codifica-ridondanza-errori (in preparazione); l’informazione mutua come misura di dipendenza, con la sua stima pratica, è mutual-information (in preparazione); la compressione lossy, radice storica dell’information bottleneck, è rate-distortion (in preparazione).

Due modi di guardare lo stesso oggetto prima delle formule: il canale come una trasformazione probabilistica, e la capacità come la quantità di informazione che sopravvive al passaggio.

Angolo 1: il canale è una matrice di probabilità, non un tubo che perde

Sezione intitolata “Angolo 1: il canale è una matrice di probabilità, non un tubo che perde”

La tentazione è immaginare il canale come un tubo bucato: entra un messaggio, qualche pezzo cade per strada, esce un messaggio incompleto. È un’immagine fuorviante. Il modo giusto è pensare il canale come una trasformazione probabilistica: dato un simbolo di input xx, il canale produce un simbolo di output yy secondo una distribuzione di probabilità condizionata p(yx)p(y \mid x).

In altre parole, il canale è quella regola probabilistica. Tutto ciò che conta del canale, ai fini della teoria, è p(yx)p(y \mid x): la probabilità di ricevere ciascun possibile output dato ciascun possibile input. I dettagli fisici — è un cavo di rame, è l’etere, è un disco che invecchia — spariscono dentro quella distribuzione. Due mezzi fisici diversissimi con la stessa p(yx)p(y \mid x) sono, per Shannon, lo stesso canale.

Questo spostamento è la chiave di tutto. Una volta che il canale è una distribuzione, il rumore non è più un’entità misteriosa: è semplicemente il fatto che p(yx)p(y \mid x) non è concentrata su un solo yy. Se per ogni input ci fosse un solo output certo, il canale sarebbe perfetto. Il rumore è la dispersione: dato xx, l’output yy è incerto.

Quando gli input e gli output sono pochi e discreti, questa “regola probabilistica” si scrive letteralmente come una tabella: una riga per ogni input, una colonna per ogni output, e in ogni cella la probabilità di quel output dato quell’input. Per un canale binario che capovolge un bit con probabilità pp, la tabella è

y=0y=1x=01ppx=1p1p\begin{array}{c|cc} & y=0 & y=1 \\ \hline x=0 & 1-p & p \\ x=1 & p & 1-p \end{array}

Si legge così: se mando uno 0, lo ricevo intatto con probabilità 1p1-p e capovolto in 1 con probabilità pp; simmetricamente per l’1. Le righe sommano a 1, perché qualcosa esce comunque. Questa tabella è il canale: un canale perfetto avrebbe 1 sulla diagonale e 0 fuori; un canale rumoroso spalma probabilità fuori diagonale. Tutta la teoria che segue si regge su questo oggetto, una matrice di probabilità di transizione.

Tre canali catturano quasi tutto ciò che serve sapere, in ordine di complessità crescente. Li introduciamo qui a parole e li formalizziamo nella sezione successiva.

Il canale binario simmetrico (binary symmetric channel, BSC) è il più semplice: input e output sono bit, 0 o 1, e con una certa probabilità pp il bit viene capovolto durante il passaggio. “Simmetrico” perché la probabilità di sbagliare è la stessa nelle due direzioni, 010 \to 1 e 101 \to 0. È il modello giocattolo della teoria.

Il canale a cancellazione (binary erasure channel, BEC) è una variante con una differenza cruciale: invece di capovolgere il bit, ogni tanto lo cancella e al suo posto arriva un simbolo speciale, un punto interrogativo che dice “qui è andato perso qualcosa”. Il ricevitore sa dove ha perso un bit, e non riceve mai un bit sbagliato spacciato per buono. Sapere dove è il danno, vedremo, vale moltissimo.

Il canale gaussiano (additive white Gaussian noise, AWGN) è il modello dei canali fisici reali. Qui input e output non sono bit ma numeri reali, segnali continui, e il canale somma al segnale un rumore casuale con distribuzione gaussiana: y=x+ny = x + n. È il rumore termico dei circuiti, lo sfrigolio di fondo dell’universo, la somma di mille disturbi indipendenti che, per il teorema del limite centrale, tende a una campana gaussiana.

La descrizione “il canale è una regola probabilistica p(yx)p(y \mid x)” regge anche qui, solo che la tabella discreta diventa una densità continua: dato l’input xx, l’output yy è distribuito come una campana gaussiana centrata in xx e larga quanto il rumore. Un rumore più forte allarga la campana, e campane più larghe per input vicini iniziano a sovrapporsi, rendendo impossibile distinguere quale input abbia generato un dato output. È la stessa intuizione del BSC — il rumore confonde gli input — ma con una manopola continua invece che con un singolo numero pp.

Angolo 2: la capacità è l’informazione che sopravvive al passaggio

Sezione intitolata “Angolo 2: la capacità è l’informazione che sopravvive al passaggio”

Se il canale distorce l’input, quanta informazione sull’input riusciamo comunque a recuperare guardando l’output? Questa è esattamente la domanda della capacità, ed è dove entra in scena il concetto centrale del capitolo: l’informazione mutua.

L’idea, prima della formula. Prima di osservare l’output ho una certa incertezza su quale input sia stato mandato. Dopo aver osservato l’output, parte di quell’incertezza si risolve — non tutta, perché il rumore ne lascia un residuo. La quantità di incertezza che l’osservazione dell’output risolve è l’informazione mutua tra input e output, scritta I(X;Y)I(X;Y).

Un canale perfetto risolve tutta l’incertezza: vedendo l’output so esattamente l’input, l’informazione mutua è massima. Un canale completamente rotto — dove l’output è scorrelato dall’input, come una radio sintonizzata sul nulla — non risolve niente: l’informazione mutua è zero. Tutti i canali reali stanno in mezzo.

La capacità del canale è il massimo dell’informazione mutua che si può ottenere scegliendo bene come usare il canale. Il canale, cioè p(yx)p(y \mid x), è dato e fisso: non lo possiamo cambiare. Quello che possiamo scegliere è la statistica con cui generiamo gli input, cioè la distribuzione p(x)p(x). Alcune distribuzioni di input sfruttano il canale meglio di altre. La capacità è il miglior sfruttamento possibile:

C=maxp(x)I(X;Y).C = \max_{p(x)} I(X;Y).

In parole povere: prendi il canale così com’è, prova tutte le strategie possibili di scelta degli input, e tieni quella che fa passare più informazione. Quel massimo è la capacità.

Cosa significhi “scegliere la distribuzione di input” si capisce con un caso storto. Immagina un canale che trasmette benissimo gli 0 ma rovina spesso gli 1. Se usassi 0 e 1 con la stessa frequenza, sprecheresti capacità: stai mandando spesso il simbolo fragile. La distribuzione di input ottimale userà gli 0 più spesso degli 1, sbilanciandosi per favorire il simbolo che il canale tratta bene. La capacità è la frequenza d’uso migliore possibile dei simboli, dato come il canale li maltratta. Per il BSC, che è simmetrico, l’ottimo è banale — 0 e 1 alla pari — ma per canali asimmetrici la scelta della distribuzione di input è una vera leva, e massimizzare I(X;Y)I(X;Y) significa proprio trovarla.

Questa definizione è apparentemente astratta, ma diventa concretissima nei tre casi canonici, dove il massimo si calcola e dà formule chiuse. Prima però serve mettere a fuoco l’informazione mutua, perché è il mattone con cui è costruito tutto.

Angolo 3: comunicare bene è impacchettare sfere lontane

Sezione intitolata “Angolo 3: comunicare bene è impacchettare sfere lontane”

Un terzo modo di vedere la stessa cosa, più geometrico, illumina perché il teorema di codifica funzioni e perché i blocchi lunghi siano la chiave. Pensa a ogni possibile codeword di nn simboli come a un punto in uno spazio a nn dimensioni. Quando una codeword attraversa il canale, il rumore la sposta: il punto ricevuto non coincide con quello mandato, ma cade da qualche parte vicino, dentro una “nuvola” di possibili esiti la cui dimensione dipende da quanto rumore c’è.

Decodificare bene significa, dato il punto ricevuto, indovinare quale codeword l’aveva generato. Questo funziona finché le nuvole di codeword diverse non si sovrappongono: se le codeword sono abbastanza distanti l’una dall’altra, ogni punto ricevuto cade nella nuvola di una sola codeword, e l’ambiguità sparisce. Il problema della codifica diventa allora un problema di impacchettamento: quante sfere (le nuvole di rumore) riesco a sistemare nello spazio senza che si tocchino?

Qui si capisce perché i blocchi lunghi aiutino. In poche dimensioni lo spazio è stretto e le sfere si pestano i piedi. Ma al crescere di nn, lo spazio cresce in modo esplosivo, e accade un fenomeno controintuitivo che è il cuore tecnico del teorema: il volume di una nuvola di rumore cresce molto più lentamente del volume totale disponibile, così che il numero di sfere ben separate che ci stanno cresce esponenzialmente. La capacità è esattamente il tasso a cui questo numero cresce: 2nC2^{nC} codeword distinguibili in nn usi del canale. Sotto CC ci sono abbastanza sfere separate; sopra CC no, e qualche nuvola deve per forza sovrapporsi, generando errore irriducibile.

È la stessa storia dei tre angoli precedenti vista da fuori: massimizzare l’informazione mutua, separare le codeword, impacchettare sfere lontane sono tre facce dello stesso problema.

Ora i simboli. Restiamo leggeri sulle dimostrazioni — la macchina di calcolo di entropia e cross-entropy vive in Entropia, cross-entropy, KL divergence — e ci concentriamo sul significato delle quantità nel contesto del canale.

L’informazione mutua I(X;Y)I(X;Y) misura quanta informazione una variabile rivela sull’altra. Ha tre scritture equivalenti, e ciascuna illumina un aspetto diverso.

La prima la conosciamo già dall’intuizione:

I(X;Y)=H(X)H(XY).I(X;Y) = H(X) - H(X \mid Y).

Qui H(X)H(X) è l’entropia di XX, l’incertezza iniziale sull’input prima di osservare nulla (la quantità definita in Informazione come riduzione di incertezza). Il termine nuovo è H(XY)H(X \mid Y), l’entropia condizionata: l’incertezza che resta su XX dopo aver osservato YY. In parole povere, H(XY)H(X \mid Y) è la sorpresa media residua sull’input quando già conosci l’output. La differenza tra le due — incertezza prima meno incertezza dopo — è proprio quanto l’osservazione di YY ha informato su XX.

La seconda scrittura è simmetrica:

I(X;Y)=H(Y)H(YX).I(X;Y) = H(Y) - H(Y \mid X).

Stessa quantità, vista dall’altro lato: l’incertezza su YY meno l’incertezza che resta su YY una volta noto XX. Il fatto che le due scritture diano lo stesso numero — cioè che I(X;Y)=I(Y;X)I(X;Y) = I(Y;X) — è il fatto, all’inizio spiazzante, che l’informazione mutua è simmetrica: l’informazione che l’output dà sull’input è uguale a quella che l’input dà sull’output, anche se la causalità va in una sola direzione (è l’input a generare l’output, non viceversa).

Il termine H(YX)H(Y \mid X) ha, nel contesto del canale, un’identità precisa: è il rumore. È l’incertezza sull’output che rimane anche sapendo esattamente l’input. Se il canale fosse perfetto, conoscere xx determinerebbe yy e H(YX)H(Y \mid X) sarebbe zero: nessun rumore. Tanta più dispersione introduce il canale, tanto più alto H(YX)H(Y \mid X), tanto meno dell’informazione mandata sopravvive.

Si può rendere questa identità tangibile sul BSC. Supponi di sapere che l’input è x=0x = 0. Cosa resta incerto sull’output? Solo l’esito del lancio “il canale capovolge?”, che accade con probabilità pp. L’incertezza residua su YY noto XX è quindi esattamente l’entropia di quel lancio, H(p)H(p), lo stesso valore per x=0x = 0 e per x=1x = 1. Quindi H(YX)=H(p)H(Y \mid X) = H(p): il rumore del canale, misurato in bit, è l’entropia binaria del flip. Questo chiarisce da dove esce la formula C=1H(p)C = 1 - H(p) vista più sotto: parti da un output con incertezza massima (1 bit, se l’input è uniforme), togli il bit di rumore H(p)H(p), e ti resta la capacità.

La terza scrittura, I(X;Y)=H(X)+H(Y)H(X,Y)I(X;Y) = H(X) + H(Y) - H(X,Y), dove H(X,Y)H(X,Y) è l’entropia congiunta (l’incertezza sulla coppia presa insieme), inquadra l’informazione mutua come l’overlap informazionale tra le due variabili: quanta incertezza condividono. Sono tre formule per lo stesso numero, e averle tutte in mente evita di restare prigionieri di una sola intuizione.

Due proprietà chiudono il quadro. L’informazione mutua è sempre non negativa, I(X;Y)0I(X;Y) \geq 0, e vale esattamente zero se e solo se XX e YY sono indipendenti — il caso del canale rotto, dove l’output non dice nulla sull’input. Non si può “disinformare”: al peggio si impara nulla.

Con l’informazione mutua in mano, le formule di capacità diventano leggibili.

Canale binario simmetrico. Il BSC capovolge ciascun bit con probabilità pp. L’incertezza introdotta dal canale, H(YX)H(Y \mid X), è l’incertezza sull’esito del lancio “capovolge / non capovolge”, cioè l’entropia binaria:

H(p)=plog2p(1p)log2(1p).H(p) = -p \log_2 p - (1-p) \log_2 (1-p).

Questa funzione vale zero quando pp è 0 oppure 1 (nessuna incertezza sul flip) e raggiunge il massimo di 1 bit quando p=0,5p = 0{,}5 (massima incertezza). Massimizzando l’informazione mutua sul BSC — cosa che si ottiene con input uniforme, metà 0 e metà 1 — si arriva alla capacità:

C=1H(p)[bit per uso del canale].C = 1 - H(p) \quad \text{[bit per uso del canale]}.

I casi limite sono istruttivi e uno è genuinamente sorprendente. Con p=0p = 0 il canale è perfetto, H(0)=0H(0) = 0, C=1C = 1: un bit dentro, un bit fuori. Con p=0,5p = 0{,}5 il canale è inutile, H(0,5)=1H(0{,}5) = 1, C=0C = 0: l’output è scorrelato dall’input, tanto vale lanciare una moneta. Ma con p=1p = 1 il canale capovolge sempre, H(1)=0H(1) = 0, C=1C = 1: la capacità è di nuovo massima. Un canale che sbaglia sempre è buono quanto uno che non sbaglia mai, perché l’errore è deterministico — basta invertire ogni bit al ricevitore. Il peggior canale non è quello che sbaglia spesso, è quello che sbaglia in modo imprevedibile, p=0,5p = 0{,}5.

Canale a cancellazione. Il BEC cancella ciascun bit con probabilità ee, sostituendolo con un punto interrogativo che il ricevitore vede. La capacità è semplicemente:

C=1e[bit per uso del canale].C = 1 - e \quad \text{[bit per uso del canale]}.

L’intuizione è diretta: una frazione ee dei bit va persa, il resto passa pulito, quindi in media restano (1e)(1-e) bit utili per uso. Il confronto con il BSC è la lezione: a parità di “frazione di bit danneggiati”, il BEC è migliore, perché sapere dove è il danno (il punto interrogativo) costa meno che subire un errore silenzioso. È il motivo per cui Internet preferisce perdere pacchetti interi — eventi rilevabili — piuttosto che consegnare pacchetti corrotti senza segnalarlo: un checksum trasforma un errore subdolo (BSC) in una cancellazione onesta (BEC).

Questa preferenza non è un caso, è progettazione consapevole. Quando un pacchetto attraversa la rete, un checksum lo accompagna; se i bit non tornano, il pacchetto viene scartato invece che consegnato corrotto. Dal punto di vista degli strati superiori, il canale che vedono è un BEC: i pacchetti arrivano interi o non arrivano, mai sbagliati di nascosto. Sopra questo BEC operano due strategie complementari: la ritrasmissione (il mittente rimanda ciò che è andato perso, come fa TCP) oppure i codici a cancellazione (fountain code e simili), che aggiungono ridondanza calibrata in modo che il destinatario ricostruisca il messaggio anche se una frazione di pacchetti si perde, senza dover chiedere niente indietro. Entrambe sfruttano il vantaggio del BEC: sapere dove manca un pezzo rende il recupero molto più economico che indovinare un bit silenziosamente sbagliato.

Canale gaussiano. Per il canale che somma rumore gaussiano, y=x+ny = x + n, con potenza del segnale SS e potenza del rumore NN, la massimizzazione dell’informazione mutua sotto un vincolo di potenza dà:

C=12log2(1+SN)[bit per uso del canale].C = \frac{1}{2} \log_2\left(1 + \frac{S}{N}\right) \quad \text{[bit per uso del canale]}.

C’è qui un fatto elegante che vale la pena rendere esplicito: la distribuzione di input ottimale per il canale gaussiano è essa stessa gaussiana. Il segnale che sfrutta meglio un canale con rumore gaussiano ha la stessa forma statistica del rumore. È un risultato profondo, non un’analogia: emerge direttamente dalla massimizzazione.

Le tre formule, una accanto all’altra, condividono la stessa logica — capacità è uno meno il rumore, in qualche unità — pur sembrando diverse:

CanaleCosa rovina il segnaleCapacità (bit per uso)
BSCflip di un bit, prob. pp1H(p)1 - H(p)
BECcancellazione, prob. ee1e1 - e
Gaussianorumore additivo, potenza NN12log2(1+S/N)\tfrac{1}{2}\log_2(1 + S/N)

Per il BSC il “rumore tolto” è l’entropia binaria del flip; per il BEC è semplicemente la frazione cancellata; per il gaussiano è codificato nel rapporto S/NS/N. In tutti e tre, una corruzione più severa abbassa la capacità, fino all’estremo in cui non passa più alcuna informazione affidabile.

Shannon-Hartley: il canale gaussiano a banda limitata

Sezione intitolata “Shannon-Hartley: il canale gaussiano a banda limitata”

La formula per uso del canale diventa una formula in bit al secondo quando si tiene conto di quanti usi del canale al secondo consente la banda. Un canale di banda BB hertz permette, per il teorema di campionamento (vedi Campionamento, aliasing, teorema di Nyquist), 2B2B campioni indipendenti al secondo. Moltiplicando la capacità per uso per 2B2B si ottiene il teorema di Shannon-Hartley:

C=Blog2(1+SN)[bit/s].C = B \log_2\left(1 + \frac{S}{N}\right) \quad \text{[bit/s]}.

Qui BB è la banda in hertz e S/NS/N è il rapporto segnale-rumore (signal-to-noise ratio, SNR) espresso come rapporto lineare di potenze. Un avvertimento che evita l’errore di conto più comune: l’SNR nella formula è lineare, non in decibel. Un SNR di 30 dB corrisponde a un rapporto lineare di 1030/10=100010^{30/10} = 1000. Il significato fisico e la conversione in decibel del rapporto segnale-rumore stanno in Rumore, signal-to-noise ratio, filtraggio.

La struttura della formula racconta una storia operativa. La capacità cresce linearmente con la banda e solo logaritmicamente con la qualità del segnale. Raddoppiare la banda raddoppia la capacità; raddoppiare l’SNR la aumenta di poco più di un bit per simbolo. È il motivo per cui, quando si vuole più velocità, conviene cercare più spettro piuttosto che pompare potenza: la banda paga in proporzione, la potenza paga con rendimenti decrescenti.

Da questa formula discende anche un limite ultimo, profondo, sull’energia. Spingendo la banda all’infinito e tenendo fissa la potenza del segnale, la capacità non esplode: tende a un valore finito. Tradotto in energia, esiste un’energia minima per bit sotto la quale la comunicazione affidabile è impossibile, qualunque codice si usi. Questo limite, intorno a 1,6-1{,}6 decibel di rapporto energia-per-bit su densità spettrale di rumore, è il vero pavimento energetico imposto da Shannon, e i sistemi di comunicazione spaziale, dove ogni watt costa, lavorano per avvicinarvisi il più possibile. Non è un dettaglio accademico: è la ragione fisica per cui una sonda lontana deve rallentare il rate man mano che si allontana, non perché “il segnale è debole” in senso vago, ma perché sta scendendo verso quel pavimento.

Arriviamo al risultato che dà il titolo storico al capitolo. Il teorema della codifica di canale (noisy-channel coding theorem) ha due metà.

La parte diretta: per ogni rate di trasmissione RR inferiore alla capacità CC, esistono codici che permettono di comunicare con probabilità d’errore arbitrariamente piccola. Non piccola, non trascurabile: arbitrariamente piccola, cioè la si può rendere piccola quanto si vuole.

La parte inversa (converse): per ogni rate RR superiore a CC, la probabilità d’errore non può essere resa arbitrariamente piccola. Esiste un errore irriducibile, per quanto sofisticato sia il codice.

Insieme, le due metà fanno della capacità un confine netto. Non un punto dove “le cose peggiorano gradualmente”, ma una soglia: di qua comunicazione affidabile, di là no.

Il come è la parte sorprendente. Shannon non comunica un simbolo alla volta. Raggruppa kk bit di informazione in un blocco e li mappa su una codeword di nn simboli di canale, con n>kn > k. Il rate è R=k/nR = k/n, e i nkn - k simboli in più sono ridondanza. L’intuizione del perché blocchi più lunghi aiutino: con codeword lunghe si possono scegliere parole “molto distanti” tra loro nello spazio dei possibili messaggi, così distanti che il rumore, per quanto le sposti, raramente trasforma una codeword in un’altra. Più lungo il blocco, più spazio per separare le codeword, più il rumore si media via.

La dimostrazione di esistenza usa un argomento che è diventato celebre, il random coding argument: invece di costruire un codice furbo, Shannon ne sceglie uno a caso — codeword generate casualmente — e calcola la probabilità d’errore media su tutti i codici casuali possibili. Mostra che questa media tende a zero per blocchi lunghi quando R<CR < C. E se la media su tutti i codici è buona, allora almeno un codice specifico deve essere buono. È una prova non costruttiva: garantisce che i codici buoni esistono senza esibirne uno. Questo è il punto che ha tenuto occupati gli ingegneri per decenni — sapere che il codice buono esiste non dice quale sia.

L’altra metà, la converse, ha un’intuizione altrettanto pulita. Ogni uso del canale può far passare al massimo CC bit di informazione mutua: è la definizione stessa di capacità. Se provi a infilare nel canale più di CC bit per uso, stai chiedendo all’output di portare più informazione sull’input di quanta il canale ne lasci passare — e l’informazione che non passa è informazione perduta, che nessuna decodifica può recuperare. È una versione del principio per cui non si crea informazione dal nulla a valle di un canale: ciò che il rumore ha cancellato non torna. Da qui l’errore irriducibile sopra CC. Le due metà del teorema, viste insieme, dicono che CC non è una stima ottimistica né un limite cautelativo: è il valore esatto, raggiungibile da sotto e invalicabile da sopra.

La codifica di canale fa l’esatto opposto della compressione. La compressione toglie ridondanza, butta via ciò che è prevedibile per accorciare il messaggio. La codifica di canale aggiunge ridondanza — ma in modo strutturato e controllato, per poter correggere gli errori del rumore. Sono la stessa nozione, la ridondanza, usata in due direzioni opposte, e convivono nello stesso sistema: prima si comprime un file (si rimuove ridondanza inutile), poi lo si protegge con un codice a correzione d’errore (si riaggiunge ridondanza utile).

Che questi due stadi si possano progettare in modo indipendente — prima comprimere fino all’entropia, poi proteggere fino alla capacità, senza che l’uno sappia nulla dell’altro — è un risultato di Shannon noto come teorema di separazione (separation theorem). Non è ovvio: a priori si potrebbe pensare che convenga un sistema unico che ottimizza compressione e protezione insieme. Shannon mostra che, almeno per i casi idealizzati, separare i due stadi non costa nulla in prestazione, e in cambio semplifica enormemente l’ingegneria. È il motivo per cui un file viene prima passato in un compressore (ZIP, JPEG) e poi, separatamente, attraverso un codice di canale: due moduli distinti, ciascuno spinto verso il proprio limite di Shannon. Il teorema ha eccezioni note nei casi reali (canali che variano, vincoli di latenza stretti), dove conviene a volte fondere i due stadi, ma come principio organizzativo regge quasi sempre.

L’esempio minimo, già visto in Informazione come riduzione di incertezza, è il codice a ripetizione: per mandare un bit lo si manda tre volte (000 per 0, 111 per 1) e il ricevitore decide a maggioranza. Su un BSC, se il rumore capovolge un solo bit dei tre, la maggioranza lo corregge. Il prezzo è un rate di 1/31/3: tre simboli di canale per un bit di informazione. È ridondanza rozza e costosa, e il teorema di Shannon promette che esistono codici molto più efficienti vicino alla capacità.

Vale la pena rendere numerico il guadagno, perché mostra in piccolo la “magia” del teorema. Su un BSC con p=0,1p = 0{,}1, mandare un bit nudo dà probabilità d’errore 0,10{,}1: dieci messaggi su cento arrivano sbagliati. Con il codice a ripetizione di lunghezza 3, sbaglio solo se il rumore capovolge almeno due dei tre bit. La probabilità è quella di due flip (30,120,9=0,0273 \cdot 0{,}1^2 \cdot 0{,}9 = 0{,}027) più quella di tre flip (0,13=0,0010{,}1^3 = 0{,}001), in totale 0,0280{,}028: l’errore scende da 10% a meno del 3%. Allunga il blocco a 5 ripetizioni e la probabilità d’errore (almeno 3 flip su 5) scende ancora, sotto l’1%. Più lungo il blocco, più basso l’errore — la stessa direzione che il teorema di canale spinge all’estremo, ma il codice a ripetizione paga questo guadagno con un rate che crolla (1/31/3, poi 1/51/5). I codici buoni del teorema ottengono lo stesso crollo dell’errore senza far crollare il rate, ed è esattamente questo che li rende speciali.

Tra la ridondanza stupida e quella ottimale c’è una nozione che la rende misurabile: la distanza di Hamming tra due codeword, cioè il numero di posizioni in cui differiscono (dal nome di Richard Hamming, matematico americano dei Bell Labs che la introdusse intorno al 1950). Un codice le cui codeword distano almeno dd l’una dall’altra può rilevare fino a d1d-1 errori e correggerne fino a (d1)/2\lfloor (d-1)/2 \rfloor: tenere le codeword lontane impedisce al rumore di confonderle. I codici di Hamming veri e propri — per esempio il codice (7,4), che protegge 4 bit di informazione con 3 bit di parità per un totale di 7 — sono i primi codici a blocchi eleganti capaci di correggere un errore singolo. Il dettaglio della loro costruzione appartiene a codifica-ridondanza-errori (in preparazione); qui basta l’idea che la ridondanza intelligente compra affidabilità in modo molto più economico della ripetizione.

Vale distinguere due capacità che la distanza di Hamming separa: rilevare un errore e correggerlo. Rilevare costa poco — basta un bit di parità per accorgersi che qualcosa non torna — ma una volta rilevato l’errore, senza informazione sufficiente non si può ricostruire il dato giusto, si può solo chiederne la ritrasmissione. Correggere costa di più, perché servono codeword abbastanza distanti da identificare quale fosse il messaggio originale, non solo da sapere che è cambiato. La scelta tra rilevare-e-ritrasmettere e correggere-sul-posto è una decisione di sistema: la ritrasmissione costa un viaggio di andata e ritorno (inaccettabile per una sonda spaziale, dove il ritardo è di ore), la correzione costa ridondanza permanente. È un altro volto del compromesso tra rate e affidabilità che attraversa tutto il capitolo.

Il teorema di canale ha lasciato in eredità un problema curioso: per quasi mezzo secolo si è saputo quanto ci si poteva avvicinare alla capacità, senza saper come. Il random coding argument garantisce che i codici buoni esistono, ma sceglierne uno a caso e decodificarlo per forza bruta è impraticabile: il numero di codeword cresce esponenzialmente, e confrontare il messaggio ricevuto con tutte è fuori portata. Serviva ridondanza strutturata abbastanza da decodificare in fretta, ma “casuale” abbastanza da avvicinarsi alla capacità. Le due esigenze tirano in direzioni opposte, ed è questa tensione che ha definito la storia dei codici.

I primi protagonisti, negli anni ‘50 e ‘60, sono codici algebrici eleganti e decodificabili in fretta, ma lontani dal limite: i codici di Hamming, poi i codici BCH e i codici di Reed-Solomon (Irving Reed e Gustave Solomon, 1960), che operano su blocchi di simboli invece che di bit e restano in servizio ancora oggi su CD, DVD e QR code. Sono affidabili e ben compresi, ma lasciano sul tavolo diversi decibel di distanza da CC: spendono più ridondanza del necessario.

Nel 1962, nella sua tesi di dottorato al MIT, Robert Gallager inventa i codici LDPC (low-density parity-check), una famiglia con una struttura di controllo “sparsa” che, in teoria, può avvicinarsi moltissimo alla capacità. Ma decodificarli richiede un’iterazione di scambio di stime che l’hardware del 1962 non poteva sostenere, e i codici LDPC finiscono dimenticati per oltre trent’anni — un caso da manuale di idea giusta nell’epoca sbagliata.

La svolta arriva nel 1993, e da una direzione inattesa. Claude Berrou, Alain Glavieux e Punya Thitimajshima, ingegneri francesi, presentano alla conferenza IEEE ICC i turbo code, in un paper dal titolo che era quasi una provocazione: Near Shannon Limit Error-Correcting Coding and Decoding: Turbo-Codes. La loro idea — due codici concatenati che si scambiano iterativamente “opinioni” sulla decodifica, raffinandole a ogni giro come un turbocompressore che riusa i gas di scarico — arrivava a mezzo decibel dal limite di Shannon, là dove decenni di teoria si erano fermati a qualche decibel. La comunità accademica all’inizio fu incredula: il risultato sembrava troppo bello, e veniva da ingegneri esterni al giro dei teorici della codifica. Era vero.

Il successo dei turbo code riaccese l’interesse per la decodifica iterativa, e a metà anni ‘90 David MacKay e Radford Neal riscoprirono indipendentemente i codici LDPC di Gallager, ormai decodificabili grazie alla potenza di calcolo nel frattempo arrivata. Da lì la corsa è essenzialmente finita: turbo code e LDPC raggiungono la capacità a frazioni di decibel. Nel 2009 Erdal Arıkan introduce i polar code, i primi codici provabilmente capacity-achieving con complessità bassa.

L’eredità è oggi dappertutto: turbo code in 3G e 4G, LDPC in 5G, Wi-Fi, TV satellitare e SSD, polar code nei canali di controllo del 5G. Il teorema astratto del 1948 ha smesso di essere un limite irraggiungibile e teorico: è diventato il bersaglio centrato ogni volta che un telefono scarica un dato.

Sei esempi eterogenei: due numerici (BSC e canale gaussiano), uno in codice (simulazione di un BEC), uno scenario reale (il QR code e la sonda spaziale) e due ponti verso l’AI (l’informazione mutua per scegliere feature, e il prompt come canale rumoroso).

I primi quattro restano nel dominio classico delle comunicazioni, dove i concetti del capitolo hanno un significato letterale e calcolabile; gli ultimi due li trasportano verso il machine learning, uno come uso esatto dell’informazione mutua e uno come analogia esplicita. La progressione è voluta: prima si fissano i concetti dove sono solidi, poi si estendono dove servono cautele.

Prendi un BSC con probabilità di errore p=0,1p = 0{,}1, cioè un bit su dieci viene capovolto. Quanta capacità resta? Prima l’entropia binaria del rumore:

H(0,1)=0,1log20,10,9log20,90,13,32+0,90,1520,469 bit.H(0{,}1) = -0{,}1 \log_2 0{,}1 - 0{,}9 \log_2 0{,}9 \approx 0{,}1 \cdot 3{,}32 + 0{,}9 \cdot 0{,}152 \approx 0{,}469 \text{ bit}.

Quindi la capacità è

C=10,4690,531 bit per uso del canale.C = 1 - 0{,}469 \approx 0{,}531 \text{ bit per uso del canale}.

Il risultato è più severo di quanto l’intuizione suggerisca. Un canale che sbaglia “solo” il 10% delle volte non ti lascia il 90% della capacità: te ne lascia circa il 53%. L’errore costa più della frazione di bit che corrompe, perché ogni bit ricevuto porta con sé il sospetto di essere sbagliato, e quel sospetto erode l’informazione anche dei bit corretti.

Per ancorare la scala con due confronti: con p=0,01p = 0{,}01 (un errore su cento) la capacità sale a C=1H(0,01)10,0810,919C = 1 - H(0{,}01) \approx 1 - 0{,}081 \approx 0{,}919 bit per uso — quasi un canale pulito. Con p=0,5p = 0{,}5 la capacità crolla a zero. La curva da p=0p=0 a p=0,5p=0{,}5 è ripida: gli errori contano molto più di quanto la loro frequenza grezza farebbe pensare.

Applichiamo Shannon-Hartley a un canale realistico. Un canale Wi-Fi a 20 MHz di banda con un rapporto segnale-rumore di 25 dB. Prima converti l’SNR in lineare: 1025/1031610^{25/10} \approx 316. Poi:

C=20000000log2(1+316)200000008,31166 Mbit/s.C = 20\,000\,000 \cdot \log_2(1 + 316) \approx 20\,000\,000 \cdot 8{,}31 \approx 166 \text{ Mbit/s}.

Questo è il tetto teorico: nessuno schema può superarlo su quel canale. Ora osserva il duplice effetto delle due leve. Se raddoppi la banda a 40 MHz, la capacità raddoppia a circa 332 Mbit/s — guadagno lineare, pieno. Se invece raddoppi l’SNR a circa 632 lineare (un aumento di 3 dB), il logaritmo passa da 8,31 a circa 9,31: guadagni un solo bit per simbolo, da 166 a circa 186 Mbit/s. La banda è la leva che paga; la potenza è la leva con i rendimenti decrescenti. È esattamente la ragione per cui gli standard Wi-Fi più recenti rincorrono canali sempre più larghi (40, 80, 160 MHz) invece di limitarsi ad alzare la potenza.

E sopra il tetto? Cosa succede se provi a trasmettere a 250 Mbit/s sul canale da 166? Non è che il router rifiuti i dati: li manda, ma una frazione arriva sbagliata, e nessun codice riesce a correggerla del tutto. È la converse del teorema in azione: oltre la capacità l’errore non scende a zero, resta una perdita irriducibile. Nei sistemi reali questo non si vede come “errori” ma come adattamento: quando l’SNR cala (ti allontani dal router, un muro attenua il segnale), il dispositivo abbassa automaticamente il rate scegliendo uno schema di modulazione e codifica più robusto, per restare sotto la capacità del momento. Il throughput che cala quando il segnale è debole è esattamente Shannon-Hartley che lavora in tempo reale.

Un canale a cancellazione si simula in poche righe, e la simulazione rende tangibile perché C=1eC = 1 - e. Il punto è che il ricevitore sa dove ha perso un bit, quindi può chiederne la ritrasmissione o ricostruirlo da un codice, invece di doverlo indovinare.

import random
def bec(bit, e):
"Canale a cancellazione: con prob. e restituisce '?', altrimenti il bit."
if random.random() < e:
return "?" # cancellazione: il ricevitore SA che e' persa
return bit
def trasmetti(messaggio, e):
ricevuto = [bec(b, e) for b in messaggio]
persi = ricevuto.count("?")
return ricevuto, persi
random.seed(0)
messaggio = [random.randint(0, 1) for _ in range(100_000)]
ricevuto, persi = trasmetti(messaggio, e=0.2)
frazione_utile = (len(messaggio) - persi) / len(messaggio)
print(f"persi: {persi}, frazione utile: {frazione_utile:.3f}")
# persi ~ 20000, frazione utile ~ 0.80, ovvero C = 1 - e = 0.8

La frazione di bit che arriva intatta si assesta intorno a 1e=0,81 - e = 0{,}8, e quei bit sono affidabili: non c’è il sospetto del BSC, perché il canale non consegna mai un bit sbagliato spacciandolo per buono. La differenza con un BSC con la stessa frazione di danno è tutta qui — e si vede confrontando questa capacità di 0,80{,}8 con quella di un BSC a p=0,2p = 0{,}2, che sarebbe 1H(0,2)10,7220,2781 - H(0{,}2) \approx 1 - 0{,}722 \approx 0{,}278. Lo stesso 20% di danno costa quasi tre volte tanto quando è silenzioso invece che dichiarato.

Per avvicinarsi davvero a quella capacità di 0,80{,}8 servirebbe un codice a cancellazione vero, non la simulazione cruda qui sopra. L’idea pratica: invece di trasmettere i 100000100\,000 bit nudi, se ne trasmettono per esempio 130000130\,000 costruiti come combinazioni ridondanti dei primi, in modo che il destinatario possa ricostruire l’intero messaggio non appena ne riceve 100000100\,000 qualsiasi, ignorando quali siano andati persi. Con e=0,2e = 0{,}2 se ne perdono in media 2600026\,000 su 130000130\,000, ne arrivano circa 104000104\,000, abbastanza per ricostruire tutto senza una sola ritrasmissione. È il principio dei fountain code, ed è il modo in cui il vantaggio teorico del BEC — sapere dove è il danno — si trasforma in robustezza concreta su reti che perdono pacchetti.

Esempio 4: il QR code strappato e la voce di Voyager

Sezione intitolata “Esempio 4: il QR code strappato e la voce di Voyager”

Uno scenario reale rende vivo il secondo teorema. Stampa un QR code, strappane un angolo, e con buona probabilità lo scanner lo legge ancora. Non è magia: è ridondanza di canale. I QR code incorporano codici di Reed-Solomon (una famiglia di codici a correzione d’errore degli anni ‘60) che aggiungono simboli ridondanti, fino a poter ricostruire i dati anche quando il 30% del codice è mancante o danneggiato. Lo strappo è il rumore; la ridondanza è ciò che permette di superarlo, esattamente come il codice a ripetizione ma in forma enormemente più efficiente.

Lo stesso principio, spinto al limite, tiene in vita le comunicazioni con lo spazio profondo. Una sonda come Voyager, a miliardi di chilometri, trasmette con una potenza di poche decine di watt verso antenne sulla Terra. Il segnale che arriva è sepolto sotto il rumore: l’SNR è disperatamente basso. Shannon-Hartley dice che a quel SNR e quella banda la capacità è minuscola ma non nulla, e il teorema di canale garantisce che, restando sotto quella capacità, si può comunicare con errore arbitrariamente piccolo. La ridondanza dei codici di canale è ciò che trasforma uno sfrigolio quasi indistinguibile in immagini di Giove nitide. Senza il secondo teorema, l’esplorazione del sistema solare esterno sarebbe muta.

Qui entra in gioco una grandezza che gli ingegneri delle comunicazioni spaziali misurano con cura, il coding gain: di quanti decibel un buon codice permette di abbassare la potenza trasmessa (o, equivalentemente, l’SNR richiesto) a parità di affidabilità rispetto a non codificare affatto. Ogni decibel guadagnato dal codice è potenza che la sonda non deve spendere o distanza che può guadagnare. È la ragione concreta per cui i codici migliori, da Reed-Solomon agli odierni turbo e LDPC, sono stati adottati appena disponibili: per una sonda lontana, la differenza tra un codice mediocre e uno vicino al limite di Shannon può essere la differenza tra una missione che trasmette e una che tace.

Esempio 5 (ponte AI): scegliere feature con l’informazione mutua

Sezione intitolata “Esempio 5 (ponte AI): scegliere feature con l’informazione mutua”

L’informazione mutua non vive solo nei canali. In machine learning è uno strumento di lavoro concreto. Nella feature selection, quando hai molte variabili candidate e vuoi tenere solo le più utili a predire un target, un criterio diretto è scegliere le feature con la più alta informazione mutua con il target: I(feature;target)I(\text{feature}; \text{target}) misura quanto, in media, conoscere quella feature riduce l’incertezza sul target.

Concretamente, immagina di predire se un utente abbandonerà un servizio (target binario) a partire da decine di variabili. Calcoli I(Xj;Y)I(X_j; Y) per ciascuna variabile XjX_j e ordini: una variabile con II alta (per esempio “giorni dall’ultimo accesso”) condivide molta informazione con l’esito; una con II vicina a zero (per esempio “iniziale del nome”) è quasi indipendente dal target e si può scartare. È la stessa quantità del canale, I(X;Y)I(X;Y), usata non per misurare un cavo ma per misurare quanto una feature “informa” sulla risposta.

Il vantaggio dell’informazione mutua rispetto alla più familiare correlazione è che cattura qualsiasi dipendenza, non solo quella lineare. Una feature può avere correlazione lineare quasi nulla con il target eppure determinarlo perfettamente attraverso una relazione a forma di U o periodica: la correlazione, cieca alle relazioni non monotone, la scarterebbe; l’informazione mutua, che misura solo quanto conoscere una variabile riduce l’incertezza sull’altra, la riconosce come informativa. È il motivo per cui I(X;Y)I(X;Y) è uno strumento di selezione più generale, a costo di essere più difficile da stimare.

Questo non è un’analogia: è letteralmente l’informazione mutua di Shannon applicata a due variabili statistiche. Va però maneggiata con una cautela tecnica importante, che riprenderemo: stimare l’informazione mutua in alta dimensione, con poche osservazioni, è notoriamente difficile, e stime ingenue possono ingannare. Il dettaglio è il tema di mutual-information (in preparazione).

Esempio 6 (analogia): un prompt come messaggio attraverso un canale rumoroso

Sezione intitolata “Esempio 6 (analogia): un prompt come messaggio attraverso un canale rumoroso”

L’ultimo esempio è dichiaratamente un’analogia, non un calcolo: serve a far vedere come la lente del canale aiuti a ragionare sulla comunicazione con un modello linguistico, senza pretendere che ci sia una capacità da misurare. Immagina di voler ottenere da un LLM una funzione che validi un indirizzo email. L’intenzione nella tua testa è la sorgente; il prompt che scrivi è il messaggio codificato; l’output del modello è il messaggio ricevuto.

Un prompt scarno — “scrivi una funzione per validare le email” — manda il messaggio attraverso un canale ad alto “rumore”: il linguaggio è ambiguo (validare con quale rigore? in quale linguaggio? gestendo quali casi limite?), e il contesto che davi per scontato non è arrivato. L’output può essere corretto, ma con alta varianza: lanciando il prompt più volte ottieni funzioni diverse, alcune lontane dalla tua intenzione, come bit capovolti da un BSC.

Aggiungere contesto — linguaggio, livello di rigore, un esempio di input/output atteso, i casi limite che ti interessano — riduce l’ambiguità del canale: il “rumore” H(outputprompt)H(\text{output} \mid \text{prompt}) cala, e l’output si concentra attorno a ciò che volevi. È la stessa intuizione che lega rumore basso a informazione mutua alta, trasportata dal cavo alla conversazione. Resta un’analogia: nessuno ha mostrato che p(outputprompt)p(\text{output} \mid \text{prompt}) sia un canale nel senso tecnico, con una capacità calcolabile. È una lente per pensare, non uno strumento per calcolare — e la prossima sezione la usa per una mossa pratica, la ridondanza nel prompt.

I due limiti di Shannon non sono teoria d’archivio: sono l’infrastruttura invisibile di quasi ogni bit che si muove oggi.

Telecomunicazioni e storage. Ogni standard moderno è progettato attorno alla capacità. La telefonia mobile usa turbo code (3G, 4G) e codici LDPC (5G); il Wi-Fi recente usa LDPC; la TV satellitare (DVB-S2), l’Ethernet ad alta velocità e gli SSD usano LDPC. Tutti spendono ridondanza per avvicinarsi alla capacità del canale nonostante il rumore. Il CD audio usa Reed-Solomon, ed è la ragione per cui un graffio non rovina la musica: la ridondanza ricostruisce i campioni persi. Quando vedi un QR code leggersi nonostante un angolo strappato, stai vedendo il secondo teorema di Shannon all’opera.

Comunicazione uomo-LLM, vista come canale (analogia). Qui serve marcare con cura la classe dell’affermazione: quella che segue è un’analogia didattica, non un teorema e non una filiazione. La comunicazione tra un utente e un modello linguistico si può vedere come un canale rumoroso. L’intenzione dell’utente è la sorgente; il prompt scritto è il messaggio codificato; il “canale” include l’ambiguità del linguaggio naturale, il contesto che l’utente dà per scontato e non scrive, la tokenizzazione, e il sampling stocastico del modello; l’output è il messaggio ricevuto, possibilmente “corrotto” rispetto all’intenzione originale.

L’analogia è utile per ragionare: prompt ambigui producono output variabili perché il “canale” ha rumore alto; aggiungere contesto rilevante riduce l’ambiguità e quindi il rumore del canale. Ma resta un’analogia, non un modello formale: nessuno ha mostrato che p(outputprompt)p(\text{output} \mid \text{prompt}) sia un canale nel senso tecnico con una capacità calcolabile, e trattare la metafora come se lo fosse sarebbe un abuso. Vale come lente intuitiva, non come strumento di calcolo.

Ridondanza nel prompting (analogia con la codifica di canale). Sulla stessa scia, e sempre come analogia: come la codifica di canale aggiunge ridondanza strutturata per robustezza, strutturare e ripetere parti del prompt — ribadire il vincolo critico, dare insieme formato ed esempio, mettere l’istruzione chiave in più di un punto — tende ad aumentare la robustezza dell’output al “rumore” del canale uomo-LLM. Non si sta costruendo un codice di Hamming sul prompt; si sta sfruttando l’idea generale che una ridondanza mirata compra affidabilità. Con un limite reale che il modello formale non cattura: la ridondanza nel prompt ha costi — token consumati, fenomeni di lost-in-the-middle, diluizione dell’attenzione — e oltre un certo punto peggiora invece di aiutare.

Informazione mutua in ML e representation learning (uso reale). Oltre alla feature selection dell’esempio, l’informazione mutua guida l’apprendimento di rappresentazioni: criteri di tipo InfoMax massimizzano l’informazione mutua tra input e rappresentazione, e molti obiettivi contrastivi moderni (come InfoNCE, alla base di approcci self-supervised) massimizzano un lower bound sull’informazione mutua tra viste diverse dello stesso dato. Qui non è analogia: è la quantità di Shannon, ottimizzata o stimata direttamente.

Il legame con il disentanglement — imparare rappresentazioni in cui fattori di variazione distinti (per un volto: posa, illuminazione, identità) finiscono in dimensioni separate e indipendenti — passa anch’esso per misure basate sull’informazione mutua. L’idea è che dimensioni che catturano fattori diversi dovrebbero avere bassa informazione mutua tra loro (sono indipendenti) e alta informazione mutua ciascuna con il proprio fattore. È esattamente la nozione di indipendenza di questo capitolo — I(X;Y)=0I(X;Y) = 0 se e solo se le variabili sono indipendenti — usata come obiettivo di progettazione invece che come proprietà di un canale. Anche qui vale la cautela sulla stima: misurare queste informazioni mutue in pratica è difficile, e molti metodi di disentanglement usano surrogati piuttosto che la quantità esatta.

Il rumore nei modelli di diffusione (richiamo concettuale). Un legame meno ovvio ma reale collega il canale gaussiano ai modelli di diffusione, la famiglia di modelli generativi dietro alla generazione di immagini. Un modello di diffusione funziona aggiungendo rumore gaussiano a un dato in molti piccoli passi (il forward process, che trasforma gradualmente un’immagine in puro rumore) e imparando a invertire ogni passo (il reverse process). A ogni livello di rumore corrisponde un rapporto segnale-rumore, e i cosiddetti noise schedule — la ricetta di quanto rumore aggiungere a ogni passo — si riformulano spesso in termini di log-SNR, lo stesso rapporto segnale-rumore che governa Shannon-Hartley.

La classe di questo legame va marcata con cura: è un richiamo concettuale, non un’equivalenza formale. Il rumore gaussiano additivo del canale AWGN e il rumore gaussiano del forward process di diffusione condividono la matematica della gaussiana e il linguaggio del SNR, ma un modello di diffusione non sta “comunicando attraverso un canale”: sta imparando a invertire una corruzione graduale. Vederli come parenti aiuta l’intuizione — entrambi gestiscono segnale immerso nel rumore — senza che ci sia una capacità di canale da calcolare. Il significato del SNR in questo contesto rimanda a Rumore, signal-to-noise ratio, filtraggio.

I teoremi di Shannon sono solidi. Ciò che si rompe è l’intuizione del lettore quando proietta sui concetti significati che non hanno, o quando dimentica le ipotesi. Questa sezione raccoglie i fraintendimenti che fanno più danni.

La capacità non è la velocità fisica del cavo. La capacità è il massimo rate al quale l’errore può essere reso arbitrariamente piccolo, non “quanti bit ci stanno nel cavo”. Sopra la capacità si possono ancora spingere bit — il cavo non li rifiuta — ma l’errore non scenderà mai sotto una certa soglia, per quanto sofisticato sia il codice. È un limite sull’affidabilità, non sulla quantità grezza.

Il limite vale “in linea di principio”, l’avvicinamento è graduale. Il teorema garantisce che esistono codici che raggiungono quasi CC, ma con blocchi che tendono a infinito. Nessun sistema reale raggiunge esattamente CC: ci si avvicina, e quanto ci si avvicina dipende dalla lunghezza di blocco che ci si può permettere, dalla complessità del decodificatore e dalla latenza tollerabile. Quando si legge che un codice “raggiunge la capacità”, si intende sempre “a frazioni di decibel, con blocchi lunghi e decodifica iterativa”, non “esattamente, qui e ora”. Confondere il limite ideale con una garanzia operativa porta a aspettative sbagliate sui sistemi reali.

Sopra la capacità non significa “niente passa”. Errore correlato al punto precedente. Sopra CC la trasmissione non si interrompe: semplicemente una frazione irriducibile di informazione si perde, e nessun codice la recupera. “Impossibile comunicare affidabilmente” non vuol dire “impossibile comunicare”.

Il caso peggiore del BSC non è quello che sbaglia di più. Un BSC con p=1p = 1 capovolge sempre, ed è perfetto: errore deterministico, basta invertire. Il caso peggiore è p=0,5p = 0{,}5, dove l’output è scorrelato dall’input. Conta l’imprevedibilità dell’errore, non la sua frequenza. Chi pensa “più flip, peggio è” si ferma a metà della curva.

L’informazione mutua è simmetrica, anche se la causalità no. I(X;Y)=I(Y;X)I(X;Y) = I(Y;X). È l’input a causare l’output, ma l’informazione che l’uno dà sull’altro è la stessa nelle due direzioni. Chi confonde dipendenza informazionale e direzione causale finisce per cercare un’asimmetria che nella mutua information non c’è. Per la causalità servono strumenti diversi, non l’informazione mutua. È un avvertimento che vale anche in ML: una feature con alta informazione mutua col target non è per ciò stesso una causa del target, è solo informativa su di esso. Trattare “alta MI” come “relazione causale” è un errore frequente e costoso.

Alta informazione mutua non vuol dire utile in senso colloquiale. Come per l’entropia nel capitolo precedente, l’informazione mutua misura quanta incertezza si risolve, non quanto la cosa risolta sia interessante o azionabile. Una feature può avere informazione mutua altissima con il target ed essere inutilizzabile in pratica perché disponibile solo dopo che il target è noto (un caso di leakage). La quantità di Shannon è onesta sul proprio significato — riduzione di incertezza — e non promette rilevanza pratica: quella va giudicata a parte.

L’SNR di Shannon-Hartley è lineare, non in decibel. Errore di conto frequentissimo. Un SNR di 30 dB è un rapporto lineare di 1000, non di 30. Inserire 30 al posto di 1000 sbaglia la capacità di un ordine di grandezza. Converti sempre prima di applicare la formula.

Il fattore 1/21/2 e il fattore BB misurano cose diverse. La capacità del canale gaussiano per uso ha un 1/21/2 davanti (12log2(1+S/N)\tfrac{1}{2}\log_2(1+S/N)), mentre Shannon-Hartley ha un BB (Blog2(1+S/N)B\log_2(1+S/N)) e nessun 1/21/2 visibile. Non si contraddicono: il primo è in bit per uso del canale (per campione reale), il secondo è in bit al secondo, e il passaggio dall’uno all’altro moltiplica per i 2B2B campioni al secondo, il cui fattore 2 assorbe l’1/21/2. Confondere “per uso” e “per secondo” è la fonte di metà degli errori quando si maneggiano queste due formule insieme: tieni sempre presente in quale unità stai lavorando.

Avere la capacità non dà il codice. La prova del teorema è non costruttiva: dimostra che esiste un codice buono, non lo esibisce. Per quasi mezzo secolo si è saputo quanto ci si poteva avvicinare a CC senza saper come. Confondere “esiste un codice che raggiunge quasi CC” con “ecco il codice” è saltare il lavoro di decenni che ha portato a turbo code e LDPC.

L’avvicinamento alla capacità non è gratis. I codici vicini a CC richiedono blocchi lunghi, e blocchi lunghi significano latenza (devi aspettare di aver ricevuto l’intero blocco prima di decodificare) e complessità di calcolo. Il “quasi-zero errori” del teorema è una proprietà asintotica, per lunghezza di blocco che tende a infinito. Nei sistemi reali si sceglie un compromesso tra vicinanza alla capacità, latenza accettabile e costo del decodificatore.

Un canale reale non è “un” canale tra i tre. BSC, BEC e gaussiano sono modelli; un mezzo fisico vero spesso ne combina aspetti, o cambia natura nel tempo. Un collegamento radio mobile è gaussiano a momenti e quasi a cancellazione in altri (quando un ostacolo blocca del tutto il segnale), e il rumore non è indipendente da campione a campione ma arriva a raffiche. Applicare meccanicamente 1H(p)1 - H(p) o Blog2(1+S/N)B\log_2(1+S/N) a un canale mal modellato dà un numero senza significato. La parte difficile dell’ingegneria, prima ancora di scegliere il codice, è costruire un modello del canale che assomigli abbastanza alla realtà.

L’information bottleneck del deep learning è una teoria dibattuta, non un fatto. Qui serve onestà sulla classe dell’affermazione. Il metodo dell’information bottleneck, introdotto da Naftali Tishby, Fernando Pereira e William Bialek nel paper The Information Bottleneck Method (37th Allerton Conference, 1999), è un’idea feconda: data una variabile osservata XX e una variabile rilevante YY, cerca una rappresentazione compressa TT di XX che minimizzi I(X;T)I(X;T) — comprime XX — massimizzando I(T;Y)I(T;Y) — mantiene ciò che serve per predire YY. È il “collo di bottiglia” che butta via i dettagli irrilevanti.

Tishby e Noga Zaslavsky, in Deep Learning and the Information Bottleneck Principle (IEEE Information Theory Workshop, 2015), hanno proposto di leggere le reti profonde come una catena di information bottleneck, con una “fase di fitting” seguita da una “fase di compressione”. Questa proposta specifica è contestata empiricamente: Andrew Saxe e colleghi, in On the Information Bottleneck Theory of Deep Learning (ICLR 2018), hanno mostrato che le tre affermazioni centrali — le due fasi, il fatto che la compressione causi la generalizzazione, e che la compressione sia dovuta alla natura diffusiva dello stochastic gradient descent — non valgono in generale: la “compressione” osservata dipende dalla nonlinearità usata (le tanh, che saturano da entrambi i lati, comprimono; le ReLU no), non è una proprietà universale del deep learning. Quindi: l’information bottleneck come quadro concettuale è interessante; la specifica teoria dell’IB del deep learning va presentata come prospettiva aperta e dibattuta, mai come risultato consolidato.

Stimare l’informazione mutua è difficile. L’informazione mutua è ben definita ma, in pratica, stimarla da dati in alta dimensione e con pochi campioni è un problema noto e insidioso. Stime ingenue tendono a sovrastimare la dipendenza, e i lower bound usati nel deep learning (come InfoNCE) hanno limiti teorici sulla loro stretta. Quando un lavoro afferma “questa rappresentazione ha alta informazione mutua con il target”, la stima va guardata con sospetto sano: il valore dipende dal metodo di stima, non è una misura oggettiva e indipendente come una lunghezza.

Il prompt-come-canale resta un’analogia. Vale la pena ribadirlo tra i fraintendimenti, perché è la tentazione più facile per chi arriva da questo capitolo con in mano gli LLM: trattare la comunicazione uomo-modello come un canale con una capacità misurabile è un abuso. Non esiste, allo stato, una p(outputprompt)p(\text{output} \mid \text{prompt}) trattata come matrice di canale con un CC calcolato, e parlare di “capacità del prompt” in senso tecnico è scivolare da analogia a teorema senza prove. L’analogia illumina (rumore, ridondanza, ambiguità), ma non calcola.

Le ipotesi del canale. La capacità è ben definita rispetto a un modello del canale, cioè a una specifica p(yx)p(y \mid x). Cambia il modello — il rumore non è gaussiano, gli errori sono correlati nel tempo invece che indipendenti, il canale varia mentre lo usi — e la capacità cambia. I tre canali canonici (BSC, BEC, gaussiano) sono modelli idealizzati; i canali reali sono più complicati, e parte dell’ingegneria delle telecomunicazioni consiste proprio nel modellare bene il canale prima di applicare i teoremi.

Più ridondanza non è sempre meglio. Nel mondo dei codici la ridondanza compra affidabilità, e l’intuizione si trasferisce facilmente al prompting: se ripetere il vincolo aiuta, ripeterlo di più aiuterà di più. È falso in entrambi i mondi. Nei codici, oltre il punto giusto la ridondanza fa solo crollare il rate senza guadagno proporzionale di affidabilità. Nel prompting, ridondanza eccessiva consuma token, sparpaglia l’istruzione chiave e innesca fenomeni come il lost-in-the-middle, dove l’informazione al centro di un contesto lungo viene trascurata. C’è un punto ottimale, e superarlo peggiora le cose: la ridondanza è una medicina con un dosaggio, non un nutriente da somministrare a volontà.

  • Informazione come riduzione di incertezza: il capitolo precedente della Parte, che fissa entropia, informazione e lo schema a cinque blocchi, e anticipa i due teoremi. Prerequisito naturale: qui si entra dentro il blocco “canale” che lì era introdotto.
  • Entropia, cross-entropy, KL divergence: la macchina di calcolo di entropia ed entropia condizionata in chiave machine learning. L’entropia condizionata H(YX)H(Y \mid X), qui usata come “rumore del canale”, è la stessa quantità.
  • Rumore, signal-to-noise ratio, filtraggio: il significato fisico dell’SNR e dei decibel che entrano in Shannon-Hartley, dal lato dei segnali. Anche il rumore gaussiano del canale AWGN si chiarisce lì.
  • Campionamento, aliasing, teorema di Nyquist: perché un canale di banda BB consente 2B2B campioni indipendenti al secondo, il passaggio che trasforma la capacità per uso in capacità in bit/s.
  • mutual-information (in preparazione): l’informazione mutua come misura di dipendenza tra variabili, con la sua stima pratica (MINE, InfoNCE) e i suoi usi in ML; qui se ne è dato solo ciò che serve per la capacità.
  • codifica-ridondanza-errori (in preparazione): i codici a correzione d’errore in dettaglio (Hamming, Reed-Solomon, LDPC), la costruzione e la decodifica della ridondanza che qui è solo accennata.
  • rate-distortion (in preparazione): la compressione lossy, radice storica dell’information bottleneck e quadro per “quanta perdita è accettabile”.
  • compressione-mdl (in preparazione): il primo teorema di Shannon portato fino al minimum description length come criterio di scelta tra modelli.
  • ponte-informazione-llm (in preparazione): il legame tra token prediction, compressione e rappresentazioni negli LLM, dove l’analogia prompt-come-canale si incontra con la pratica.
  • Shannon, C. E. (1948). A Mathematical Theory of Communication, Bell System Technical Journal, vol. 27. Il paper fondante. La definizione di capacità come massimo dell’informazione mutua, il channel coding theorem e la forma a banda limitata sono tutti qui, in una prosa sorprendentemente leggibile.
  • Cover, T. M. & Thomas, J. A. (2006). Elements of Information Theory, 2a ed., Wiley. Il riferimento formale: capacità di BSC, BEC e canale gaussiano, informazione mutua ed entropia condizionata, channel coding theorem con dimostrazione completa.
  • MacKay, D. J. C. (2003). Information Theory, Inference, and Learning Algorithms, Cambridge University Press. Disponibile gratuitamente online. Taglio orientato all’apprendimento, ottimo per l’intuizione su capacità e codici; MacKay è tra i riscopritori dei codici LDPC.
  • Tishby, N., Pereira, F. C. & Bialek, W. (1999). The Information Bottleneck Method, Proc. 37th Allerton Conference. L’origine dell’information bottleneck. Da leggere insieme a Saxe et al. (ICLR 2018), On the Information Bottleneck Theory of Deep Learning, per la classe corretta dell’affermazione: idea feconda, applicazione al deep learning dibattuta.
  • Berrou, C., Glavieux, A. & Thitimajshima, P. (1993). Near Shannon Limit Error-Correcting Coding and Decoding: Turbo-Codes, Proc. IEEE ICC. Il primo schema pratico a frazioni di decibel dal limite di Shannon, il momento in cui il teorema del 1948 diventa raggiungibile.