Table of Contents

Geometrie și Operații Algebrice Liniare

Geometria Vectorilor

Mai întâi, trebuie să discutăm cele două interpretări geometrice comune ale vectorilor, fie ca puncte, fie ca direcții în spațiu. Fundamental, un vector este o listă de numere precum lista Python de mai jos.

#@tab all
v = [1, 7, 0, 1]

Matematicienii scriu cel mai adesea acest lucru fie ca un vector coloană fie ca un vector linie, adică fie ca

$$ \mathbf{x} = \begin{bmatrix}1\\7\\0\\1\end{bmatrix}, $$

sau

$$ \mathbf{x}^\top = \begin{bmatrix}1 & 7 & 0 & 1\end{bmatrix}. $$

Aceștia au adesea interpretări diferite, unde exemplele de date sunt vectori coloană și ponderile utilizate pentru a forma sume ponderate sunt vectori linie. Totuși, poate fi benefic să fim flexibili. Așa cum am descris în , deși orientarea implicită a unui singur vector este un vector coloană, pentru orice matrice care reprezintă un set de date tabelar, tratarea fiecărui exemplu de date ca un vector linie în matrice este mai convențională.

Dat fiind un vector, prima interpretare pe care ar trebui să i-o dăm este ca un punct în spațiu. În două sau trei dimensiuni, putem vizualiza aceste puncte folosind componentele vectorilor pentru a defini locația punctelor în spațiu comparativ cu o referință fixă numită origine. Acest lucru poate fi văzut în .

O ilustrare a vizualizării vectorilor ca puncte în plan. Prima componentă a vectorului dă coordonata $\mathit{x}$, a doua componentă dă coordonata $\mathit{y}$. Dimensiunile superioare sunt analoage, deși mult mai greu de vizualizat.

Acest punct de vedere geometric ne permite să considerăm problema la un nivel mai abstract. Nu ne mai confruntăm cu o problemă aparent insurmontabilă precum clasificarea imaginilor ca fiind pisici sau câini, putem începe să considerăm sarcinile abstract ca și colecții de puncte în spațiu și să ne imaginăm sarcina ca descoperirea modului de a separa două grupuri distincte de puncte.

În paralel, există un al doilea punct de vedere pe care oamenii îl au adesea despre vectori: ca direcții în spațiu. Nu numai că ne putem gândi la vectorul $\mathbf{v} = [3,2]^\top$ ca la locația aflată la $3$ unități la dreapta și $2$ unități în sus de la origine, ne putem gândi la el și ca la direcția însăși de a face $3$ pași la dreapta și $2$ pași în sus. În acest fel, considerăm toți vectorii din figura identici.

Orice vector poate fi vizualizat ca o săgeată în plan. În acest caz, fiecare vector desenat este o reprezentare a vectorului $(3,2)^\top$.

Unul dintre beneficiile acestei schimbări este că putem da un sens vizual actului de adunare a vectorilor. În particular, urmăm direcțiile date de un vector, și apoi urmăm direcțiile date de celălalt, așa cum se vede în .

Putem vizualiza adunarea vectorilor urmând mai întâi un vector, și apoi pe celălalt.

Scăderea vectorilor are o interpretare similară. Considerând identitatea că $\mathbf{u} = \mathbf{v} + (\mathbf{u}-\mathbf{v})$, vedem că vectorul $\mathbf{u}-\mathbf{v}$ este direcția care ne duce de la punctul $\mathbf{v}$ la punctul $\mathbf{u}$.

Produse Scalare și Unghiuri

Așa cum am văzut în , dacă luăm doi vectori coloană $\mathbf{u}$ și $\mathbf{v}$, putem forma produsul lor scalar calculând:

$$\mathbf{u}^\top\mathbf{v} = \sum_i u_i\cdot v_i.$$

Deoarece :eqref:eq_dot_def este simetrică, vom oglindi notația multiplicării clasice și vom scrie

$$ \mathbf{u}\cdot\mathbf{v} = \mathbf{u}^\top\mathbf{v} = \mathbf{v}^\top\mathbf{u}, $$

pentru a evidenția faptul că schimbarea ordinii vectorilor va produce același răspuns.

Produsul scalar :eqref:eq_dot_def admite de asemenea o interpretare geometrică: este strâns legat de unghiul dintre doi vectori. Considerați unghiul arătat în .

Între oricare doi vectori din plan există un unghi bine definit $\theta$. Vom vedea că acest unghi este intim legat de produsul scalar.

Pentru început, să considerăm doi vectori specifici:

$$ \mathbf{v} = (r,0) \; \textrm{și} \; \mathbf{w} = (s\cos(\theta), s \sin(\theta)). $$

