Madaline – precyzowanie zadania

0

Tworzę warstwę neuronową Madaline. Mógłby ktoś doradzić, jak dokładnie sprecyzować wykonanie zadania, które chcemy uzyskać? Dajmy na to, mamy tablicę 10x5 (10 wierszy, pięć kolumn), gdzie zapisujemy wzorce 9 cyfr dla naszej sieci neuronowej (czyli to, czego chcemy nauczyć nasz madaline). Neurony tworzymy na bazie Mccuhhola Pittsa (jak rozumiem, każdy z neuronów będzie miał 10 sygnałów wejściowych 0 lub 1 oraz wagi, które będziemy kolejno modyfikować). I nie rozumiem, jak ma dokładnie wyglądać proces nauki, jeśli przykładowo chcemy, żeby madaline w 100 pętlach zidentyfikował liczbę, która będzie przykładowo jedynką opisaną na macierzy 10x5 (oczywiście namalujemy coś nie do końca identycznego ze wzorcem). Wiem, jak działa reguła delta, ogólna koncepcja, ale jak mamy ustalić nasz wzorzec, dane do nauki, skoro każdy z neuronów może uzyskać tylko jedną oczekiwaną wartość? Mielibyśmy w tym wypadku tylko 5 możliwych do podania danych, a chcemy przecież nauczyć się całych cyfr, z których każda zajmuje 50 komórek macierzy. Prosiłbym o przybliżenie tej koncepcji. Korzystam z książki Tadeusiewicza, ale ciężko chociażby jeden przykład tam znaleźć i pojawia się niestety problem.

1

A czemu nie możesz mieć 50 neuronów? Bo skoro potrzebujesz tylu pikseli to tyle też neuronów

0

W porządku. A co powpisywać wtedy do sygnałów wejściowych? Skoro nasz wzorzec zawarty jest w 50 neuronach (10x5), a na jeden neuron przypada zaledwie tylko jedna oczekiwana wartość, a kilka sygnałów, to jak mają wyglądać sygnały wejściowe? Nie do końca to rozumiem.

1

Nie bardzo rozumiem o co ci chodzi. Na wejściu masz 50 neuronów bo tyle też pikseli. Następnie każde wejście ma ustawione 0 albo 1, zależnie od tego czy dany piksel jest zapalony czy też nie jest. Następnie to wszystko jest połaczone do warstwy ukrytej na zasadzie wszystkie wejśćia -> każdy neuron warstwy ukrytej. Na wyjściu masz 9 neuronów no bo chcesz klasyfikować 9 różnych liczb jak rozumiem (a nie 10?). I na wyjściu chcesz uzyskać jeden zapalony bit, który określi która cyferka była na wejściu. (na wyjściu oczywiście wystarczyłoby 5 neuronów gdyby kodować wynik binarnie, ale to już szczegóły).

0

W porządku, więc od początku: na początku naszym celem jest nauczenie sieci na podstawie ciągu uczącego odpowiedniej reakcji na dane wejściowe. Mamy 9 wyjść (załóżmy, że cyfry zero się nie uczymy). Żeby określić, ile mamy mieć neuronów w warstwie ukrytej (załóżmy, że będzie tylko jedna), użyjmy wzoru mnożącego warstwy wejściową i wyjściową, a następnie wyprowadźmy z tego pierwiastek. Wychodzi nam 21 neuronów. Załóżmy, że chcemy nauczyć sieć tak, żeby otrzymać ERMS <0.01 (będziemy dokładali neurony w warstwie ukrytej, zmieniali współczynniki alfa/beta, dodamy momentum i będziemy obserwować zmianę błędu np. po 5000 epok). Potem uznamy nasz ciąg za nauczony i wprowadzimy dane walidujące.
Moje pytania: skoro mamy mieć 50 neuronów, jak mają wyglądać ich synapsy? Skoro uczymy, chcemy wprowadzić wzorzec: uprośćmy, że chcemy na początek nauczyć nasz perceptron cyfr 1, 2, 3 i zminimalizować ERMS do < 0.01. Więc odtworzymy dla 50 neuronów zarówno jedynkę, dwójkę i trójkę. Pierwsza sprawa: jak mamy powprowadzać sygnały wejściowe? Każdy neuron ma mieć trzy synapsy, odpowiadające jedynce, dwójce i trójce, co łącznie dawałoby ich 150? Czy może każdy neuron ma jedną synapsę i musimy po kolei nauczyć go reakcji na każdą cyfrę, a na wyjściu "nauczycielskim" (do których będzie porównywane każde wyjście w danej epoki) mamy wprowadzić sygnał 1 na pierwszym z nich, a na pozostałych 0 (zapala się pierwsza lampka odpowiedzialna za jedynkę, pozostałe nie)? I czy dobrze określam dane nadzorujące prace sieci? Nie do końca wiem, jak zacząć tutaj w praktyce coś realizować. Prosiłbym o łopatologiczne wyjaśnienie dla tego przykładu.

