Formes de tenseurs courantes en NLP : les tokens d'entrée sont des entiers (batch_size, sequence_length). Les embeddings sont des floats (batch_size, seq_len, model_dim). Les poids d'attention sont (batch_size, num_heads, seq_len, seq_len). Les logits de sortie sont (batch_size, seq_len, vocab_size). Comprendre ces formes te dit exactement ce qui se passe : le tenseur d'attention est N×N parce que chaque token attend à chaque autre token.
Opérations clés sur les tenseurs : matmul (multiplication matricielle — le calcul central dans les réseaux de neurones), reshape (changer les dimensions sans changer les données), transpose (échanger les dimensions), concat (joindre des tenseurs le long d'une dimension), slice (extraire des sous-tenseurs), et broadcast (rendre des tenseurs de formes différentes compatibles pour les opérations élément par élément). Le deep learning est vraiment juste une séquence de ces opérations appliquées à des tenseurs.
Les tenseurs sont calculés sur GPU parce que les opérations tensorielles sont massivement parallèles : multiplier deux matrices implique des millions d'opérations multiplier-additionner indépendantes qui peuvent tourner simultanément. C'est pourquoi la VRAM du GPU compte — tous les tenseurs impliqués dans le calcul doivent résider dans la mémoire du GPU. Quand tu manques de VRAM, c'est parce que la somme de toutes les tailles de tenseurs (poids du modèle + activations + gradients + états de l'optimiseur) dépasse la capacité. Les techniques comme le gradient checkpointing, la précision mixte et le sharding de modèle visent toutes à gérer la mémoire tensorielle.