Vectorul $\mathbf{v}$ are lungimea $r$ și merge paralel cu axa $x$, iar vectorul $\mathbf{w}$ are lungimea $s$ și este la unghiul $\theta$ cu axa $x$. Dacă calculăm produsul scalar al acestor doi vectori, vedem că

$$ \mathbf{v}\cdot\mathbf{w} = rs\cos(\theta) = \|\mathbf{v}\|\|\mathbf{w}\|\cos(\theta). $$

Cu o simplă manipulare algebrică, putem rearanja termenii pentru a obține

$$ \theta = \arccos\left(\frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}\right). $$

Pe scurt, pentru acești doi vectori specifici, produsul scalar combinat cu normele ne spun unghiul dintre cei doi vectori. Același fapt este adevărat în general. Nu vom deriva expresia aici, totuși, dacă considerăm scrierea $\|\mathbf{v} - \mathbf{w}\|^2$ în două moduri: unul cu produsul scalar, și celălalt geometric folosind legea cosinusurilor, putem obține relația completă. Într-adevăr, pentru oricare doi vectori $\mathbf{v}$ și $\mathbf{w}$, unghiul dintre cei doi vectori este

$$\theta = \arccos\left(\frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}\right).$$

Acesta este un rezultat frumos deoarece nimic din calcul nu face referire la două dimensiuni. Într-adevăr, putem folosi acest lucru în trei sau trei milioane de dimensiuni fără probleme.

Ca un exemplu simplu, să vedem cum să calculăm unghiul dintre o pereche de vectori:

#@tab pytorch
%matplotlib inline
from d2l import torch as d2l
from IPython import display
import torch
from torchvision import transforms
import torchvision
 
def angle(v, w):
    return torch.acos(v.dot(w) / (torch.norm(v) * torch.norm(w)))
 
angle(torch.tensor([0, 1, 2], dtype=torch.float32), torch.tensor([2.0, 3, 4]))

Nu îl vom folosi chiar acum, dar este util să știm că ne vom referi la vectori pentru care unghiul este $\pi/2$ (sau echivalent $90^{\circ}$) ca fiind ortogonali. Examinând ecuația de mai sus, vedem că acest lucru se întâmplă când $\theta = \pi/2$, ceea ce este același lucru cu $\cos(\theta) = 0$. Singurul mod în care se poate întâmpla acest lucru este dacă produsul scalar în sine este zero, iar doi vectori sunt ortogonali dacă și numai dacă $\mathbf{v}\cdot\mathbf{w} = 0$. Aceasta se va dovedi a fi o formulă utilă atunci când înțelegem obiectele geometric.

Este rezonabil să întrebăm: de ce este util calculul unghiului? Răspunsul vine în tipul de invarianță pe care ne așteptăm să o aibă datele. Considerați o imagine, și o imagine duplicat, unde fiecare valoare a pixelului este aceeași dar $10\%$ din luminozitate. Valorile pixelilor individuali sunt în general departe de valorile originale. Astfel, dacă cineva ar calcula distanța dintre imaginea originală și cea mai întunecată, distanța poate fi mare. Totuși, pentru majoritatea aplicațiilor ML, conținutul este același—este încă o imagine a unei pisici în ceea ce privește un clasificator pisică/câine. Totuși, dacă considerăm unghiul, nu este greu de văzut că pentru orice vector $\mathbf{v}$, unghiul dintre $\mathbf{v}$ și $0.1\cdot\mathbf{v}$ este zero. Acest lucru corespunde faptului că scalarea vectorilor păstrează aceeași direcție și doar schimbă lungimea. Unghiul consideră imaginea mai întunecată identică.

Exemple ca acesta sunt peste tot. În text, am putea dori ca subiectul discutat să nu se schimbe dacă scriem de două ori mai mult dintr-un document care spune același lucru. Pentru unele codificări (cum ar fi numărarea aparițiilor cuvintelor într-un vocabular), acest lucru corespunde unei dublări a vectorului care codifică documentul, deci din nou putem folosi unghiul.

Similaritate Cosinus

În contexte ML unde unghiul este angajat pentru a măsura apropierea a doi vectori, practicienii adoptă termenul similaritate cosinus (cosine similarity) pentru a se referi la porțiunea $$ \cos(\theta) = \frac{\mathbf{v}\cdot\mathbf{w}}{\|\mathbf{v}\|\|\mathbf{w}\|}. $$

Cosinusul ia o valoare maximă de $1$ când cei doi vectori indică în aceeași direcție, o valoare minimă de $-1$ când indică în direcții opuse, și o valoare de $0$ când cei doi vectori sunt ortogonali. Rețineți că dacă componentele vectorilor de dimensiuni mari sunt eșantionate aleatoriu cu media $0$, cosinusul lor va fi aproape întotdeauna aproape de $0$.

