Trenowanie sieci neuronowej

0

Witam.
W programie korzystam z sieci neuronowej 3 warstwy 20 wej. 2 wyj.
algorytm FANN::TRAIN_QUICKPROP :
http://leenissen.dk/fann/index.php
Zauważyłem że po trenowaniu sieci identycznymi danymi wejściowymi sieć utworzona na ich podstawie różni się minimalnie (istnieje możliwość zapisania
utworzonych wag i powiązań w sieci) po każdym pojedynczym treningu.
Z tym nie ma problemu bo wiadomo że będzie to przybliżenie generujące oczekiwany rezultat wyniku .
Zastanawia mnie jednak czy kolejność danych w pliku trenującym ma jakiś wpływ na wyniki prawidłowego ukształtowania sieci ? np.

Plik1

Dane1 xxxxxxxxxxxxxx
wyjscie 0 0
Dane2 xxxxxxxxxxxxxx
wyjscie 0 0
Dane3 xxxxxxxxxxxxxx
wyjscie 0 0
Dane4 xxxxxxxxxxxxxx
wyjscie 0 0

Dane5 xxxxxxxxxxxxxx
wyjscie 1 1
Dane6 xxxxxxxxxxxxxx
wyjscie 1 1
Dane7 xxxxxxxxxxxxxx
wyjscie 1 1
Dane8 xxxxxxxxxxxxxx
wyjscie 1 1

A jeśli plik będzie wyglądał tak :

Plik2

Dane1 xxxxxxxxxxxxxx
wyjscie 0 0
Dane2 xxxxxxxxxxxxxx
wyjscie 1 1
Dane3 xxxxxxxxxxxxxx
wyjscie 0 0
Dane4 xxxxxxxxxxxxxx
wyjscie 1 1

Dane5 xxxxxxxxxxxxxx
wyjscie 0 0
Dane6 xxxxxxxxxxxxxx
wyjscie 1 1
Dane7 xxxxxxxxxxxxxx
wyjscie 0 0
Dane8 xxxxxxxxxxxxxx
wyjscie 1 1

.
Nie bardzo mogę zbadać różnicę "na piechotę" i mam pytanie czy istnieją jakieś
teoretyczne podstawy dla których lepiej stosować któryś ze sposobów zapisu kolejności
danych wejściowych ?

0

kolejność ma znaczenie, bo (przynajmniej w niektórych algorytmach) największy wpływ na wagi wejść ma ostatnia próbka, m.in. dlatego nauka powinna trwać wiele iteracji (kilkadziesiąt, kilkaset, zależnie od ilości i jakości danych, ale nie za dużo, żeby sieć nie zapamiętała, zamiast się nauczyć). do tego punktem startu wag powinny być losowe wartości, ale to inna sprawa.
jak to sprawdzić? jeśli będziesz startować z tymi samymi wagami, to po nauczeniu (z małą ilością iteracji) próbkami ułożonymi w różnych kolejnościach powinieneś mieć różne wartości błędów dla tych samych wartości wejść (przy założeniu, że funkcją na wyjściu sieci nie jest sgn).

0
ŁF napisał(a)

jeśli będziesz startować z tymi samymi wagami, to po nauczeniu (z małą ilością iteracji) próbkami ułożonymi w różnych kolejnościach powinieneś mieć różne wartości błędów dla tych samych wartości wejść (przy założeniu, że funkcją na wyjściu sieci nie jest sgn).

Rozumiem też że lepszym rozwiązaniem skoro wagi są ustawiane na starcie "szumem" jest podobne rozłożenie próbek - raczej w sposób losowy,
ewent do testów mogę sobie zrobić jakiś "mieszacz próbek" + stałe wejście, co powinno dać jakieś pojęcie czy sieć pracuje prawidłowo .
Dzięki to mi się przyda , ale właśnie wyjścia mam 1 i -1 co wtedy , zmienić na 0 , 1 ?
Właściwie ten zakres wartości (1,-1) wyjściowych bardziej mi odpowiada.(wejściowe sygnały też są symetryczne,no i większy zakres wyjścia).

0
dzejo napisał(a)

Witam.
Zastanawia mnie jednak czy kolejność danych w pliku trenującym ma jakiś wpływ na wyniki prawidłowego ukształtowania sieci ?
(...)
Nie bardzo mogę zbadać różnicę "na piechotę" i mam pytanie czy istnieją jakieś
teoretyczne podstawy dla których lepiej stosować któryś ze sposobów zapisu kolejności
danych wejściowych ?

