01 · Podstawy · 4 min czytania · Interaktywne · aktualizacja
Co to jest iloczyn skalarny i podobieństwo kosinusowe wektorów?
W skrócie
Iloczyn skalarny mierzy, jak bardzo dwa wektory wskazują w tę samą stronę. Podzielony przez ich długości daje podobieństwo kosinusowe od −1 do 1.
Co to jest
Iloczyn skalarny dwóch wektorów to suma iloczynów ich odpowiadających sobie składowych: a · b = a₁b₁ + a₂b₂ + … + aₙbₙ. Wynik jest jedną liczbą, która rośnie, gdy wektory są długie i wskazują w podobnym kierunku. Podobieństwo kosinusowe to iloczyn skalarny podzielony przez długości obu wektorów: cos(a, b) = a · b / (‖a‖ ‖b‖); przyjmuje wartości od −1 (przeciwne kierunki) przez 0 (prostopadłe) do 1 (ten sam kierunek).
To najczęściej wykonywane działanie w całym uczeniu maszynowym. Neuron liczy iloczyn skalarny wag i wejść. Regresja liniowa i logistyczna to iloczyn skalarny plus wyraz wolny. Mechanizm uwagi w transformerze porównuje zapytania z kluczami iloczynem skalarnym. Wyszukiwarki wektorowe szukają dokumentów o największym podobieństwie kosinusowym do pytania.
Intuicja: iloczyn skalarny odpowiada na pytanie „ile z wektora b leży w kierunku wektora a?”. Jeśli a to kierunek „im więcej, tym bardziej chory”, to a · x mówi, jak daleko pacjent x przesunął się w tę stronę.
Mechanizm — dlaczego tak działa
Kluczowa tożsamość brzmi: a · b = ‖a‖ ‖b‖ cos θ, gdzie θ to kąt między wektorami. Wynika ona z twierdzenia cosinusów zastosowanego do trójkąta o bokach a, b i a − b. Dlatego iloczyn skalarny łączy dwie informacje: długości i kąt. Gdy podzielimy go przez długości, zostaje sam kąt — i to jest podobieństwo kosinusowe.
Kiedy chcemy pozbyć się długości? Gdy długość nie niesie sensu, tylko „ilość”. Dokument dwa razy dłuższy ma dwa razy większe liczniki słów, ale nie jest przez to o czymś innym. Wektor (1, 2) i (2, 4) wskazują ten sam kierunek; ich kosinus wynosi 1, choć odległość euklidesowa między nimi jest niezerowa. Dla tekstów i embeddingów kierunek zwykle mówi o treści, a długość o czymś ubocznym (długości tekstu, częstości słowa).
Iloczyn skalarny jest też rzutem. Jeśli ‖a‖ = 1, to a · b jest długością cienia, jaki b rzuca na prostą wyznaczoną przez a. Model liniowy w = (w₁, …, wₙ) robi właśnie to: rzutuje każdy przykład na jeden kierunek i porównuje wynik z progiem. Granica decyzyjna w · x + b = 0 to płaszczyzna prostopadła do w.
Ważne zastrzeżenie: kosinus zależy od tego, gdzie jest początek układu. Gdy wszystkie cechy są dodatnie (wzrost, waga, ceny), wszystkie wektory leżą w jednym „rogu” przestrzeni i ich kosinusy są bliskie 1 niezależnie od tego, jak bardzo się różnią. Dopiero wycentrowanie danych (odjęcie średniej) sprawia, że kosinus mierzy, czy dwa przypadki odchylają się od przeciętnej w tę samą stronę. Kosinus wektorów wycentrowanych to dokładnie współczynnik korelacji Pearsona.
Drugie zastrzeżenie: kosinus traci sens dla wektora zerowego (dzielenie przez zero) i jest niestabilny dla wektorów bardzo krótkich, gdzie kierunek jest w dużej mierze szumem.
Na przykładzie
Weźmy średnie wektory trzech gatunków ze zbioru Iris (cztery wymiary kwiatu w centymetrach). Surowe podobieństwo kosinusowe wynosi 0,925 dla pary setosa–versicolor, 0,888 dla setosa–virginica i 0,996 dla versicolor–virginica. Wszystkie liczby są bliskie 1, bo wszystkie wymiary są dodatnie, więc każdy kwiat to strzałka skierowana mniej więcej „w górę i w prawo”. Taki kosinus prawie nie odróżnia gatunków.
Po odjęciu średniej całego zbioru obraz się zmienia: setosa–versicolor daje −0,918, setosa–virginica −0,994, a versicolor–virginica 0,867. Teraz kosinus mówi coś sensownego: setosa odchyla się od przeciętnego kwiatu dokładnie w przeciwną stronę niż virginica (małe płatki kontra duże płatki), a versicolor i virginica odchylają się w tę samą stronę. Dla porównania: pierwszy kwiat zbioru i jego „podwojona” wersja mają kosinus równy 1, choć dzieli je odległość 6,35 cm — kosinus jest ślepy na skalę.
Dane: Iris (irysy Fishera)
W praktyce
- W NumPy iloczyn skalarny to
a @ blubnp.dot(a, b); w PyTorchtorch.dot, a dla partii wektorówtorch.matmul. - Podobieństwo kosinusowe:
sklearn.metrics.pairwise.cosine_similaritylubtorch.nn.functional.cosine_similarity. - Jeśli wektory znormalizujesz do długości 1 (
sklearn.preprocessing.normalize), iloczyn skalarny staje się kosinusem — tak robi wiele baz wektorowych, bo to szybsze. - Dla cech dodatnich wycentruj dane przed liczeniem kosinusa, inaczej wszystko wyjdzie „podobne”.
- W uwadze transformera iloczyn skalarny dzieli się przez √d (wymiar wektora), bo bez tego wartości rosną z wymiarem i softmax staje się zbyt ostry.
Najczęstsze pytania
- Kiedy używać kosinusa, a kiedy odległości euklidesowej?
- Kosinus, gdy liczy się kierunek, a długość jest przypadkowa: teksty, embeddingi, profile preferencji. Odległość euklidesowa, gdy wielkości mają znaczenie bezwzględne, np. pomiary fizyczne po standaryzacji. Dla wektorów o długości 1 obie miary dają ten sam ranking sąsiadów.
- Co znaczy kosinus równy zero?
- Wektory są prostopadłe: w kierunku jednego nie ma nic z drugiego. W przestrzeniach o setkach wymiarów losowe wektory są niemal prostopadłe, więc kosinus bliski 0 to „brak związku”, a nie „przeciwieństwo”.
- Czy kosinus jest metryką odległości?
- Nie w ścisłym sensie — 1 − cos nie spełnia nierówności trójkąta. W praktyce nie przeszkadza to w wyszukiwaniu sąsiadów, ale niektóre algorytmy wymagające prawdziwej metryki mogą zachowywać się inaczej.
Źródła
- Deisenroth, Faisal, Ong „Mathematics for Machine Learning”, Cambridge University Press, 2020, rozdz. 3 (Analytic Geometry: inner products, lengths, angles, projections).
- Goodfellow, Bengio, Courville „Deep Learning”, MIT Press, 2016, rozdz. 2.
- Jurafsky, Martin „Speech and Language Processing”, 3rd ed. draft, rozdz. 6 (Vector Semantics and Embeddings).
- Vaswani i in., 2017, „Attention Is All You Need”, NeurIPS, arXiv:1706.03762.
- Dokumentacja scikit-learn: cosine_similarity, https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html