Mapa Kohonena

0

Witam,
zacząłem trochę interesować się sieciami neuronowymi i moją uwagę przyciągnęła mapa Kohonena. Większość rzeczy rozumiem (proces uczenia etc.) ale całej organizacji już nie :(. W związku z powyższym bardzo proszę o przybliżenie mi tematu w niżej wymienionych kwestiach (najpierw postaram się opisać co rozumiem :P):
Mam sobie jakiś wektor zmiennych, które prawdopodobnie coś reprezentują (i szukamy tych zależności). Zmiennych jest powiedzmy 10 a danych uczących 100 (tzn. próba jest wielkości 100 wektorów po 10 zmiennych)
W związku z powyższym tworzymy sobie zmienną tablica[100][10] i zapisujemy te wszystkie zmienne. Następnie tworzymy naszą sieć (mapę kohonena).
Pierwsze pytanie to czy musi to być 2-wymiarowa mapa (pytam na wszelki wypadek bo wydaje mi się, że może być),
po drugie czy rozmiar tej mapy ma być mniejszy od ilości zmiennych (tzn. np. jak zmiennych jest 10 to maksymalna wielkość mapy to 3x3?)
Po trzecie (dla pewności) czy neurony się jakoś przemieszcza czy one same się dopasowują -> problem jest taki, że jak zrobię sobie taką mapę np. mapa[3][3] i zacznę ją uczyć to np. jakieś zmienne będą najbliżej neuronu mapa[0][0] a drugi najbliższy neuron będzie położony np. na mapa[3][3] i będzie to dziwnie wyglądać później
Ostatnie pytanie to jak później interpretuje się taką sieć? wrzucam sobie nowe zmienne (już nie z danych uczących) i wygrywa np. neuron o współrzędnych mapa[1][2] -> a co z resztą? czy wyuczona już sieć ma zwracać wynik tylko najlepszego neuronu (zaklasyfikować dany zestaw zmiennych jako ten neuron) czy powinna zwracać wynik wszystkich neuronów a my będziemy mieli podgląd o sile różnych neuronów (tzn. taką siatkę trójwymiarową)? Jak to drugie to tym bardzie pytanie czy te neurony nie powinny być przez nas jakoś układane w zależności od odległości między sobą.
z góry dziękuję bardzo za pomoc w zrozumieniu tego algorytmu. Tak jak wcześniej wspomniałem algorytmy uczenia (miary odległości etc.) rozumiem a mam problem jedynie ze zrozumieniem jak to działa.
Pozdrawiam

0

Cześć!

Max80 napisał(a)

Pierwsze pytanie to czy musi to być 2-wymiarowa mapa (pytam na wszelki wypadek bo wydaje mi się, że może być),
Zwykle wykorzystuje się mapę 2D.

Max80 napisał(a)

po drugie czy rozmiar tej mapy ma być mniejszy od ilości zmiennych (tzn. np. jak zmiennych jest 10 to maksymalna wielkość mapy to 3x3?)
Rozmiar mapy dobierasz w zależności od spodziewanej ilości klastrów w danych wejściowych i ilości tych danych. Dla 10 zmiennych mapa wielkości 3x3 jest raczej zbyt mała.

Max80 napisał(a)

Po trzecie (dla pewności) czy neurony się jakoś przemieszcza czy one same się dopasowują -> problem jest taki, że jak zrobię sobie taką mapę np. mapa[3][3] i zacznę ją uczyć to np. jakieś zmienne będą najbliżej neuronu mapa[0][0] a drugi najbliższy neuron będzie położony np. na mapa[3][3] i będzie to dziwnie wyglądać później
Początkowe wartości wag neuronów można dobrać losowo lub postarać się, by równomiernie pokrywały przestrzeń danych wejściowych. To drugie jest moim zdaniem lepsze. Przy doborze losowym może się zdarzyć to, co zauważyłeś: iż neurony odległe od siebie na mapie będę bliskie w sensie wagowym. Powinno się dążyć do tego, by bliskość na mapie odpowiadała bliskości wagowej.

Max80 napisał(a)

Ostatnie pytanie to jak później interpretuje się taką sieć? wrzucam sobie nowe zmienne (już nie z danych uczących) i wygrywa np. neuron o współrzędnych mapa[1][2] -> a co z resztą? czy wyuczona już sieć ma zwracać wynik tylko najlepszego neuronu (zaklasyfikować dany zestaw zmiennych jako ten neuron) czy powinna zwracać wynik wszystkich neuronów a my będziemy mieli podgląd o sile różnych neuronów (tzn. taką siatkę trójwymiarową)? Jak to drugie to tym bardzie pytanie czy te neurony nie powinny być przez nas jakoś układane w zależności od odległości między sobą.
Najczęściej stosuje się właśnie to, iż odpowiedzią sieci na podaną wartość wejściową jest neuron, który zwycięży. Jest to najprostrze i w wielu wypadkach wystarczające.

Polecam http://blog.peltarion.com/2007/04/10/the-self-organized-gene-part-1/ :)

0

Hey,
dziękuję bardzo za odpowiedź.
Już sobie poradziłem z tym i wiem mniej więcej co i jak (uff!) :).
Pozostało jednak kilka dylematów, które trudno mi rozwiązać :/
W moim przypadku wystarczy jednak mapa jako wektor (1D) a nie mapa typu 2D.
Pozostają jednak dwa pytania:

  1. jak wybrać wstępne wartości wag, żeby nie były zbyt blisko siebie i gdy wiemy jakie wartości zwracają zmienne tj. np. z przedziału (-1,1)?
    Gdy mamy np. 1000 wzorców po 30 zmiennych każdy i chcemy stworzyć 10 neuronów to jak dobrać wagi w sposób równomierny? Tzn. oczywiście najlepiej, żeby były rozłożone (mniej więcej) zgodnie z rozkładem normalnym tzn. żeby więcej było przy przy środku (w tym przykładzie blisko 0) a rzadziej przybierały odległe wartości tzn. bliski -1 lub 1. Czy da się w ogóle do tego tak podejść?
    Głównie chodzi mi o to, że nie chcę, żeby dwa neurony były wylosowane zbyt blisko siebie!

  2. jak zrobić, żeby już po nauczeniu sieci dwa lub więcej neuronów właśnie nie były zbyt blisko siebie? czy jest możliwe jakieś zmierzenie tego i wiedząc z jakiego przedziału są zmienne?