Nie, nie ma żadnego znaczenia czy będziesz uczyć siec w kolejności chronologicznej czy jakiś inny sposób. Wyjątkiem są sieci rekurencyjne, ale to chyba logiczne, że wówczas trzeba uczyć sieć po kolei. Ba, uczenie sieci w sposób losowy jest nawet zalecane. Oczywiście warunek jest taki, że dane wejściowe odpowiadają danym wzorcowym! tzn. że losujesz index, które dane mają być obecnie uczone i ten index bierzesz zarówno dla danych wzorcowych jak i uczących.

dzejo napisał(a)

Rozumiem też że lepszym rozwiązaniem skoro wagi są ustawiane na starcie "szumem" jest podobne rozłożenie próbek - raczej w sposób losowy,
ewent do testów mogę sobie zrobić jakiś "mieszacz próbek" + stałe wejście, co powinno dać jakieś pojęcie czy sieć pracuje prawidłowo .

Zarówno wypowiedzi ŁF jak i tej wyżej nie mogę zrozumieć.

Pozdrawiam

0
WojtekS napisał(a)

Nie, nie ma żadnego znaczenia czy będziesz uczyć siec w kolejności chronologicznej czy jakiś inny sposób.
(...) Ba, uczenie sieci w sposób losowy jest nawet zalecane.

te dwa zdania są sprzeczne.

WojtekS napisał(a)

Zarówno wypowiedzi ŁF jak i tej wyżej nie mogę zrozumieć.

nie wiem, co tam niezrozumiałego napisałem... może raz jeszcze: twierdzę, że kolejność próbek uczących ma znaczenie, ale dla sieci nierekurencyjnej pomijalne przy wielu iteracjach uczenia. twierdzę też, że można to łatwo sprawdzić, o ile na wyjściu/wyjściach sieci jest liczba rzeczywista.

dzejo napisał(a)

Rozumiem też że lepszym rozwiązaniem skoro wagi są ustawiane na starcie "szumem" jest podobne rozłożenie próbek - raczej w sposób losowy,
ewent do testów mogę sobie zrobić jakiś "mieszacz próbek" + stałe wejście, co powinno dać jakieś pojęcie czy sieć pracuje prawidłowo .

tylko dla sieci rekurencyjnych. dla innych, takich jak Twoja, wystarczy kilkadziesiąt razy powtórzyć uczenie pełnym zestawem próbek.

0
ŁF napisał(a)
WojtekS napisał(a)

Nie, nie ma żadnego znaczenia czy będziesz uczyć siec w kolejności chronologicznej czy jakiś inny sposób.
(...) Ba, uczenie sieci w sposób losowy jest nawet zalecane.

te dwa zdania są sprzeczne.
(...)
może raz jeszcze: twierdzę, że kolejność próbek uczących ma znaczenie, ale dla sieci nierekurencyjnej pomijalne przy wielu iteracjach uczenia. twierdzę też, że można to łatwo sprawdzić, o ile na wyjściu/wyjściach sieci jest liczba rzeczywista.

Niby gdzie widzisz sprzeczność w tych zdaniach?
Jeśli masz wektor danych uczących/wzorcowych to nie ma znaczenia czy będziesz uczył od najstarszej próbki do najnowsze czy np. dobierając próbki w sposób losowy. Nie powinno mieć to przynajmniej większego znaczenia w sieciach jednokierunkowych (czyli nierekurencyjnych).
W dodatku jeśli będziesz uczyć sieć od najstarszej do najnowszej to sieć może się lepiej "nauczyć" tych nowszych wzorców co w niektórych przypadkach może być niekorzystne!
Inaczej jest w sieciach rekurencyjnych, gdzie nie ma możliwości innej nauki jak chronologicznie -> od najstarszej do najnowszej - bo sieć otrzymuje wynik z poprzedniego okresu - więc logiczne jest, że musi być nauka po kolei...

A czy znasz jakiś przykład, gdzie na "wyjściu/wyjściach sieci jest..." liczba inna niż rzeczywista?

