01 · Podstawy · 4 min czytania · aktualizacja
Co tak naprawdę robi mnożenie macierzy przez wektor?
W skrócie
Macierz to przepis na przekształcenie przestrzeni: obraca, rozciąga, rzutuje. Mnożenie macierzy przez wektor przenosi punkt, a warstwa sieci robi to samo.
Co to jest
Macierz to prostokątna tablica liczb o m wierszach i n kolumnach. Najważniejsze jest jednak nie to, jak wygląda, tylko co robi: macierz m × n to przekształcenie liniowe, które każdy wektor z przestrzeni n-wymiarowej zamienia na wektor m-wymiarowy. Mnożenie y = A x to zastosowanie tego przekształcenia do punktu x.
Przekształcenie liniowe zachowuje dwie rzeczy: proste przechodzą w proste, a początek układu zostaje na miejscu. W praktyce oznacza to obroty, rozciągania wzdłuż osi, odbicia, ścinania i rzuty na mniejszą liczbę wymiarów — oraz dowolne ich złożenia. Nic się nie zakrzywia.
Ta perspektywa zamienia rachunki w obrazy. Standaryzacja cech to macierz diagonalna, która rozciąga lub ściska każdą oś osobno. PCA to obrót, po którym zostawiamy kilka pierwszych osi. Warstwa sieci neuronowej to macierz wag, czyli przekształcenie liniowe, po którym następuje nieliniowa funkcja aktywacji.
Mechanizm — dlaczego tak działa
Najprostszy sposób, żeby „zobaczyć” macierz: kolumny macierzy to obrazy wektorów bazowych. Pierwsza kolumna mówi, dokąd trafia wektor (1, 0, …, 0), druga — dokąd trafia (0, 1, 0, …) i tak dalej. Ponieważ każdy wektor jest kombinacją wektorów bazowych, a przekształcenie jest liniowe, A x to po prostu ta sama kombinacja kolumn: x₁ · (kolumna 1) + x₂ · (kolumna 2) + …
Równoważne spojrzenie od strony wierszy: i-ta składowa wyniku to iloczyn skalarny i-tego wiersza macierzy z wektorem x. Każdy wiersz jest więc „detektorem” — mierzy, ile z x leży w jego kierunku. Warstwa sieci o 64 neuronach to 64 takie detektory działające równolegle.
Mnożenie macierzy to składanie przekształceń. Iloczyn B A oznacza „najpierw A, potem B”. Dlatego kolejność ma znaczenie (obrót, a potem rozciągnięcie to co innego niż rozciągnięcie, a potem obrót) i dlatego wymiary muszą do siebie pasować. Z tego wynika też ważna obserwacja o sieciach: złożenie dwóch warstw liniowych bez nieliniowości to wciąż jedna macierz. Bez funkcji aktywacji głęboka sieć nie byłaby ani trochę bardziej wyrazista od regresji liniowej.
Ile przekształcenie „rozciąga” przestrzeń, mówi wyznacznik: to współczynnik, o jaki zmienia się pole (w 2D) lub objętość (w nD). Wyznacznik równy zero oznacza, że przestrzeń zostaje spłaszczona do mniejszego wymiaru — informacji nie da się odzyskać i macierz nie ma odwrotności. Rzut z czterech wymiarów na dwa jest właśnie takim nieodwracalnym spłaszczeniem.
Są kierunki szczególne: takie, które przekształcenie tylko wydłuża lub skraca, nie zmieniając ich kierunku. To wektory własne, a współczynniki wydłużenia to wartości własne. Rozkład macierzy na takie „naturalne osie” (rozkład własny, SVD) jest podstawą PCA, analizy stabilności treningu i kompresji modeli.
Na przykładzie
PCA na zbiorze Iris znajduje macierz W o wymiarach 2 × 4, która przenosi każdy kwiat z czterech wymiarów na płaszczyznę. Jej wiersze (po zaokrągleniu) to (0,361; −0,085; 0,857; 0,358) oraz (0,657; 0,730; −0,173; −0,075). Pierwszy wiersz to detektor „dużego kwiatu z długimi płatkami” — największą wagę ma długość płatka. Drugi reaguje głównie na wymiary działki kielicha. Wiersze są do siebie prostopadłe i mają długość 1, więc W Wᵀ daje macierz jednostkową: to czysty obrót połączony z rzutem, bez rozciągania.
Pierwszy kwiat po odjęciu średniej to wektor (−0,743; 0,443; −2,358; −0,999). Pomnożony przez W ląduje w punkcie (−2,684; 0,319): daleko po „małej” stronie pierwszej osi, jak wszystkie kwiaty setosy. Całkowita wariancja danych to 4,573, a po rzucie zostaje 4,228 + 0,243, czyli 97,8%. Średni kwadrat błędu odtworzenia wynosi 0,101 przy średnim kwadracie długości wektora 4,54 — spłaszczenie czterech wymiarów do dwóch kosztuje tu nieco ponad 2% informacji o rozrzucie.
Dane: Iris (irysy Fishera)
W praktyce
- W NumPy i PyTorch mnożenie macierzy to operator
@(A @ x);*mnoży element po elemencie, a pomylenie tych dwóch to klasyczny błąd. torch.nn.Linear(n, m)przechowuje macierz wag o kształcie (m, n) i wektor przesunięcia; liczy x Wᵀ + b dla całej partii naraz.sklearn.decomposition.PCAudostępnia macierz rzutu wcomponents_;transformto odjęcie średniej i mnożenie przez nią.np.linalg.det,np.linalg.eiginp.linalg.svddają wyznacznik, wartości własne i rozkład SVD; zamiast jawnie odwracać macierz (inv), rozwiązuj układnp.linalg.solve, bo to stabilniejsze numerycznie.- Błąd „shapes cannot be multiplied” prawie zawsze oznacza pomyloną orientację: przykłady w wierszach kontra w kolumnach.
Najczęstsze pytania
- Dlaczego mnożenie macierzy nie jest przemienne?
- Bo to składanie przekształceń, a kolejność operacji zmienia wynik: najpierw obrót, potem rozciągnięcie wzdłuż osi x daje inny kształt niż odwrotna kolejność. Czasem AB i BA mają nawet różne wymiary albo tylko jedno z nich jest określone.
- Czy przesunięcie (bias) to też przekształcenie liniowe?
- Nie, przesunięcie przenosi początek układu, więc jest przekształceniem afinicznym. Często sztucznie dokłada się do wektora składową równą 1, żeby zapisać przesunięcie jako część macierzy.
- Po co sieci nieliniowość, skoro macierze są tak potężne?
- Bo złożenie dowolnie wielu macierzy to nadal jedna macierz, a ona umie tylko obracać, rozciągać i rzutować. Funkcja aktywacji między warstwami zagina przestrzeń, dzięki czemu sieć może rozdzielać klasy, których żadna płaszczyzna nie rozdzieli.
Źródła
- Strang „Introduction to Linear Algebra”, 5th ed., Wellesley-Cambridge Press, 2016, rozdz. 2 i 8 (Linear Transformations).
- Deisenroth, Faisal, Ong „Mathematics for Machine Learning”, Cambridge University Press, 2020, rozdz. 2 i 4 (Matrix Decompositions).
- Goodfellow, Bengio, Courville „Deep Learning”, MIT Press, 2016, rozdz. 2.
- Pearson, 1901, „On lines and planes of closest fit to systems of points in space”, Philosophical Magazine 2(11), 559–572.
- Dokumentacja scikit-learn: PCA, https://scikit-learn.org/stable/modules/decomposition.html#pca