Jak jądro prostego perceptronu?

10

Problemy klasyfikacyjne z nieliniowymi granicami nie mogą być rozwiązane przez prosty perceptron . Poniższy kod R służy do celów ilustracyjnych i jest oparty na tym przykładzie w języku Python):

nonlin <- function(x, deriv = F) {
  if (deriv) x*(1-x)
  else 1/(1+exp(-x))
}

X <- matrix(c(-3,1,
              -2,1,
              -1,1,
               0,1,
               1,1,
               2,1,
               3,1), ncol=2, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(2,-1,1)

for (iter in 1:100000) {
  l1 <- nonlin(X %*% syn0)
  l1_error <- y - l1
  l1_delta <- l1_error * nonlin(l1,T)
  syn0 <- syn0 + t(X) %*% l1_delta
}

print("Output After Training:")
## [1] "Output After Training:"
round(l1,3)
##       [,1]
## [1,] 0.488
## [2,] 0.468
## [3,] 0.449
## [4,] 0.429
## [5,] 0.410
## [6,] 0.391
## [7,] 0.373

Teraz idea jądra i tak zwanej sztuczki jądra polega na rzutowaniu przestrzeni wejściowej na przestrzeń o wyższym wymiarze, taką jak ( źródła zdjęć ):

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Moje pytanie
Jak korzystać ze sztuczki jądra (np. Z prostym jądrem kwadratowym), aby uzyskać perceptron jądra , który jest w stanie rozwiązać dany problem z klasyfikacją? Uwaga: Jest to głównie pytanie koncepcyjne, ale gdybyś mógł także podać niezbędną modyfikację kodu, byłoby świetnie

To, co próbowałem do tej pory
, wypróbowałem następujące, które działa dobrze, ale myślę, że to nie jest prawdziwa okazja, ponieważ staje się zbyt drogie obliczeniowo w przypadku bardziej skomplikowanych problemów („sztuczka” za „sztuczką z jądrem” to nie tylko idea samo jądro, ale nie musisz obliczać projekcji dla wszystkich instancji):

X <- matrix(c(-3,9,1,
              -2,4,1,
              -1,1,1,
               0,0,1,
               1,1,1,
               2,4,1,
               3,9,1), ncol=3, byrow=T)

y <- c(0,0,1,1,1,0,0)

syn0 <- runif(3,-1,1)

Pełne ujawnienie
Zamieściłem to pytanie tydzień temu na SO, ale nie zyskało ono dużej uwagi. Podejrzewam, że jest to lepsze miejsce, ponieważ jest bardziej pytaniem koncepcyjnym niż programowym.

vonjd
źródło

Odpowiedzi:

2

XX=X,X<,>:Rp×RpRk:Rp×RpR

K.(xja,xjot)=exp(-||xja-xjot||2)2)σ2))

Jak wspomniano na stronie Wikipedii na temat perceptronu jądra , wybieramy podzbiór wielkości danych wejściowych i używamy ich liniowej kombinacji, aby uzyskać nasz wynik, M.

fa(x)=jaM.αjayjaK.(x,xja)

Jeśli widziałeś maszynę wektorów wsparcia ( SVM ), zauważysz identyczny dual. Aby wybrać podzbiór rozmiaru do użycia, optymalizujemy ponad , które reprezentują, czy próbka jest wektorem wspierającym / naszego rozwiązania. W optymalizacji uwzględniamy wagi oryginalnej optymalizacji perceptronu.α i i α i ω iM.αjajaαjaωja

Jeśli chodzi o twoje pytanie o konieczności obliczania rzutu, masz rację, twoja macierz danych wejściowych jest nadal dwuwymiarowa. W obliczeniach danych wyjściowych zastąpiliśmy iloczyn skalarny funkcją jądra i w tym miejscu następuje obliczenie „niejawne” w przestrzeni cech.X

Kellan Fluette
źródło
Dziękujemy - czy możesz uściślić swoją odpowiedź w tym sensie, że określasz, które wiersze w powyższym kodzie należy zmodyfikować w jaki sposób? Jeśli nie znasz R, modyfikacje można oczywiście podać w pseudokodzie. Z radością przyjąłbym twoją odpowiedź :-)
vonjd
Wpis, do którego linkujesz, na którym opierasz swój kod, jest, moim zdaniem, słabą prezentacją perceptronów i propagacji wstecznej, choć z pewnością jest zwięzły. Czy wiesz, jak działa propagacja wsteczna i ogólna teoria perceptronów?
Kellan Fluette,
Do pewnego stopnia mam nadzieję. O co ci dokładnie chodzi? Jak zmodyfikowałbyś powyższy kod, aby użyć sztuczki jądra z jądrem kwadratowym?
vonjd
Czy nie ma $ \ vec {x} ^ \ intercal \ vec {x) $ w podwójnym Lagrangianu kryterium percepcji? To właśnie tutaj zamieniasz wewnętrzny produkt na ocenę funkcji jądra.
Kellan Fluette,