Perché i tuoi Tensor Shape ti giocano brutti scherzi (e come una notazione migliore può salvarti)
Perché gli errori di shape nei tensori passano inosservati
Ti capita di far girare un training loop per settimane, vedere la loss scendere e le metriche migliorare, e poi scoprire che il modello in produzione genera output sbagliati. Senza crash, senza eccezioni. Solo risultati sistematicamente scorretti.
Spesso la causa è un asse che, nella tua testa, aveva un significato ben preciso. Ma nel codice non era mai stato dichiarato in modo chiaro. E così il framework l'ha trattato come qualunque altra dimensione.
Il problema della notazione
La verità scomoda è questa: ciò che non dai un nome, non puoi controllarlo.
I framework per tensori non distinguono tra significati diversi. Una shape come (32, 768, 12, 64) può rappresentare:
(batch, sequence, heads, dim_per_head)(batch, features, height, width)(batch, tokens, layers, channels)
Il compilatore non ha preferenze. Conta solo che le dimensioni si moltiplichino correttamente. E il framework esegue l'operazione, dando per scontato che il significato sia quello che tu gli hai dato.
È un bug invisibile. Non viola le regole matematiche. Ma viola le tue intenzioni.
Cosa cambierebbe con una notazione migliore
Immagine un sistema in cui le operazioni sui tensori mantenessero il loro significato anche attraverso il sistema di tipi. Non solo shape. Ma dimensioni con etichette.
Al posto di dover ricordare quale asse è quale, potresti dichiararlo dal principio:
tensor: [batch=32, sequence=128, heads=12, dim_per_head=64]
In questo modo il compilatore potrebbe controllare che:
- Le operazioni di broadcast avvengano solo su dimensioni che lo dürfen
- Le riduzioni colpiscano gli assi che realmente intendivi
- Gli attention heads non si confondano con le feature dimension
- La LayerNorm agisca sugli assi giusti
Il compilatore diventa un guardiano. Cattura la confusione tra assi prima che tu investa settimane in un training.
Il prezzo reale di questi bug silenziosi
Questi errori di dimension hanno un costo che va ben jenseits del training:
Nella ricerca: Ore e ore di test per capire perché le tue statistiche non si replicano. È un hyperparameter? Un random seed? O è invece l'ordine degli assi che è