Hiperplane

În plus față de lucrul cu vectori, un alt obiect cheie pe care trebuie să îl înțelegeți pentru a merge departe în algebra liniară este hiperplanul, o generalizare la dimensiuni superioare a unei linii (două dimensiuni) sau a unui plan (trei dimensiuni). Într-un spațiu vectorial $d$-dimensional, un hiperplan are dimensiuni $d-1$ și împarte spațiul în două semi-spații.

Să începem cu un exemplu. Presupuneți că avem un vector coloană $\mathbf{w}=[2,1]^\top$. Vrem să știm, „care sunt punctele $\mathbf{v}$ cu $\mathbf{w}\cdot\mathbf{v} = 1$?” Amintindu-ne conexiunea dintre produsele scalare și unghiurile de mai sus :eqref:eq_angle_forumla, putem vedea că acest lucru este echivalent cu $$ \|\mathbf{v}\|\|\mathbf{w}\|\cos(\theta) = 1 \; \iff \; \|\mathbf{v}\|\cos(\theta) = \frac{1}{\|\mathbf{w}\|} = \frac{1}{\sqrt{5}}. $$

Reamintindu-ne trigonometria, vedem că formula $\|\mathbf{v}\|\cos(\theta)$ este lungimea proiecției vectorului $\mathbf{v}$ pe direcția lui $\mathbf{w}$

Dacă considerăm semnificația geometrică a acestei expresii, vedem că este echivalent cu a spune că lungimea proiecției lui $\mathbf{v}$ pe direcția lui $\mathbf{w}$ este exact $1/\|\mathbf{w}\|$, așa cum este arătat în . Mulțimea tuturor punctelor unde acest lucru este adevărat este o linie la unghiuri drepte față de vectorul $\mathbf{w}$. Dacă am dori, am putea găsi ecuația pentru această linie și să vedem că este $2x + y = 1$ sau echivalent $y = 1 - 2x$.

Dacă ne uităm acum la ce se întâmplă când întrebăm despre mulțimea punctelor cu $\mathbf{w}\cdot\mathbf{v} > 1$ sau $\mathbf{w}\cdot\mathbf{v} < 1$, putem vedea că acestea sunt cazuri unde proiecțiile sunt mai lungi sau mai scurte decât $1/\|\mathbf{w}\|$, respectiv. Astfel, acele două inegalități definesc fiecare parte a liniei. În acest fel, am găsit o cale de a tăia spațiul nostru în două jumătăți, unde toate punctele de pe o parte au produsul scalar sub un prag, și cealaltă parte deasupra așa cum vedem în .

Dacă considerăm acum versiunea inegalității a expresiei, vedem că hiperplanul nostru (în acest caz: doar o linie) separă spațiul în două jumătăți.

Povestea în dimensiuni superioare este cam aceeași. Dacă luăm acum $\mathbf{w} = [1,2,3]^\top$ și întrebăm despre punctele în trei dimensiuni cu $\mathbf{w}\cdot\mathbf{v} = 1$, obținem un plan la unghiuri drepte față de vectorul dat $\mathbf{w}$. Cele două inegalități definesc din nou cele două părți ale planului așa cum este arătat în .

Hiperplanele în orice dimensiune separă spațiul în două jumătăți.

Deși capacitatea noastră de a vizualiza se epuizează în acest punct, nimic nu ne oprește să facem acest lucru în zeci, sute sau miliarde de dimensiuni. Acest lucru apare adesea când ne gândim la modele învățate automat. De exemplu, putem înțelege modelele de clasificare liniară precum cele din , ca metode de a găsi hiperplane care separă diferitele clase țintă. În acest context, astfel de hiperplane sunt adesea referite ca plane de decizie. Majoritatea modelelor de clasificare învățate profund se termină cu un strat liniar alimentat într-un softmax, deci se poate interpreta rolul rețelei neuronale profunde ca fiind acela de a găsi o încorporare (embedding) neliniară astfel încât clasele țintă să poată fi separate curat prin hiperplane.

Pentru a da un exemplu construit manual, observați că putem produce un model rezonabil pentru a clasifica imagini mici de tricouri și pantaloni din setul de date Fashion-MNIST (văzut în ) doar luând vectorul dintre mediile lor pentru a defini planul de decizie și a estima din ochi un prag brut. Mai întâi vom încărca datele și vom calcula mediile.

#@tab pytorch
# Load in the dataset
trans = []
trans.append(transforms.ToTensor())
trans = transforms.Compose(trans)
train = torchvision.datasets.FashionMNIST(root="../data", transform=trans,
                                          train=True, download=True)