W dodatku znowu męczę się ze zrozumieniem Twoich zdań... Co niby chciałem powiedzieć pisząc: "ale dla sieci nierekurencyjnej pomijalne przy wielu iteracjach uczenia". Tzn. że co? :/

ŁF napisał(a)
dzejo napisał(a)

Rozumiem też że lepszym rozwiązaniem skoro wagi są ustawiane na starcie "szumem" jest podobne rozłożenie próbek - raczej w sposób losowy,
ewent do testów mogę sobie zrobić jakiś "mieszacz próbek" + stałe wejście, co powinno dać jakieś pojęcie czy sieć pracuje prawidłowo .

tylko dla sieci rekurencyjnych. dla innych, takich jak Twoja, wystarczy kilkadziesiąt razy powtórzyć uczenie pełnym zestawem próbek.

że co?! Wiesz w ogóle o czym piszesz? :/ Pomijam fakt, że nie rozumiem was obydwu to jeszcze trochę się obawiam, że (sorry za określenie) bredzisz...

Pozdrawiam

0
WojtekS napisał(a)

Niby gdzie widzisz sprzeczność w tych zdaniach?

Skoro piszesz, że sposób wykonania czegoś nie ma znaczenia, to nie możesz pisać, że jakiś sposób wykonania tego jest zalecany. To jest sprzeczne.

0
WojtekS napisał(a)
ŁF napisał(a)
WojtekS napisał(a)

Nie, nie ma żadnego znaczenia czy będziesz uczyć siec w kolejności chronologicznej czy jakiś inny sposób.
(...) Ba, uczenie sieci w sposób losowy jest nawet zalecane.

te dwa zdania są sprzeczne.

Niby gdzie widzisz sprzeczność w tych zdaniach?

jak można zalecać uczenie w sposób losowy twierdząc jednocześnie, że nie ma znaczenia w jakiej kolejności uczy się sieć?

WojtekS napisał(a)

nie ma znaczenia czy będziesz uczył od najstarszej próbki do najnowsze czy np. dobierając próbki w sposób losowy.
jeśli będziesz uczyć sieć od najstarszej do najnowszej to (...) w niektórych przypadkach może być niekorzystne!

jak wyżej: nie ma znaczenia, ale może być niekorzystne. jak coś, co nie ma znaczenia, może mieć znaczenie niekorzystne?!?

nie zajmowałem się sieciami rekurencyjnymi, więc będę się wypowiadać tylko na temat sieci nierekurencyjnych, do tego dla uproszczenia przyjmę proces uczenia "z nauczycielem" (próbki uczące zawierają wartości wejść i oczekiwane wartości wyjść):

  • szukanie minimum funkcji błędu i zmiana wartości wag wejść dla każdej próbki odbywa się osobno (nie można naraz uczyć dwóch i więcej próbek, bo nie możesz podać na wejścia jednocześnie dwóch próbek; dwie i więcej próbki uczone są w pętli po wszystkich próbkach, zgodzisz się?).
  • nowe wagi powodują mniejszy błąd odpowiedzi sieci dla TEJ KONKRETNEJ próbki, którą aktualnie sieć jest uczona, zgodzisz się?
  • jednocześnie zmiana wag dla TEJ próbki spowoduje zwiększenie błędu (być może nieistotne) dla poprzednich próbek, bo wagi ustalone dla minimalizacji ich błędu zostały zmienione.
  • na początku procesu uczenia skoki wag są największe (bo błąd na wyjściu jest największy i jego minimalizacja wymaga głębszych "korekt" wag).
  • skoro tak, to w pierwszej iteracji (tzw. epoce) uczenia każda kolejna próbka ma największy (negatywny) wpływ na wynik uczenia dla poprzednich próbek. jeszcze raz: największy i negatywny, bo 1) uczenie TEJ próbki zmienia wagi, 2) dopiero zaczynamy uczenie, więc zmiany wag są największe 3) zmiany wag minimalizujące błąd dla TEJ próbki zwiększają błąd dla wcześniejszych próbek (i tak się dzieje z każdą kolejną uczoną próbką - trochę "psuje" proces uczenia poprzednimi próbkami).
  • skoro tak, to po pierwszej iteracji/epoce sieć odpowiada najmniejszym błędem dla ostatniej próbki i największym dla próbki pierwszej. to samo dzieje się w kolejnych epokach, jednak skoki wag zmniejszają się (o ile uczenie przebiega prawidłowo); tu możesz polemizować, bo istnieją różne algorytmy minimalizacji błędu sieci, część z nich ma stały współczynnik uczenia (czy jak tam się nazywał, nie pamiętam dokładnie, oznaczany bodajże gammą) pośrednio wpływający na stały skok wartości wag, większość ma zmienny, malejący. jednak jeśli skok jest stały, to ostatnia próbka ma zawsze największy wpływ na wynik, a to rozkłada na łopatki Twoją teorię.
  • skoro tak, to dla MAŁEJ ILOŚCI EPOK i dla malejącego wsp. uczenia-czy-jak-mu-tam kolejność próbek ma znaczenie.
  • dla ODPOWIEDNIEJ (trudny termin) ILOŚCI EPOK (i dla malejącego wsp. uczenia) kolejność próbek traci znaczenie, bo skok wag maleją i ostatnia próbka ma dużo mniej istotny wpływ na wagi, a więc i zwiększenie błędu dla pozostałych próbek.
  • dla ZBYT DUŻEJ ILOŚCI EPOK (i dla malejącego wsp. uczenia) sieć uczy się próbek "na pamięć", żadna z próbek praktycznie nie ma wpływu na wagi (znalezione wagi zapewniają minimum funkcji błędu dla każdej próbki), a więc kolejność nie ma znaczenia.

