przy czym oczywiście
Indeksy górne przy wagach neuronu z jednej strony określają numerację neuronów, do którego wagi należą (m) z drugiej zaś numerację kroków określających kolejne pokazy.
Jeśli pokusić się o intuicyjną interpretację samouczenia sieci to można to określić jako stwierdzenie: „wzmocnieniu ulegają w niej te wagi, które są aktywne (duże ) w sytuacji, gdy „ich” neuron jest pobudzony (duże )”. Tego też wynika, że sieci uczona taką strategią należy do klasy sieci autoasocjacyjnych.
Stosując prawa Hebba jako regułę uczenia uzyskuje się takie dopasowanie wag aby korelacja pomiędzy sygnałem wejściowym a zapamiętanym w formie wag wzorcem sygnału, na który dany neuron ma reagować. Stąd nazwa klasy takich strategii uczenia określana mianem uczenie korelacyjne (ang. correlation learning).
Sieć swoje działanie opiera na grupowaniu sygnałów wejściowych w klasy podobieństwa (ang. cluster) w trakcie procesu uczenia, by następnie nadchodzące sygnały klasyfikować pod względem podobieństwa do określonej klasy (dany neuron – reprezentant klasy – posiada największą wartość wyjscia).
Nasz program zawiera przykład, który obrazuje uczenie sieci neuronowej oparte o strategię reguł Hebba. Pozwala on w sposób krokowy bądź ciągły (cykle prezentacji sygnału wejściowego) obserwować zmiany wartości wag dwuwejściowych neuronów rzutowane na płaszczyznę.
struktury danych algorytmu:
LN - liczna neuronów w sieci
eta - współczynnik uczenia
lPokaz - liczba pokazów sygnału uczącego wykonanych w danej ćwiartce układu współrzędnych
lNeuron - liczba neuronów które w bieżącym kroku znajdują się w danej ćwiartce układu współrzędnych
cbxCiasno - przełącznik czy wagi początkowe mają być losowane z przedziału [-2,2] czy [-10,10] wokół losowego punktu startowego
wagi - tablica wag rozmiar tablicy jest ustalany przez wartość zmiennej LN, neurony posiadają po dwa wejścia więc wagi na neuron jest dwie
cbxLosowe - przełącznik czy ćwiartka układu współrzędnych do prezentacji ma być losowana czy zadana arbitralnie
sygnaly - wektor zawierający współrzędne punktu (sygnału) uczącego sieć
pobudzenie - tablica odpowiedzi neuronów w danym kroku przy ustalonej tablicy wag oraz zadanym sygnale uczącym
{ ile neuronów będzie uczestniczyć w pokazie }
LN := Trunc(enLiczbaNeuronow.Value);
{ ustalenie początkowej wartości współczynnika uczenia }
eta := 0.1;
{ wyczyszczenie informacji o położeniu neuronów w odpowiednich ćwiartkach układu współrzędnych }
for i := 1 to 4 do begin
lPokaz[i] := 0; lNeuron[i] := 0;
end;
for i := 1 to LN do
moc[i] := 0.0;
{ początkowe wartości wag ułożone wokół punktu startowego (x,y) }
Randomize;
x := 16.0*Random-8.0;
y := 16.0*Random-8.0;
for i := 1 to LN do
if not cbxCiasno then begin
wagi[i,1] := 20.0*Random-10.0;
wagi[i,2] := 20.0*Random-10.0;
moc[i] := sqr(wagi[i,1]) + sqr(wagi[i,2]);
end
else begin
wagi[i,1] := x-2.0*Random;
wagi[i,2] := y-2.0*Random;
moc[i] := sqr(wagi[i,1]) + sqr(wagi[i,2]);
end;
{ główna pętla losowania punktu uczącego, modyfikacji wag oraz wizualizacji tego procesu na ekranie }s
while True do
begin
{ wyczyszczenie obrazka }
.....
{ rysunek sieci }
for i := 1 to LN do begin
ix := pbrAuto.XRToPoint(wagi[i,1]);
iy := pbrAuto.YRToPoint(wagi[i,2]);
pbrAuto.Canvas.Polygon([Point(ix-2,iy-2),Point(ix+2,iy-2),Point(ix+2,iy+2),Point(ix-2,iy+2)]);
end;
{ losowanie ćwiartki lub wskazanie arbitralne przez użytkownika oraz wylosowanie punktu jako sygnału uczącego }
.....
{ zliczanie liczby pokazow }
.....
{ rysunek sygnału uczącego }
.....
{ wyliczenie pobudzenia neuronów przez wyznaczone sygnały }
.....
{ określenie maksymalnego pobudzenia }
max := 0.0;
for i := 1 to LN do begin
pobudzenie[i] := wagi[i,1]*sygnaly[1] + wagi[i,2]*sygnaly[2];
pobudzenie[i] := 4.0*pobudzenie[i]/moc[i];
if pobudzenie[i] > max then
max := pobudzenie[i];
end;
{ zerowanie liczników neuronów dla odpowiednich ćwiartek układu współrzędnych }
for i := 1 to 4 do lNeuron[i] := 0;
{ samouczenie sieci w oparciu o wyznaczone parametry pobudzenia }
for i := 1 to LN do begin
{ zapamiętanie starych wartości wag }
wagiOld[i,1] := wagi[i,1];
wagiOld[i,2] := wagi[i,2];
if pobudzenie[i] < 0.2 * max then pobudzenie[i] := 0.3 * pobudzenie[i];
if pobudzenie[i] < 0.0 then pobudzenie[i] := 0.1 * pobudzenie[i];
wagi[i,1] := wagi[i,1] + eta * pobudzenie[i] * (sygnaly[1]-wagi[i,1]);
wagi[i,2] := wagi[i,2] + eta * pobudzenie[i] * (sygnaly[2]-wagi[i,2]);
moc[i] := moc[i] + Sqr(wagi[i,1]) + Sqr(wagi[i,2]);
end;
{ zliczanie liczby neuronów w odpowiednich ćwiartkach }
.....
{ opisanie legendy uczenia w danym kroku }
WypiszLiczbyPN;
{ zerowanie liczników neuronów dla odpowiednich ćwiartek układu współrzędnych }
for i := 1 to 4 do lNeuron[i] := 0;
{ rysunek nowych wartości wag oraz obrazowanie zmiany }
.....
{ rysunek zmiany }
.....
{ rysunek starych pozycji w kolorach Czerwonym - pobudzany i Niebieskim - pobudzany przeciwnie }
.....
{ zliczanie liczby neuronów w odpowiednich ćwiartkach }
.....
{ opisanie legendy uczenia w danym kroku }
WypiszLiczbyPN;
{ zmniejszenie współczynnika uczenia }
eta := eta * 0.99;
end;
|