test = torchvision.datasets.FashionMNIST(root="../data", transform=trans,
                                         train=False, download=True)
 
X_train_0 = torch.stack(
    [x[0] * 256 for x in train if x[1] == 0]).type(torch.float32)
X_train_1 = torch.stack(
    [x[0] * 256 for x in train if x[1] == 1]).type(torch.float32)
X_test = torch.stack(
    [x[0] * 256 for x in test if x[1] == 0 or x[1] == 1]).type(torch.float32)
y_test = torch.stack([torch.tensor(x[1]) for x in test
                      if x[1] == 0 or x[1] == 1]).type(torch.float32)
 
# Compute averages
ave_0 = torch.mean(X_train_0, axis=0)
ave_1 = torch.mean(X_train_1, axis=0)

Poate fi informativ să examinăm aceste medii în detaliu, deci să graficăm cum arată. În acest caz, vedem că media seamănă într-adevăr cu o imagine neclară a unui tricou.

În al doilea caz, vedem din nou că media seamănă cu o imagine neclară a unor pantaloni.

Într-o soluție complet învățată automat, am învăța pragul din setul de date. În acest caz, am estimat pur și simplu manual un prag care arăta bine pe datele de antrenament.

#@tab pytorch
# Print test set accuracy with eyeballed threshold
w = (ave_1 - ave_0).T
# '@' is Matrix Multiplication operator in pytorch.
predictions = X_test.reshape(2000, -1) @ (w.flatten()) > -1500000
 
# Accuracy
torch.mean((predictions.type(y_test.dtype) == y_test).float(), dtype=torch.float64)

Geometria Transformărilor Liniare

Prin și discuțiile de mai sus, avem o înțelegere solidă a geometriei vectorilor, lungimilor și unghiurilor. Totuși, există un obiect important pe care am omis să îl discutăm, și anume o înțelegere geometrică a transformărilor liniare reprezentate de matrice. Internalizarea completă a ceea ce pot face matricele pentru a transforma datele între două spații potențial diferite dimensional necesită o practică semnificativă, și este dincolo de scopul acestei anexe. Totuși, putem începe să construim intuiția în două dimensiuni.

Presupuneți că avem o matrice:

$$ \mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}. $$

Dacă vrem să aplicăm acest lucru unui vector arbitrar $\mathbf{v} = [x, y]^\top$, înmulțim și vedem că

$$ \begin{aligned} \mathbf{A}\mathbf{v} & = \begin{bmatrix}a & b \\ c & d\end{bmatrix}\begin{bmatrix}x \\ y\end{bmatrix} \\ & = \begin{bmatrix}ax+by\\ cx+dy\end{bmatrix} \\ & = x\begin{bmatrix}a \\ c\end{bmatrix} + y\begin{bmatrix}b \\d\end{bmatrix} \\ & = x\left\{\mathbf{A}\begin{bmatrix}1\\0\end{bmatrix}\right\} + y\left\{\mathbf{A}\begin{bmatrix}0\\1\end{bmatrix}\right\}. \end{aligned} $$

Acesta poate părea un calcul ciudat, unde ceva clar a devenit oarecum impenetrabil. Totuși, ne spune că putem scrie modul în care o matrice transformă orice vector în termeni de cum transformă doi vectori specifici: $[1,0]^\top$ și $[0,1]^\top$. Acest lucru merită luat în considerare pentru un moment. Am redus în esență o problemă infinită (ce se întâmplă cu orice pereche de numere reale) la una finită (ce se întâmplă cu acești vectori specifici). Acești vectori sunt un exemplu de bază, unde putem scrie orice vector din spațiul nostru ca o sumă ponderată a acestor vectori bază.

Să desenăm ce se întâmplă când folosim matricea specifică

$$ \mathbf{A} = \begin{bmatrix} 1 & 2 \\ -1 & 3 \end{bmatrix}. $$

Dacă ne uităm la vectorul specific $\mathbf{v} = [2, -1]^\top$, vedem că acesta este $2\cdot[1,0]^\top + -1\cdot[0,1]^\top$, și astfel știm că matricea $A$ va trimite acest lucru la $2(\mathbf{A}[1,0]^\top) + -1(\mathbf{A}[0,1])^\top = 2[1, -1]^\top - [2,3]^\top = [0, -5]^\top$. Dacă urmăm această logică cu atenție, să spunem luând în considerare grila tuturor perechilor de puncte întregi, vedem că ceea ce se întâmplă este că înmulțirea matriceală poate înclina, roti, și scala grila, dar structura grilei trebuie să rămână așa cum vedeți în .

