sieci dwuwarstwowe

Transkrypt

sieci dwuwarstwowe
sieci dwuwarstwowe
w MATLABie
LABORKA © Piotr Ciskowski
•
trzy funkcje do obsługi sieci dwuwarstwowej…:
–
init2.m
- tworzy sieć, inicjuje wagi (losowo)
–
dzialaj2.m – symuluje działanie sieci
(na pojedynczym przykładzie)
–
•
ucz2.m
- uczy sieć na zadanym ciągu uczącym
…i jeden skrypt:
–
test2.m
- sieć 2-2-1, przykład: XOR
•
init2.m
- tworzy sieć, czyli macierz wag obu warstw
i wypełnia je wartościami losowymi z zakresu -0.1 ÷ 0.1
- w sieciach jednowarstwowych
korzystamy z wejścia zerowego – biasu
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
% funkcja tworzy sieć dwuwarstwową
% i wypełnia jej macierze wag wartościami losowymi
% z zakresu od -0.1 do 0.1
% parametry: S – liczba wejść do sieci
/ liczba wejść warstwy 1
%
K1 – liczba neuronów w warstwie 1
%
K2 – liczba neuronów w warstwie 2 / liczba wyjść sieci
% wynik:
W1 – macierz wag warstwy 1 sieci
%
W2 – macierz wag warstwy 2 sieci
W1 = ...
W2 = ...
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
x0 = −1
x0 = −1
x1
x2
w
w
w
⋮ yk(1) = xk( 2)
⋮ y (1) = x( 2)
K1
S2
X
(1)
(1)
S +1×1
W (1) S +1×K1
1
Y =  y1( )  X
 (1) 
 y2 
 ⋮ 
 
 y (1) 
 K1  K1×1
wk( ,0)
2
wk( ,1)
2
⋮
1
wk( ,)S
⋮
xS
X
y1(1) = x1( 2)
(1)
(1) k ,0
k ,1
(1)
k ,2
wk( ,S) 2
⋮
y1( 2)
⋮
yk(
2)
⋮
yK( 22)
2
( 2)
Y
K1 +1×1
W ( 2) K1 +1 × K2
( 2)
=  y1( ) 
 ( 2) 
 y2 
 ⋮ 


2
(
)
y 
 K 2  K 2 ×1
2
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
% funkcja tworzy sieć dwuwarstwową
% i wypełnia jej macierze wag wartościami losowymi
% z zakresu od -0.1 do 0.1
% parametry: S – liczba wejść do sieci
/ liczba wejść warstwy 1
%
K1 – liczba neuronów w warstwie 1
%
K2 – liczba neuronów w warstwie 2 / liczba wyjść sieci
% wynik:
W1 – macierz wag warstwy 1 sieci
%
W2 – macierz wag warstwy 2 sieci
W1 = ...
W2 = ...
W (1) S +1×K1
W ( 2) K1 +1 × K2
•
dzialaj2.m
- dla sieci o danych macierzach wag W1 i W2
dla podanego na wejście wektora X
oblicza wektory wyjść warstw Y1 i Y2
- neurony obu warstw mają sigmoidalną funkcję aktywacji
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
% funkcja symuluje działanie sieci dwuwarstwowej
% parametry: W1 – macierz wag pierwszej warstwy sieci
%
W2 – macierz wag drugiej warstwy sieci
%
X – wektor wejść do sieci
%
sygnał podany na wejście ( sieci / warstwy 1 )
% wynik:
Y1 – wektor wyjść warstwy 1
( przyda się podczas uczenia )
%
Y2 – wektor wyjść warstwy 2
/ sieci
%
sygnał na wyjściu sieci
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
x0 = −1
x0 = −1
x1
x2
w
⋮ yk(1) = xk( 2)
wk( ,1)
y1( 2)
wk( ,S) 2
⋮
⋮
yk(
2)
⋮
yK( 22)
2
⋮ y (1) = x( 2)
K1
S2
⋮
1
wk( ,)S
 −1
