siec neuronowa

0

Witam,
pod delikatna presją studiów wziąłem się za napisanie sieci neuronowej. Poczytałm trochę, rozplanowałem projekt.
Pierwsza rzeczą, za która się wziąłem jest klasa neuron. działa ona w następujący sposób:

funkcja aktywacji: ** ( 2/(1+ exp( (-1*beta) * potencjal_membranowy) )-1 );**
pochodna funkcji aktywacji: ( (1-(pow( potencjal_membranowy,2)))/2)
uaktualnianie wag: ** inputsWeights[i] = (inputsWeights[i] + ( learningRate * inputs[i] * (activationFunctionDerivative() ) ));**
obliczanie błędu ostatniej warstwy: ( (ExpectValue - output) * activationFunctionDerivative() );

funkcja aktywacji uwzględnia bias.

i tutaj zaczyna sie pierwszy problem. Stworzyciel obiekt neuron i próbuje go uczyć. Daje na wejście 0.5 na wyjcie -0.5, uczę go, a on nic :) Moje pytanie, czemu tak się dzieje? Może coś we wzorach pomieszałem?

Pytanie 2: przegrzebałem setki storn i nie wiem do końca kiedy przestać uczyć siec, czy dowolny neuron. Moja funkcja bledu zwraca wartość ujemna jak sumować błędy? Dodatkowo, jeżeli mam parę wyjść, to sumuje błąd ze wszystkich tak?

Serdecznie pozdrawiam
i dziękuje za pomoc

0

Ad 1. Co znaczy "a on nic?" błąd nie maleje? rośnie?
Ad 2. Uczysz tak długo jak chcesz. Możesz ograniczyć liczbą iteracji lub wartością błędu.

crn napisał(a)

Moja funkcja bledu zwraca wartość ujemna jak sumować błędy?

hało na dziś: Błąd średniokwadratowy

0

właśnie wiem, czym jest błąd średniowarstwowy, tylko wyczytałem, żeby używać przy tej funkcji aktywacji do obliczania błędu:
( (ExpectValue - output) * activationFunctionDerivative() ); a ten błąd jest ujemny. dlatego sie gubie.

blad maleje, ale niezlaeznie od ilosci iteracji, wyjscie podawane przez neuron jest zle ( nawet ma rożny znak).

Ja wiem kiedy przestać, tylko pytam się jak. Jak obliczyć błąd dla calej sieci? tzn. kiedy wyjść mam nie jedno, a 2 np.

I jak ma się moja funkcja obliczająca błąd, do błędu średniowarstwowego.

Pozdrawiam i dzięki z pomoc

EDIT: znalazłem błąd, w uaktualnianiu wag (pominąłem o uwzględnieniu błędu tam)

dodatkowo błąd jest jakiś w pochodnej funkcji aktywacji i funkcji aktywacji. czy ktoś mógłby sprawdzić? chce używać bisigmoidalnej funkcji.

EDIT:
po zmianach funkcja aktywacji wygląda tak:
(2.0/((1.0+(exp(-betapotencjał_membranowy)))-1.0));
pochodna tak:
((1.0-(output
output))/2.0);
poprawianie wag tak:
inputsWeights[i] = (inputsWeights[i] + ( learningRate * error * inputs[i] * (activationFunctionDerivative() ) ));

i teraz działa (neuron się uczy) ale tylko w przedziale 0-1 i współczynnik uczenia musi być większy niż coś ok 0.3, inaczej funkcja zwraca mi więcej niż 1.
w teorii funkcja Funkcja sigmoidalna bipolarna powinna zwracać wartości (-1 do 1).

Zna ktoś może odpowiedź i jest chętny do pomocy? będę wdzięczny :)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1