2009-07-29
Wsteczna propagacja błędu - sinusy na wejściu
UPDATE (2012-11-25): I get many google search hits from people looking for general information on backpropagation algorithm. Here's a very good introduction: sparseAutoencoder.pdf. These notes are from lecture on autoencoders, but the first half is a description of backpropagation algorithm, with practical hints on how to implement it.
W lutym pisałem o zabawie z implementacją zadania na sieci neuronowe. Od tego czasu praktycznie nic przy tym nie grzebałem. Dziś (spontanicznie) postanowiłem zobaczyć co by się stało gdybym na wejścia dorzucił jeszcze sinusy zależne od x i osobne zależne od y. Generalnie pomysł użycia sinusów wziąłem od Fouriera; ale nie myślałem, że będzie taki fajny rezultat. W porównaniu z sieciami bez tych wejść zbieganie do obrazu źródłowego jest bardzo szybkie (przynajmniej dla małych sieci) - dla sieci o dwóch warstwach ukrytych po 32 neurony, po kilkuset tysiącach przykładowych pikseli obraz jest już rozpoznawalny. A dodaję tylko 16 neuronów na wejściu, czyli jak mam 32 w pierwszej ukrytej to przybywa 16*32 wag, czyli tragedii nie ma.
Niestety nie mam teraz czasu na sklejenie filmu z większą ilością przykładów, ale skleiłem poniższe porównanie dwóch konfiguracji nowej sieci z sinusami i sieci starej bez sinusów - pokazuję iterację nr 2mln i 10mln (tzn 10mln losowych przykładów i wstecznych propagacji).
Obraz jeszcze trochę zbiega w kolejnych milionach iteracjach, ale dobrze by było zmniejszać stałą uczenia, bo zachowuje się trochę zbyt chaotycznie. Niestety na razie brak czasu na eksperymenty.
Dorzuciłem jeszcze wejście z szumem (dokładnie rozkład jednostajny 0.1-0.9). Chyba Keyer mi podrzucił ten pomysł jakiś miesiąc temu - nie jestem pewien czy dobrze to zapamiętałem - miało to chyba poprawić zbieganie. Dalej chyba Gruby to chyba sugerował. Być może wszystko pokręciłem i źle to robię. Na oko nie zauważyłem dużej zmiany (suma błędów na pikselach po 5-10mln iteracji) - może trochę szybciej, nie wiem na ile się zasugerowałem... Ale nawet po dłuższym uczeniu widzę, że wagi przy tym wejściu utrzymuja się na poziomie do +/-0.2 - na razie nie mam zdania co z tym zrobić.
A co do metody to muszę jeszcze poeksperymentować z różnymi funkcjami na wejściu, zmienna stała uczenia i przeróżnych konfiguracjach. Jestem też ciekaw jak obraz generowany przez sieć wyglada w powiększeniu oraz jak algorytm poradzi sobie przy bardziej jednolitych teksturach (skały, kamienie, drewno, czy jakieś powierzchnie organiczne). Może by to miało jakieś zastosowanie przy generowaniu tekstur proceduralnych? Ciekawe też jak bardzo można przyciać dokładność wag by nie zakłócić za bardzo całego obrazu.
---
UPDATE (2009-11-10 01:27): Filmik z porównaniem procesów uczenia się zwykłych sieci (pierwszy wiersz) z sieciami z sinusami na wejściu takimi jak wyżej (w drugim wierszu):
Jakiś czas temu Maja podpowiedziała mi, że dorzucanie tak zmodyfikowanych wejść przypomina tzw. metody kernelowe - czyli ma to jakąś nazwę. Ogólnie wizualnie ciekawe wyniki dostawałem też przy innych funkcjach okresowych (np. sign(sin(.)) czy arcsin(sin(.)) ), ale przy zdjęciach uczenie najlepiej przebiega przy sinusach... Nie próbowałem jeszcze całej bazy razem z cosinusami.
Zrezygnowałem na razie z wejścia losowego.
W lutym pisałem o zabawie z implementacją zadania na sieci neuronowe. Od tego czasu praktycznie nic przy tym nie grzebałem. Dziś (spontanicznie) postanowiłem zobaczyć co by się stało gdybym na wejścia dorzucił jeszcze sinusy zależne od x i osobne zależne od y. Generalnie pomysł użycia sinusów wziąłem od Fouriera; ale nie myślałem, że będzie taki fajny rezultat. W porównaniu z sieciami bez tych wejść zbieganie do obrazu źródłowego jest bardzo szybkie (przynajmniej dla małych sieci) - dla sieci o dwóch warstwach ukrytych po 32 neurony, po kilkuset tysiącach przykładowych pikseli obraz jest już rozpoznawalny. A dodaję tylko 16 neuronów na wejściu, czyli jak mam 32 w pierwszej ukrytej to przybywa 16*32 wag, czyli tragedii nie ma.
Niestety nie mam teraz czasu na sklejenie filmu z większą ilością przykładów, ale skleiłem poniższe porównanie dwóch konfiguracji nowej sieci z sinusami i sieci starej bez sinusów - pokazuję iterację nr 2mln i 10mln (tzn 10mln losowych przykładów i wstecznych propagacji).
Obraz jeszcze trochę zbiega w kolejnych milionach iteracjach, ale dobrze by było zmniejszać stałą uczenia, bo zachowuje się trochę zbyt chaotycznie. Niestety na razie brak czasu na eksperymenty.
Dorzuciłem jeszcze wejście z szumem (dokładnie rozkład jednostajny 0.1-0.9). Chyba Keyer mi podrzucił ten pomysł jakiś miesiąc temu - nie jestem pewien czy dobrze to zapamiętałem - miało to chyba poprawić zbieganie. Dalej chyba Gruby to chyba sugerował. Być może wszystko pokręciłem i źle to robię. Na oko nie zauważyłem dużej zmiany (suma błędów na pikselach po 5-10mln iteracji) - może trochę szybciej, nie wiem na ile się zasugerowałem... Ale nawet po dłuższym uczeniu widzę, że wagi przy tym wejściu utrzymuja się na poziomie do +/-0.2 - na razie nie mam zdania co z tym zrobić.
A co do metody to muszę jeszcze poeksperymentować z różnymi funkcjami na wejściu, zmienna stała uczenia i przeróżnych konfiguracjach. Jestem też ciekaw jak obraz generowany przez sieć wyglada w powiększeniu oraz jak algorytm poradzi sobie przy bardziej jednolitych teksturach (skały, kamienie, drewno, czy jakieś powierzchnie organiczne). Może by to miało jakieś zastosowanie przy generowaniu tekstur proceduralnych? Ciekawe też jak bardzo można przyciać dokładność wag by nie zakłócić za bardzo całego obrazu.
---
UPDATE (2009-11-10 01:27): Filmik z porównaniem procesów uczenia się zwykłych sieci (pierwszy wiersz) z sieciami z sinusami na wejściu takimi jak wyżej (w drugim wierszu):
Jakiś czas temu Maja podpowiedziała mi, że dorzucanie tak zmodyfikowanych wejść przypomina tzw. metody kernelowe - czyli ma to jakąś nazwę. Ogólnie wizualnie ciekawe wyniki dostawałem też przy innych funkcjach okresowych (np. sign(sin(.)) czy arcsin(sin(.)) ), ale przy zdjęciach uczenie najlepiej przebiega przy sinusach... Nie próbowałem jeszcze całej bazy razem z cosinusami.
Zrezygnowałem na razie z wejścia losowego.
Labels: neuron
2009-07-14
Pan Magoo
Na specjalne zamówienie tym razem coś bez pierwiastków i wykresów.
Niedawno znalazłem świetnego bloga obracającego się wokół stylu kreskówek z lat pięćdziesiątych: Cartoon Modern - niestety już nie rozwijany, ale archiwa bardzo bogate (jest też kontynuacja w postaci mini bloga na tumblr). Można tam znaleźć szczególnie dużo informacji o studiu animacji UPA (filmografia na Wikipedii) - to oni są odpowiedzialni z krótki film Rooty Toot Toot - nomanacja do Oskara 1952 (ostatnio na blipie przyczepiłem do tego link). I to właśnie oni wymyślili Pana Magoo. A teraz do rzeczy:
O tym jak Magoo latał (Oskar 1955)
Pan Magoo w centrum lotów kosmicznych
Pan Magoo na siłowni
A na deser:
Magoo w reklamie piwa
Niedawno znalazłem świetnego bloga obracającego się wokół stylu kreskówek z lat pięćdziesiątych: Cartoon Modern - niestety już nie rozwijany, ale archiwa bardzo bogate (jest też kontynuacja w postaci mini bloga na tumblr). Można tam znaleźć szczególnie dużo informacji o studiu animacji UPA (filmografia na Wikipedii) - to oni są odpowiedzialni z krótki film Rooty Toot Toot - nomanacja do Oskara 1952 (ostatnio na blipie przyczepiłem do tego link). I to właśnie oni wymyślili Pana Magoo. A teraz do rzeczy:
O tym jak Magoo latał (Oskar 1955)
Pan Magoo w centrum lotów kosmicznych
Pan Magoo na siłowni
A na deser:
Magoo w reklamie piwa
Starsze posty dostępne w archiwum