Trochę kombinowałem z obliczeniem średniej i odchylenia standardowego dla każdego wektora zmiennych ale jakoś ciężko mi znaleźć jakieś sensowne rozwiązanie :/

Do tego dochodzi jeszcze kilka pytań, które chwilowo wyleciały mi z głowy ale wiem, że gdzieś tam są (chwilowo musiałem zrobić sobie małą przerwę z SSN) ale zamierzam do tego za jakiś czas (za jakieś dwa lub trzy tygodnie) powrócić.
Bardzo zainteresował mnie ten temat więc gdybyś miał możliwość trochę mi pomóc to byłbym wdzięczny :)
Pozdrawiam

0
max80 napisał(a)

Pozostają jednak dwa pytania:

  1. jak wybrać wstępne wartości wag, żeby nie były zbyt blisko siebie i gdy wiemy jakie wartości zwracają zmienne tj. np. z przedziału (-1,1)?
    Gdy mamy np. 1000 wzorców po 30 zmiennych każdy i chcemy stworzyć 10 neuronów to jak dobrać wagi w sposób równomierny? Tzn. oczywiście najlepiej, żeby były rozłożone (mniej więcej) zgodnie z rozkładem normalnym tzn. żeby więcej było przy przy środku (w tym przykładzie blisko 0) a rzadziej przybierały odległe wartości tzn. bliski -1 lub 1. Czy da się w ogóle do tego tak podejść?
    Głównie chodzi mi o to, że nie chcę, żeby dwa neurony były wylosowane zbyt blisko siebie!

