thumb|Perceptron złożony z jednego neuronu McCullocha-Pittsa: ma wejść (dendrytów) i 1 wyjście (akson); służy do wykrywania pojedynczej cechy w danych; każda dana jest zapisana w postaci wektora mającego składowych. Perceptron (od ang. , postrzeganie) – prosta sztuczna sieć neuronowa, wprowadzona przez Franka Rosenblatta w 1958 roku, dla której podał metodę jej uczenia czyli stopniowego dobierania wag i biasów (progów) tak, by wyniki podawane na wyjściu sieci były coraz bardziej zgodne z wartościami oczekiwanymi. W swojej podstawowej formie (perceptron prosty) składa się z jednego sztucznego neuronu McCullocha-Pittsa ze skokową funkcją aktywacji i regulowanymi wagami i progiem. Dalszy rozwój doprowadził do konstrukcji perceptronów wielowarstwowych, w tym perceptronów ze sprzężeniem zwrotnym, z różnymi funkcjami aktywacji, mających znacznie większe możliwości obliczeniowe; istotne było tu zastosowanie ciągłych funkcji aktywacji i odkrycie nowych metod uczenia sieci neuronowych, by przezwyciężyć ograniczenia perceptronu Rosenblatta, który mógł uczyć się jedynie problemów liniowo separowalnych.

Historia mały|Schemat budowy neuronu: a – dendryty, b – ciało komórki, c – jądro komórkowe, d – akson, e – otoczka mielinowa, f – komórka Schwanna, g – przewężenie Ranviera, h – wiele zakończeń aksonu. W 1943 roku neurofizjolog Warren McCulloch i logik Walter Pitts wprowadzili do informatyki „neuron” jako element logiczny z wieloma wejściami i jednym wyjściem binarnym, działający progowo, tj. neuron ten przyjmował stan 1, gdy suma sygnałów wejściowych przekroczyła zadany próg (bias); w przeciwnym zaś wypadku przyjmował stan 0 w odpowiedzi na sygnały wejściowe (patrz schemat neuronu McCullocha-Pittsa ). Odpowiadało to neurobiologicznej analogii potencjału czynnościowego, który komórka nerwowa emituje, gdy następuje zmiana jej potencjału błonowego, gdy suma sygnałów, jakie dochodzą do komórki od dendrytów, przekroczy pewien próg.

Liczba zakończeń aksonu neuronu biologicznego jest znaczna - poprzez te zakończenia dany neuron łączy się z dendrytami innymi neuronów. Analogiczne połączenia można budować między sztucznymi neuronami: akson danego neuronu McCullocha-Pittsa, mimo że posiada jeden akson (jedno wyjście), może być podłączony na wejścia wielu innych neuronów. McCulloch i Pitts wykazali, że poprzez odpowiednie połączenie takich neuronów można tworzyć bramki logiczne AND, OR, NOT, a z nich bardziej złożone układy.

W 1958 roku Frank Rosenblatt opublikował model perceptronu, który do dziś stanowi podstawę sztucznych sieci neuronowych. Perceptron zbudowany przez Rosenblatta wraz z Charlesem Wightmanem służył do rozpoznawania znaków alfanumerycznych. Innowacją było opracowanie metody uczenia sieci neuronowej, dzięki której po odpowiednio dużej liczbie iteracji sieć przyjmowała właściwe wagi i biasy. Był to istotny postęp: McCulloch i Pitts ustawiali wagi i biasy sieci poprzez ich odgadnięcie, co jest niewykonalnym zadaniem dla bardziej złożonych zagadnień.

W Polsce Jacek Karpiński, inżynier i wynalazca, skonstruował w 1962 roku perceptron z tranzystorów. Jego sieć neuronowa rozpoznawała otoczenie za pomocą kamery i potrafiła się uczyć. Był to drugi taki perceptron na świecie.

Badania nad perceptronami zostały zahamowane na jakiś czas, gdy w roku 1969 Marvin Minsky i Seymour Papert wykazali, że metoda uczenia perceptronów, podana przez Rosenblatta, jest skuteczna jedynie dla sieci mających uczyć się problemów liniowo separowalnych (pojęcie to omówiono dalej); pokazali m.in. niezdolność do uczenia się przez perceptrony bramek XOR.

Przezwyciężenie tego ograniczenia nastąpiło dzięki:

a). wprowadzeniu różniczkowalnych funkcji aktywacji, m.in. ReLU (Rectified Linear Unit), Sigmoid (funkcja logistyczna), Tgh (funkcja tangens hiperboliczny), Softmax, Leaky ReLU

b). odkryciu nowej metody ucznia sieci, tzw. back propagation, która wymaga liczenia pochodnych funkcji aktywacji - wymóg ten spełniają funkcje różniczkowalne.

