Sieci neuronowe w grach


Sztuczna
Inteligencja
Sieci neuronowe w grach
Maciej Gorywoda
astanówmy się przez chwilę, jak działa ludz- Jak już powiedzieliśmy wcześniej, sieć neurono-
ki umysÅ‚ gdy postawić go w sytuacji, w któ- wa dziaÅ‚a w sposób, który do pewnego stopnia przy-
Zrej należy bardzo szybko dokonać wyboru pomina nasz sposób podejmowania decyzji. Sieć po-
spośród kilku możliwości. W takich momentach za- biera uproszczoną wersję sytuacji, w jakiej znajduje
zwyczaj improwizujemy  z czynników, które bierze- się agent  wersję, która została specjalnie dla niej
my pod uwagÄ™ przy podejmowaniu decyzji usuwamy przygotowana przez mechanizm analizujÄ…cy dane 
te, których nie jesteśmy pewni, a następnie porównu- a następnie próbuje znalezć wzorzec, który najlepiej
jemy wynik z naszymi wspomnieniami, to jest z wzor- pasuje do tej sytuacji. Porównanie polega na usunię-
cami podobnych sytuacji, jakie znamy z przeszłości ciu czynników, których nie jesteśmy pewni oraz na
wraz z naszymi reakcjami, oraz wynikami tych reak- zamianie fragmentów, które nie pasują do żadnego
cji. Poszukujemy wzorca połączonego z reakcją, któ- ze wzorców na te, które pojawiają się w sprawdza-
ra wyszła nam na dobre. Co prawda reakcja uwień- nym wzorcu. W końcu wybrany zostaje wzorzec wy-
czona porażką może nam powiedzieć, jak nie powin- magający najmniejszej liczby takich operacji. Należy
niśmy zareagować tym razem, ale ponieważ musimy jednak zwrócić uwagę, że tak samo jak w przypadku
podjąć decyzję w ciągu kilku sekund, ta informacja ludzi czasami podjęta decyzja tylko wydaje się być
na nic nam się nie przyda. słuszna, tak w przypadku sieci wzorzec wymagający
Tak więc staramy się znalezć wzorzec połączo- najmniejszej liczby operacji wcale nie musi być tym
ny z reakcją, która pozwoliła nam osiągnąć sukces najlepszym. Innymi słowy, rezultat może okazać się
i tak szybko, jak tylko go znajdziemy, działamy w spo- tylko lokalnym, nie globalnym optimum rozwiązywa-
sób, jaki nam ten wzorzec podpowiada  nawet jeże- nego problemu.
li obecna sytuacja różni się wyraznie od tej ze wzor- Poniżej postaram się opisać przykładową imple-
ca. Ważniejsze jest to, że od wszystkich innych pa- mentację sieci neuronowej jako jednostki kontrolu-
miętanych przez nas wzorców obecna sytuacja różni jącej obiekt poruszający się w grze komputerowej.
się jeszcze bardziej. Jednakże by tego dokonać, muszę wcześniej powie-
Sztuczne sieci neuronowe to dział nauki o sztu- dzieć przynajmniej kilka słów o samym przykłado-
cznej inteligencji, którego celem jest wykorzysta- wym środowisku gry.
nie sposobu w jaki działa ludzki mózg. Sieci neu-
ronowe zazwyczaj wykorzystywane sÄ… jako sys- Åšrodowisko gry
temy eksperckie  na podstawie niepełnej lub nie- Do zaimplementowania gry potrzebujemy trzech rze-
dokładnej informacji sieć może zaproponować roz- czy: środowiska gry wraz z fizyką oraz metodami re-
wiązanie, lub przewidzieć działanie jakiegoś zło- prezentacji terenu; obiektów znajdujących się w tym
żonego systemu  z czym, ze względu na brak środowisku, z których część może poruszać się po
danych, konwencjonalny program komputerowy nim, a część nie; oraz agentów kontrolujących nie-
mógłby mieć problemy. Z tych samych względów które z obiektów ruchomych.
sieć neuronowa może również służyć do rozpo- Środowisko składa się z różnych materiałów,
znawania twarzy lub głosu. z których każdy ma inne współczynniki  na przykład
Jednakże w niniejszym artykule chciałbym skon- tarcie. Środowisko gry możemy porównać do plan-
centrować się na innym zastosowaniu: Mechanizm szy, podczas gdy fizyka  czyli zbiór mechanizmów
działania sieci neuronowych bazuje na sposobie, opisujących zachowanie obiektów  to zasady, wedle
w jaki działa ludzki mózg. Mózg kieruje ciałem czło- których toczy się rozgrywka.
wieka. Dlaczego więc sieć neuronowa nie mogłaby Jeżeli środowisko jest planszą, to obiekty są pion-
zostać użyta do kontroli robota, sondę, lub, w symulo- kami. Niektóre z nich są nieruchome i mogą być uży-
wanym środowisku, agenta? Lub też, skoro już jeste- wane w charakterze zródeł energii lub informacji (co
śmy przy symulowanych środowiskach, dlaczego nie w grze oznacza, że mogą być zjadane, lub niszczone
miałaby prowadzić do walki naszych komputerowych w celu zdobycia pewnych przedmiotów), albo też mo-
przeciwników w grach typu First Person Perspective. gą być po prostu przeszkodami ustawionymi na dro-
dze z jednego punktu do drugiego. Inne obiekty sÄ… ru-
chome, ale pasywne  tzn. poruszą się jeżeli zosta-
Autor jest absolwentem Politechniki Warszawskiej;
ną pchnięte lub pociągnięte w którąkolwiek stronę, ale
obecnie przygotowywuje siÄ™ do doktoratu z sieci neuro-
same z siebie pozostają w bezruchu. W końcu, nie-
nowych i pracuje jako programista gier.
które z obiektów ruchomych mogą być pojazdami wy-
Kontakt z autorem: mgorywoda@o2.pl
posażonymi w silnik, za pomocą którego mogą poru-
18
www.sdjournal.org
Software Developer s Journal 12/2005
Sieci neuronowe w grach
szać się bez pomocy z zewnątrz, oraz kamerę pozwalającą im jest klasa opisująca sytuację, w jakiej znajduje się kontrolowa-
pobierać dane na temat swojego otoczenia. Agent połączony ny pojazd. Nazwiemy ją po prostu Situation. Wszystkie war-
z pojazdem może przetwarzać te dane i na ich podstawie wy- tości w obiektach tej klasy będą przechowywane w postaci
dać pojazdowi jeden z następujących rozkazów: skwantyfikowanej  tzn. za pomocą stałych, opisujących pew-
ne przedziały wartości: np. dystans możemy opisywać za po-
" ruch w kierunku zródła energii (i pobranie energii, jeżeli mocą wartości VERYLARGE, LARGE, MEDIUM, SMALL, VERYSMALL i AL-
zródło znajduje się wystarczająco blisko); MOSTZERO, a poziom energii za pomocą VERYHIGH, HIGH, MEDIUM,
" ruch w kierunku zródła danych (i zniszczenie go, by po- LOW i VERYLOW. W przypadku dystansu przydatna będzie rów-
brać dane, jeżeli zródło znajduje się wystarczająco blisko); nież wartość UNKNOWN, używana w sytuacji gdy agent nie zna,
" obrót wokół własnej osi, by umożliwić kamerze pobranie lub nie potrafi obliczyć odległości do danego obiektu. Na Li-
danych na temat otoczenia; stingu 1. znajduje się kod przykładowej klasy Situation.
" wyłączenie silnika, jeżeli żadna z powyższych czynności
nie jest potrzebna. Konwersja
do wektora liczb (i z powrotem)
Sposób, w jaki interpretowany jest każdy z powyższych roz- Wektor wejściowy sieci neuronowej to z programistycznego
kazów, zależy od konkretnej gry: jeżeli gra, którą piszemy punktu widzenia po prostu tablica wartości, czyli zer i jedynek,
to strzelanka w rodzaju Quake lub PainKiller, ruch w kierun- które zostaną skopiowane do odpowiednich neuronów wej-
ku zródła danych może oznaczać po prostu strzał do wroga, ściowych  po jednej wartości dla każdego neuronu. Przy kon-
a pobranie energii ze zródła  podniesienie apteczki pierwszej wersji każdej zmiennej używamy takiej ilości neuronów, jaką
pomocy, lub kasety z amunicją. wartość ma największa ze stałych, opisujących jej przedziały
Centrum agenta stanowi jednostka podejmująca decyzje  wartości (czyli po sześć dla datasource _ distance i energyso-
czyli w naszym przypadku właśnie sieć neuronowa. Zadaniem urce _ distance, oraz po cztery dla energy _ level i known _ vi-
agenta jest przefiltrowanie informacji pochodzących z kamery cinity). W ten sposób, na przykład, jeżeli datasource_distan-
i przygotowanie ich do postaci wektora wejściowego dla sie- ce ma wartość VERYLARGE, pierwszy neuron otrzyma wartość
ci neuronowej. Następnie sieć przetwarza wektor i daje odpo- 1, a pięć kolejnych 0. Jeżeli pojazd zbliży się do zródła danych
wiedz, która z kolei przetwarzana jest na rozkaz. i datasource _ distance zmieni się na VERYSMALL, pięć pierw-
szych neuronów otrzyma wartość 1, a ostatni 0.
Opis sytuacji Ktoś mógłby zapytać dlaczego dla potrzeb konwersji po pro-
Jedną z najważniejszych  oczywiście oprócz samej sie- stu nie zamienimy zmiennej na jej wartość binarną. Wtedy dy-
ci neuronowej  struktur danych, jakie będą nam potrzebne, stans do celu byłby opisywany za pomocą tylko trzech neuro-
Sztuczna
Inteligencja
Listing 1. Klasa sytuacji Listing 3. Synapsa
public class Situation{ public class Synapse{
public int datasource_distance; private Neuron neuron;
public int energysource_distance; private double weight;
public int energy_level; public double getsignal(void){
public int known_vicinity; return neuron.getsignal() * weight;
public int reaction; }
static final int UNKNOWN = 0, VERYLARGE = 1, public Synapse(Neuron n,double w){
LARGE = 2, MEDIUM = 3, SMALL = 4, neuron = n; weight = w;
VERYSMALL = 5, ALMOSTZERO = 6; }
// wartości dla energy_level i known_vicinity }
static final int VERYLOW = 0, LOW = 1, MEDIUM = 2,
HIGH = 3, VERYHIGH = 4;
// wartości dla reaction ki. Agent przekazuje jej dane w postaci wektora liczb, urucha-
static final int GOTODATASOURCE = 1, mia przetwarzanie, a następnie pobiera odpowiedz, również
GOTOENERGYSOURCE = 2, w postaci wektora liczb. Obliczenia, jakie zachodzÄ… wewnÄ…trz
LOOKAROUND = 3, sieci, nie mają dla niego żadnego znaczenia.
STOP = 4; Zaprojektowanie sieci neuronowej jako czarnej skrzynki ma
} jedną bardzo ważną zaletę  sieć staje się zupełnie niezależna
od implementacji agenta, pojazdu i świata gry. Mechanizm od-
powiedzialny za konwersję danych do postaci zrozumiałej przez
nów. Na pewno pozwoliłoby to zaoszczędzić pamięć, ale bardzo sieć jest zaimplementowany w klasie agenta, nie w klasie sieci
zle wpłynęłoby na zdolności sieci neuronowej. Dystans VERYLAR- neuronowej, podobnie jak mechanizm odpowiedzialny za kon-
GE, zamieniony na postać binarną, miałby postać [0,0,1], podczas wersję danej przez sieć odpowiedzi do postaci zrozumiałej dla
gdy dystans VERYSMALL [1,0,1]  te dwie wartości różniłyby się tyl- reszty programu. Co więcej, ten sam kod sieci neuronowej, któ-
ko na jednym miejscu, co oznacza, że dla sieci neuronowej były- ry wykorzystujemy do podejmowania decyzji może być użyty
by one bardzo podobne  a to do niczego dobrego nie prowadzi. do rozwiązywania całej gamy problemów w wielu różnych apli-
Podobnie wektor wyjściowy naszej sieci neuronowej będzie kacjach  od rozpoznawania odręcznego pisma po przewidy-
składał się z czterech pozycji. Każda z wartości  odpowiadają- wanie pogody.
ca jednemu neuronowi warstwy wyjściowej sieci  będzie przy- Jednym ze sposobów klasyfikacji sieci neuronowych jest po-
porządkowana jednej z reakcji. Za odpowiedz sieci uznamy tę dział na pamięci autoasocjacyjne i heteroasocjacyjne. Pamięć
reakcję, której neuron będzie miał najsilniejszy sygnał. autoasocjacyjna to taka, która na podstawie przekazanych jej
niepełnych danych stara się odtworzyć pełny wzorzec. Takie za-
Implementujemy sieć chowanie sieci może być wykorzystywane przy rozpoznawaniu
Sieć neuronowa, zaprogramowana w języku obiektowym, ta- twarzy, dzwięku, bądz odręcznego pisma. Natomiast pamięć he-
kim jak Java lub C++, staje się czymś w rodzaju czarnej skrzyn- teroasocjacyjna stara się skojarzyć otrzymany wektor wejściowy
z pewnym wektorem wyjściowym, który został jej zaprezentowa-
Listing 2. Klasa neuronu
Listing 4. Sieć neuronowa
public class Neuron{
private Synapse[] synapses; public class Network{
private double buffer; private Neuron[] neurons;
private void sigma(void){ private int inputneurons;
buffer = 0.0; private int outputneurons;
for(int i=0;i buffer += synapses[i].getsignal(); // ...
} }
private void f(void){ public void getresponse(float[] outputvector){
buffer = 1.0 /( 1 + exp(-2.0 * buffer) ) // ...
} }
public void work(void){ public void work(){
sigma(); // ...
f(); }
} public void learn(float[][] inputset, float[][]
public double getsignal(void){ outputset){
return buffer; // ...
} }
} }
20
www.sdjournal.org
Software Developer s Journal 12/2005
Sieci neuronowe w grach
ny w procesie nauczania  czyli dokonuje takiego dokładnie pro-
Listing 5. Plik uczÄ…cy
cesu przetwarzania, jaki został opisany na początku tego artyku-
łu. Tego właśnie typu sieci neuronowej jest model, którego uży- Example{
jemy w naszym przykładzie. Jego fachowa nazwa to perceptron datasource_distance="large",
wielowarstwowy. energysource_distance="small",
Perceptron wielowarstwowy (Multi-Layered Perceptron, energy_level="medium",
w skrócie MLP) powstał jako rozszerzenie prostego perceptro- known_vicinity="medium",
nu jednowarstwowego  modelu sieci neuronowej bardzo po- reaction="gotoenergysource"
pularnego w kręgach akademickich w latach 60. MLP zazwy- }
czaj składa się z trzech warstw neuronów  wejściowej, ukry- Example{
tej, oraz wyjściowej  i taką właśnie strukturę będzie miała datasource_distance="small",
sieć, której użyjemy w naszym przykładzie. Oczywiście, możli- energysource_distance="large",
we jest zbudowanie MLP o większej ilości warstw ukrytych, ale energy_level="medium",
doświadczenie pokazuje, iż możliwości takich sieci można uzy- known_vicinity="medium",
skać po prostu dokładając nowe neurony do środkowej warstwy reaction="gotodatasource"
perceptronu trójwarstwowego. }
Example{
Neuron datasource_distance="large",
Pojedynczy neuron to prosty obiekt, składający się z bufora, energysource_distance="large",
przechowującego sygnał, tabeli połączeń z innymi neuronami energy_level="medium",
(czyli synaps), mechanizmu pobierającego i sumującego sygnały known_vicinity="verylow",
neuronów na końcach połączeń (metoda sigma), oraz funkcji pro- reaction="lookaround"
gu (f). Zadaniem funkcji progu jest przemapowanie wyniku su- }
mowania na sygnał z zakresu (0,1), za pomocą równania: Example{
datasource_distance="verylarge",
1
energysource_distance="verylarge",
v =
1+ e-k"u
energy_level="medium",
known_vicinity="large",
Współczynnik k wyznacza jak bardzo stromy jest wykres funk- reaction="stop"
cji. Dla potrzeb naszego przykładu założymy, że k = 2. }
Klasa Neuron będzie więc wyglądała tak, jak na Listingu 2.
Pojedyncza synapsa to niewielka struktura, składająca się
z referencji do obiektu klasy Neuron, oraz wagi  liczby zmien- największy sygnał. W sytuacji idealnej neuron ten miałby sy-
noprzecinkowej w zakresie (-1,1). gnał 1, podczas gdy pozostałe uzyskałyby 0  ale w prakty-
W klasie neuronu przydadzą się nam również metody ad- ce nawet przy bardzo dobrze nauczonej sieci neuron-zwycięz-
dsynapse(Neuron n,float w), deletesynapse(Neuron n), getweigh- ca będzie miał sygnał w okolicach 0,9, podczas gdy pozostałe
t(Neuron n), oraz setweight(Neuron n,float w). W zasadzie ini- od 0,05 do 0,2. Możemy więc albo już w metodzie getrespon-
cjalizację połączeń do innych neuronów moglibyśmy przepro- se odszukać neuron o największym sygnale i na jego miejsce
wadzać wyłącznie w konstruktorze klasy Neuron, ale możliwość w wektorze wyjściowym wstawić 1, a pozostałe zapełnić zera-
wprowadzania zmian w obiekcie z zewnątrz bardzo ułatwi nam mi, albo zostawić to zadanie do wykonania agentowi.
proces nauczania sieci (o czym poniżej). Działanie sieci polega na uruchomieniu metody work każ-
dego z neuronów po kolei  rozpoczynając od pierwszego
Klasa sieci neuronowej neuronu warstwy ukrytej, a kończąc na ostatnim neuronie
Nasza sieć neuronowa będzie się składać z tablicy takich neu- warstwy wyjściowej. Neurony warstwy wejściowej służą wy-
ronów, oraz kilku prostych funkcji, odpowiedzialnych za skopio- łącznie do przechowywania wartości pobranych z wektora
wanie wartości wektora wejściowego do odpowiednich neuro- wejściowego, nie muszą więc być przetwarzane.
nów pierwszej warstwy, oraz za pobranie odpowiedzi z neuro-
nów warstwy ostatniej i utworzenie na ich podstawie wektora public void work(){
wyjściowego. Podział na warstwy zapewnią nam dwie zmienne for(int i=inputneurons;i inputneurons i outputneurons, przechowujące ilość neuronów, neurons[i].work();
odpowiednio warstwy wejściowej i wyjściowej. A ponieważ w Ja- }
vie indeksowanie tablic zaczynamy od zera, inputneurons będzie
nam służyło równocześnie za indeks pierwszego neuronu war- Kilka słów o nauczaniu
stwy ukrytej, a neurons.length - outputneurons  pierwszego Zanim sieć neuronowa będzie potrafiła prawidłowo reagować na
neuronu warstwy wyjściowej. zaistniałe sytuacje, musimy ją nauczyć jak postępować w przy-
Klasa sieci neuronowej będzie więc wyglądać tak, jak na najmniej kilku wzorcowych sytuacjach  to znaczy, dla każdego
Listingu 4. O ile metoda feed polega na prostym kopiowa- sposobu, w jaki obiekt może zareagować, staramy się znalezć
niu odpowiednich wartości do odpowiednich neuronów, o tyle sytuację, w której taka reakcja jest najbardziej pożądana.
w przypadku getresponse musimy pamiÄ™tać, że interesuje nas W tym celu przygotowujemy zbiór par danych Sytuacja ®
wyłącznie informacja, który z neuronów wyjściowych uzyskał Reakcja, np. w postaci pliku tekstowego (Listing 5.).
Software Developer s Journal 12/2005 www.sdjournal.org
21
Sztuczna
Inteligencja
Listing 6. Algorytm nauczania sieci
public void learn(float[][] inputset, float[][] outputset){ for(int k=0;k // losujemy wagi wszystkich połączeń (wartości w sum += neurons[offset+k].getweight(
// zakresie <-1,1>) neurons[inputneurons+i]) * outputerror[k];
int offset = neurons.length - outputneurons; hiddenerror[i] = sum * 2.0
int hiddenneurons = offset - inputneurons; * neurons[inputneurons+i].getsignal()
float[] outputvector = new float[outputneurons]; * (1.0-neurons[inputneurons+i].getsignal());}
float[] outputerror = new float[outputneurons]; // obliczamy poprawkę do wag pomiędzy
float[] hiddenerror = new float[hiddenneurons]; // warstwą wyjściową a ukrytą
for(int ni=0;ni float learning_coeff = 1.0/ni; for(int j=0;j for(int k=0;k // wyciÄ…gamy ze zbioru wektory, neurons[inputneurons+j])
// na których będziemy pracowali + learning_coeff * outputerror[i]
float[] inputvector = inputset[k]; * neurons[inputneurons+j].getsignal();
float[] desiredoutput = outputset[k]; neurons[offset+i].setweight(
// testujemy działanie sieci neurons[inputneurons+j],d);}
feed(inputvector); // i do wag pomiędzy warstwą ukrytą a wejściową
work(); for(int i=0;i getresponse(outputvector); for(int j=0;j // obliczamy błąd na wyjściu float d=neurons[inputneurons+i].getweight(
for(int i=0;i outputerror[i]=(desiredoutput[i]-outputvector[i]) * hiddenerror[i] * neurons[j].getsignal();
* 2.0 * outputvector[i] neurons[inputneurons+i].setweight(
* (1.0 - outputvector[i]); neurons[j],d);}
// obliczamy błąd w warstwie ukrytej }
for(int i=0;i float sum=0.0; }
Jak widzimy, dane w każdej z przykładowych sytuacji od- poprawki będą coraz mniejsze, a co za tym idzie coraz do-
powiadają obiektom sytuacji i bardzo łatwo jest je skonwerto- kładniejsze.
wać do tej postaci, a następnie do postaci par wektor wejścio- Przedstawiony algorytm nie zawsze daje zadowalają-
wy ® wektor wyjÅ›ciowy. ce rezultaty. Wiele zależy od liczby neuronów w warstwie
Nauczanie sieci neuronowej odbywa siÄ™ za pomocÄ… meto- ukrytej, oraz od wyniku losowania wag  czasami wyloso-
dy propagacji wstecznej. Polega ona na przepychaniu wstecz wane wartości są tak różne od tych, do których dążymy,
błędu, jaki otrzymaliśmy w warstwie wyjściowej i identyfikowa- że założona liczba iteracji nie wystarcza. W takim wypad-
niu, oraz poprawianiu wag tych połączeń, które najbardziej przy- ku należy powtórzyć cały proces. Na szczęście nauczenia
czyniły się do powstania błędu. W procesie wykorzystywana jest sieci wystarczy dokonać tylko raz  pózniej można zapisać
pochodna funkcji progu neuronu  funkcja sigmoidalna, o której wagi połączeń i za następnym uruchomieniem programu
pisałem wcześniej, ma bardzo prostą postać pochodnej ( f'(x)=2 już tylko wczytać je z pliku.
* f(x) * (1  f(x)) ) i dlatego właśnie z niej korzystamy. Proces pro- Pozostało nam jeszcze określić liczbę neuronów war-
pagacji jest powtarzany dla każdej z par Sytuacja ® Reakcja, ja- stwy ukrytej. Niestety, na to pytanie nie ma gotowej odpo-
kich chcielibyśmy nauczyć sieć, aż do momentu, gdy wszystkie wiedzi. Jedynym pewnym sposobem jest przeprowadzenie
pary zostaną poprawnie zapamiętane. procesu nauczania przy arbitralnie wybranej, odpowiednio
Aby nie zasypywać Czytelnika nadmiarem informacji dużej liczbie neuronów, przy której sieć na pewno będzie
teoretycznych, poniżej przedstawiam kod algorytmu uczą- w stanie nauczyć się prawidłowych reakcji, a następnie
cego, czyli metodÄ™ learn klasy Network. Argumentami tej stopniowe zmniejszanie warstwy ukrytej i ponowne wywo-
metody są zbiory wektorów  zbiór wektorów wejściowych, ływanie algorytmu  aż do momentu, gdy dalsze usuwanie
oraz zbiór pożądanych wektorów wyjściowych. Wektory na neuronów będzie skutkowało powstawaniem błędnych re-
tych samych pozycjach w zbiorach odpowiadają sobie  akcji. Można też spróbować metody odwrotnej  rozpocząć
tzn. jeśli wejściem naszej sieci jest wektor inputset[x], to proces nauki od pewnej małej liczby neuronów w warstwie
wektor outputset[x] jest wynikiem, jaki chcielibyśmy uzy- ukrytej, a następnie stopniowo zwiększać ich ilość. Jeśli
skać. Będziemy również potrzebowali zmiennej number _ wybierzemy tę drugą metodę, proponuję aby rozpocząć od
of _ iterations, określającej ile razy użyjemy metody pro- ilości neuronów w warstwie ukrytej równej ilości neuronów
pagacji wstecznej, zanim nie zakończymy pracy algorytmu, w warstwie wejściowej  w powyższym przykładzie, przy
oraz współczynnika uczenia (learning _ coeff), określające- 20 neuronach na wejściu i 4 na wyjściu, wystarcza od 20
go wielkość poprawki. Współczynnik uczenia będzie ma- do 30 elementów w warstwie ukrytej, by sieć dawała prawi-
lał wraz z liczbą przeprowadzonych iteracji  innymi słowy, dłowe odpowiedzi. n
22
www.sdjournal.org
Software Developer s Journal 12/2005


Wyszukiwarka

Podobne podstrony:
StatSoft Wprowadzenie do sieci neuronowych
Nieeuklidesowe sieci neuronowe
SIECI NEURONOWE
Zastosowanie sieci neuronowych w ekonomi
Sieci neuronowe Skrypt rozdzial 10
lab5 Sieci neuronowe
sieci neuronowe pytania
sieci neuronowe i uczenie maszynowe próba integracji readme
sieci neuronowe i uczenie maszynowe próba integracji readme
zadanie sieci neuronowe
Analiza skurczu betonu za pomocÄ… sieci neuronowej RBF
Sieci neuronowe w modelowaniu zabużeń neuropsychologicznych readme
SZTUCZNE SIECI NEURONOWE
Wykłady sieci neuronowe
praca dyplomowa sieci neuronowe
badanie wrazliwosci sieci neuronowych Automatyka

więcej podobnych podstron