Wprowadzenie do Sieci Neuronowych — Laboratorium 06

Transkrypt

Wprowadzenie do Sieci Neuronowych — Laboratorium 06
Wprowadzenie do Sieci Neuronowych — Laboratorium 06 — Algorytm
wstecznej propagacji błędu
Maja Czoków, Jarosław Piersa
2013-11-06
1
Powtórzenie
1.1
Perceptron sigmoidalny
Funkcja sigmoidalna:
1
(1)
1 + exp(−c · (x − p))
Parametr c odpowiada za nachylenie funkcji; jest zazwyczaj ustalony (c = 1). Parametr p odpowiada za progowanie.
Zazwyczaj jest pomijany, a w jego miejsce dodawane jest sztuczne wejście zawsze równe +1 z dodatkową wagą w0 , która jest
objęta uczeniem. Perceptron sigmoidalny o wagach wi na wejściach xi zwraca wartość
σ(x) =
N
X
wi xi )
out = σ(
(2)
i=1
Alternatywnie można wartość progu ustalić p = 0, do sieci dodać N + 1-sze wejście, które zawsze jest równe +1 oraz
stowarzyszoną z nim wagę wn+1 , która przejmie funkcję progu. Działanie neuronu jest identyczne.
Sigmoida jest funkcją ciągłą i różniczkowalną oraz:
σ 0 (x) = σ(x)(1 − σ(x)).
(3)
Można rozważać, też symetryczną sigmoidę:
tanh(x) =
1 − exp(x)
= 2 · σ(x) − 1
1 + exp(x)
(4)
1.5
=1
=2
=5
=10
1.4
1
1.2
1
0.8
0.5
0.6
0.4
0.2
0
0 10
5
10
5
0
0
-5
-0.5
-3
-2
-1
0
1
2
-5
-10
-10
3
(a) Jeden wymiar parametry c = 1, c = −3, c = 10
(b) Sigmoida określona na sumie ważonej dwóch
zmiennych.
Rysunek 1: Wykres sigmoidy σ(x) =
1
1+exp(−c(x))
Podobnie jak w przypadku neuronów progowych, perceptrony z sigmoidalną funkcją aktywującą można łączyć w sieci. Ze
względu na ciągłą (i różniczkowalną!) zależność wyjścia od danych można stosować bardziej wyrafinowane (ale i wymagające!)
algorytmy uczenia (alg. spadku gradientowego, ang. gradient descent).
1
w = [ -3.0 3.0 -1.5 3.0 -3.0 -1.5 * * -2.0]
4
4
3.5
3.5
3
3
2.5
2.5
2
2
1.5
1.5
1
1
0.5
0.5
0
25
0
4
-5
20
-4
2
-2
0
0
15
10
0
-2
10
5
2
-4
5
15
0
4
20
-5 25
(a) Portret błędu sieci z progową funkcją aktywacji.
(b) Portret błędu sieci z sigmoidalną funkcją aktywacji.
Rysunek 2: Portret błędu dla problemu XOR (projekcja na dwa wymiary).
1.2
Wsteczna propagacja błędu / backerror propagation
Dane: Sieć warstwowa perceptronów o sigmoidalnej funkcji aktywacji. Znane są ilości perceptronów w poszczególnych
warstwach (tzn. wymiary tablic z wagami). Ponadto dany jest zestaw uczący — zbiór przykładowych danych E i = (E1i , Eni )
i oczekiwanych odpowiedzi C i dla i = 1..P (ilość przykładów).
UWAGA: wszystkie C i są znormalizowane: C i ∈ [0.1, 0.9] (dla tanh(): C i ∈ [−0.9, 0.9])
Wartości wejść nie muszą spełniać tej własności, ale dobrze będzie jeżeli pozostaną ograniczone / lub przeskalowane, jeżeli
ich zakres jest za duży.
Wynik: Wartości wagi (zestaw tablic!), minimalizujące błąd średniokwadratowy.
Funkcja błędu, określa jak bardzo niedostosowana jest sieć do zestawu uczącego
ERR(W, E, C) =
P
1 X
(out(E i ) − C i )2
P i=1
(5)
Naturalna interpretacja — im mniejsza wartość funkcji błędu tym lepiej nauczona sieć. Wniosek — algorytm powinien
poszukiwać minimum funkcji ERR na przestrzeni wszystkich możliwych konfiguracji wag sieci (już sam wymiar przestrzeni
może być gigantyczny, a do tego wagi są liczbami rzeczywistymi!).
Oznaczenia
• η > 0 — stała uczenia,
• wij — waga pomiędzy neuronem itym we wcześniejszej warstwie, a j-tym w następnej
• σ() — funkcja sigmoidalna
• oi , Ii,j — wyjście z neuronu i, wejście numer i do neuronu numer j w następnej warstwie, są to te same wartości (choć
mogą występować w różnych kontekstach), wejściami do warstwy pierwszej są dane uczące Ii,1 = Eij .
• E j , C j zestaw uczący i odpowiadający mu poprawny wynik, Eji ∈ [0..1] więc dane z poza tego przedziału należy
znormalizować. Podobnie wynikowa odpowiedź C ∈ (0.1..0.9). UWAGA! Ponieważ sigmoida nie osiąga wartości 0 ani
1 nie należy stosować skrajnych wartości odpowiedzi.
Algorytm
1. ∆wi,j := 0 dla wszystkich wag
2. Wybierz przykład uczący E z listy przykładów i odpowiadający mu poprawny wynik C.
3. Oblicz wynik działania sieci na E, zapamiętaj go, zapamiętaj również wyniki w warstwach pośrednich oj , sumy ważone
inj (wyniki przed zaaplikowaniem funkcji aktywującej) i wejścia do neuronów w danej warstwie Ik,j (wejściem do
warstwy pierwszej jest przykład, dla warstw wyższych j są nimi wyniki z warstwy poprzedniej k).
Zatem zachodzi:
inj =
X
Ik,j wk,j
k
oj = σ(inj )
Ij,l = oj
Gdzie k jest indeksem neuronu w warstwie poprzedniej, j — w warstwie bieżącej, l — w warstwie następnej.
4. Dla wszystkich jednostek i w wyjściowej warstwie wykonaj:
• Oblicz błąd erri = Ci − oi
• Oblicz ∆i = erri · σ 0 (ini )
• Uaktualnij wagi od jednostek j (poprzednia warstwa) do jednostki i:
∆wj,i
= ∆wj,i + η · Ij,i · ∆i
= ∆wj,i + η · oj · erri · σ 0 (ini )
5. Dla wszystkich jednostek j w kolejnych warstwach sieci (schodząc warstwami od przedostatniej do pierwszej):
P
• Oblicz błąd errj = l wj,l · ∆l
• Oblicz
∆j = σ 0 (inj ) · errj
• Uaktualnij wagi od jednostki k (wcześniejsza warstwa) do jednostki j:
∆wk,j = ∆wk,j + η · Ik,j · ∆j
6. Online mode: wij + = ∆wi,j (dla wszystkich wag w sieci) i wróć do 1.
7. Batch mode: wróć do 1, po przebiegnięciu wszystkich przykładów wykonaj wij + = ∆wi,j (dla wszystkich wag w sieci)
i rozpocznij przebieganie jeszcze raz.
8. Zakończ po wykonaniu określonej liczby kroków lub osiągnięciu zadowalającego poziomu błędu
1.3
Algorytm spadku grdientowego
∂f
∂f
Dana niech będzie funkcja f : Rn → R ciągła i różniczkowalna (istnieją pochodne cząstkowe ∂x
... ∂x
). Chcemy wyznaczyć
1
n
n
minimum (lokalne) funkcji tj. x ∈ R , takie że dla f (x) ≤ f (y) dla y należących do pewnego otoczenia x. Dodatkowo dany
niech będzie pewien punkt startowy a0 ∈ Rn .
Przypomnijmy definicję pochodnych cząstkowych
∂f
f (x1 , .., xi−1 , xi + h, xi+1 , ...xn ) − f (x1 , ..., xn )
(x1 , ..., xn ) = lim
h→0
∂xi
h
(6)
∂f
Zastanówmy się czym jest ∂x
(a0 )? Intuicyjnie jest to kierunek, w którą stronę funkcja rośnie zmieniając pierwszą współ1
rzędną, przy pozostałych ustalonych. Mając cały zestaw pochodnych cząstkowych (gradient) mamy dokładny kierunek, w
którym funkcja najszybciej rośnie.
Szukając minimum należy zatem wybrać zwrot przeciwny i... udać się w jego kierunku.
1. Rozpocznij w losowym / wybranym a(0)
2. Dla każdej współrzędnej i = 1..n
(k+1)
ai
(k)
= ai
−η·
∂f (k)
(a )
∂xi
3. Powtarzaj krok 2
Uwagi:
• W przykładach rozważana jest parabola — funkcja posiada dokładnie jedno minimum lokalne (i bardzo ładne wzory
do jego analitycznego obliczenia — jej celem jest ilustrowanie działania algorytmu). Jeżeli funkcja rozbiega do (minus)
nieskończoności algorytm może się zapętlić.
25
20
15
10
5
0
-6
-4
-2
0
2
4
6
8
Rysunek 3: Interpretacja pochodnych cząstkowych.
35
30
50
25
40
30
20
20
10
15
06
4
10
2
0
5
-2
-4
0
-6
-4
-2
0
2
4
6
-6 -6
-4
-2
0
2
4
6
(b) f (x, y) = x2 + 12 y 2
(a) f (x) = x2
Rysunek 4: Postęp GDA do obliczania minimum funkcji.
• Trajektoria poszukiwania minimum zależy od punktu startowego. Wybór „złego” może powodować utknięcie w minimum lokalnym. Zazwyczaj nie ma możliwości stwierdzenia, że jest to minimum lokalne. W takiej sytuacji jednym z
sensowniejszych pomysłów jest ponowne uruchomienie algorytmu z innym / losowym punktem startowym.
• Sugerowane warunki stopu: gdy zmiany będą bardzo małe (poniżej ustalonego progu względnego lub bezwzględnego),
po wykonaniu ustalonej liczby iteracji, po osiągnięciu zadowalającej wartości.
• Parametr η > 0 jest stałą uczenia. Zbyt duża wartość uniemożliwi osiągnięcie minimum (kolejne punkty zaczną
„przeskakiwać minimum na drugą stronę”), zbyt mały spowoduje powolne działanie. Wartość η można „uzmiennić” i
zmniejszać wraz z postępem obliczeń.
(Jeżeli ktoś jeszcze nie spostrzegł...) Wsteczna propagacja błędu jest algorytmem spadku gradientowego. Minimalizowane
jest funkcja błędu (nieujemna!) 5.
ERR =
1X
(out(E i ) − C i )2
2 i
Dziedziną funkcji jest przestrzeń wszystkich wartości wag. Każda waga jest rzeczywista. Przy x wejściach, trzech
warstwach liczących kolejno j,k,l neuronów cała przestrzeń ma wymiar xj + jk + kl (tu już trudniej o gotowe analityczne
wzory dla każdej z wag).
2
Zadania na zajęcia
2.1
Zad. przybliżenie funkcji w R1
Zaimplementuj sieć neuronów (jedno wejście, dwie warstwy ukryte z kilkoma neuronami + jedno wyjście), która będzie się
uczyła nieznanej funkcji f : R → R.
• Napisz funkcje, które obliczają σ() i σ 0 () (będą potrzebne przy uczeniu)
% sigmoid function
function ret = sigm ( x )
ret = 1./(1+ exp ( - x ));
end
oraz
% derivative of sigmoid
function ret = sigmPrime ( x )
a = 1./(1+ exp ( - x ));
ret = a .*(1 - a );
end
• zaimplementuj dynamikę sieci skierowanej (sumy ważone można traktować jako mnożenie macierzy przez wektor)
function ret = network (x , wagi )
x1 = sigm ([ x ,1]* wagi . W1 );
x2 = sigm ([ x1 ,1]* wagi . W2 );
x3 = sigm ([ x2 ,1]* wagi . W3 );
ret = x3 ;
end
• wygeneruj dane uczące: pary współrzędna — wartość,
Uwaga do ściągawki: wykorzystany został ’strukturo-podobny’ sposób przechowywania trzech tablic z wagami (W1,
W2, W3) jako ’pola’ innej zmiennej.
• zaimplementuj algorytm wstecznej propagacji
function wagi = bep ( EX , EC , wagi )
iters =1000;
eta =.1;
% Uwaga ! w wersji on - line nalezy brac przyklady losowo
for t =1: iters
delta . W1 = wagi . W1 *0;
delta . W2 = wagi . W2 *0;
delta . W3 = wagi . W3 *0;
for j =1: length ( EX )
% losowy przyklad
j = floor ( rand ()* length ( EX )) + 1;
example = EX ( j );
expected = EC ( j );
% wyniki posrednie
in1 = [ example ,1]* wagi . W1 ;
in2 = [ sigm ( in1 ) ,1]* wagi . W2 ;
in3 = [ sigm ( in2 ) ,1]* wagi . W3 ;
out = sigm ( in3 );
% warstwa wyjsciowa :
error3 = expected - out ;
delta3 = error3 .* sigmPrime ( in3 );
% poprawa wag : w += eta * error * input
delta . W3 = delta . W3 + eta .* [ sigm ( in2 ) ,1] ’ * delta3 ’ ;
% Layer 2
error2 = wagi . W3 (1: end -1 ,:) * delta3 ;
delta2 = error2 .* sigmPrime ( in2 ) ’;
delta . W2 = delta . W2 + eta * [ sigm ( in1 ) ,1] ’ * delta2 ’;
% Layer 1
error1 = wagi . W2 (1: end -1 ,:) * delta2 ;
delta1 = error1 .* sigmPrime ( in1 ) ’;
delta . W1 = delta . W1 + eta * [ example ,1] ’ * delta1 ’;
end % for wszystkie przyklady
wagi . W1 = wagi . W1 + delta . W1 ;
wagi . W2 = wagi . W2 + delta . W2 ;
wagi . W3 = wagi . W3 + delta . W3 ;
end % for iters
end % function
• naucz sieć na przykładach uczących:
function test1 ()
% ilosc neuronow : 1( wejscie ) , 6 w L1 , 4 w L2 , 1 wyjsciowy
wym1 = 1;
wym2 = 6;
wym3 = 4;
wym4 = 1;
% losowe
wagi . W1 =
wagi . W2 =
wagi . W3 =
%
%
wagi
randn ( wym1 +1 , wym2 );
randn ( wym2 +1 , wym3 );
randn ( wym3 +1 , wym4 );
M =100;
EX = rand (1 , M )*4 -2;
% funkcja celu
C = sin (2* EX ) + cos (1.2* EX .^2) - EX ;
C = (1+10* EX )./ abs (.1 - EX );
C = exp ( -( EX ).^2);
% normalizacja do [.1 , .9]
skalC = ( C - min (C ’)) / ( max (C ’) - min (C ’)) * 0.8
+ 0.1;
wagi2 = bep1 ( EX , skalC , wagi );
end ; % function
3
Zadania programistyczne (projekty)
Inne pomysły są jak najbardziej mile widziane.
3.1
Zadanie 1 — Ramię robota
Ramię robota składa się z pary sztywnych odcinków (ustalonej długości) połączonych ze sobą regulowanym zawiasem o
rozwartości od 0 do 180 stopni tj. (0..π). Punkt mocowania ramienia jest ustalony, ale można obracać ramię również w tym
punkcie. Ramieniem steruje sieć neuronowa, jej wejściami są współrzędne punktu na płaszczyźnie, w które należy sięgnąć
dłonią (para liczb znormalizowanych do [0..1]). Wyjściem są wartości rozwarcia obu zawiasów (ponownie znormalizowane do
[0.1..0.9]). Sieć należy nauczyć na wygenerowanych danych (np. wylosować pary kątów i analitycznie przeliczyć punkt, w
który dłoń trafi).
Wielkość sieci, ilość warstw ukrytych, długość ramion, ilość iteracji, sposób reprezentacji... zależna od autora.
3.2
Zadanie 2 — Pong
Napisz sieć neuronową sterującą graczem komputerowym w grze Pong / Arkanoid. Danymi do sieci mogą być np. współrzędne
piłki, kierunek i zwrot ruchu, prędkość, położenie paletki przeciwnika. Danymi wyjściowmi informacje czy przesunąć własną
paletkę w górę, czy w dół (lewo / prawo — arkanoid).
3.3
Zadanie 3 — Tanks
Napisz sieć neuronową sterującą graczem komputerowym w grze Tanks / Worms. Danymi do sieci mogą być np. współrzędne
strzelającego działa, współrzędne celu, grawitacja, wiatr (ewentualnie również topografia terenu). Danymi wyjściowymi są
kierunek (kąt) oraz siła (prędkość początkowa) strzału.
3.4
Zadanie 4 — Space invaders
Napisz sieć neuronową sterującą graczem komputerowym w grze Space Invaders / Galaxian. Danymi do sieci mogą być np.
współrzędne statku kosmicznego, współrzędne celów (ewentualnie pocisków lecących na nasz statek). Danymi wyjściowymi
mogą być zmiana położenia (lewo, prawo, góra, dół, bez zmian) oraz decyzja czy strzelać.
3.5
Zadanie 5 — Uczenie obrazu
Napisz sieć, która uczy się kolorów pikseli grayscale / RGB obrazu zależnie od współrzędnych (x, y) piksela Input: (x,y)
piksela (przeskalowane do [0,1]) + wartości przekształceń sin(x), sin(y), sin(2x), sin(2y), sin(3x), sin(3y), itd Wynik: wartość
piksela, lub kanałów RGB dla piksela (na podstawie zadanego obrazu). Iteracje: miliony.