Funkcja skokowa, używana w neuronie McCullocha-Pittsa i przejęta przez Rosenblatta, nie jest różniczkowalna, dlatego dopiero zastosowanie jako funkcji aktywacji funkcji różniczkowalnych pozwoliło z czasem odkryć metodę back propagation. Funkcja skokowa aktywacji neuronu McCullocha-Pittsa jest pokazana na schemacie powyżej w sposób symboliczny jako schodek w kwadracie.

Pojedynczy sztuczny neuron Wyjście z pojedynczego sztucznego neuronu oblicza się za pomocą wzoru:

, gdzie:

– wartość progowa () – wejścia – wagi – funkcja aktywacji – wyjście

W konstrukcji pierwotnego perceptronu jako funkcję aktywacji jego neuronów Rosenblatt stosował funkcję skokową, dla której wyjście przyjmowało wartość lub :

W ogólności funkcje aktywacji mogą dawać na wyjściu wartości dyskretne lub ciągłe, np. dla sigmoidalnej funkcji aktywacji wyjście przyjmuje wartości w zakresie .

Trenowanie perceptronu Aby perceptron wykonywał zadanie klasyfikacji, należy go "wytrenować", tj. ustalić wartości wag i biasów jego neuronów. Można to np. zrobić metodą prób, podając przykładowe dane na wejście i modyfikuje wagi połączeń i biasy tak, aby wynik na wyjściu przybierał pożądane wartości. Pierwszą metodą algorytmiczną (tj. możliwą do zaprogramowania) uczenia perceptronu podał Rosenblatt. Metoda ta nadaje się jednak tylko do trenowania sieci jednowarstwowych lub sieci o wielu warstwach, ale gdzie tylko jedna warstwa ma dobierane wagi i biasy (taką sieć zbudował Rosenblatt). Później opracowano metody nadające się do trenowania sieci wielowarstwowych (np. metoda propagacji wstecznej).

Metoda uczenia perceptronu według Rosenblatta Podczas uczenia perceptronu używa się zestawu danych uczących, złożonego z par, gdzie - dana wejściowa, - zakładana (oczekiwana) dana wyjściowa. Liczba par uczących zależy od rodzaju zagadnienia, jakiego ma nauczyć się sieć. Celem jest znalezienie wag i biasu neuronu tak, by uzyskać zgodność między wartością wyjściową z sieci a założą daną wyjściową dla wszystkich par uczących

W zerowym kroku iteracji dobiera się losowo wagi i bias . Następnie dla pierwszej pary uczącej oblicza się:

(a) wyjście z neuronu (jest to pojedyncza wartość liczbowa):

gdzie – funkcja aktywacji w perceptronie Rosenblatta to funkcja skokowa Heaviside’a,

(b) błąd sieci, tj. różnicę między wynikiem sieci a oczekiwanym wynikiem :

(c) jeśli błąd jest niezerowy, to koryguje się bias i wagi według reguły uczenia Rosenblatta

gdzie: – numer iteracji (kroku uczenia) – współczynnik uczenia, np. 0.1, który określa wielkość korekty wag w każdej iteracji - wektor wag w kroku t+1 - wektor wartości k-tej danej Drugie z powyższych równań jest równoważne równaniom: ,

Proces ten powtarza się dla wszystkich przykładów uczących , przy czym w danej iteracji koryguje się wagi i bias uzyskane w poprzedniej iteracji; ten cykl uczenia stanowi tzw. pojedynczą epokę uczenia. Zazwyczaj powtarza się uczenie w kolejnych epokach, zaczynając ponownie od pierwszej pary uczącej oraz koryguje się wagi i bias uzyskane w ostatniej iteracji poprzedniej epoki. Proces uczenia kończy się, gdy dla wszystkich par uczących uzyska się zerowe błędy, co oznacza zgodność odpowiedzi sieci z wartościami oczekiwanymi.

Może też zdarzyć się, że nie uzyska się tej zgodności pomimo wykonania założonej maksymalnej liczby epok uczenia - wtedy proces można ponowić, zaczynając od innego zestawu losowo dobranych wag i biasu.

Uwaga: Dodatkowe nieliniowe wejście – rozwiązanie ograniczeń perceptronu

Metoda Rosenblatta nadaje się tylko dla jednowarstwowych sieci neuronowych z liniowo separowalnymi danymi. Jeśli dane nie są liniowo separowalne, to nie da się osiągnąć tą metodą zgodności przewidywań sieci z wartościami oczekiwanymi nawet po wielu iteracjach. Istnieje też inne rozwiązanie: można dodać dodatkowe wejście neurony, na które poda się iloczyn wejść , tj. – wtedy problem staje się liniowo separowalny w przestrzeni i można taką sieć wytrenować metodą Rosenblatta. Rosenblatt nie stosował jednak takiego rozwiązania, co stało się powodem przekonania, iż perceptron może rozwiązywać tylko problemy liniowo separowalne (mimo że Minsky i Papert podali taką możliwość). W konsekwencji nastąpił okres tzw. zimy w badaniach na sieciami neuronowymi.