Matricea $\mathbf{A}$ acționând asupra vectorilor bază dați. Observați cum întreaga grilă este transportată împreună cu ea.

Acesta este cel mai important punct intuitiv de internalizat despre transformările liniare reprezentate de matrice. Matricele sunt incapabile de a distorsiona unele părți ale spațiului diferit de altele. Tot ce pot face este să ia coordonatele originale pe spațiul nostru și să le încline, rotească și scaleze.

Unele distorsiuni pot fi severe. De exemplu matricea

$$ \mathbf{B} = \begin{bmatrix} 2 & -1 \\ 4 & -2 \end{bmatrix}, $$

comprimă întregul plan bidimensional într-o singură linie. Identificarea și lucrul cu astfel de transformări sunt subiectul unei secțiuni ulterioare, dar geometric putem vedea că acest lucru este fundamental diferit de tipurile de transformări pe care le-am văzut mai sus. De exemplu, rezultatul de la matricea $\mathbf{A}$ poate fi „îndoit înapoi” la grila originală. Rezultatele de la matricea $\mathbf{B}$ nu pot deoarece nu vom ști niciodată de unde a venit vectorul $[1,2]^\top$—a fost $[1,1]^\top$ sau $[0, -1]^\top$?

Deși această imagine a fost pentru o matrice $2\times2$, nimic nu ne împiedică să luăm lecțiile învățate în dimensiuni superioare. Dacă luăm vectori bază similari precum $[1,0, \ldots,0]$ și vedem unde îi trimite matricea noastră, putem începe să obținem un sentiment despre cum înmulțirea matriceală distorsionează întregul spațiu în orice spațiu dimensional cu care avem de-a face.

Dependență Liniară

Considerați din nou matricea

$$ \mathbf{B} = \begin{bmatrix} 2 & -1 \\ 4 & -2 \end{bmatrix}. $$

Aceasta comprimă întregul plan jos pentru a trăi pe o singură linie $y = 2x$. Întrebarea apare acum: există vreo cale prin care putem detecta acest lucru doar uitându-ne la matricea însăși? Răspunsul este că într-adevăr putem. Să luăm $\mathbf{b}_1 = [2,4]^\top$ și $\mathbf{b}_2 = [-1, -2]^\top$ ca fiind cele două coloane ale lui $\mathbf{B}$. Amintiți-vă că putem scrie totul transformat de matricea $\mathbf{B}$ ca o sumă ponderată a coloanelor matricei: precum $a_1\mathbf{b}_1 + a_2\mathbf{b}_2$. Numim aceasta o combinație liniară. Faptul că $\mathbf{b}_1 = -2\cdot\mathbf{b}_2$ înseamnă că putem scrie orice combinație liniară a acelor două coloane în întregime în termeni de să spunem $\mathbf{b}_2$ deoarece

$$ a_1\mathbf{b}_1 + a_2\mathbf{b}_2 = -2a_1\mathbf{b}_2 + a_2\mathbf{b}_2 = (a_2-2a_1)\mathbf{b}_2. $$

Acest lucru înseamnă că una dintre coloane este, într-un sens, redundantă deoarece nu definește o direcție unică în spațiu. Acest lucru nu ar trebui să ne surprindă prea mult deoarece am văzut deja că această matrice colapsează întregul plan într-o singură linie. Mai mult, vedem că dependența liniară $\mathbf{b}_1 = -2\cdot\mathbf{b}_2$ capturează acest lucru. Pentru a face acest lucru mai simetric între cei doi vectori, vom scrie acest lucru ca

$$ \mathbf{b}_1 + 2\cdot\mathbf{b}_2 = 0. $$

În general, vom spune că o colecție de vectori $\mathbf{v}_1, \ldots, \mathbf{v}_k$ sunt liniar dependenți dacă există coeficienți $a_1, \ldots, a_k$ nu toți egali cu zero astfel încât

$$ \sum_{i=1}^k a_i\mathbf{v_i} = 0. $$

În acest caz, putem rezolva pentru unul dintre vectori în termeni de o combinație a celorlalți, și efectiv să îl facem redundant. Astfel, o dependență liniară în coloanele unei matrice este un martor al faptului că matricea noastră comprimă spațiul jos la o dimensiune inferioară. Dacă nu există dependență liniară spunem că vectorii sunt liniar independenți. Dacă coloanele unei matrice sunt liniar independente, nu apare nicio compresie și operația poate fi anulată.

Rang