dlatego pozwolę sobie stwierdzić, że Twoje stwierdzenie ("nie ma znaczenia czy będziesz uczył od najstarszej próbki do najnowsze") nie jest zgodne z prawdą przynajmniej dla takiej sieci i takiego typu uczenia jaki podałem i DLA MAŁEJ ILOŚCI EPOK.

WojtekS napisał(a)

Inaczej jest w sieciach rekurencyjnych, gdzie nie ma możliwości innej nauki jak chronologicznie -> od najstarszej do najnowszej

z przymrużeniem oka - mózg to wielka sieć rekurencyjna, a jakoś nie wymaga podawania próbek w konkretnej kolejności... ;)

WojtekS napisał(a)

A czy znasz jakiś przykład, gdzie na "wyjściu/wyjściach sieci jest..." liczba inna niż rzeczywista?

nie wiem, czepiasz się, czy co? wiesz, co to jest funkcja wyjścia neuronu? wiesz, jakie wartości przyjmuje funkcja sgn? owszem, każda z wartości tej funkcji (-1, 0, 1) jest też liczbą rzeczywistą, ale sens mojej wypowiedzi jest taki, że binarna odpowiedź sieci praktycznie uniemożliwia sprawdzenie wpływu kolejności próbek uczących na wartość funkcji błędu.

WojtekS napisał(a)

W dodatku znowu męczę się ze zrozumieniem Twoich zdań... Co niby chciałem powiedzieć pisząc: "ale dla sieci nierekurencyjnej pomijalne przy wielu iteracjach uczenia". Tzn. że co? :/

nie wiem, co chciałeś powiedzieć. ja chciałem powiedzieć, że dla odpowiednio wielu epok kolejność próbek nie ma znaczenia, lub jest ono pomijalne. udowodniłem to powyżej. nie wierzysz albo nie rozumiesz? sprawdź, zamiast, za przeproszeniem, bredzić.

WojtekS napisał(a)

Pomijam fakt, że nie rozumiem was obydwu to jeszcze trochę się obawiam, że (sorry za określenie) bredzisz...

jeśli nie rozumiesz, to jak możesz krytykować? proponuję douczyć się trochę teorii i usiąść przed matlabem albo zaimplementować od zera własną sieć neuronową w C czy Pascalu.

0

No to lećmy po kolei :)

ŁF napisał(a)

jak można zalecać uczenie w sposób losowy twierdząc jednocześnie, że nie ma znaczenia w jakiej kolejności uczy się sieć?

To akurat nie jest sprzeczne. To, że ostateczny wynik będzie taki sam lub bardzo podobny (nawet nie da się określić czy lepszy czy gorszy) to nie znaczy, że nie można jakiejś metody preferować/zalecać.

ŁF napisał(a)

jak wyżej: nie ma znaczenia, ale może być niekorzystne. jak coś, co nie ma znaczenia, może mieć znaczenie niekorzystne?!?

