Perceptron: element konstrukcyjny sztucznej sieci neuronowej

Węzeł źródłowy: 1216283

Jeśli jesteś entuzjastą uczenia maszynowego i sztucznej inteligencji, na pewno spotkałeś się ze słowem perceptron. Perceptron jest nauczany w pierwszym rozdziale wielu kursów głębokiego uczenia się. Więc co to dokładnie jest? Jaka kryje się za tym inspiracja? Jak dokładnie rozwiązuje problem klasyfikacji? W tym artykule zaczniemy od biologicznych inspiracji stojących za perceptronem, następnie zagłębimy się w jego matematyczne aspekty techniczne, a na koniec zbudujemy od podstaw klasyfikator binarny przy użyciu jednostki perceptronu.

Biologiczna inspiracja sieci neuronowych

Neuron (komórka nerwowa) jest podstawowym elementem budulcowym układu nerwowego. Ludzki mózg składa się z miliardów neuronów, które są ze sobą połączone. Odpowiadają za odbieranie i wysyłanie sygnałów z mózgu. Jak widać na poniższym schemacie, typowy neuron składa się z trzech głównych części – dendrytów, aksonu i ciała komórkowego, czyli somy. Dendryty to drzewiaste gałęzie wywodzące się z ciała komórki. Otrzymują informacje od innych neuronów. Soma jest rdzeniem neuronu. Odpowiada za przetwarzanie informacji otrzymanych z dendrytów. Akson jest jak kabel, przez który neurony przesyłają informacje. Pod koniec akson dzieli się na wiele gałęzi, które poprzez dendryty łączą się z innymi neuronami. The połączenie między aksonem a innymi dendrytami neuronów nazywa się synapsami.

Ryc. 1: Neuron biologiczny a sztuczna sieć neuronowa

Źródło pliku: Willems, K. (2017, 2 maja). Keras Tutorial: Głębokie uczenie się w Pythonie.

Ponieważ ANN jest inspirowana funkcjonowaniem mózgu, przyjrzyjmy się, jak działa mózg. Mózg składa się z sieci miliardów neuronów. Komunikują się za pomocą sygnałów elektrycznych i chemicznych poprzez synapsę, w której informacja z jednego neuronu jest przekazywana do innych neuronów. Proces transmisji obejmuje impuls elektryczny zwany „potencjałem czynnościowym”. Aby informacja mogła zostać przesłana, sygnały wejściowe (impuls) powinny być na tyle silne, aby przekroczyć pewną barierę progową, wówczas dopiero neuron aktywuje się i przekazuje sygnał dalej (wyjście).

Zainspirowany biologicznym funkcjonowaniem neuronu, amerykański naukowiec Franck Rosenblatt wpadł na koncepcję perceptronu w Cornell Aeronautical Laboratory w 1957 roku.

  • Neuron otrzymuje informacje od innych neuronów w postaci impulsów elektrycznych o różnej sile.
  • Neuron integruje wszystkie impulsy, które otrzymuje od innych neuronów.
  • Jeśli powstałe sumowanie jest większe niż pewna wartość progowa, neuron „odpala”, wyzwalając potencjał czynnościowy, który jest przekazywany do innych połączonych neuronów.

Główne składniki Perceptronu

Perceptron Rosenblatta jest w zasadzie klasyfikatorem binarnym. Perceptron składa się z 3 głównych części:

  • Węzły wejściowe lub warstwa wejściowa: Warstwa wejściowa pobiera początkowe dane do systemu w celu dalszego przetwarzania. Każdy węzeł wejściowy jest powiązany z wartością liczbową. Może przyjąć dowolną realną wartość.
  • Wagi i obciążenie: Parametry wag reprezentują siłę połączenia między jednostkami. Większa jest waga, silniejszy jest wpływ powiązanego neuronu wejściowego na decydowanie o wyjściu. Odchylenie odgrywa tę samą rolę, co wyraz wolny w równaniu liniowym.
  • Funkcja aktywacji: Funkcja aktywacji określa, czy neuron zostanie uruchomiony, czy nie. W najprostszej postaci funkcja aktywacji jest funkcją krokową, ale w zależności od scenariusza można zastosować różne funkcje aktywacji.

Więcej na ten temat dowiemy się w następnej sekcji.

