Présentation de l'attention

L'attention est un mécanisme fondamental dans les architectures de traitement du langage naturel, telles que les Transformers. Elle permet de mettre en correspondance les éléments d'une séquence d'entrée avec ceux d'une séquence de sortie. L'attention est souvent représentée comme une collection d'opérations primitives, notamment des produits matriciels, des masquages et des normalisations.

Fonctionnement de l'attention

Le processus d'attention peut être décrit comme suit :

scores = torch.matmul(q, k.transpose(-2, -1))
scores = scores * self.scale
scores = scores.masked_fill(mask, float('-inf'))
attn = torch.softmax(scores, dim=-1)
out = torch.matmul(attn, v)
L'attention est ainsi composée de plusieurs étapes, chacune correspondant à une opération spécifique.

Optimisation de l'attention

Pour améliorer les performances de l'attention, il est possible d'utiliser des opérations in-place, qui évitent de créer des copies de tenseurs. Par exemple, en remplaçant

scores = scores.masked_fill(mask, float('-inf'))
par
scores.masked_fill_(mask, float('-inf'))
, on peut réduire le nombre de copies de tenseurs et ainsi accélérer le processus.

Implémentation PyTorch

PyTorch propose une implémentation de l'attention sous la forme de la fonction

F.scaled_dot_product_attention(q, k, v, is_causal=True)
. Cette fonction encapsule l'ensemble des opérations nécessaires à l'attention et permet de bénéficier d'optimisations telles que l'utilisation d'opérations in-place.