Dacă avem o matrice generală $n\times m$, este rezonabil să întrebăm în ce spațiu dimensional mapează matricea. Un concept cunoscut sub numele de rang va fi răspunsul nostru. În secțiunea anterioară, am notat că o dependență liniară este martoară a compresiei spațiului într-o dimensiune inferioară și astfel vom putea folosi acest lucru pentru a defini noțiunea de rang. În particular, rangul unei matrice $\mathbf{A}$ este cel mai mare număr de coloane liniar independente dintre toate subseturile de coloane. De exemplu, matricea

$$ \mathbf{B} = \begin{bmatrix} 2 & 4 \\ -1 & -2 \end{bmatrix}, $$

are $\textrm{rank}(B)=1$, deoarece cele două coloane sunt liniar dependente, dar oricare coloană singură nu este liniar dependentă. Pentru un exemplu mai provocator, putem considera

$$ \mathbf{C} = \begin{bmatrix} 1& 3 & 0 & -1 & 0 \\ -1 & 0 & 1 & 1 & -1 \\ 0 & 3 & 1 & 0 & -1 \\ 2 & 3 & -1 & -2 & 1 \end{bmatrix}, $$

și să arătăm că $\mathbf{C}$ are rangul doi deoarece, de exemplu, primele două coloane sunt liniar independente, totuși oricare dintre cele patru colecții de trei coloane sunt dependente.

Această procedură, așa cum este descrisă, este foarte ineficientă. Ea necesită examinarea fiecărui subset al coloanelor matricei noastre date, și astfel este potențial exponențială în numărul de coloane. Mai târziu vom vedea o cale mai eficientă computațional de a calcula rangul unei matrice, dar pentru moment, acest lucru este suficient pentru a vedea că conceptul este bine definit și pentru a înțelege semnificația.

Inversabilitate

Am văzut mai sus că înmulțirea cu o matrice cu coloane liniar dependente nu poate fi anulată, adică, nu există nicio operație inversă care poate recupera întotdeauna intrarea. Totuși, înmulțirea cu o matrice de rang complet (adică, o matrice $\mathbf{A}$ care este $n \times n$ cu rang $n$), ar trebui să o putem anula întotdeauna. Considerați matricea

$$ \mathbf{I} = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}. $$

care este matricea cu unu pe diagonală, și zero în rest. Numim aceasta matrice identitate. Este matricea care ne lasă datele neschimbate când este aplicată. Pentru a găsi o matrice care anulează ceea ce a făcut matricea noastră $\mathbf{A}$, vrem să găsim o matrice $\mathbf{A}^{-1}$ astfel încât

$$ \mathbf{A}^{-1}\mathbf{A} = \mathbf{A}\mathbf{A}^{-1} = \mathbf{I}. $$

Dacă privim acest lucru ca pe un sistem, avem $n \times n$ necunoscute (intrările lui $\mathbf{A}^{-1}$) și $n \times n$ ecuații (egalitatea care trebuie să țină între fiecare intrare a produsului $\mathbf{A}^{-1}\mathbf{A}$ și fiecare intrare a $\mathbf{I}$) deci ar trebui să ne așteptăm generic să existe o soluție. Într-adevăr, în secțiunea următoare vom vedea o cantitate numită determinant, care are proprietatea că atâta timp cât determinantul nu este zero, putem găsi o soluție. Numim o astfel de matrice $\mathbf{A}^{-1}$ matrice inversă. Ca un exemplu, dacă $\mathbf{A}$ este matricea generală $2 \times 2$

$$ \mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}, $$

atunci putem vedea că inversa este

$$ \frac{1}{ad-bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix}. $$

Putem testa pentru a vedea acest lucru văzând că înmulțirea cu inversa dată de formula de mai sus funcționează în practică.

#@tab pytorch
M = torch.tensor([[1, 2], [1, 4]], dtype=torch.float32)
M_inv = torch.tensor([[2, -1], [-0.5, 0.5]])
M_inv @ M

Probleme Numerice

Deși inversa unei matrice este utilă în teorie, trebuie să spunem că de cele mai multe ori nu dorim să folosim inversa matricei pentru a rezolva o problemă în practică. În general, există algoritmi mult mai stabili numeric pentru rezolvarea ecuațiilor liniare precum

$$ \mathbf{A}\mathbf{x} = \mathbf{b}, $$

decât calcularea inversei și înmulțirea pentru a obține

$$ \mathbf{x} = \mathbf{A}^{-1}\mathbf{b}. $$

Exact așa cum împărțirea la un număr mic poate duce la instabilitate numerică, la fel poate și inversarea unei matrice care este aproape de a avea rang scăzut.