Działanie Perceptronu

W pierwszym kroku wszystkie wartości wejściowe są mnożone przez odpowiadające im wagi i sumowane. Otrzymany wynik nazywany jest sumą ważoną ∑wi*xi, lub podano inaczej,  x1*w1 + x2*w2 +…wn*xn. Suma ta stanowi odpowiednią reprezentację danych wejściowych w oparciu o ich znaczenie. Dodatkowo termin stronniczy b do tej sumy dodaje się ∑wi*xi + b. Odchylenie służy jako kolejny parametr modelu (oprócz wag), który można dostroić w celu poprawy wydajności modelu.

W drugim kroku funkcja aktywacji f naliczana jest na powyższą sumę ∑wi*xi + b, aby uzyskać wynik Y = f(∑wi*xi + b). W zależności od scenariusza i użytej funkcji aktywacji, plik Wydajność jest albo dwójkowy {1, 0} lub wartość ciągła. 

Działanie Perceptronu

(Często oba te etapy są przedstawiane jako pojedynczy krok w perceptronach wielowarstwowych, tutaj pokazałem je jako dwa różne etapy dla lepszego zrozumienia)

Funkcje aktywacji

Neuron biologiczny uruchamia się dopiero po przekroczeniu pewnego progu. Podobnie sztuczny neuron również uruchomi się tylko wtedy, gdy suma wejść (suma ważona) przekroczy pewną wartość progową, powiedzmy 0. Intuicyjnie możemy pomyśleć o takim podejściu opartym na regułach –

Jeśli ∑wi*xi + b > 0: wyjście = 1 else: wyjście = 0

Jego wykres będzie mniej więcej taki:

Funkcje aktywacji

W rzeczywistości jest to funkcja aktywacji kroku jednostkowego (próg), która była pierwotnie używana przez Rosenblatta. Ale jak widać, funkcja ta jest nieciągła w punkcie 0, więc powoduje problemy w obliczeniach matematycznych. Płynniejszą wersją powyższej funkcji jest funkcja sigmoidalna. Daje wynik od 0 do 1. Innym jest tangens hiperboliczny (tanh), która daje wynik w przedziale od -1 do 1. Zarówno funkcja sigmoidalna, jak i tanh mają problemy ze znikającymi gradientami. Obecnie najczęściej używanymi funkcjami aktywacyjnymi są ReLU i Leaky ReLU. Są stosunkowo stabilne w głębokich sieciach.

Perceptron jako klasyfikator binarny

Jak dotąd widzieliśmy inspirację biologiczną i matematykę perceptronu. W tej sekcji zobaczymy, jak perceptron rozwiązuje problem klasyfikacji liniowej.

Importowanie niektórych bibliotek –

ze sklearn.datasets import make_blobs import matplotlib.pyplot jako plt import numpy jako np %matplotlib inline

Generowanie fikcyjnego zestawu danych przy użyciu make_blobs funkcjonalność zapewniana przez scikit Learn –

# Wygeneruj zbiór danych X, Y = make_blobs(n_features = 2, centra = 2, n_samples = 1000, random_state = 12)
# Wizualizuj zbiór danych plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c = Y) plt.title('Podstawowa prawda', rozmiar czcionki = 18) plt.show()
Perceptron jako klasyfikator binarny

Powiedzmy, że niebieskie kropki to 1, a zielone kropki to 0. Używając logiki perceptronu, możemy stworzyć granicę decyzyjną (hiperpłaszczyzna) do klasyfikacji oddzielającej różne punkty danych na wykresie.

Zanim przejdziemy dalej, dodajmy składnik odchylenia (jedynki) do wektora wejściowego –

# Dodaj odchylenie do wektora wejściowego X_bias = np.ones([X.shape[0], 3]) X_bias[:, 1:3] = X

Zbiór danych będzie wyglądał mniej więcej tak

zestaw danych

Tutaj każdy wiersz powyższego zbioru danych reprezentuje wektor wejściowy (punkt danych). Aby stworzyć granicę decyzyjną, musimy znaleźć odpowiednie wagi. Ciężarów „uczymy się” na treningu według poniższej zasady –

w = w + (oczekiwane — przewidywane) * x

Perceptron z

