← Tous les exercices
Remettre l'ordre : les vecteurs de place
Partie 5 · ★★
L'attention ignore l'ordre : « toux » donne le même [0,79 ; 0,79] dans « fièvre sans toux » et « toux sans fièvre ». On donne donc à chaque place 1, 2, 3 son propre vecteur et on l'ajoute au vecteur du token (le token n'a toujours qu'un vecteur : la somme).
Complète avec_places. Cours : places [1;0], [0;0], [0;1] ; « toux » devient [1 ; 1,86] à la place 3 et [1,85 ; 1] à la place 1. Les fonctions d'attention sont fournies.
def produit_scalaire(u, x): return sum(a * b for a, b in zip(u, x)) def softmax(scores): m = max(scores) exps = [math.exp(s - m) for s in scores] total = sum(exps) return [e / total for e in exps] def attention_token(i, x): scores = [produit_scalaire(x[i], v) for v in x] poids = softmax(scores) nouveau = [0, 0] for p, v in zip(poids, x): nouveau = [n + p * c for n, c in zip(nouveau, v)] return nouveau x = {"fièvre": [1, 0], "sans": [0, 1], "toux": [1, 1]} places = [[1, 0], [0, 0], [0, 1]] def avec_places(tokens): return [[a + b for a, b in zip(x[t], places[___])] for i, t in enumerate(tokens)] ordre1 = attention_token(2, avec_places(["fièvre", "sans", "toux"])) ordre2 = attention_token(0, avec_places(["toux", "sans", "fièvre"]))
Ctrl/⌘+Entrée