Ja jestem za tym, by na początku neurony "rozpiąć" równomiernie na przestrzeni danych wejściowych. Polecam więc np. podzielić przedział (-1,1) na n równych części (gdzie n = liczba neuronów) i umiejscowić neurony w środku każdej z tych części.
Skąd założenenie, że rozkład normalny jest najlepszy? Nie wiesz przecież (chyba), jaki rozkład mają dane wejściowe. Algorytm właśnie dąży do znalezienia rozkładu tych danych.
Podałeś przykład 1000 wzorców w przestrzeni 30-wymiarowej. Nie wiem, czy zdajesz sobie sprawę, iż tak niewielka ilość wzórców jest OGROOOMNIE niewystarczająca, by sieć mogła choć trochę być pomocna. Dla 30 wymiarów potrzebujesz ogromnej ilości danych. Nie wiem, czy to prawda, ale dowiadywałem się już, że e30 powinno wystarczyć (a to jest więcej niż 10 bilionów wzorców!!!). Polecam znacząco zmniejszyć ilość wymiarów.

max80 napisał(a)
  1. jak zrobić, żeby już po nauczeniu sieci dwa lub więcej neuronów właśnie nie były zbyt blisko siebie? czy jest możliwe jakieś zmierzenie tego i wiedząc z jakiego przedziału są zmienne?
    Trochę kombinowałem z obliczeniem średniej i odchylenia standardowego dla każdego wektora zmiennych ale jakoś ciężko mi znaleźć jakieś sensowne rozwiązanie :/

Po co chcesz to robić? Jak wspomniałem, algorytm będzie znajdował rozkład / strukturę danych. Tak więc tam, gdzie dane będą bardziej upakowane, tam znajdzie się więcej neuronów :)

0

Hey,
dzięki jeszcze raz, że się odezwałeś :)

Ja jestem za tym, by na początku neurony "rozpiąć" równomiernie na przestrzeni danych wejściowych. Polecam więc np. podzielić przedział (-1,1) na n równych części (gdzie n = liczba neuronów) i umiejscowić neurony w środku każdej z tych części.

Dokładnie ja też do tego podchodzę, z tym, że dane są albo w przedziale (-1,1) - normalizacja albo je standaryzuję tzn. mają mniej więcej przedział (-3,3) -> chociaż zdarzają się dane z poza tego przedziału (np. 5).
Mam jednak pytanie co to znaczy "równomiernie"? Czy chodzi Ci o to, żeby jeden neuron miał np. wszystkie wagi równe 0,75 drugi 0,5 ... a ostatni -0,75 lub podobnie? Bo ja to myślałem jeszcze o czymś innym. Mianowicie jak mamy mieć jeden wymiar to wstępnie waga może być na środku przedziału (np. w punkcie 0). Natomiast mając dwa neuronu (2D) możliwości jest znacznie więcej np.:

  1. waga_11 = 0,25 waga_12 = 0,25 (dla pierwszego neuronu) i waga_21 = -0,25 waga_22 = -0,25
  2. waga_11 = 0,25 waga 12 = -025 (dla pierwszego) i waga_21 = -0,25 waga_22 = 0,25

lub jeszcze inaczej.
W 1-2D nie jest to może tak widoczne i nie powinno to być problemem, ale im większy wymiar tym więcej kombinacji jak te wstępne wagi rozmieścić... Oczywiście najprostszy byłby taki, że w każdym neuronie byłyby zainicializowane takie same wagi tj. ten pierwszy przykład jednak nie jestem jego tak pewny :/. Bardziej rozważałem jakoś rozrzucić wagi liniowo ale po całej przestrzeni - jednak nie wiem za bardzo jak to zrobić. Szukałem rozwiązania w operacji na macierzach ale nic nie przychodzi mi do głowy :(. Oczywiście chodzi mi o taką sytuację, że znam chociaż przybliżony przedział zmiennych lub po prostu znormalizować go do przedziału (-1,1) tak jak Ty to wskazałeś.
Znasz może jakąś dobrą książkę/artykuły/www, gdzie byłoby to w miarę jasno opisane? :)