Mai mult, este obișnuit ca matricea $\mathbf{A}$ să fie rară (sparse), ceea ce înseamnă că conține doar un număr mic de valori non-zero. Dacă ar fi să explorăm exemple, am vedea că acest lucru nu înseamnă că inversa este rară. Chiar dacă $\mathbf{A}$ ar fi o matrice de $1$ milion pe $1$ milion cu doar $5$ milioane de intrări non-zero (și astfel avem nevoie să stocăm doar acele $5$ milioane), inversa va avea tipic aproape fiecare intrare non-negativă, necesitându-ne să stocăm toate cele $1\textrm{M}^2$ intrări—adică $1$ trilion de intrări!

Deși nu avem timp să ne scufundăm complet în problemele numerice spinoase întâlnite frecvent când lucrăm cu algebra liniară, vrem să vă oferim o intuiție despre când să procedați cu prudență, și în general evitarea inversării în practică este o regulă bună.

Determinant

Vederea geometrică a algebrei liniare oferă o cale intuitivă de a interpreta o cantitate fundamentală cunoscută sub numele de determinant. Considerați imaginea grilei de dinainte, dar acum cu o regiune evidențiată ().

Matricea $\mathbf{A}$ distorsionând din nou grila. De data aceasta, vreau să atrag atenția în mod particular asupra a ceea ce se întâmplă cu pătratul evidențiat.

Priviți pătratul evidențiat. Acesta este un pătrat cu marginile date de $(0, 1)$ și $(1, 0)$ și astfel are aria unu. După ce $\mathbf{A}$ transformă acest pătrat, vedem că devine un paralelogram. Nu există niciun motiv ca acest paralelogram să aibă aceeași arie cu care am început, și într-adevăr în cazul specific arătat aici de

$$ \mathbf{A} = \begin{bmatrix} 1 & 2 \\ -1 & 3 \end{bmatrix}, $$

este un exercițiu de geometrie analitică să calculăm aria acestui paralelogram și să obținem că aria este $5$.

În general, dacă avem o matrice

$$ \mathbf{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix}, $$

putem vedea cu ceva calcul că aria paralelogramului rezultat este $ad-bc$. Această arie este referită ca determinantul.

Să verificăm acest lucru rapid cu niște cod exemplu.

#@tab pytorch
torch.det(torch.tensor([[1, -1], [2, 3]], dtype=torch.float32))

Cei cu ochi de vultur dintre noi vor observa că această expresie poate fi zero sau chiar negativă. Pentru termenul negativ, aceasta este o chestiune de convenție luată general în matematică: dacă matricea răstoarnă figura, spunem că aria este negată. Să vedem acum că atunci când determinantul este zero, aflăm mai multe.

Să considerăm

$$ \mathbf{B} = \begin{bmatrix} 2 & 4 \\ -1 & -2 \end{bmatrix}. $$

Dacă calculăm determinantul acestei matrice, obținem $2\cdot(-2 ) - 4\cdot(-1) = 0$. Dată fiind înțelegerea noastră de mai sus, acest lucru are sens. $\mathbf{B}$ comprimă pătratul din imaginea originală într-un segment de linie, care are arie zero. Și într-adevăr, fiind comprimat într-un spațiu dimensional inferior este singura cale de a avea arie zero după transformare. Astfel vedem că următorul rezultat este adevărat: o matrice $A$ este inversabilă dacă și numai dacă determinantul nu este egal cu zero.

Ca un comentariu final, imaginați-vă că avem orice figură desenată pe plan. Gândind ca niște informaticieni, putem descompune acea figură într-o colecție de pătrate mici astfel încât aria figurii este în esență doar numărul de pătrate din descompunere. Dacă transformăm acum acea figură printr-o matrice, trimitem fiecare dintre aceste pătrate în paralelograme, fiecare dintre ele având aria dată de determinant. Vedem că pentru orice figură, determinantul dă numărul (cu semn) cu care o matrice scalează aria oricărei figuri.

Calcularea determinanților pentru matrice mai mari poate fi laborioasă, dar intuiția este aceeași. Determinantul rămâne factorul cu care matricele $n\times n$ scalează volumele $n$-dimensionale.

Tensori și Operații Comune de Algebră Liniară

În conceptul de tensori a fost introdus. În această secțiune, ne vom scufunda mai adânc în contracțiile tensoriale (echivalentul tensorial al înmulțirii matriceale), și vom vedea cum poate oferi o vedere unificată asupra unui număr de operații cu matrice și vectori.

Cu matricele și vectorii știam cum să îi înmulțim pentru a transforma datele. Trebuie să avem o definiție similară pentru tensori dacă ei urmează să ne fie utili. Gândiți-vă la înmulțirea matriceală:

$$ \mathbf{C} = \mathbf{A}\mathbf{B}, $$

sau echivalent

$$ c_{i, j} = \sum_{k} a_{i, k}b_{k, j}.$$