0

skoro mamy mieć 50 neuronów, jak mają wyglądać ich synapsy

o_O ty się uczysz biologii czy informatyki? WTF? Bo to co teraz napisałeś jest po prostu tak głupie że brak mi słów...

Masz na wejściu 50 neuronów i każdy z nich jest połączonym z jednym pikselem wejścia. Wejściem jest obrazek złożony z 50 pikseli. Podajesz na wejście obrazek a sieć na wyjściu zapala jeden bit odpowiedzialny za "klasę".

Załóżmy prosty przypadek kiedy wejściem jest obrazek 3x3 np.
0:

111
101
111

(widać jako tako to 0 złożone z "1" na obrazku mam nadzieje :P)

No więc teraz mamy taki obrazek złożony z 9 pikseli. Spłaszczamy to: 111101111 i podajemy na wejście 9 neuronów warstwy wejściowej, po jednym pikseli na neuron. Czyli neuron 1 dostaje wartość 1, neuron 2 też 1, neuron 3 też 1, neuron 4 też 1, neuron 5 dostaje 0, ....
Następnie sieć wylicza odpowiedź na wyjściu i w warstwie wyjściowej jeden neuron daje 1, pozostałe dają 0.

Oczywiście z tym wyjściem może być też inaczej - możesz kodować wyniki binarnie i wtedy na wyjściu może być zapalone wiele "bitów", to zależy tylko od ciebie i od tego jak przygotowujesz zestawy testowe. Dla sieci to bez znaczenia generalnie.

0

Synapsami w książce Tadeusiewicza czasami nazywane są po prostu sygnały wejściowe – raczej nie sądzę, żeby imć głupio pisał. Pytam, bo neuron McCulloha Pittsa może mieć wiele wejść a jedno wyjście – w tym wypadku mielibyśmy neurony tylko o pojedynczych wejściach.
W takim razie w porządku. A jak ma wyglądać nadzór nauczyciela? Bo generalnie: oczekiwane wartości ustawiamy na końcu, jak rozumiem, więc w przypadku zera zapali się pierwszy sygnał, a pozostałe będą na zero. Dalsze wartości uczące z ostatniej warstwy przekazujemy do warstwy ukrytej po prostu propagacją wsteczną?

1

Nie chodziło mi o to że użyłeś słowa synapsa a raczej o to że pytasz o jakieś rzeczy zupełnie bez znaczenia i bez sensu. Co za różnica czy zrobisz sobie 1 neuron wejściowy z 50 wejściami czy też 50 neuronów z 1 wejściem każdy? Przecież to jest funkcjonalnie dokładnie to samo...

Anyway, uczyć to możesz na wiele sposobów, to już zależy od twojej własnej inwencji. Możesz robić backpropagation, ale równie dobrze mógłbyś to w ogóle uczyć bez nauczyciela choćby za pomocą sieci Kohonena. W przypadku sieci neuronowych nie ma jakiegoś panaceum czy też "najlepszego" algorytmu. Wszystko tu jest heurystyczne. Musisz sobie po prostu sobie coś wybrać i voila.

0

I jeszcze ostatnia sprawa: załóżmy, że korzystamy z sieci MLP ze wsteczną propagacją. I pojawia się pytanie: jak nauczyć sieć kilku cyfr? Musimy przeprogramowywać sieć na bieżąco? Przykładowo najpierw wpiszemy wzorzec do cyfry zero, wypełnimy 50 neuronów imitujących cyfrę zero, a na wyjściu ustawimy nauczyciela: zapala się pierwsza lampka, wszystkie pozostałe nie. Załóżmy, że ERMS spadnie poniżej 0,01, wsadzimy na wejście coś bliskiego cyfrze zero i sprawdzimy, jak na takim zestawie walidującym radzi sobie neuron (przy takim ERMS powinien bez problemu wykryć cyfry lekko odstające od normy albo zapisane inną "czcionką"). I teraz najważniejsze: kolejny nauczyciel zapali drugą lampkę, a na wejście wprowadzimy cyfrę 1. Czy po takim przemodulowaniu wag, przykładowo po 1000 epokach, kiedy ERMS dla nauki jedynki znowu spadnie do <0.01 i MLP nauczy się wykrywać jedynkę w zestawie walidującym, będziemy mogli znowu wprowadzić zero? Przecież te wagi będą już tak "przemłocone" pod jedynkę, że sieć raczej w ogóle nie ogarnie bez ponownego przeprowadzenia treningu dla cyfry zero – tak mi się wydaje.

0