Oznacza to odjęcie oszacowanego wyniku od prawdy podstawowej, a następnie pomnożenie tego przez bieżący wektor wejściowy i dodanie do niego starych wag w celu uzyskania nowej wartości wag. Jeśli wynik jest taki sam jak rzeczywista klasa, wówczas wagi się nie zmieniają. Jeśli jednak nasze szacunki różnią się od podstawowej prawdy, wówczas wagi odpowiednio rosną lub maleją. W ten sposób wagi są stopniowo dostosowywane w każdej iteracji.

Zaczynamy od przypisania dowolnych wartości do wektora wag, a następnie stopniowo dostosowujemy je w każdej iteracji, korzystając z dostępnych błędów i danych –

# inicjalizacja wag losowymi wartościami w = np.random.rand(3, 1) print(w)

Wyjście:

[[0.37547448] [0.00239401] [0.18640939]]

Zdefiniuj funkcję aktywacji perceptronu –

def aktywacja_func(z): jeśli z >= 1: zwróć 1 w przeciwnym razie: zwróć 0

Następnie stosujemy zasadę uczenia się perceptronu –

for _ in range(100): for i in range(X_bias.shape[0]): y = aktywacja_func(w.transpose().dot(X_bias[i, :])) # Aktualizuj wagi w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)

Nie ma gwarancji, że wagi zbiegną się w jednym przejściu, dlatego wszystkie dane uczące wprowadzamy do algorytmu perceptronu 100 razy, ciągle stosując regułę uczenia się, aby ostatecznie udało nam się uzyskać optymalne wagi.

Teraz, gdy uzyskaliśmy optymalne wagi, możemy przewidzieć klasę dla każdego punktu danych za pomocą Y = f(∑wi*xi + b) lub Y = wT.x w postaci wektorowej.

# przewidywanie klasy punktów danychresult_class = [aktywacja_func(w.transpose().dot(x)) dla x w X_bias]

Wizualizuj granicę decyzji i przewidywane etykiety klas –

# konwertuj na wektor jednostkowy w = w/np.sqrt(w.transpose().dot(w))
# Wizualizuj wyniki plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c =result_class) plt.plot([-10, -1], hiperpłaszczyzna ([-10, -1], w), lw = 3, c = 'czerwony') plt.title('Klasyfikacja perceptronów z granicą decyzyjną') plt.show()
Klasyfikacja perceptronów z granicą decyzyjną

Możesz porównać podstawowy obraz prawdy z przewidywanym obrazem wyniku i zobaczyć niektóre punkty, które są błędnie sklasyfikowane. Jeśli policzymy dokładność, to wynosi ona około 98% (pozostawiam to czytelnikom jako ćwiczenie).

Jak widzisz, tutaj nasze oryginalne dane były dość rozdzielone, więc jesteśmy w stanie uzyskać tak dobrą dokładność. Nie dotyczy to jednak danych ze świata rzeczywistego. Używając pojedynczego perceptronu, możemy skonstruować jedynie liniową granicę decyzyjną, więc jeśli dane zostaną wymieszane, algorytm perceptronu będzie działał słabo. Jest to jedno z ograniczeń modelu pojedynczego perceptronu.

Przypisy

Zaczęliśmy od zrozumienia biologicznych inspiracji leżących u podstaw perceptronu Rosenblatta. Następnie przeszliśmy do matematyki perceptronu i funkcji aktywacji. Na koniec, korzystając ze zbioru danych zabawek, zobaczyliśmy, jak perceptron może przeprowadzić podstawową klasyfikację, budując liniową granicę decyzyjną, która oddziela punkty danych należące do różnych klas.

O autorze

Pratika Nabriya jest wykwalifikowanym analitykiem danych, obecnie zatrudnionym w firmie zajmującej się analityką i sztuczną inteligencją z siedzibą w Noida. Jest biegły w uczeniu maszynowym, głębokim uczeniu się, NLP, analizie szeregów czasowych, manipulacji danymi, SQL, Pythonie i zna pracę w środowisku chmury. W wolnym czasie uwielbia brać udział w Hackatonach i pisać artykuły techniczne.

Media pokazane w tym artykule nie są własnością Analytics Vidhya i zostały użyte według uznania Autora.

Źródło: https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

Znak czasu:

Więcej z Analityka Widhja