Tutaj już prędzej jest sprzeczność, chociaż moim zdaniem jest to czepianie się słówek podczas gdy Ciebie (i autora wątku) trudno było w ogóle zrozumieć.

ŁF napisał(a)

nie zajmowałem się sieciami rekurencyjnymi, więc (...)

więc swoje 3 grosze wrzuciłeś :).

ŁF napisał(a)

(...) będę się wypowiadać tylko na temat sieci nierekurencyjnych

znaczy się jednokierunkowych :)

ŁF napisał(a)
  • szukanie minimum funkcji błędu i zmiana wartości wag wejść dla każdej próbki odbywa się osobno (nie można naraz uczyć dwóch i więcej próbek, bo nie możesz podać na wejścia jednocześnie dwóch próbek; dwie i więcej próbki uczone są w pętli po wszystkich próbkach, zgodzisz się?).

I tak i nie. Mamy coś takiego jak metodę on-line i off-line. On-line polega na uczeniu próbka po próbce (po jednym wzorcu) natomiast off-line jest uczeniem dla całej próby (liczy się gradient z całej próby). Wówczas w metodzie off-line kolejność w ogóle nie ma znaczenia - bo nie ma znaczenia czy będziesz sumował od tyłu od przodu czy od środka czy może losowo. Dlatego zakładam, że chodzi Ci o metodę on-line, która ma kilka zalet ale ma też kilka wad :P.

ŁF napisał(a)
  • nowe wagi powodują mniejszy błąd odpowiedzi sieci dla TEJ KONKRETNEJ próbki, którą aktualnie sieć jest uczona, zgodzisz się?

Też niekoniecznie :). Z tej wypowiedzi definitywnie wynika, że piszesz o metodzie on-line :). Dlaczego niekoniecznie? bo wszystko zależy od kroku uczenia. Gdy będzie baaardzo mały to na pewno zmniejszysz ten błąd (chociaż o baaardzo mało). Natomiast gdy ten krok będzie duży to możesz spowodować zwiększenie tego błędu...

ŁF napisał(a)
  • jednocześnie zmiana wag dla TEJ próbki spowoduje zwiększenie błędu (być może nieistotne) dla poprzednich próbek, bo wagi ustalone dla minimalizacji ich błędu zostały zmienione.

Z tym się całkowicie nie zgodzę! Fakt, część próbek może ulec pogorszeniu ale część (i to raczej ta większa część - szczególnie w początkowej fazie uczenia) może lub nawet powinna ulec również poprawieniu. No, chyba, że Twoje dane uczące i wzorcowe są całkowicie niezależne (ale próba użycia jakiegokolwiek narzędzie jest bezcelowa).

ŁF napisał(a)
  • na początku procesu uczenia skoki wag są największe (bo błąd na wyjściu jest największy i jego minimalizacja wymaga głębszych "korekt" wag).

Tak, w sumie z tym się zgodzę :).

ŁF napisał(a)
  • skoro tak, to w pierwszej iteracji (tzw. epoce) uczenia każda kolejna próbka ma największy (negatywny) wpływ na wynik uczenia dla poprzednich próbek. jeszcze raz: największy i negatywny, bo 1) uczenie TEJ próbki zmienia wagi, 2) dopiero zaczynamy uczenie, więc zmiany wag są największe 3) zmiany wag minimalizujące błąd dla TEJ próbki zwiększają błąd dla wcześniejszych próbek (i tak się dzieje z każdą kolejną uczoną próbką - trochę "psuje" proces uczenia poprzednimi próbkami).

No i właśnie znowu zahaczamy o to "coś". Po pierwsze bardziej pasuje tu słowo krok uczenia a nie iteracja - a już na pewno nie epoka! Epoka odnosi się do całego zestawu zmiennych. Po drugie skąd w ogóle wywnioskowałeś, że ucząc jedną próbkę psujesz wszystkie inne? Do tego czemu tylko te poprzednie a nie te, które za chwilę będziesz uczyć również? hmm...

ŁF napisał(a)
  • skoro tak, to po pierwszej iteracji/epoce sieć odpowiada najmniejszym błędem dla ostatniej próbki i największym dla próbki pierwszej. to samo dzieje się w kolejnych epokach, jednak skoki wag zmniejszają się (o ile uczenie przebiega prawidłowo); tu możesz polemizować, bo istnieją różne algorytmy minimalizacji błędu sieci, część z nich ma stały współczynnik uczenia (czy jak tam się nazywał, nie pamiętam dokładnie, oznaczany bodajże gammą) pośrednio wpływający na stały skok wartości wag, większość ma zmienny, malejący. jednak jeśli skok jest stały, to ostatnia próbka ma zawsze największy wpływ na wynik, a to rozkłada na łopatki Twoją teorię.