Acest tipar este unul pe care îl putem repeta pentru tensori. Pentru tensori, nu există un singur caz despre ce să sumăm care poate fi ales universal, deci trebuie să specificăm exact peste ce indici vrem să sumăm. De exemplu am putea considera

$$ y_{il} = \sum_{jk} x_{ijkl}a_{jk}. $$

O astfel de transformare este numită o contracție tensorială. Ea poate reprezenta o familie mult mai flexibilă de transformări decât înmulțirea matriceală singură.

Ca o simplificare notațională folosită adesea, putem observa că suma este peste exact acei indici care apar de mai multe ori în expresie, astfel oamenii lucrează adesea cu notația Einstein, unde însumarea este luată implicit peste toți indicii repetați. Aceasta dă expresia compactă:

$$ y_{il} = x_{ijkl}a_{jk}. $$

Exemple Comune din Algebra Liniară

Să vedem câte dintre definițiile algebrice liniare pe care le-am văzut înainte pot fi exprimate în această notație tensorială comprimată:

În acest fel, putem înlocui o multitudine de notații specializate cu expresii tensoriale scurte.

Exprimarea în Cod

Tensorii pot fi operați flexibil și în cod de asemenea. Așa cum s-a văzut în , putem crea tensori așa cum este arătat mai jos.

#@tab pytorch
# Define tensors
B = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
A = torch.tensor([[1, 2], [3, 4]])
v = torch.tensor([1, 2])
 
# Print out the shapes
A.shape, B.shape, v.shape

Însumarea Einstein a fost implementată direct. Indicii care apar în însumarea Einstein pot fi transmiși ca un șir, urmați de tensorii asupra cărora se acționează. De exemplu, pentru a implementa înmulțirea matriceală, putem considera însumarea Einstein văzută mai sus ($\mathbf{A}\mathbf{v} = a_{ij}v_j$) și să eliminăm indicii înșiși pentru a obține implementarea:

#@tab pytorch
# Reimplement matrix multiplication
torch.einsum("ij, j -> i", A, v), A@v

Aceasta este o notație extrem de flexibilă. De exemplu dacă vrem să calculăm ceea ce ar fi scris tradițional ca

$$ c_{kl} = \sum_{ij} \mathbf{b}_{ijk}\mathbf{a}_{il}v_j. $$

poate fi implementat via însumare Einstein ca:

#@tab pytorch
torch.einsum("ijk, il, j -> kl", B, A, v)

Această notație este lizibilă și eficientă pentru oameni, totuși voluminoasă dacă din orice motiv trebuie să generăm o contracție tensorială programatic. Din acest motiv, einsum oferă o notație alternativă prin furnizarea indicilor întregi pentru fiecare tensor. De exemplu, aceeași contracție tensorială poate fi scrisă de asemenea ca:

#@tab pytorch
# PyTorch does not support this type of notation.

Oricare notație permite reprezentarea concisă și eficientă a contracțiilor tensoriale în cod.

Rezumat

Exerciții

  1. Care este unghiul dintre $$ \vec v_1 = \begin{bmatrix} 1 \\ 0 \\ -1 \\ 2 \end{bmatrix}, \qquad \vec v_2 = \begin{bmatrix} 3 \\ 1 \\ 0 \\ 1 \end{bmatrix}? $$
  2. Adevărat sau fals: $\begin{bmatrix}1 & 2\\0&1\end{bmatrix}$ și $\begin{bmatrix}1 & -2\\0&1\end{bmatrix}$ sunt inverse una alteia?
  3. Presupuneți că desenăm o formă în plan cu aria $100\textrm{m}^2$. Care este aria după transformarea figurii prin matricea $$ \begin{bmatrix} 2 & 3\\ 1 & 2 \end{bmatrix}. $$
  4. Care dintre următoarele seturi de vectori sunt liniar independente?
  1. Presupuneți că aveți o matrice scrisă ca $A = \begin{bmatrix}c\\d\end{bmatrix}\cdot\begin{bmatrix}a & b\end{bmatrix}$ pentru o alegere de valori $a, b, c$, și $d$. Adevărat sau fals: determinantul unei astfel de matrice este întotdeauna $0$?
  2. Vectorii $e_1 = \begin{bmatrix}1\\0\end{bmatrix}$ și $e_2 = \begin{bmatrix}0\\1\end{bmatrix}$ sunt ortogonali. Care este condiția asupra unei matrice $A$ astfel încât $Ae_1$ și $Ae_2$ să fie ortogonali?
  3. Cum puteți scrie $\textrm{tr}(\mathbf{A}^4)$ în notația Einstein pentru o matrice arbitrară $A$?

Discuții