Skąd założenenie, że rozkład normalny jest najlepszy?

Tutaj miałem na myśli założenie, że dane również mają rozkład normalny więc przy inicjalizacji wag lepiej by było, żeby dane były skupione bliżej środka. Tzn. np. zamiast dzielić przedział na równe odległości możemy go podzielić na takie bliższe rozkładowi normalnemu. Oczywiście gdyby okazało się, że rozkład danych jest zupełnie inny to i tak nie miałoby to większego znaczenia gdyż sieć sama powinna dojść do prawidłowego rozkładu - ewentualnie dłużej by to trwało.

Podałeś przykład 1000 wzorców w przestrzeni 30-wymiarowej. Nie wiem, czy zdajesz sobie sprawę, iż tak niewielka ilość wzórców jest OGROOOMNIE niewystarczająca, by sieć mogła choć trochę być pomocna.

Tzn. mi się wydaje, że nauczyć to się czegoś powinna - a dokładniej znaleźć (jakieś) centra z tych 1000 wzorców. Chociaż fakt, że nie jest to dużo jak na przestrzeń 30D :D. Podałem jednak tylko taki przykład :)
Poza tym chyba lepiej jest mieć nadmiar neuronów (część z nich będzie po prostu "martwa") niż sytuację, gdzie część przestrzeni będzie nie uwzględniona przez sieć (przynajmniej takie jest moje zdanie).

Dla 30 wymiarów potrzebujesz ogromnej ilości danych. Nie wiem, czy to prawda, ale dowiadywałem się już, że e30 powinno wystarczyć (a to jest więcej niż 10 bilionów wzorców!!!). Polecam znacząco zmniejszyć ilość wymiarów.

Możesz napisać skąd masz taki wzór na dobór (przybliżony ofc.) ilości wzorców? rozumiem, że jak stworzę sobie sieć z 10 neuronami to muszę zadbać o e^10 wzorców? (czyli jakieś 22000).
A jak to się ma do tworzenia mapy w 2D tzn. zamiast wektora neuronów (łańcucha) to stworzyć np. siatkę 5x5? Wówczas który wzór będzie bardziej odpowiedni: e5 czy e(5*5)? czy może jeszcze jakiś inny?
Do tego czy ma jakiś wpływ pierwotna ilość wymiarów? tzn. jak mamy n wzorców i 100 zmiennych i chcemy zredukować tą liczbę wymiarów np. do 30D (30 neuronów) to czy na ilość wzorców ma wpływ to, że pierwotnie było 100D (przestrzeń 100 wymiarowa)?

Po co chcesz to robić? Jak wspomniałem, algorytm będzie znajdował rozkład / strukturę danych. Tak więc tam, gdzie dane będą bardziej upakowane, tam znajdzie się więcej neuronów :)

No tak, ale jak już sam wspomniałeś im więcej neuronów tym więcej potrzebuję danych a chciałbym, żeby cała przestrzeń była uwzględniona (tzn. tam gdzie są skupiska moich zmiennych). Pozwolenie sieci na zbliżanie się neuronów do siebie może mi zagrozić tym, że jakaś grupa zmiennych nie zostanie uwzględniona -> szczególnie, gdy źle zainicjujemy naukę (a nie da się tego zrobić zawsze optymalnie).
W końcu powstaje również niebezpieczeństwo, że kilka neuronów będzie dokładnie (lub bardzo blisko) tego samego punku w przestrzeni a to raczej nie dobrze...