Najpierw może ustalmy co nazywasz iteracją/epoką bo chyba Ci się pewne pojęcia pomieszały... Zaczynam się gubić w tych wypowiedziach.
Na jakiej podstawie twierdzisz, że błąd na ostatniej próbce będzie najmniejszy a na pierwszej największy? Bo ja twierdzę, że to wszystko zależy od zaszumienia Twoich danych wejściowych i wzorcowych oraz od pewnych zależności, które są w danych. Gdy pierwsza próbka będzie miała podobne "właściwości" co ostatnia a dane wejściowe będą podobne to nie rozumiem, dlaczego ta pierwsza ma być gorsza?

ŁF napisał(a)
  • skoro tak, to dla MAŁEJ ILOŚCI EPOK i dla malejącego wsp. uczenia-czy-jak-mu-tam kolejność próbek ma znaczenie.

No i znowu mam problem bo namieszałeś z epokami/iteracjami i z tym o co Ci naprawdę chodziło (przynajmniej tak mi się wydaje)...
Zadam Ci w takim razie pytanie: jeśli Twoim skromnym zdaniem to ma znaczenie to czy jest ono korzystne czy nie?
Bo ja uważam, że nie da się tego tak wprost ocenić. Po pierwsze dane możesz mieć na wstępie wymieszane (np. robiłeś ankiety i wklepujesz je w dowolnej kolejności) ale możesz mieć również szereg czasowy dane są uporządkowane! Jednak ani w jednym ani w drugim przypadku nic nie gwarantuje Ci tego, że pierwsze, środkowe, ostatnie czy jakieś inne dane będą mniej lub bardziej zaszumione...

ŁF napisał(a)
  • dla ODPOWIEDNIEJ (trudny termin) ILOŚCI EPOK (i dla malejącego wsp. uczenia) kolejność próbek traci znaczenie, bo skok wag maleją i ostatnia próbka ma dużo mniej istotny wpływ na wagi, a więc i zwiększenie błędu dla pozostałych próbek.

Te dane, które będą miały większe błędy (większa odległość między wynikiem sieci a daną wzorcową) to one będą faworyzowały uczenie (gradient będzie miał większą wartość) a nie ostatnie dane bo o nich akurat nic nie wiesz... Epoka (jak to ty nazywasz) nie ma tu nic do rzeczy. Fakt, te ostatnie będą nieco bardziej faworyzowane ale to nie znaczy, że tam błąd będzie najmniejszy.

ŁF napisał(a)
  • dla ZBYT DUŻEJ ILOŚCI EPOK (i dla malejącego wsp. uczenia) sieć uczy się próbek "na pamięć", żadna z próbek praktycznie nie ma wpływu na wagi (znalezione wagi zapewniają minimum funkcji błędu dla każdej próbki), a więc kolejność nie ma znaczenia.

Kolejna teza wzięta z sufitu. tzw. uczenie "na pamięć" jest przede wszystkim związane ze stosunkiem ilości danych uczących z ilością neuronów i ilością zmiennych a nie z ilością iteracji!!!
Spróbuj nauczyć sieć z 10 zmiennymi i 3 neuronami "na pamięć" ucząc ją na 10000 danych wzorcowych -> powodzenia... :)

ŁF napisał(a)

dlatego pozwolę sobie stwierdzić, że Twoje stwierdzenie ("nie ma znaczenia czy będziesz uczył od najstarszej próbki do najnowsze") nie jest zgodne z prawdą przynajmniej dla takiej sieci i takiego typu uczenia jaki podałem i DLA MAŁEJ ILOŚCI EPOK.

Ja natomiast pozwolę sobie stwierdzić, że mimo, że coś kojarzysz i widać, że trochę się tego uczyłeś to brakuje ci zarówno wiedzy teoretycznej jak i praktycznej. Do tego strasznie ciężko czyta się Twoje wypowiedzi (chociaż teraz było znacznie lepiej). Najgorsze jest natomiast błędne nazewnictwo, które doprowadza do błędnych wniosków. Przykładowo czym w końcu według Ciebie jest epoka/iteracja? Bo najpierw wywnioskowałem, że jest to jeden krok uczenia a później wychodzi na to, że chodzi Ci o... no właśnie o co?
Masz coś takiego:

for(int i=0; i<ilosc_iteracji;i++){
   for(int j=0; j<ilosc_danych_uczacych; j++){
      //reszta kodu
      }
   }

To która pętla według Ciebie odpowiada za iterację/epokę?

ŁF napisał(a)
WojtekS napisał(a)

Inaczej jest w sieciach rekurencyjnych, gdzie nie ma możliwości innej nauki jak chronologicznie -> od najstarszej do najnowszej

z przymrużeniem oka - mózg to wielka sieć rekurencyjna, a jakoś nie wymaga podawania próbek w konkretnej kolejności... ;)

Widać, że nie rozumiesz rekurencji... ale nie o tym jest ten post więc sobie daruję. Zadam jedynie pytanie retoryczne: a czy potrafisz podróżować w czasie? Nasza nauka przebiega od dnia narodzin do końca naszego życia -> nie wybierasz sobie "próbki uczącej" ("Aa, dziś mam 9 lat więc pouczę się o mechanice kwantowej..." <- no, chyba, że ty tak masz :))

ŁF napisał(a)

wiesz, jakie wartości przyjmuje funkcja sgn?

rzeczywiste? :D

ŁF napisał(a)
WojtekS napisał(a)

W dodatku znowu męczę się ze zrozumieniem Twoich zdań... Co niby chciałem powiedzieć pisząc: "ale dla sieci nierekurencyjnej pomijalne przy wielu iteracjach uczenia". Tzn. że co? :/

nie wiem, co chciałeś powiedzieć. ja chciałem powiedzieć, że dla odpowiednio wielu epok kolejność próbek nie ma znaczenia, lub jest ono pomijalne. udowodniłem to powyżej. nie wierzysz albo nie rozumiesz? sprawdź, zamiast, za przeproszeniem, bredzić.

Tak się składa, że SSN zajmuję się już jakiś czas. A o bredzeniu nic nie mów bo wcześniej wypowiadałeś się m.in. o sieciach rekurencyjnych (pisząc prawdziwe brednie) a teraz przyznałeś, że się nimi nie zajmowałeś.
aha a jakby co to już kilka zaimplementowałem (m.in. MLP, RBF, RMLP, Elmana i Kohonena) w dodatku bez korzystania z żadnej biblioteki (napisałem wszystko od zera) :). A ty, jakie masz osiągnięcia w tej dziedzinie?
Pozdrawiam

0

wreszcie pokazałeś, że jednak nie jesteś oszołomem, tylko się kompletnie nie rozumiemy. tak jak pisałem, ostatni raz z nn miałem do czynienia kilka lat temu, więc terminologia nieco się zatarła, o niektórych szczegółach zapomniałem, a niektórych nie poznałem. z Twojej strony kompletny brak umiejętności czytania ze zrozumieniem.
implementowałem od zera sieć na perceptronach (mlp), ale z braku czasu zabawa zatrzymała się na funkcji do minimalizacji błędu (problem z minimami lokalnymi, symulowane wyżarzanie chyba źle zaimplementowałem, a nie chciałem korzystać z gotowego kodu), poza tym to było ładne pięć lat temu. skończyło się na pomyślnym nauczeniu dwuwarstwowej sieci tabliczki mnożenia 1-9. w matlabie, korzystając z gotowej implementacji, robiłem ciut bardziej zaawansowane rzeczy.
super, że implementowałeś sieci nie korzystając "z żadnej biblioteki", tylko co to by była za implementacja, kiedy korzystasz z gotowego rozwiązania?