i
 
wk( ,0)
2
2
w
w
⋮
xS
X S×1
y1(1) = x1( 2)
(1)
(1) k ,0
k ,1
(1)
k ,2
W( ) S +1×K1
1
X
(1)
S +1×1
U
f ( i)
(1)
K1 ×1
Y
 −1
i
 
(1)
K1 ×1
X
W(
( 2)
K1 +1 ×1
2)
K1 +1 × K 2
U
f (i)
( 2)
K 2 ×1
Y
( 2)
K 2 ×1
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
% funkcja symuluje działanie sieci dwuwarstwowej
% parametry: W1 – macierz wag pierwszej warstwy sieci
%
W2 – macierz wag drugiej warstwy sieci
%
X – wektor wejść do sieci
%
sygnał podany na wejście ( sieci / warstwy 1 )
% wynik:
Y1 – wektor wyjść warstwy 1
( przyda się podczas uczenia )
%
Y2 – wektor wyjść warstwy 2
/ sieci
%
sygnał na wyjściu sieci
beta
X1 =
U1 =
Y1 =
X2 =
U2 =
Y2 =
X S×1
 −1
i
 
X
= 5 ;
...
...
...
...
...
...
W(1) S +1×K1
(1)
S +1×1
U
f ( i)
(1)
K1 ×1
Y
 −1
i
 
(1)
K1 ×1
X
W ( 2 ) K1 +1 × K2
( 2)
K1 +1 ×1
U
f (i)
( 2)
K 2 ×1
Y
( 2)
K 2 ×1
przykład - XOR - w pliku test2.m
•
P = [
T = [
0
0
0
0
1
1
1
0
1
1
1
0
;
]
]
% wejścia sieci
% żądane wyjście sieci
[ W1przed , W2przed ] = init2 ( 2 ,
[ Y1 , Y2a ] = dzialaj2 ( W1przed ,
[ Y1 , Y2b ] = dzialaj2 ( W1przed ,
[ Y1 , Y2c ] = dzialaj2 ( W1przed ,
[ Y1 , Y2d ] = dzialaj2 ( W1przed ,
Yprzed = [ Y2a , Y2b , Y2c , Y2d ]
2 , 1 )
W2przed
W2przed
W2przed
W2przed
,
,
,
,
P
P
P
P
% najmniejsza dobra sieć
(:,1) ) ;
(:,2) ) ;
(:,3) ) ;
(:,4) ) ;
% [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , 2000 )
%
%
%
%
%
[ Y1 , Y2a ] = dzialaj2
[ Y1 , Y2b ] = dzialaj2
[ Y1 , Y2c ] = dzialaj2
[ Y1 , Y2d ] = dzialaj2
Ypo = [ Y2a , Y2b , Y2c
(
(
(
(
,
W1po ,
W1po ,
W1po ,
W1po ,
Y2d ]
W2po
W2po
W2po
W2po
,
,
,
,
P
P
P
P
(:,1)
(:,2)
(:,3)
(:,4)
)
)
)
)
;
;
;
;
•
ucz2.m
- dla sieci o danych macierzach wag W1 i W2
uczy sieć przez zadaną liczbę epok
na podanym ciągu uczącym – macierze P i T
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
% funkcja uczy sieć dwuwarstwową
% na podanym ciągu uczącym (P,T)
% przez zadaną liczbę epok (n)
% parametry: W1przed – macierz wag warstwy 1 przed uczeniem
%
P
– ciąg uczący – przykłady - wejścia
%
T
- ciąg uczący – żądane wyjścia
%
dla poszczególnych przykładów
%
n
- liczba epok
% wynik:
W1po
– macierz wag warstwy 1 po uczeniu
%
W2po
– macierz wag warstwy 2 po uczeniu
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
% schemat funkcji:
%
%
%
%
%
%
losuj numer przykładu
podaj przykład na wejścia i oblicz wyjścia
oblicz błędy na wyjściach warstwy 2
oblicz błędy na wyjściach warstwy 1
oblicz poprawki
wag warstw 1 i 2
dodaj poprawki do wag warstw 1 i 2
% i to wszystko n razy
- ważna kolejnosć !
- ważna kolejnosć !
- dowolna kolejność
- dowolna kolejność
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
x0 = −1
x0 = −1
x1
x2
w
⋮ yk(1) = xk( 2)
wk( ,1)
wk( ,S) 2
⋮
y1( 2)
t1
d1( 2)
⋮
yk(
tk
d k(
⋮
yK( 22)
t K2
d K( 22)
2)
2)
2
⋮ y (1) = x( 2)
K1
S2
⋮
1
wk( ,)S
 −1