Kolejny (mam nadzieję, że już ostatni) problem to nauka metodą off line. Jak wiadomo można uczyć metodą on-line i wówczas do każdego wzorca podchodzimy osobno, sprawdzamy odległość i odejmujemy część wagi. Algorytm ten ma jednak kilka wad (m.in. neuron wraz z kolejnym wzorcem zmienia swoją pozycję co powoduje pewne faworyzowanie ostatnich wzorców). Zalecana jest wówczas metoda off-line tj. sprawdzenie odległości między wagami a wzorcami dla każdego neuronu, z sumowanie odległości i odjęcie jakiejś części tej sumy.
Problem jednak polega na tym, że neuron może być oddalony nie wiele od rzeczywistego centrum ale wygrywając przy n wzorcach zostanie z sumowana odległość dla każdego z nich co może spowodować, że zmiana jego wagi (przez uwzględnienie każdego wzorca) będzie znacznie mocniejsza i może go odrzucić w odległe miejsce (mam nadzieję, że jasno to przedstawiłem :P). czy jest jakieś rozwiązanie na ten problem?

Pozdrawiam,
i z góry dziękuję za odpowiedzi :)

0

Jednak ostatni problem nie jest "problemem" bo przecież uwzględnia się średnią odległość ze wszystkich wzorców - co przeoczyłem wcześniej :).

0

Podejrzewam, iż inaczej ode mnie rozumiesz pojęcie wymiaru. Gdy nawiązałem do twego przykładu 1000 wzorców o 30 wymiarach, to oznaczało, że każdy z tych wzorców jest wektorem o 30 zmiennych. Wydaje mi się, iż Ty traktujesz wymiar jako wymiar mapy neuronów SOM. To też jest poprawne, bo można mapę SOM zrobić 1D, 2D lub 3D (więcej raczej się nie wykorzystuje), ale ten wymiar nie ma nic wspólnego z wymiarem przestrzeni, z której bierzesz dane.

Max80 napisał(a)

Mam jednak pytanie co to znaczy "równomiernie"? Czy chodzi Ci o to, żeby jeden neuron miał np. wszystkie wagi równe 0,75 drugi 0,5 ... a ostatni -0,75 lub podobnie? Bo ja to myślałem jeszcze o czymś innym. Mianowicie jak mamy mieć jeden wymiar to wstępnie waga może być na środku przedziału (np. w punkcie 0). Natomiast mając dwa neuronu (2D) możliwości jest znacznie więcej np.:

  1. waga_11 = 0,25 waga_12 = 0,25 (dla pierwszego neuronu) i waga_21 = -0,25 waga_22 = -0,25
  2. waga_11 = 0,25 waga 12 = -025 (dla pierwszego) i waga_21 = -0,25 waga_22 = 0,25

Równomiernie znaczy, że przestrzeń danych ma zostać "zakryta" przed te początkowe wartości wag neuronów w taki sposób, by żaden fragment tej przestrzeni nie został pominięty wobec faworyzowania innych.
Przykład 1:
Przestrzeń danych wejściowych to odcinek (-1,1), czyli 1 wymiar. Przyjmujemy mapę SOM 1D w postaci 4 neuronów połączonych w łańcuch. Przedział (-1,1) dzielimy więc na 4 części: (-1,-0.5], (-0.5, 0], (0, 0.5], (0.5, 1) i neurony ustawiamy w ich środku nadając ich wagon wartości: -0.75, -0.25, 0.25, 0.75.
Można też ustawić wagi w punktach -1, -0.333, 0.333 oraz 1. Jest to także równomierne ustawienie neuronów na całej przestrzenii.
Przykład 2:
Przestrzeń wejściowa to kwadrat [0,1]x[0,1]. Chcemy mieć siatkę 9 neuronów. Ustawiamy je więc np. w punktach:
(0.25, 0.25), (0.25, 0.5), (0.25, 0.75)
(0.5, 0.25), (0.5, 0.5), (0.5, 0.75)
(0.75, 0.25), (0.75, 0.5), (0.75, 0.75)

Max80 napisał(a)

Podałeś przykład 1000 wzorców w przestrzeni 30-wymiarowej. Nie wiem, czy zdajesz sobie sprawę, iż tak niewielka ilość wzórców jest OGROOOMNIE niewystarczająca, by sieć mogła choć trochę być pomocna.

