2012-03-07 28 views
6

W przypadku pojedynczego perceptronu - literatura stwierdza, że ​​nie można jej użyć do oddzielenia nieliniowych przypadków dyskryminacyjnych, takich jak funkcja XOR. Jest to zrozumiałe, ponieważ wymiar VC linii (w 2-D) wynosi 3, więc pojedyncza linia 2-D nie może rozróżniać sygnałów wyjściowych takich jak XOR.Pojedynczy Perceptron - nieliniowa funkcja oceniająca

Jednak moje pytanie brzmi: dlaczego funkcja oceny w pojedynczym perceptronie powinna być funkcją liniowego kroku? Oczywiście, jeśli mamy nieliniową funkcję oceniającą jak sigmoid, perceptron ten może rozróżnić między 1s a 0s XOR. Czy coś tu mi brakuje?

Odpowiedz

11

jeśli mamy nieliniową funkcją oceniającą jak esicy, to perceptron może rozróżniać pomiędzy 1s i 0s XOR

to nie jest prawda. Kryteriami dyskryminacji nie jest kształt linii (lub hiperpłaszczyzny w wyższych wymiarach), ale raczej to, czy funkcja ta pozwala na uzyskanie pewnej wartości.

Brak funkcji pojedyncza, która wytwarza hiperpłaszczyznę zdolną do oddzielania punktów funkcji XOR. Krzywa na obrazie oddziela punkty, ale nie jest funkcją.

You can't separate the blue and red points into separate hyperplanes using a single function

Aby rozdzielić punkty XOR, będziesz musiał użyć przynajmniej dwa wiersze (lub jakiekolwiek inne funkcje kształtach). Będzie to wymagało dwóch oddzielnych perceptronów. Następnie możesz użyć trzeciego perceptronu, aby oddzielić wyniki pośrednie na podstawie znaku.

If you use two lines, you can create two discriminants, and then merge the result

+0

* „jeśli mamy nieliniową funkcją oceniającą jak esicy ...” „To nie jest prawda.” * Zupełnie tak, ponieważ funkcja esicy nie ma większego sensu, ale wierzę, Wymyśliłem przykład nieliniowej funkcji oceny, w której działałby bardziej skomplikowany klasyfikator binarny; zobacz moją odpowiedź, jeśli są zainteresowani. – ninjagecko

+1

Funkcja, którą zasugerowałeś, zadziała, ale nie może być obsługiwana przez jednego perceptron. zobacz komentarz do drugiej odpowiedzi. –

2

Zakładam przez esicy rzeczywistości nie oznacza esicy, ale coś z lokalnego maksimum. Podczas gdy normalne perceptron klasyfikatora binarnego ma postać:

f(x) = (1 if w.x+b>0 else 0) 

można mieć funkcję:

f(x) = (1 if |w.x+b|<0.5 else 0) 

To na pewno będzie działać, ale byłoby dość sztuczny, w które skutecznie są dostosowując swój model do zbioru danych, który jest zły.

To, czy normalny algorytm perceptronowy byłby zbieżny, prawie na pewno nie wchodzi w grę, chociaż mogę się mylić. http://en.wikipedia.org/wiki/Perceptron#Separability_and_convergence Być może trzeba będzie wymyślić zupełnie nowy sposób na dopasowanie funkcji, która w pewien sposób pokonuje cel.

Albo możesz po prostu użyć support vector machine, który jest jak perceptron, ale jest w stanie obsłużyć bardziej skomplikowane przypadki używając kernel trick.

+1

Ale wprowadzając operator modulus, tworzysz funkcję _two_, która porównuje (w.x + b) z 0.5, drugą, która porównuje to samo (w.x + b) z -0,5, a następnie używa znaki pośrednie prowadzą do trzeciej klasyfikacji. Jest to równoważne użyciu wielowarstwowego perceptronu. –

+0

Nie jest to równoważne użyciu perceptronu wielowarstwowego, ponieważ nie można osobno ćwiczyć ciężarów. Dodałbyś ograniczenie między wagami w wielowarstwowym perceptronie i nie wiem, czy to jest dobre. –

0

Stare pytanie, ale chcę zostawić moje myśli (ktoś mnie poprawi, jeśli się mylę).

Myślę, że miesza się pojęcia funkcji linear model i loss lub error. Perceptron jest z definicji modelem liniowym, więc definiuje linię/płaszczyznę/hiperpłaszczyznę, której można użyć do rozdzielenia klas.

Standardowy algorytm Perceptron wyodrębnić sygnał swoim wyjściu, dając -1 lub 1:

yhat = signal(w * X + w0) 

To jest w porządku iw końcu zbiegają jeśli dane są linearly separable.

Aby to poprawić można użyć sigmoid wygładzić funkcję strat w przedziale [-1, 1]:

yhat = -1 + 2*sigmoid(w * X + w0) 
mean_squared_error = (Y - yhat)^2 

Następnie użyj optymalizator liczbowej jak Gradient Descent, aby zminimalizować błąd nad całym zbiorze . Tutaj w0, w1, w2, ..., wn są twoimi zmiennymi.

Teraz, jeśli oryginalne dane nie mają wartości linearly separable, można je przekształcić w sposób umożliwiający liniowe oddzielenie, a następnie zastosować dowolny model liniowy. Jest to prawdą, ponieważ model jest linear on the weights.

Jest to w zasadzie to, co robią modele takie jak SVM pod maską, aby sklasyfikować twoje nieliniowe dane.

PS: I'm learning this stuff too, so experts don't be mad at me if i said some crap.