Produit scalaire de vecteurs -- De la projection à la multiplication
Le produit scalaire est l’opération vectorielle la plus fréquemment utilisée en IA.
Le calcul des couches entièrement connectées et la correspondance de similarité dans les mécanismes d’attention—les deux sont fondamentalement des produits scalaires.
Le produit scalaire adeux perspectives équivalentescomprendre le pont entre elles est le principal enseignement de ce chapitre.
Perspective 1 : Calcul algébrique
Multiplier les éléments aux positions correspondantes, puis les additionner.
\( \mathbf{a} \cdot \mathbf{b} = \sum a_i b_i \)
Par exemple : (2,3) · (4,1) = 2×4 + 3×1 = 11
Perspective 2 : Intuition géométrique
Projeter un vecteur sur un autre, puis multiplier les deux longueurs.
\( \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta \)
Plus l’angle θ est petit, plus le produit scalaire est grand.
Les deux méthodes donnent la même valeur — c'est une équation extrêmement élégante en mathématiques.
Le signe du produit scalaire révèle des relations directionnelles
Exemples concrets
Facture de courses : quantité × prix unitaire
Vous avez acheté 2 bouteilles de cola (3 yuan chacune), 3 paquets de chips (5 yuan chacun) et 1 seau de nouilles instantanées (4 yuan par seau).
Le produit scalaire du vecteur des quantités (2, 3, 1) et du vecteur des prix (3, 5, 4) est le prix total : 2×3 + 3×5 + 1×4 = 25 yuan.
Pousser un chariot de courses : force × déplacement
La force que vous appliquez au chariot de courses est un vecteur (avec une norme et une direction), et le déplacement du chariot est un autre vecteur.
En physique, travail = composante de la force dans la direction du déplacement × norme du déplacement = le produit scalaire du vecteur force et du vecteur déplacement.
Si vous poussez latéralement (direction perpendiculaire), vous n'effectuez aucun travail du tout—le produit scalaire est nul.
Définition mathématique
Définition algébrique
\[ \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n \]Définition géométrique
\[ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta \]Lien entre les deux définitions : trouver l'angle
\[ \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} \]Cela signifie :Étant donné les coordonnées de deux vecteurs, vous pouvez calculer l'angle entre eux sans rapporteur。
Propriétés des opérations
| Propriété | Formule | Explication |
|---|---|---|
| Loi commutative | \( \mathbf{a} \cdot \mathbf{b} = \mathbf{b} \cdot \mathbf{a} \) | L'ordre n'a pas d'importance |
| Loi distributive | \( \mathbf{a} \cdot (\mathbf{b} + \mathbf{c}) = \mathbf{a}\cdot\mathbf{b} + \mathbf{a}\cdot\mathbf{c} \) | Vous pouvez d'abord additionner, puis calculer le produit scalaire |
| Produit scalaire avec lui-même | \( \mathbf{a} \cdot \mathbf{a} = \|\mathbf{a}\|^2 \) | Le produit scalaire d'un vecteur avec lui-même est égal au carré de sa longueur |
Mise en pratique avec Python
Exemple
a_example = np.array([2, 3, 1])
b_example = np.array([4, 1, 2])
# Méthode 1 : np.dot()
dot1 = np.dot(a_example, b_example)
# Méthode 2 : opérateur @ (recommandé)
dot2 = a_example @ b_example
# Méthode 3 : vérification manuelle
dot3 = sum(a_example[i] * b_example[i] for i in range(len(a_example)))
print("a · b =", dot1) # 13
print("Les trois méthodes donnent le même résultat :", dot1 == dot2 == dot3)
# Utiliser la définition géométrique pour en déduire l'angle
norm_a = np.linalg.norm(a_example)
norm_b = np.linalg.norm(b_example)
cos_theta = dot1 / (norm_a * norm_b)
theta_deg = np.degrees(np.arccos(cos_theta))
print(f"||a||={norm_a:.2f}, ||b||={norm_b:.2f}, cosθ={cos_theta:.4f}")
print(f"Angle = {theta_deg:.1f}°")
# Vérifier la formule géométrique
verify = norm_a * norm_b * cos_theta
print(f"||a||·||b||·cosθ = {verify:.4f} (cohérent avec le produit scalaire)")
# Démonstration de différents angles
print("\n[1,0] · [0.8,0.6] =", np.array([1,0]) @ np.array([0.8,0.6]), " (angle aigu, positif)")
print("[1,0] · [0,1] =", np.array([1,0]) @ np.array([0,1]), " (angle droit, zéro)")
print("[1,0] · [-1,0] =", np.array([1,0]) @ np.array([-1,0]), " (angle obtus, négatif)")
a · b = 13 三种方法结果一致: True ||a||=3.74, ||b||=4.58, cosθ=0.7580 夹角 = 40.7° [1,0] · [0.8,0.6] = 0.8 (锐角,正) [1,0] · [0,1] = 0 (直角,零) [1,0] · [-1,0] = -1.0 (钝角,负)
Démo interactive du produit scalaire
Faites glisser les extrémités des vecteurs a et b pour voir comment la valeur du produit scalaire et l'angle changent. Le signe du produit scalaire détermine un angle aigu/obtus/droit :
Scénarios d'application en IA
Couche entièrement connectée = calcul par lots de produits scalaires
Un neurone calcule \( y = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b \). La partie somme est leproduit scalaire du vecteur de poids w et du vecteur d'entrée x。
Quand vous voyez une couche entièrement connectéenn.Linear(784, 256), ce qu'elle fait mathématiquement est : 256 neurones, chaque neurone prend son propre vecteur de poids (de dimension 784) et calcule le produit scalaire avec le vecteur d'entrée, puis ajoute le biais. 256 produits scalaires calculés en parallèle = multiplication matricielle.
Mécanisme d'attention = produit scalaire + Softmax
L'opération centrale du Transformer : le vecteur Query et le vecteur Key font un produit scalaire ; plus le résultat est grand, plus les deux sont « liés ».
\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]\( QK^T \) est la multiplication d'une matrice seq_len × d_k et d'une matrice d_k × seq_len ; la valeur à la position (i, j) dans la matrice résultat = leproduit scalaire de la i-ème Query et de la j-ème KeyPlus cette valeur est grande, plus l'« attention » de la i-ème position envers la j-ème position est élevée.
La division par \( \sqrt{d_k} \) sert à éviter que les valeurs du produit scalaire ne deviennent trop grandes, ce qui entraînerait la disparition du gradient de Softmax. Tous les grands modèles de langage modernes tels que GPT, BERT et Claude reposent sur ce mécanisme d'attention par produit scalaire.
Calcul de similarité dans les systèmes de recommandation
Le produit scalaire du vecteur utilisateur et du vecteur article donne le « score de préférence » de l'utilisateur pour cet article. C'est le cœur de l'algorithme de recommandation par factorisation matricielle—la matrice de notation ≈ matrice des vecteurs latents des utilisateurs × transposée de la matrice des vecteurs latents des articles.
Autres extensions