ML Atlas

03 · Nadzorowane · 4 min czytania · aktualizacja

Na czym polega sztuczka jądrowa (kernel trick) w SVM?

W skrócie

Sztuczka jądrowa pozwala modelowi liniowemu działać w ogromnej przestrzeni cech bez jej liczenia: wystarczy funkcja, która zwraca iloczyny skalarne.

Co to jest

Sztuczka jądrowa (kernel trick) to technika, która pozwala algorytmowi liniowemu działać tak, jakby dane przeniesiono do przestrzeni o wielu (nawet nieskończenie wielu) wymiarach, bez faktycznego obliczania współrzędnych w tej przestrzeni. Działa wtedy, gdy algorytm korzysta z danych wyłącznie przez iloczyny skalarne par punktów — wtedy każdy iloczyn φ(x)·φ(z) w dużej przestrzeni zastępuje się funkcją jądra K(x, z) liczoną wprost na oryginalnych danych.

Po co przenosić dane? Klasy, których nie da się rozdzielić prostą na płaszczyźnie, często da się rozdzielić płaszczyzną w przestrzeni z dodatkowymi cechami. Klasyczny przykład: punkty jednej klasy w środku koła, drugiej — dookoła. Żadna prosta ich nie rozdzieli, ale po dodaniu cechy x₁² + x₂² (kwadrat odległości od środka) wystarczy jeden próg.

Sztuczkę spopularyzowały maszyny wektorów nośnych (Boser, Guyon, Vapnik, 1992), choć sam pomysł jąder w rozpoznawaniu wzorców pojawił się już w pracach Ajzermana, Brawermana i Rozonoera w latach 60. Dziś działa także w jądrowej regresji grzbietowej, jądrowym PCA i procesach gaussowskich.

Mechanizm — dlaczego tak działa

Weźmy dwa punkty na płaszczyźnie i jądro wielomianowe K(x, z) = (x·z)². Rozpisując kwadrat, dostajemy x₁²z₁² + 2x₁x₂z₁z₂ + x₂²z₂², a to dokładnie iloczyn skalarny wektorów φ(x) = (x₁², √2·x₁x₂, x₂²) i φ(z) zbudowanych tak samo. Licząc jedno mnożenie i kwadrat w dwóch wymiarach, dostaliśmy wynik z trójwymiarowej przestrzeni cech kwadratowych — bez tworzenia tej przestrzeni.

Przy większej liczbie cech zysk staje się ogromny. Jądro (x·z + 1)^d odpowiada wszystkim jednomianom stopnia do d; dla 13 cech i d = 5 to 8568 wymiarów, a koszt obliczenia jądra to nadal jeden iloczyn skalarny 13 liczb i potęgowanie. Jądro gaussowskie (RBF) K(x, z) = exp(−γ‖x − z‖²) odpowiada przestrzeni nieskończenie wymiarowej — tam jawne obliczenia są w ogóle niemożliwe, a jądro wciąż liczy się jednym krótkim wzorem.

Dlaczego algorytmy potrzebują tylko iloczynów skalarnych? W SVM rozwiązanie da się zapisać jako kombinację punktów treningowych: f(x) = Σ αᵢ yᵢ K(xᵢ, x) + b, gdzie niezerowe αᵢ mają tylko wektory nośne. Zarówno trening (w postaci dualnej), jak i przewidywanie odwołują się do danych tylko przez K. Ogólniej mówi o tym twierdzenie o reprezentacji: dla szerokiej klasy problemów z regularyzacją optymalna funkcja jest kombinacją jąder wokół punktów treningowych.

Nie każda funkcja nadaje się na jądro. Warunek Mercera wymaga, żeby macierz K(xᵢ, xⱼ) dla dowolnego zbioru punktów była dodatnio półokreślona — wtedy istnieje przestrzeń, w której K jest iloczynem skalarnym. Jądro można też rozumieć prościej: jako miarę podobieństwa dwóch punktów, a model jądrowy — jako ważone głosowanie podobnych przykładów, coś pomiędzy regresją liniową a metodą najbliższych sąsiadów.

