Sieci neuronowe
Marcin Orchel
1 Wstęp
1.1 Model neuronu
n - liczba wejść w neuronie wektor wejściowy x = [x1, . . . , xn]T, wagi neuronu w = [w0, . . . , wn]T. Zauważmy, że rozmiar wektora wagowego jest identyczny jak rozmiar wektora wejściowego, y - wartość wyjściowa neuronu, w0 - wartość progowa neuronu, f - funkcja aktywacji. Mamy
y = f (s) (1)
gdzie
s =
n
X
i=0
xiwi (2)
Zakładamy, że wartość sygnału x0 jest równa 1. Jest to przydatne do tego aby otrzymać wyraz wolny b. Waga w0, czyli wyraz wolny nazywamy progiem.
1.1.1 Perceptron
W perceptronie funkcja f ma szczególną postać
f (s) = 1 (3)
gdy s > 0 oraz
f (s) = −1 (4)
gdy s ≤ 0. Powyższy opis to nic innego jak ogólny opis klasyfikatora liniowego.
Częścią modelu perceptronu jest jego uczenie, czyli znalezienie wag w. Wybieramy losowo wagi początkowe perceptronu. Podajemy na wejście wektor uczący x, oblicza- my wartość wyjściową y, porównujemy wartość wyjściową ze wzorcową. Dokonujemy modyfikacji wag, jeżeli y(x(t)) 6= d(x(t)) to
wi(t + 1) = wi(t) + d (x (t)) xi(t) (5) jeżeli y(x(t)) = d(x(t)) to
wi(t + 1) = wi(t) (6)
Alg. 1 Perceptron k = 0
powtórz
for i = 1 to l
jeśli yi( ~wk· ~xi+ bk) ≤ 0
~
wk+1= ~wk+ ηyi~xi bk+1 = bk+ ηyiR2
dopóki nie będzie żadnych błędów w pętli zwróć (wk, bk)
Alg. 2 Perceptron w postaci dualnej k = 0
powtórz
for i = 1 to l jeśli yi Pl
j=1
αjyj~xj· ~xi+ bk
!
≤ 0 αi= αi+ 1
bk+1 = bk+ yiR2
dopóki nie będzie żadnych błędów w pętli zwróć (~α, bk)
Wracamy do podawania na wejściu wektora uczącego. Przechodzimy w ten sposób przez cały zbiór uczący (epoka). Obliczamy błąd dla całego zbioru uczącego, jeśli jest mniej- szy od założonej tolerancji wychodzimy. Można pokazać, że dla danych separowalnych liniowo ten algorytm jest zbieżny.
Mamy parametr η ∈ R+, które jest nazywany współczynnikiem uczenia, a także R = max1≤i≤lkxik, k to liczba błędów. Algorytm pokazany jest w Alg. 1.
W postaci dualnej wektor wagowy może być zapisany jako:
~ w =
l
X
i=1
αiyi~xi
Algorytm pokazany jest w Alg. 2. Wartość α dla konkretnego punktu treningowego oznacza jak często ten punkt był błędnie klasyfikowany.
1.1.2 Model Adaline
Porównujemy sygnał wzorcowy d z sygnałem s na wyjściu części liniowej neuronu. A więc neuron zwraca jako odpowiedź s, dlatego możemy go użyć do metod regresji. Można go również użyć do metod klasyfikacji, ale podczas testowania należy użyć funkcji f takiej jak w perceptronie. Możemy wyobrazić sobie ten przypadek, tak że mamy funkcje wielowymiarową której wartościami mogą być -1 lub 1, i naszym celem jest regresja tej funkcji funkcją liniową. Błąd dany jest wzorem d − s, zadanie minimalizacji sprowadza
się do minimalizacji kwadratu błędu Q (w) = 1
2ε2 = 1 2 d −
n
X
i=0
wixi
!2
(7) Jest to funkcja różniczkowalna i możemy użyć metody największego spadku. Wagi mo- dyfkuje się następująco
wi(t + 1) = wi(t) − η∂Q (wi)
∂wi (8)
gdzie η to współczynnik uczenia. Mamy
∂Q (wi)
∂wi
= ∂Q (wi)
∂s
∂s
∂wi
(9) Mamy także
∂s
∂wi
= xi (10)
oraz
∂Q (wi)
∂s = − (d − s) (11)
Otrzymujemy
wi(t + 1) = wi(t) + ηδxi (12)
gdzie δ = d − s. Powyższa reguła nazywana jest regułą delta.
1.1.3 Model neuronu sigmoidalnego
Możemy zauważyć, że w przypadku klasyfikacji dla modelu Adaline lepszym dopaso- waniem do funkcji klasyfikacji niż funkcja liniowa będzie funkcja która jest ograniczona w przedziale -1, 1, np. tgh(x)http://www.wolframalpha.com/input/?i=tanh%28x%29.
Funkcja aktywacji jest unipolarna lub bipolarna odpowiednio f (x) = 1
1 + e−βx (13)
oraz
f (x) = tgh (βx) = 1 − eβx
1 + e−βx (14)
Funkcja aktywacji jest różniczkowalna pochodne wynoszą odpowiednio
f0(x) = βf (x) (1 − f (x)) (15)
f0(x) = β1 − f2(x) (16)
Sygnał wyjściowy dany jest wzorem y (t) = f
n
X
i=0
wi(t) xi(t)
!
(17)
Miara błędu jest zdefiniowana
Q (w) = 1
2 d − f
n
X
i=0
wixi
!!2
(18) Wyprowadzenie
wi(t + 1) = wi(t) − η∂Q (wi)
∂wi (19)
∂Q (wi)
∂wi
= ∂Q (wi)
∂s
∂s
∂wi
(20)
∂s
∂wi
= xi (21)
∂Q (wi)
∂s = − (d − f (s)) f0(s) (22)
Oznaczmy
δ = − (d − f (s)) f0(s) (23)
Otrzymujemy
wi(t + 1) = wi(t) − ηδxi= wi(t) + η (d − f (s)) f0(s) xi (24) Model neuronu Hebba. Modyfikacja wag
wi(t + 1) = wi(t) + ∆wi (25)
gdzie ∆wi = ηyxi. Nie ma tutaj wartości wzorcowej, więc jest to uczenie bez nauczyciela.
Wersja z nauczycielem ∆wi= ηxid
2 Sieci jednokierunkowe wielowarstwowe
Mamy co najmniej dwie warstwy: wejściową i wyjściową. Między nimi znajdują się war- stwy ukryte. Sygnały przekazywane są między neuronami z różnych warstw, nie mogą być przekazywane między neuronami z tej samej warstwy. Sygnały przekazywane są w kierunku warstwy wyjściowej (sieć jednokierunkowa).
2.1 Wsteczna propagacja błędów
Gdy mamy warstwę ukrytą problem jest taki, że nie znamy prawidłowej wartości na wyjściu neuronów z warstwy ukrytej, więc nie wiemy jak wyliczyć modyfikacje wag.
Algorytm wstecznej propagacji błędów. Tworzymy wektor wszystkich wartości wagowych ze wszystkich neuronów, funkcja błędu to Q(w). Będziemy minimalizować funkcję Q.
Rozwijamy funkcję Q w szereg Taylora
Q (w + p) = Q (w) + [g (w)]T p + 0, 5pTH (w) p + . . . (26)
gdzie g (w) to wektor gradientu, czyli g (w) =
∂Q
∂w1
, . . . , ∂Q
∂wn
T
(27) H (w) to hesjan
H (w) =
∂2Q
∂w1∂w1 . . . ∂w∂2Q
1∂wn
... ...
∂2Q
∂wn∂w1 . . . ∂w∂2Q
n∂wn
(28)
Wagi modyfikujemy następująco:
w (t + 1) = w (t) + η (t) p (t) (29) Jak wyznaczyć wektor w tak aby błąd Q malał czyli Q(w(t+1)) < Q(w(t)). Ograniczymy się do dwóch pierwszych składników Q(w+p). Wartość Q(w+p) traktujemy jako wartość Q w kolejnym kroku, a więc Q(w + p) ma być mniejsze od Q(w). Czyli
g (w (t))T p (t) < 0 (30)
Warunek ten jest spełniony przykładowo dla
p (t) = −g (w (t)) (31)
Po podstawieniu otrzymujemy
w (t + 1) = w (t) − ηg (w (t)) (32)
Jest to reguła największego spadku.
Mamy daną sieć neuronową wielowarstwową. Mamy L warstw. W każdej warstwie znajduje się Nk neuronów, gdzie k = 1, . . . , L. Sieć ma N0 wejść, to znaczy wektor danymi ma wymiar N0, i zapisywany jest jako
x = [x1(t) , . . . , xN0(t)]T (33) Sygnał wyjściowy i-tego neuronu w k-tej warstwie to y(k)i (t). Do tego neuronu i każdego z tej samej warstwy podawany jest wektor wejściowy
x(k)(t) =hx(k)0 (t) , . . . , x(k)N
k−1(t)iT (34)
gdzie x(k)0 (t) = 1. Wektor wagowy i-tego neuronu w warstwie k oznaczamy jako wi(k)(t) =hwi,0(k)(t) , . . . , wi,N(k)
k−1(t)iT (35)
Możemy rozwinąć zapis sygnału wyjściowego i-tego neuronu w warstwie k jako yi(k)= fs(k)i (t) (36)
gdzie
s(k)i (t) =
Nk−1
X
j=0
wi,j(k)(t) x(k)j (t) (37) Cała sieć ma Nl sygnałów wyjściowych. Porównujemy je z sygnałami wzorcowymi d.
Błąd na wyjściu sieci Q definiujemy jako
Q (t) =
NL
X
i=1
ε(L)i 2(t) =
NL
X
i=1
d(L)i (t) − yi(L)(t)2 (38)
Teraz wyliczamy zmianę wag
wij(k)(t + 1) = wij(k)− η ∂Q (t)
∂wij(k)(t)
(39)
Możemy zapisać
∂Q (t)
∂w(k)ij (t)
= ∂Q (t)
∂s(k)i (t)
∂s(k)i (t)
∂wij(k)(t)
= ∂Q (t)
∂s(k)i (t)
x(k)j (t) (40)
Oznaczamy
δi(k)(t) = −1 2
∂Q (t)
∂s(k)i (t)
(41) otrzymujemy zatem
∂Q (t)
∂wij(k)(t)
= −2δi(k)(t) x(k)j (t) (42) i zmiana wag wygląda następująco
w(k)ij (t + 1) = w(k)ij (t) + 2ηδi(k)(t) x(k)j (t) (43) Sposób wyliczenia δi(k). Dla warstwy ostatniej
δi(L)(t) = −1 2
∂Q (t)
∂s(L)i (t)
= −1 2
∂PNm=1L Q(L)
2
m (t)
∂s(L)i (t)
= −1 2
∂Q(L)
2
i (t)
∂s(L)i (t)
= (44)
−1 2
∂d(L)i (t) − yi(L)(t)2
∂s(L)i (t)
= Q(L)i (t)∂y(L)i (t)
∂s(L)i (t)
= Q(L)i (t) f0s(L)i (t) (45) Dla dowolnej warstwy k 6= L otrzymujemy
δi(L)(t) = −1 2
∂Q (t)
∂s(k)i (t)
= −1 2
Nk+1
X
m=1
∂Q (t)
∂s(k+1)m (t)
∂s(k+1)m (t)
∂s(k)i (t)
= (46)
Nk+1
X
m=1
δ(k+1)m (t) w(k+1)mi (t) f0s(k)i (t)= f0s(k)i (t)
Nk+1
X
m=1
δ(k+1)m (t) wmi(k+1)(t) (47) Definiujemy błąd w wersji k bez ostatniej jako
ε(k)i (t) =
Nk+1
X
m=1
δm(k+1)(t) wmi(k+1)(t) (48)
dla k = 1, . . . , L − 1. Otrzymujemy
δi(L)(t) = ε(k)i (t) f0s(k)i (t) (49) Zauważmy, że wartość δ w warstwie k zależy od tej wartości w warstwie k + 1 dlatego błąd najpierw obliczany jest w ostatniej warstwie i propagowany z powrotem.
Wyróżniamy przyrostowe uaktualnianie wag oraz kumulacyjne uaktualnianie wag. W tym drugim błędy są sumowane dla wszystkich punktów i dopiero do obliczeniu błędów dla wszystkich punktów zmieniane są wagi.
Algorytm wstecznej propagacji błędów z członem momentum. Modyfikujemy zmianę wag
w(k)ij (t + 1) = wij(k)(t) + 2ηδ(k)i (t) x(k)j (t) + αwij(k)(t) − wij(k)(t − 1) (50) 2.2 Autoencoder
Składa się z enkodera i dekodera. Służy m.in. do kompresji danych. Liczba neuronów w warstwie ukrytej enkodera jest mniejsza niż wymiarowość wejścia. A liczba neuronów w dekoderze jest identyczna jak wymiarowość wektora wejściowego. Zadaniem jak takie wytrenowanie sieci aby uzyskać jak najbardziej zbliżony wektor x∗na wyjściu do wektora wejściowego x. Wyjście z warstwy ukrytej jest skompresowanym wejściem. Dekompresja polega na podaniu skompresowanych danych na wejście tylko do warstwy wyjściowej.
Gdy warstwa ukryta ma r neuronów, to zdjęcie jest kompresowane do r liczb.
3 Zadania
3.1 Zadania na 3.0
Napisać skrypt w R. W skrypcie
• wykonać aproksymację funkcji sin(x) na przedziale [0, 2π]
• wyświetlić sieć neuronową
• wykonać klasyfikację na wybranych danych rzeczywistych siecią neuronową wielo- warstową z wsteczną propagacją błędów
• wykonać kompresję obrazów za pomocą autoenkoderów
• przetestowanie różnej liczby warstw sieci oraz różnej liczby neuronów
• sprawdzić na wolframalpha.com jaka jest wartość przewidywana dla sieci z jednym neuronem dla x = 1
• wyświetlić na wolframalpha.com funkcję predykcji dla 1 neuronu, a także dla 3 neuronów
Wskazówki do R
• w poleceniu neuralnet można testować również sieci z wieloma warstwami ukrytymi
• aby była brana pod uwagę funkcja aktywacji w poleceniu neuralnet należy ustawić parametr linear.output na false, w przeciwnym razie na wyjściu otrzymujemy tylko iloczyn skalarny
• wyraz wolny jest dodawany do iloczynu skalarnego
• http://search.r-project.org/library/neuralnet/html/neuralnet.html
• https://www.rdocumentation.org/packages/autoencoder/versions/1.1/topics/
autoencode Wskazówki
• http://www.mathworks.com/help/nnet/gs/fit-data-with-a-neural-network.
html
• przykładowe zbiory danychhttp://www.mathworks.com/help/nnet/gs/neural- network-toolbox-sample-data-sets.html
• http://www.mathworks.com/matlabcentral/fileexchange/35364-fast-multilayer- neural-network-training/content/demo.m
• http://www.mathworks.com/help/nnet/gs/classify-patterns-with-a-neural- network.html
• http://www.mathworks.com/help/nnet/ug/adaptive-neural-network-filters.
html
3.2 Zadania na 4.0
• wykonać klasyfikację na wybranych danych rzeczywistych siecią neuronową wielo- warstową z członem momentum
Wskazówki:
• http://www.mathworks.com/help/nnet/examples/training-a-deep-neural-network- for-digit-classification.html
3.3 Zadania na 5.0
• przetestować sieć konwolucyjną
• przetestować algorytm Levenberga-Marquardta Wskazówki:
• http://www.mathworks.com/help/nnet/ref/trainlm.html
• http://yann.lecun.com/exdb/mnist/
• http://www.mathworks.com/matlabcentral/fileexchange/24291-cnn-convolutional- neural-network-class