@Ceplusplus mam pytanie, takie zupełnie seiro: Czy ty w ogóle poświęciłeś 5 minut żeby cokolwiek przeczytać na ten temat? Bo z twoich pytań wynika że nie. Wynika że próbujesz zgadywać rzeczy które są opisane w każdym artykule neural networks for dummies...

  1. Nie rozumiesz chyba w ogóle jak działa uczenie sieci, w tym przypadku backpropagation. Ty sobie niczego nie "ustawiasz" na wyjściu. Podajesz przypadek testowy na wejście. Sieć wylicza odpowiedź. Porównujesz ją z oczekiwaną odpowiedzią. Wyliczasz sobie uzyskany błąd. Wyliczasz sobie jak przesunąć współczynniki żeby błąd zmalał. Propagujesz zmiany w sieci.
  2. Nie uczy się jednej cyferki non stop tylko wszystkich na raz oczywiście. Inaczej efekt byłby dokładnie taki jak opisałeś -> nauczenie drugiej cyferki "popsuje" pierwszą. Musisz przygotować zestaw danych testowych i losowo wysyłać do sieci elementy tego zestawu i uczyć sieć.
  3. Sieć sama wcale nie będzie wykrywać symboli "zbliżonych". Ba, często można sieć "przetrenować". Musisz w zestawach testowych uwzględnić sobie lekko zmodyfikowane cyfry i uczyć także za ich pomocą.
  4. Powinieneś też zrobić zestaw "tesotwy" który zawiera inne przypadki (tzn inaczej zmodyfikowane cyferki np) niż zestaw uczący. Tym zestawem będziesz weryfikował czy sieć jest nauczona czy nie, ale nie będziesz używał go żeby uczyć sieć.
0

Nieprecyzyjnie się wyraziłem – oczywiście nie chodziło mi o ustawianie czegokolwiek na wyjściu, tylko o ustawieniu nauczyciela, przy czym po wykonaniu określonych epok na końcu porównać uzyskane odpowiedzi z oczekiwanymi. Odnośnie skryptu – czytałem Tadeusiewicza, ale ciężko było o przykłady. Potrzebowałem właśnie takiego opisu jak wyżej. Więc przykładowo: uczymy sieć cyfr 0, 1, 2. Co epokę następuje zmiana: funkcja losująca wybiera, czy na wejściu ma się pojawić obraz zera, jedynki, dwójki albo lekko zmodyfikowany obraz którejś z tych liczb (po wybraniu którejś z nich nauczyciel zawiera informacje, która lampka ma się zapalić i porównujemy po każdej epoce wyjście oczekiwane z naszym aktualnym. Wyliczamy błąd ERMS). Następnie przeprowadzamy określoną ilość epok, drukujemy wszystkie rezultaty ERMS i analizujemy wykres – jeśli np. nie ma minimów lokalnych, błąd spada do 0.01, możemy uznać sieć za nauczoną. W takim wypadku po pojedynczej epoce powinna nam znaleźć albo lekko zmodyfikowaną jedynkę, albo dwójkę, albo trójkę (z bardzo wysokim prawdopodobieństwem zidentyfikowania obiektu) – wsadzamy zestaw testowy i wykonujemy określoną ilość epok. Sprawdzamy procent poprawnych odpowiedzi i uzyskujemy finalną sprawność naszej sieci. Poprawnie to rozumuję?

1

Jeśli przez "epokę" rozumiesz tutaj pojedyńcze wywołanie. Bo jeśli ty nadal chcesz pchać tą samą literkę wielokrotnie pod rząd i uczyć sieć w ten sposób to jest to zły pomysł. Wiec jeśli dla ciebie epoka = jedno użycie sieci, to tak, dobrze rozumujesz.

0

Okej, propagacja wsteczna działa ładnie (ERMS spada do <0,01, skuteczność wykrywania dziewięciu cyfr średnio 97-98% w zestawie uczącym po 5-6 tys. epokach). Chciałbym się jeszcze zapytać o uczenie bez nauczyciela – jak nie "podpowiadamy" sieci wyjść, to wtedy sam sobie dobierze dane wyjście dla danego wzorca, jak rozumiem? Więc przykładowo skojarzy czwórkę z sygnałem wyjściowym pierwszym i na tym będzie oparte uczenie, jak nie możemy powiązać nauczyciela z wyjściami?

1

Generalnie tak. Np. sieć Kohonena po prostu będzie klasyfikować "do jednego worka" podobne wejścia i zapalać dla nich któreśtam wyjście. To będzie po prostu klasyfikacja. Symbole jednego typu pójdą do klasy pierwszej, innego do klasy drugiej itd. Ryzyko jest oczywiście takie że różne symbole trafią do tej samej klasy bo będą zbyt "podobne".

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