Tzn. mi się wydaje, że nauczyć to się czegoś powinna - a dokładniej znaleźć (jakieś) centra z tych 1000 wzorców. Chociaż fakt, że nie jest to dużo jak na przestrzeń 30D :D. Podałem jednak tylko taki przykład :)
Poza tym chyba lepiej jest mieć nadmiar neuronów (część z nich będzie po prostu "martwa") niż sytuację, gdzie część przestrzeni będzie nie uwzględniona przez sieć (przynajmniej takie jest moje zdanie).
Zgadza się.

Max80 napisał(a)

Dla 30 wymiarów potrzebujesz ogromnej ilości danych. Nie wiem, czy to prawda, ale dowiadywałem się już, że e30 powinno wystarczyć (a to jest więcej niż 10 bilionów wzorców!!!). Polecam znacząco zmniejszyć ilość wymiarów.

Możesz napisać skąd masz taki wzór na dobór (przybliżony ofc.) ilości wzorców? rozumiem, że jak stworzę sobie sieć z 10 neuronami to muszę zadbać o e^10 wzorców? (czyli jakieś 22000).
Nie wiem, czy taki wzór jest właściwy. Ktoś kiedyś wskazał mi go do oszacowania potrzebnej ilości danych.

Max80 napisał(a)

A jak to się ma do tworzenia mapy w 2D tzn. zamiast wektora neuronów (łańcucha) to stworzyć np. siatkę 5x5? Wówczas który wzór będzie bardziej odpowiedni: e5 czy e(5*5)? czy może jeszcze jakiś inny?
Do tego czy ma jakiś wpływ pierwotna ilość wymiarów? tzn. jak mamy n wzorców i 100 zmiennych i chcemy zredukować tą liczbę wymiarów np. do 30D (30 neuronów) to czy na ilość wzorców ma wpływ to, że pierwotnie było 100D (przestrzeń 100 wymiarowa)?
Tu właśnie dajesz oznakę błędnego rozumienia wymiarów, o czym napisałem na początku.

Max80 napisał(a)

Po co chcesz to robić? Jak wspomniałem, algorytm będzie znajdował rozkład / strukturę danych. Tak więc tam, gdzie dane będą bardziej upakowane, tam znajdzie się więcej neuronów :)

No tak, ale jak już sam wspomniałeś im więcej neuronów tym więcej potrzebuję danych a chciałbym, żeby cała przestrzeń była uwzględniona (tzn. tam gdzie są skupiska moich zmiennych).
Nie im więcej neuronów, ale im większy wymiar danych wejściowych (długość wektorów tworzących wzorce).

Max80 napisał(a)

Pozwolenie sieci na zbliżanie się neuronów do siebie może mi zagrozić tym, że jakaś grupa zmiennych nie zostanie uwzględniona -> szczególnie, gdy źle zainicjujemy naukę (a nie da się tego zrobić zawsze optymalnie).
W końcu powstaje również niebezpieczeństwo, że kilka neuronów będzie dokładnie (lub bardzo blisko) tego samego punku w przestrzeni a to raczej nie dobrze...

Trzeba właściwie dobrać współczynnik uczenia i jeśli algorytm jest dobrze napisany, to raczej nie ma obawy, że takie przypadki zaistnieją.

0

Dzięki wielkie za odpowiedź (za poświęcony czas i za podzielenie się wiedzą :) ).
Rzeczywiście było małe nieporozumienie z wymiarami bo ja bardziej zmierzam do wykorzystania redukcji wymiaru zmiennych dzięki SOM tj. każdy neuron reprezentowałby jeden wymiar (tj. 3 neurony w sieci to 3D). Dlatego gdy mamy np. 10 zmiennych do dyspozycji to redukujemy je do mniejszej przestrzeni.
Mam nadzieję, że już sobie poradzę. Tak jak wspomniałem wcześniej chwilowo zajmuję się czymś innym i nie mam za bardzo możliwości zgłębienia tego rodzaju sieci - który jest bardzo ciekawy i w najbliższej przyszłości na pewno się nim zajmę :).
Pozdrawiam

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