epoka to w podanym przez Ciebie kodzie pętla po wszystkich próbkach (czyli jedna iteracja pętli i). zresztą sam nazwałeś zmienną tak, jak ją określałem (ilosc_iteracji), więc mam wrażenie, że na siłę szukasz błędów. to samo tyczy się odpowiedzi na pytanie o wartości funkcji sgn, wyciąłeś część pytania i na tą wyciętą część sobie odpowiedziałeś, nawet nie zauważając, że to było pytanie retoryczne i gubiąc cały sens tego fragmentu mojej odpowiedzi. może Ci wytłumaczę raz jeszcze, co autor miał na myśli, skoro nie umiesz czytać ze zrozumieniem: jeśli funkcja sgn na wyjściu sieci przyjmuje trzy wartości, to bardzo ciężkie staje się zmierzenie wpływu kolejności próbek uczących na zmianę błędu na wyjściu. co innego funkcja sigmoidalna, tanh, czy wręcz liniowa. czy teraz rozumiesz, co miałem na myśli, czy nadal niewyraźnie piszę?

WojtekS napisał(a)

A o bredzeniu nic nie mów bo wcześniej wypowiadałeś się m.in. o sieciach rekurencyjnych (pisząc prawdziwe brednie) a teraz przyznałeś, że się nimi nie zajmowałeś.

nigdzie nie wypowiadałem się na ten temat, poza jednym krótkim zdaniem. być może źle mnie zrozumiałeś, być może nieuważnie przeczytałeś. nie wypowiadam się w tematach, w których nie mam choćby podstawowej wiedzy.

odpiszę coś więcej wieczorem lub jutro rano.

[edit 01.30.2011]
albo i nie odpiszę, bo mam chwilowo coś ciekawszego do roboty, zresztą nic szczególnie wartościowego do dodania nie mam.

0

Z tym się całkowicie nie zgodzę! Fakt, część próbek może ulec pogorszeniu ale część (i to raczej ta większa część - szczególnie w początkowej fazie uczenia) może lub nawet powinna ulec również poprawieniu. No, chyba, że Twoje dane uczące i wzorcowe są całkowicie niezależne (ale próba użycia jakiegokolwiek narzędzie jest bezcelowa).

Z tym twierdzeniem nie można się zgodzić. Skąd wiesz, że błąd "pozostałych" ( w domyśle - poprzednich) próbek będzie się zmniejszał? Oczywiście, że będzie się zwiększał! (mowa oczywiście o on-line BP, dla Batch learning błąd ten będzię się zmniejszał).

0
ŁF napisał(a)

wreszcie pokazałeś, że jednak nie jesteś oszołomem

Dzięki :)

Deti napisał(a)

Z tym twierdzeniem nie można się zgodzić. Skąd wiesz, że błąd "pozostałych" ( w domyśle - poprzednich) próbek będzie się zmniejszał? Oczywiście, że będzie się zwiększał! (mowa oczywiście o on-line BP, dla Batch learning błąd ten będzię się zmniejszał).

Równie dobrze ja mogę zadać pytanie dlaczego uważasz, że błąd będzie się zwiększał?

Weźmy sobie taki trochę ekstremalny przykład: mamy sobie sieć z dwoma wejściami i jednym wyjściem. Żeby ułatwić sprawę powiedzmy, że mamy tylko 2 dane wzorcowe. Dodatkowo powiedzmy sobie, że nasze zmienne są następujące:
-> t = 1, x_1 = 3, X_2 = -2 i d = 1
-> t = 2, X_1 = -3, X_2 = 2 i d= -1
gdzie t to dany okres w próbie (t = 1,2,...,n -> dla n wzorców w próbie), X_i - to zmienna "i" w t-próbie a d - to wzorzec dla t-próby.
Załóżmy teraz, że przeliczyłem sobie błędy sieci dla wszystkich okresów i gdzieś zapisałem.
Teraz pytanie: jak zmienię wartość wag w pierwszym kroku uczenia zmniejszając ten błąd to czy błąd dla drugiego wzorca się zwiększy czy zmniejszy?
Następnie przechodzę do drugiego wzorca, gdzie również "uczę" sieć zmniejszając błąd dla tego wzorca.
Pytanie nr 2: czy zmniejszając błąd przy drugim wzorcu to czy błąd dla pierwszego (poprzedniego) wzorca spadnie czy wzrośnie?
Odpowiedź jest oczywiście taka, że zmniejszając błąd dla jednego wzorca zmniejszę błąd dla drugiego bo te wszystkie zmienne są symetryczne.

Oczywiście to jest tylko taki prosty przykład bo w praktyce na symetrię nie możemy liczyć ale zakładamy, że jakieś zależności w danych są... (pomijam fakt, że tak najłatwiej przedstawić o co mi chodzi :P)
Pozdrawiam

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.