i
 
wk( ,0)
2
2
w
w
⋮
xS
X S×1
y1(1) = x1( 2)
(1)
(1) k ,0
k ,1
(1)
k ,2
W( ) S +1×K1
1
X
(1)
U
S +1×1
f ( i)
(1)
Y
K1 ×1
 −1
i
 
(1)
dW
dW
E
(1)
S +1× K1
f '( i)
(1)
K1 ×1
D
X
K1 ×1
W(
( 2)
K1 ×1
K1 +1 × K 2
U
K1 +1 ×1
( 2)
E
K1 +1 × K 2
BP
(1)
2)
f (i)
( 2)
Y
K 2 ×1
f '( i)
( 2)
K 2 ×1
D
( 2)
K 2 ×1
( 2)
K 2 ×1
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
liczbaPrzykladow = ...
W1 = ...
W2 = ... ; S2 = ...
wspUcz = ...
beta = 5
for i = 1 : n ,
los = ...
nrPrzykladu = ...
X = ...
X1 = ...
[ Y1 , Y2 ] = ...
X2 = ...
% oblicz błędy na wyjściach warstwy 2
D2 = ...
E2 = ...
% błąd „wewnętrzny” warstwy 2
D1 = ...
% oblicz błędy na wyjściach warstwy 1 - BACKPROPAGATION
E1 = ...
% błąd „wewnętrzny” warstwy 1
dW1 = ...
% oblicz poprawki wag warstwy 1 z uwzgl. pochodnej
dW2 = ...
% oblicz poprawki wag warstwy 2 z uwzgl. pochodnej
W1 = ...
% dodaj poprawki do wag warstwy 1
W2 = ...
% dodaj poprawki do wag warstwy 2
end
% i to wszystko n razy
W1po = ...
W2po = ...
•
przykład - XOR
- nie każda sieć
się nauczy…
•
przykład - XOR
- ale większość
się nauczy…
do zrobienia
•
dodaj do funkcji ucz2 rysowanie wykresu błędu średniokwadratowego
w kolejnych epokach uczenia
do zrobienia
•
do funkcji ucz2 dodaj parametry:
–
m - maksymalna liczba kroków uczenia
–
e
- błąd, który sieć ma osiągnąć
- sieć będzie się uczyć do osiągnięcia zadanego błędu,
ale nie dłużej niż przez maksymalną liczbę epok
–
k
- liczba pokazów w kroku
- liczba przykładów pokazywanych w jednym kroku uczenia
do zrobienia
•
zobacz, jak będą się uczyły sieci z większą liczbą neuronów ukrytych
•
dodaj do funkcji ucz2 rysowanie wykresu błędu średniokwadratowego
w kolejnych epokach uczenia
•
do funkcji ucz2 dodaj parametry: m, e, k
•
zmodyfikuj algorytm uczenia:
–
dodaj momentum
–
zastosuj adaptacyjny współczynnik uczenia
•
po zakończonym uczeniu narysuj wykres
zależności funkcji celu od wybranej wagi sieci
(przy pozostałych wagach takich, jak po zakończeniu uczenia)
•
narysuj wykres 3D zależności funkcji celu od dwóch wybranych wag sieci