Poniżej podano kod w języku Python do trenowania perceptronu metoda Rosenblatta, który uczy się bramki logicznej XOR - dodano tu dodatkowe wejście .

import numpy as np

# --- Dane wejściowe dla XOR z dodatkową cechą x3 = x1*x2 --- X = np.array([ [0, 0], [0, 1], [1, 0], [1, 1] ])

# Tworzymy dodatkową cechę x3 x3 = (X[:,0] * X[:,1]).reshape(-1,1) X_new = np.hstack([X, x3])

# Oczekiwane wyjścia XOR y = np.array([0, 1, 1, 0])

# --- Inicjalizacja wag i biasu --- np.random.seed() w = np.random.randn(3) b = 0.0 eta = 0.1 # współczynnik uczenia epochs = 20

# --- Funkcja aktywacji (step) --- def step(x): return np.where(x >= 0, 1, 0)

# --- Trening perceptronu --- for epoch in range(epochs): errors = 0 for xi, target in zip(X_new, y): output = step(np.dot(w, xi) + b) delta = target - output if delta != 0: w += eta * delta * xi b += eta * delta errors += 1 print(f"Epoka {epoch+1}: błąd = {errors}, wagi = {w}, bias = {b}") if errors == 0: break

# --- Test sieci --- print("\nTest końcowy:") for xi, target in zip(X_new, y): output = step(np.dot(w, xi) + b) print(f"Wejście: {xi}, Wyjście: {output}, Oczekiwane: {target}")W powyższym programie wagi początkowe są losowo dobierane. W zależności od ich wartości perceptron uczy się właściwych wag dla bramki XOR przez kilka-kilkanaście epok. Na końcu podaje test końcowy, który wskazuje na zgodność obliczeń perceptrony z wartościami oczekiwanymi, tj.

Wejście: [0 0 0], Wyjście: 0

Wejście: [0 1 0], Wyjście: 1

Wejście: [1 0 0], Wyjście: 1

Wejście: [1 1 1], Wyjście: 0

Trzecie liczby w nawiasach - to wartości podawane jako dodatkowe wejście .

Perceptron jednowarstwowy - budowa Perceptron jednowarstwowy jest zbudowany z neuronów, których wejścia są wspólne - na te wejścia podaje się analizowaną daną. Przy tym:

- ilość wejść perceptronu (równa liczbie wejść każdego neuronu) zależy od danych: jeżeli każda dana wejściowa jest określona za pomocą liczb , to każdy neuron musi mieć wejść - liczba neuronów perceptronu / liczba wyjść: jeśli perceptron ma klasyfikować dane ze względu na 1 cechę, to ma 1 neuron; jeśli ma klasyfikować dane ze względu na 2 cechy, to ma 2 neurony; do analizy cech perceptron ma neuronów; ponieważ każdy neuron ma jedno wyjście, więc jeżeli perceptron analizuje cech, to ma neuronów

Perceptron jako klasyfikator binarny Działanie perceptronu jest następujące:

w przypadku analizy 1 cechy perceptron ma 1 neuron; na jego wejścia podawane są wartości liczbowe analizowanej danej i jeżeli dana ta należy do analizowanej przez neuron klasy, to neuron na wyjściu poda liczbę , a gdy nie należy, to poda gdy perceptron klasyfikuje cech, to ma neuronów, mających wspólnych wejść; poszczególnym cechom analizowanej danej neurony przypiszą liczby 1 lub 0; na wyjściu perceptronu będzie więc wyjść od poszczególnych neuronów, każde w stanie wyjściowym 1 lub 0; perceptron przypisze więc danej wejściowej liczbę o bitach - kolejne bity określają, czy ta dana posiada czy nie poszczególne analizowane cechy. Z tego względu perceptron należy do klasyfikatorów binarnych.

Problem liniowej separowalności danych Problemy liniowo separowalne thumb|Dane w 2D są liniowo separowalne ze względu na jakąś cechę (np. przypisany danym kolor), gdy istnieje prosta, która rozdziela te dane na dwa rozłączne podzbiory Najprostsze perceptrony mogą klasyfikować dane, które są liniowo separowalne. Dane są separowalne liniowo w następującym sensie:

jeżeli perceptron ma 2 wejścia, to dane te można przedstawić jako punkty na płaszczyźnie 2D; są one separowalne liniowo, jeżeli istnieje prosta na tej płaszczyźnie, która oddziela punkty mające daną cechę od punktów, które jej nie mają