Koszty i granice: macierz jąder ma n × n elementów, więc przy 100 tysiącach przykładów to 10 miliardów liczb. Dlatego metody jądrowe najlepiej działają na małych i średnich zbiorach, a dla dużych stosuje się przybliżenia (metoda Nyströma, losowe cechy Fouriera). Elastyczność też kosztuje — jądro RBF z dużym γ potrafi zapamiętać każdy punkt.

Na przykładzie

Najpierw rachunek na liczbach. Dla x = (1, 2) i z = (3, 1) mamy x·z = 5, więc K(x, z) = (x·z)² = 25. Jawnie: φ(x) = (1; 2√2; 4), φ(z) = (9; 3√2; 1), a ich iloczyn skalarny to 9 + 12 + 4 = 25. Ten sam wynik, ale jądro nie potrzebowało trzeciego wymiaru.

Teraz zbiór Wine: 178 win, 13 standaryzowanych cech chemicznych. Jawne cechy dla jądra (x·z + 1)² to 105 kolumn (stała, 13 cech liniowych, 13 kwadratów, 78 iloczynów par). Policzyliśmy macierz 178 × 178 obiema drogami — jądrem i jawnym iloczynem 105-wymiarowych wektorów — i największa różnica wyniosła 4,5·10⁻¹³, czyli tyle, ile wynoszą błędy zaokrągleń. Na dwóch cechach (zawartość alkoholu i kwasu jabłkowego) różnica w trafności też jest widoczna: w 5-krotnej walidacji krzyżowej (random_state=0) liniowa SVM ma 77,0%, a z jądrem RBF lub wielomianowym stopnia 2 — 80,3%. Na wszystkich 13 cechach klasy są niemal liniowo rozdzielne i zysk z jądra jest mniejszy.

Dane: Wine (wina z Piemontu)

W praktyce

  • W scikit-learn: SVC(kernel="rbf" | "poly" | "linear" | "sigmoid"); własne jądro jako funkcja albo kernel="precomputed" z gotową macierzą.
  • Jądro RBF to rozsądny domyślny wybór; parametr gamma="scale" ustawia γ = 1 / (liczba cech · wariancja X).
  • Inne modele jądrowe: KernelRidge, KernelPCA, GaussianProcessRegressor.
  • Dla dużych zbiorów: Nystroem lub RBFSampler (losowe cechy Fouriera) tworzą przybliżone cechy, a potem szybki model liniowy, np. LinearSVC.
  • Przed jądrami opartymi na odległości zawsze standaryzuj cechy.

Najczęstsze pytania

Czym jest funkcja jądra?
To funkcja dwóch punktów, która zwraca ich iloczyn skalarny w pewnej (zwykle dużo większej) przestrzeni cech, bez obliczania tej przestrzeni. Intuicyjnie mierzy podobieństwo: dla jądra RBF wynosi 1 dla identycznych punktów i maleje do 0 wraz z odległością.
Czy sztuczka jądrowa działa tylko w SVM?
Nie. Działa w każdym algorytmie, który da się zapisać wyłącznie za pomocą iloczynów skalarnych: w regresji grzbietowej, PCA, analizie dyskryminacyjnej, procesach gaussowskich, a nawet w perceptronie. SVM jest po prostu najbardziej znanym przykładem.
Dlaczego nie dodać po prostu cech wielomianowych jawnie?
Przy kilku cechach i niskim stopniu to rozsądne i daje ten sam model. Przy wielu cechach liczba kolumn eksploduje (13 cech i stopień 5 to 8568 kolumn), a dla jądra RBF jawna przestrzeń jest nieskończona. Jądro omija ten koszt, płacąc za to macierzą n × n.

Źródła

  • Boser B. E., Guyon I. M., Vapnik V. N. „A Training Algorithm for Optimal Margin Classifiers”, COLT 1992.
  • Schölkopf B., Smola A. J. „Learning with Kernels”, MIT Press, 2002.
  • Bishop C. „Pattern Recognition and Machine Learning”, Springer, 2006, rozdz. 6 i 7.
  • Hastie T., Tibshirani R., Friedman J. „The Elements of Statistical Learning”, 2nd ed., 2009, rozdz. 12.3.
  • Dokumentacja scikit-learn, „Kernel functions”: https://scikit-learn.org/stable/modules/svm.html#kernel-functions

Zobacz też