Problem XOR w sieciach neuronowych.
Wprowadzenie
Jest to pierwszy z serii postów omawiających implementacje sztucznych sieci neuronowych (ANN). Celem artykułu jest pomóc czytelnikowi uzyskać intuicję podstawowych pojęć przed przejściem do algorytmicznych implementacji, które będą następować.
Nie zakłada się wcześniejszej wiedzy, chociaż, w interesie zwięzłości, nie wszystkie z terminologii jest wyjaśnione w artykule. Zamiast tego podane są hiperłącza do Wikipedii i innych źródeł, gdzie może być wymagane dodatkowe czytanie.
To jest duży temat. ANN mają szeroką gamę zastosowań i mogą być używane do uczenia się nadzorowanego, nienadzorowanego, półnadzorowanego i wzmacniania. To wszystko zanim przejdziemy do architektur specyficznych dla danego problemu w ramach tych kategorii. Ale musimy gdzieś zacząć, więc w celu zawężenia zakresu, zaczniemy od zastosowania ANN do prostego problemu.
Problem XOr
Problem XOr, lub „wyłączne lub”, jest klasycznym problemem w badaniach ANN. Jest to problem użycia sieci neuronowej do przewidywania wyjść bramek logicznych XOr, biorąc pod uwagę dwa wejścia binarne. Funkcja XOr powinna zwrócić wartość true, jeśli dwa wejścia nie są równe i wartość false, jeśli są równe. Wszystkie możliwe wejścia i przewidywane wyjścia są pokazane na rysunku 1.
XOr jest problemem klasyfikacji i to takim, dla którego oczekiwane wyjścia są znane z góry. Dlatego właściwe jest zastosowanie podejścia uczenia nadzorowanego.
Na powierzchni, XOr wydaje się być bardzo prostym problemem, jednak Minksy i Papert (1969) pokazali, że był to duży problem dla architektur sieci neuronowych z lat 60-tych, znanych jako perceptrony.
Perceptrony
Jak wszystkie ANN, perceptron składa się z sieci jednostek, które są analogiczne do biologicznych neuronów. Jednostka może otrzymać dane wejściowe od innych jednostek. Gdy to zrobi, bierze sumę wszystkich otrzymanych wartości i decyduje, czy ma zamiar przekazać sygnał do innych jednostek, z którymi jest połączona. Nazywa się to aktywacją. Funkcja aktywacji wykorzystuje takie lub inne środki, aby zredukować sumę wartości wejściowych do 1 lub 0 (lub wartości bardzo zbliżonej do 1 lub 0) w celu przedstawienia aktywacji lub jej braku. Inna forma jednostki, znana jako jednostka skośna, zawsze aktywuje, zwykle wysyłając zakodowaną 1 do wszystkich jednostek, z którymi jest połączona.
Perceptrony zawierają pojedynczą warstwę jednostek wejściowych – w tym jedną jednostkę skośną – i pojedynczą jednostkę wyjściową (patrz rysunek 2). Jednostka bias jest tu przedstawiona jako przerywane kółko, podczas gdy inne jednostki są przedstawione jako niebieskie kółka. Istnieją dwie nieobiektywne jednostki wejściowe reprezentujące dwie binarne wartości wejściowe dla XOr. Można uwzględnić dowolną liczbę jednostek wejściowych.
Perceptron jest rodzajem sieci typu feed-forward, co oznacza, że proces generowania wyjścia – znany jako propagacja w przód – przepływa w jednym kierunku od warstwy wejściowej do warstwy wyjściowej. Nie ma połączeń pomiędzy jednostkami w warstwie wejściowej. Zamiast tego, wszystkie jednostki w warstwie wejściowej są połączone bezpośrednio z jednostką wyjściową.
Uproszczone wyjaśnienie procesu propagacji w przód jest takie, że wartości wejściowe X1 i X2, wraz z wartością skośną 1, są mnożone przez ich odpowiednie wagi W0…W2, i parsowane do jednostki wyjściowej. Jednostka wyjściowa pobiera sumę tych wartości i stosuje funkcję aktywacji – zazwyczaj funkcję krokową Heavside’a – aby przekształcić wynikową wartość na 0 lub 1, tym samym klasyfikując wartości wejściowe jako 0 lub 1.
To właśnie ustawienie zmiennych wagowych daje autorowi sieci kontrolę nad procesem przekształcania wartości wejściowych na wartość wyjściową. To właśnie wagi określają, w którym miejscu rysowana jest linia klasyfikacji, czyli linia rozdzielająca punkty danych na grupy klasyfikacyjne. Jeśli wszystkie punkty danych po jednej stronie linii klasyfikacyjnej mają przypisaną klasę 0, wszystkie pozostałe są klasyfikowane jako 1.
Ograniczeniem tej architektury jest to, że jest ona w stanie oddzielić punkty danych tylko jedną linią. Jest to niefortunne, ponieważ wejścia XOr nie są liniowo separowalne. Jest to szczególnie widoczne, jeśli naniesiemy wartości wejściowe XOr na wykres. Jak widać na rysunku 3, nie ma możliwości oddzielenia predykcji 1 i 0 za pomocą pojedynczej linii klasyfikacyjnej.
Wielowarstwowe perceptrony
Rozwiązaniem tego problemu jest wyjście poza architekturę jednowarstwową poprzez dodanie dodatkowej warstwy jednostek bez bezpośredniego dostępu do świata zewnętrznego, zwanej warstwą ukrytą. Tego rodzaju architektura – pokazana na rysunku 4 – to inna sieć typu feed-forward znana jako perceptron wielowarstwowy (MLP).
Warto zauważyć, że MLP może mieć dowolną liczbę jednostek w warstwie wejściowej, ukrytej i wyjściowej. Może być również dowolna liczba warstw ukrytych. Użyta tu architektura została zaprojektowana specjalnie dla problemu XOr.
Podobnie jak w klasycznym perceptronie, propagacja w przód rozpoczyna się od pomnożenia wartości wejściowych i jednostki skośnej z warstwy wejściowej przez ich odpowiednie wagi, jednak w tym przypadku istnieje waga dla każdej kombinacji jednostki wejściowej (w tym jednostki skośnej warstwy wejściowej) i ukrytej (z wyłączeniem jednostki skośnej warstwy ukrytej). Iloczyny wartości warstwy wejściowej i ich odpowiednich wag są parsowane jako dane wejściowe do jednostek nieobiektywnych w warstwie ukrytej. Każda nieobiektywna jednostka ukryta wywołuje funkcję aktywacji – zwykle klasyczną funkcję sigmoidalną w przypadku problemu XOr – w celu zgniecenia sumy wartości wejściowych do wartości mieszczącej się w przedziale od 0 do 1 (zwykle wartości bardzo bliskiej 0 lub 1). Wyjścia każdej jednostki warstwy ukrytej, w tym jednostki skośnej, są następnie mnożone przez kolejny zestaw odpowiednich wag i przesyłane do jednostki wyjściowej. Jednostka wyjściowa również przetwarza sumę swoich wartości wejściowych przez funkcję aktywacji – ponownie, funkcja sigmoidalna jest tutaj odpowiednia – aby zwrócić wartość wyjściową mieszczącą się pomiędzy 0 i 1. Jest to przewidywane wyjście.
Ta architektura, choć bardziej złożona niż klasyczna sieć perceptronowa, jest w stanie osiągnąć nieliniową separację. Tak więc, przy odpowiednim zestawie wartości wag, może ona zapewnić niezbędną separację, aby dokładnie sklasyfikować dane wejściowe XOr.
Backpropagacja
Słoniem w pokoju, oczywiście, jest to, jak można wymyślić zestaw wartości wag, które zapewniają, że sieć wytwarza oczekiwane dane wyjściowe. W praktyce, próba ręcznego znalezienia akceptowalnego zestawu wag dla sieci MLP byłaby niewiarygodnie pracochłonnym zadaniem. W rzeczywistości jest ono NP-complete (Blum i Rivest, 1992). Jednakże, na szczęście możliwe jest automatyczne nauczenie się dobrego zestawu wartości wag poprzez proces znany jako wsteczna propagacja. Po raz pierwszy wykazano, że działa on dobrze dla problemu XOr przez Rumelhart et al. (1985).
Algorytm propagacji wstecznej rozpoczyna się od porównania rzeczywistej wartości uzyskanej przez proces propagacji w przód z wartością oczekiwaną, a następnie przesuwa się wstecz przez sieć, nieznacznie dostosowując każdą z wag w kierunku, który zmniejsza wielkość błędu o mały stopień. Zarówno propagacja w przód, jak i wstecz są ponownie uruchamiane tysiące razy na każdej kombinacji danych wejściowych, dopóki sieć nie będzie w stanie dokładnie przewidzieć oczekiwanego wyjścia z możliwych wejść przy użyciu propagacji w przód.
W przypadku problemu xOr, 100% możliwych przykładów danych jest dostępnych do wykorzystania w procesie szkolenia. Możemy zatem oczekiwać, że wytrenowana sieć będzie w 100% dokładna w swoich przewidywaniach i nie ma potrzeby zajmować się takimi kwestiami jak skośność i wariancja w wynikowym modelu.
Podsumowanie
W tym poście, klasyczny problem ANN XOr został zbadany. Sam problem został szczegółowo opisany, wraz z faktem, że dane wejściowe dla XOr nie są liniowo separowalne na ich właściwe kategorie klasyfikacyjne. Nieliniowe rozwiązanie – obejmujące architekturę MLP – zostało zbadane na wysokim poziomie, wraz z algorytmem propagacji w przód używanym do generowania wartości wyjściowej z sieci i algorytmem propagacji wstecznej, który jest używany do trenowania sieci.
Kolejny post z tej serii będzie zawierał implementację w Javie opisanej tutaj architektury MLP, w tym wszystkie komponenty niezbędne do trenowania sieci, aby działała jako bramka logiczna XOr.
Blum, A. Rivest, R. L. (1992). Trening 3-węzłowej sieci neuronowej jest NP-zupełny. Neural Networks, 5(1), 117-127.
Blum, A. Rivest, R. L. (1992).