- Valeur propre, vecteur propre. Av = λv avec v ≠ 0 : une direction que A ne tourne pas, et son facteur (p04-02, pas 2). Contrôles gratuits : Σλ = trace, Πλ = det.
- Diagonaliser, c'est trois actions. A = P D P−1 se lit de droite à gauche : changer de base, étirer, revenir (p04-02, pas 4). Toute la chaîne remplace ce P−1 par une transposée.
- Symétrique ⇒ orthogonal. Si A = A⊤, les valeurs propres sont réelles et les directions propres orthogonales (p04-02, pas 8). C'est l'énoncé que le pas 2 met en forme.
- Rang, image, noyau. Le rang est la dimension de l'image ; une colonne redondante l'abaisse et le noyau devient non trivial (p04-01, pas 4 et pas 5).
- Matrice orthogonale. Q dont les colonnes sont orthonormées : Q⊤Q = I, donc Q−1 = Q⊤. Elle conserve les longueurs et les angles : c'est une rotation (ou une rotation suivie d'un miroir).
La chaîne
Le décor : deux gênes
p04-02 écrit A = P D P−1. Deux choses coincent.
Un. P−1 est une vraie inversion : elle coûte, et si deux directions propres sont presque parallèles elle amplifie tout ce qui traîne.
Deux. Si A n'est pas carrée, Av = λv n'a même pas de sens : v vit dans Rp et Av dans Rn. Comparer les deux est une faute de dimension, pas une difficulté technique.
« Une valeur propre compare x et Ax, donc elle exige que les deux vivent dans le même espace, donc une matrice rectangulaire n'en a aucune, donc il faut une décomposition qui autorise deux espaces différents. »
| matrice | forme | Av = λv ? | directions propres |
|---|---|---|---|
| C = [[1, 1], [1, 4]] | 2 × 2 symétrique | oui | orthogonales |
| A = [[2, 1], [0, 3]] | 2 × 2 non symétrique | oui | (1 ; 0) et (1 ; 1) — pas orthogonales |
| X = [[1, 2], [2, 4], [3, 6]] | 3 × 2 | non | la question n'existe pas |
A est le fil rouge de p04-02 : facteurs 2 et 3 sur deux directions à 45° l'une de l'autre. Le pas 4 lui trouvera deux directions orthogonales — au prix de changer d'espace à l'arrivée.
Théorème spectral tronc
Si A = A⊤ (réelle), alors
Le P−1 du prérequis est devenu un Q⊤. Lecture de droite à gauche : tourner (Q⊤), étirer chaque axe par son λ (Λ), retourner (Q). Le carré unité devient un parallélogramme et le cercle unité une ellipse alignée sur les directions propres.
On ne le démontre pas ici : on l'énonce et on le regarde.
« Symétrique, donc les directions propres sont orthogonales et les valeurs réelles, donc le changement de base est une rotation, donc A est une dilatation vue dans une base tournée — et retourner ne coûte qu'une transposée. »
Trace 5, déterminant 3, donc λ² − 5λ + 3 = 0, discriminant 13 :
Contrôles : 4,303 + 0,697 = 5 = trace ✓ · 4,303 × 0,697 = 3 = det ✓.
| λ | direction q | angle | vérification Cq |
|---|---|---|---|
| 4,303 | (0,290 ; 0,957) | 73,2° | (1,247 ; 4,118) = 4,303 q1 |
| 0,697 | (−0,957 ; 0,290) | 163,2° | (−0,667 ; 0,202) = 0,697 q2 |
q1 · q2 = 0 et les deux sont de norme 1 : Q = [q1 q2] est orthogonale, de déterminant +1 — une rotation de 73,2°. Et Q Λ Q⊤ redonne C au dernier chiffre près.
La grille fine et le carré pointillé sont le départ ; le cercle pointillé est le cercle unité. Clique décomposer : la scène passe par les trois temps de Q Λ Q⊤. De 0 à 1 c'est Q⊤, une rotation pure — le cercle reste un cercle, seule la grille tourne. De 1 à 2 c'est Λ, un étirement le long des axes : le cercle devient une ellipse de demi-axes 4,30 et 0,697. De 2 à 3 c'est Q, qui remet l'ellipse sur les deux droites tiretées — les directions propres. Le curseur parcourt les trois temps en continu ; à τ = 3 les demi-axes valent exactement les valeurs propres, et c'est la signature du cas symétrique.
Formes quadratiques : le signe des λ donne la forme
Écris x dans la base propre : ai = ⟨qi, x⟩. Alors
Une somme de carrés pondérés par les λ. Tous λi > 0 ⇔ x⊤Ax > 0 pour tout x ≠ 0 : définie positive, un bol. Un λ nul : une vallée plate, la forme ne voit pas cette direction. Un λ négatif : une selle. C'est la géométrie de la loss quadratique de p03-02.
« x se décompose dans la base propre, donc A n'agit sur chaque coordonnée que par son λ, donc la forme quadratique est une somme de carrés pondérés par les λ, donc le signe des λ donne la forme : bol, vallée ou selle. »
Le bol. C a λ = 4,303 et 0,697, tous deux > 0 : définie positive.
| x | x⊤Cx direct | λ1a1² + λ2a2² |
|---|---|---|
| (1 ; 0) | 1 | 4,303·0,0840 + 0,697·0,9160 = 1 |
| (0 ; 1) | 4 | 4,303·0,9160 + 0,697·0,0840 = 4 |
| (1 ; 1) | 7 | = 7 |
La vallée. X⊤X = [[14, 28], [28, 56]] : trace 70, det 0, donc λ = 70 et 0. Et x⊤(X⊤X)x = ‖Xx‖² ≥ 0 : semi-définie positive. Sur x = (2 ; −1)/√5, Xx = (0 ; 0 ; 0) et la forme vaut 0 — la loss est plate le long de cette droite, il y a une infinité de minimums.
C'est exactement ce que λI répare : le 0 devient λ, la vallée se referme, les directions ne bougent pas (p02-02, pas 5 et p04-02, pas 7).
SVD : rectangulaire = rotation, étirement, rotation tronc
Toute matrice X de taille n × p — sans aucune hypothèse — s'écrit
V est orthogonale p × p dans l'espace des entrées, U orthogonale n × n dans l'espace des sorties, Σ diagonale ≥ 0. Les deux espaces sont enfin distincts, et c'est ce qui débloque le cas rectangulaire.
Géométrie : la sphère unité de Rp devient une ellipse dans Rn, de demi-axes les σi portés par les ui. Rang = nombre de σi > 0.
« Une matrice rectangulaire envoie une sphère sur une ellipse, donc il existe des axes d'entrée orthogonaux envoyés sur des axes de sortie orthogonaux, donc X est une rotation, un étirement, une rotation. »
A⊤A = [[4, 2], [2, 10]] : trace 14, det 36, donc λ = 7 ± √13 = 10,606 et 3,394, et
Contrôle : σ1σ2 = 6 = |det A| ✓ (l'aire est multipliée par le produit des étirements).
| axe d'entrée v | axe de sortie u | σ | |
|---|---|---|---|
| 1 | (0,290 ; 0,957) | (0,472 ; 0,882) | 3,257 |
| 2 | (−0,957 ; 0,290) | (−0,882 ; 0,472) | 1,842 |
Le fait à retenir. Les valeurs propres de A valent 2 et 3 ; ses valeurs singulières valent 3,257 et 1,842. Rien à voir. Et les directions propres (1 ; 0) et (1 ; 1) font 45° entre elles, alors que v1 ⊥ v2 et u1 ⊥ u2 : l'orthogonalité est rachetée en acceptant que l'entrée et la sortie aient chacune leur base.
Même montage qu'en figure 1, mais les trois temps sont V⊤, Σ, U. Les droites tiretées bleues sont les axes d'entrée v1, v2 ; les flèches suivent leurs images. À τ = 3 l'ellipse est portée par u1, u2, qui ne sont pas les axes d'entrée : c'est toute la différence avec le cas symétrique. Compare les readouts « valeurs propres » et « valeurs singulières » — sur le cisaillement les deux valeurs propres valent 1 alors que σ = (1,618 ; 0,618). Sur B = [[1, 2], [2, 4]], σ2 = 0 : à partir de τ = 1 l'ellipse s'aplatit et la grille s'effondre sur une droite — rang 1, κ = ∞.
Lien avec X⊤X : les σ sont les racines
Remplace X par U Σ V⊤ et simplifie par U⊤U = I :
C'est le pas 2 appliqué à X⊤X, qui est symétrique : ses valeurs propres sont les σi², ses directions propres sont les colonnes de V. Diagonaliser la covariance et décomposer X sont le même calcul — c'est la PCA (p04-04).
« XᵀX vaut VΣ²Vᵀ, donc ses valeurs propres sont les carrés des valeurs singulières, donc diagonaliser la covariance et décomposer X sont le même calcul. »
X = [[1, 2], [2, 4], [3, 6]] : la deuxième colonne est le double de la première.
v1 = (1 ; 2)/√5 = (0,447 ; 0,894) ; v2 = (2 ; −1)/√5, et X v2 = (0 ; 0 ; 0) — la direction de σ = 0 est le noyau. Une seule σ non nulle : rang 1 ✓.
Le cas où les deux décompositions coïncident. C est symétrique et définie positive : ses valeurs singulières sont ses valeurs propres, 4,303 et 0,697, et V = U = Q. C'est le seul cas. Si un λ était négatif, σ vaudrait |λ| et le signe partirait dans U.
Conditionnement tronc
C'est l'allongement de l'ellipse du pas 4, et il se lit de deux façons.
Résoudre. Ax = b divise par les σ ; la composante sur vmin est divisée par σmin. Une erreur relative δ sur b devient au pire κδ sur x.
Itérer. Sur un bol de conditionnement κ, un pas sûr contracte la direction plate de 1 − 1/κ seulement : le nombre de pas est proportionnel à κ (p03-02, pas 6).
κ = ∞ ⇔ singulier. κ ≈ 108 en float32 ⇔ plus aucun chiffre fiable.
« La solution divise par les σ, donc la direction de σ_min amplifie les erreurs de 1/σ_min, donc le rapport σ_max/σ_min est le facteur d'amplification, donc c'est lui qui dit si le problème est bien posé. »
| matrice | σ | κ | lecture |
|---|---|---|---|
| C = [[1, 1], [1, 4]] | 4,303 · 0,697 | 6,17 | bien posé |
| X2 = [[1, 0], [0, 1], [1, 1], [2, 1]] | 2,803 · 1,070 | 2,62 | très bien conditionné |
| X = D4, rang 1 | 8,367 · 0 | ∞ | singulier |
X2⊤X2 = [[6, 3], [3, 3]] : trace 9, det 9, λ = (9 ± √45)/2 = 7,854 et 1,146, dont les racines sont 2,803 et 1,070. Contrôle : σ1σ2 = 3 = √9 ✓.
Le chiffre à retenir. Le ridge de D4 à λ = 1 donne X⊤X + I = [[15, 28], [28, 57]], de valeurs propres 71 et 1, donc κ = 71. w03-01 chiffre la descente qui en découle de bout en bout : facteur de contraction plat 0,98, 114 pas pour diviser l'écart par dix, contre une résolution 2 × 2 immédiate. On y renvoie plutôt que de la refaire.
En haut, la ligne de niveau x⊤Ax = 1 pour A = diag(1, κ) : une ellipse de demi-axes 1 et 1/√κ, donc √κ fois plus longue que large. Monte le curseur : à κ = 1 c'est un cercle, à κ = 71 (le ridge de D4) une ellipse 8,4 fois plus longue, à κ = 1 000 un trait. En bas, le nombre de pas de descente à η = 1/κ pour diviser la loss par 100 : la courbe est une droite, n ≈ κ·ln(100)/2. Le readout donne aussi la valeur exacte, ln(0,01)/(2·ln(1 − 1/κ)). Doubler κ double le travail, quel que soit l'optimiseur. À κ = 71 on lit 163 pas ici, contre 114 dans w03-01 : ce déroulé prend un pas plus grand (η = 0,02 plutôt que 1/71) et vise un facteur dix sur l'écart, pas cent sur la loss. Le chiffre dépend de ces deux choix ; la proportionnalité à κ, non.
Ne pas former X⊤X tronc
Le pas 5 dit que les valeurs propres de X⊤X sont les σ². Donc
Le nombre de chiffres perdus vaut environ log10 κ : former la matrice de Gram le double. On résout donc les moindres carrés par QR ou SVD de X directement : lstsq le fait, inv(X.T @ X) @ X.T @ y est le mauvais réflexe — deux fois puni, par le carré et par l'inversion explicite.
« Les valeurs singulières de XᵀX sont les carrés, donc son conditionnement est le carré, donc passer par XᵀX double la perte de précision. »
Minimiser ‖Xw − y‖² + λ‖w‖² revient à un moindre carré ordinaire sur la matrice empilée :
| route | ce qu'on factorise | spectre | κ | chiffres perdus |
|---|---|---|---|---|
| QR / SVD | Xλ, 5 × 2 | σ = √71 · 1 | 8,43 | 0,9 |
| équations normales | [[15, 28], [28, 57]] | λ = 71 · 1 | 71 | 1,9 |
Même solution exacte, κ au carré d'un côté. Ici on perd un chiffre, sans conséquence. Sur des features non standardisées à κ(X) = 104 : κ(X⊤X) = 108, et en float32 (7 chiffres décimaux) il ne reste rien alors que la route QR passe encore confortablement.
Les deux conditionnements du ridge de D4 en fonction de λ. La courbe bleue est κ(Xλ) = √((70 + λ)/λ), ce qu'on factorise en QR ou SVD ; la rouge est κ(X⊤X + λI) = (70 + λ)/λ, son carré, ce qu'on obtient en formant le Gram. Les deux partent de l'infini en λ = 0 — c'est là que la matrice est singulière. À λ = 1 : 8,43 contre 71. Que κ chute quand λ monte est déjà acquis (p04-02, pas 7) ; ce qui se lit ici est l'écart entre les deux courbes, qui ne dépend d'aucun réglage — seulement de la route de calcul choisie.
Rang faible : tronquer, c'est compresser
Garde les k plus grandes valeurs singulières :
Xk est la meilleure approximation de rang k en norme de Frobenius, et l'erreur est exactement la racine des σ² jetés. Images, embeddings, LoRA (ΔW = BA de rang r) : la même idée — l'information tient dans quelques directions.
« Les σ rangées décroissantes trient les directions par énergie, donc garder les k premières garde le maximum d'énergie à rang k fixé, donc la troncature est la meilleure approximation de rang k et l'erreur est la racine des σ² jetés. »
D4. σ = (8,367 ; 0). k = 1 donne X1 = X exactement, erreur 0 : trois lignes colinéaires tiennent dans une direction, et le stockage passe de 6 nombres à 5 (u1, v1, σ1).
X2. σ = (2,803 ; 1,070), donc σ² = 7,854 et 1,146, de somme 9 = ‖X2‖²F. Tronquer à k = 1 garde 7,854/9 = 87 % de l'énergie et laisse une erreur relative √(1,146/9) = 0,357, soit 36 %. Beaucoup : ce jeu n'est pas de rang faible.
LoRA. Une couche d × d adaptée par ΔW = BA avec B de taille d × r et A de taille r × d : 2dr paramètres au lieu de d². À d = 4 096 et r = 8 : 65 536 contre 16 777 216, soit 0,39 %.
Où ça casse casse
κ est un rapport, donc il dépend des unités ; et « zéro » n'existe pas en flottant.
« Une valeur singulière minuscule n'est pas nulle et un déterminant minuscule n'est pas un mauvais conditionnement, donc le rang se lit sur le spectre avec un seuil, donc κ ne se lit qu'après avoir standardisé les colonnes. »
- Petites valeurs singulières non nulles. σ = 10−8 n'est pas 0, mais diviser par elle multiplie le bruit par 108. Le rang numérique se lit avec un seuil (σi > tol · σmax), jamais avec le déterminant : diag(10−8, 10−8) a un det de 10−16 et un κ de 1 — parfaitement conditionnée.
- Échelles hétérogènes. Une feature en km et une en mm donnent un κ énorme sans que le problème soit mal posé : κ n'est pas invariant par changement d'unités. Standardiser d'abord, lire κ ensuite — sinon on diagnostique la colinéarité d'un choix d'unités.
- SVD complète en grande dimension. Coût O(np·min(n, p)) : à n = 106 et p = 103, 1012 opérations pour des directions dont on ne garde que les premières. On tronque — SVD randomisée, ou power iteration (p04-02, pas 5) sur les k premières.
- Rang faible n'est pas gratuit. LoRA suppose que l'adaptation vit dans quelques directions ; rien ne garantit que les σ décroissent vite — c'est une propriété des données, pas du théorème. Si elle est fausse, r petit sous-apprend, et X2 ci-dessus en est la version miniature : 36 % d'erreur à k = 1.
Résumé
- Symétrique : A = Q Λ Q⊤, Q rotation — tourner, étirer, retourner ; x⊤Ax = Σλiai², donc bol si tous les λ > 0, vallée si un est nul, selle si un est négatif.
- Rectangulaire : X = U Σ V⊤ — rotation à l'entrée, étirement par les σ ≥ 0, rotation à la sortie ; rang = nombre de σ > 0. Existe toujours.
- X⊤X = V Σ²V⊤ : valeurs propres = σ², directions = V. La SVD de X est la diagonalisation de la covariance.
- κ = σmax/σmin : amplification des erreurs, et nombre de pas de descente proportionnel à κ ; ∞ ⇔ singulier.
- Ne pas former X⊤X : κ au carré, donc deux fois plus de chiffres perdus. QR, SVD,
lstsq. - Tronquer la SVD à k termes = meilleure approximation de rang k, d'erreur √(Σi > kσi²) : compression, embeddings, LoRA.
Chaîne verbalisée — une prise, à voix haute
- Que dit le théorème spectral, en trois gestes ?Symétrique ⇒ Q Λ Q⊤ : rotation, étirement le long des axes, rotation inverse — et l'inverse du changement de base n'est qu'une transposée.
- Que dit x⊤Ax > 0 pour tout x ?Tous les λ > 0 : un bol, définie positive. Un λ nul donne une vallée plate, un λ négatif une selle.
- Lis X = U Σ V⊤.Rotation dans l'espace d'entrée (V⊤), étirement par les σ, rotation dans l'espace de sortie (U). La sphère unité devient une ellipse de demi-axes les σ.
- Relie les σ et les valeurs propres de X⊤X.λ(X⊤X) = σ², mêmes directions V. Sur D4 : λ = 70 et 0, donc σ = 8,37 et 0.
- Que mesure κ, et pourquoi ne pas former X⊤X ?L'amplification des erreurs et le nombre de pas de descente. κ(X⊤X) = κ(X)² : deux fois plus de chiffres perdus. QR ou SVD de X.
- Que vaut κ de la ridge de D4 à λ = 1 ?71 : X⊤X + I a pour valeurs propres 71 et 1. Par la matrice empilée, √71 = 8,43.
Ponts et cartes
algebre::spectral (A = Q Λ Q⊤, définie positive ⇔ tous les λ > 0) · algebre::svd (X = U Σ V⊤, rang = nombre de σ > 0, troncature) · algebre::valeurs-singulieres (σi = √λi(X⊤X), σ1σ2 = |det|) · algebre::conditionnement (κ = σmax/σmin, κ(X⊤X) = κ(X)², ne pas former le Gram).
Une carte qui résiste après cette chaîne est une carte à refondre, pas une section à relire.