Hvorfor dine Tensor-Shape-fejl gemmer sig lige foran næsen på dig
Hvorfor dine tensor-shape-problemer gemmer sig i fuldt dagslys
Du kender følelsen. Træningen kører. Loss-værdien falder. Tallene ser fine ud. Så, tre uger inde i produktionen, opdager nogen at modellens output er systematisk forkert – og ingen kan finde fejlen.
Skylden ligger hos en akse, som betød én ting i dit hoved, men noget helt andet i koden.
Det er ikke en kompileringsfejl. Det er ikke et crash. Det er værre: en tavs korrekthedsfejl der sidder indbygget i alle modelprædiktioner.
Problemet med notation
Her er den ubehagelige sandhed: det du ikke kan navngive, kan du ikke kontrollere.
De fleste tensor-frameworks er ligeglade med betydning. En shape som (32, 768, 12, 64) kan betyde alt fra:
(batch, sequence, heads, dim_per_head)(batch, features, height, width)(batch, tokens, layers, channels)
Compileren ser kun en tuple af tal. Så længe tallene passer sammen, er operationen gyldig. Frameworket udfører den – og låser den semantiske betydning fast i dine vægte.
Det er den usynlige fejl. Ikke forkert matematik. Forkert intention.
Hvad bedre notation kunne ændre
Tænk på en verden, hvor tensor-operationer bar deres betydning med sig gennem type-systemet. Ikke bare shapes – men navngivne dimensioner.
I stedet for at debugge hvilken akse der er hvilken, erklærer du det fra starten:
tensor: [batch=32, sequence=128, heads=12, dim_per_head=64]
Nu kan compileren tjekke at:
- Du kun broadcaster på dimensioner, der må broadcaster
- Reduktionsoperationer slår de akser sammen, som du mener
- Attention-heads forbliver adskilt fra feature-dimensioner
- LayerNorm normaliserer på de rigtige akser
Compileren bliver din medpilot. Den fanger akse-fejlene før du bruger flere uger på at træne.
Omkostningerne ved tavs bugs
Overvej hvad dimensionelle bugs faktisk koster:
I forskning: Timer af statiske tests, mens man søger efter årsagen til at tallen