Sztuczna inteligencja wyświetlanie krawędzi oraz kilka wzorów

0

Witam,

  1. Mam prostą sieć neuronową, z jedną warstwą ukrytą oraz z zaimplementowanym algorytmem wstecznej propagacji.
    W jaki sposób wyświetlić które krawędzie dany neuron w warstwie ukrytej rozpoznaje (chce to zwizualizować aby wiedzieć jakich cech się uczą), dokładnie tak jak jest w artykule podanym poniżej, na stronie 17:

http://web.stanford.edu/class/cs294a/sparseAutoencoder.pdf

Nie do końca rozumiem ten wzór dobrze zaimplementowałem, aktualnie rozumiem że jeden piksel w danym neuronie ukrytym jest to dana waga wejścia podzielona przez pierwiastek sumy kwadratów wszystkich wejść do tego neurony. Jednak piksele te prezentują u mnie losowo rozmieszczone piksele na obrazku.

  1. Kolejny problem z jakim się borykam jest to zrozumienie wzoru na "pi" w Sparse Autoencoder na stronie 14 w tym samym artykule.
    Implementowałem to na różne sposoby jednak nie jestem pewien czy którykolwiek był dobry, nie dokładnie rozumiem co oznacza wartość "m" oraz część zawierająca się w nawiasach kwadratowych.

  2. Ostatnimi problemami jest określanie wag oraz błędów w Autoencoder, aktualnie mam sieć w postaci 784x500x784,
    jest to sieć rozpoznająca liczby z bazy MNIST pierwsza część jest to encoder a druga decoder, sieć uczy się zwykłym wzorem wstecznej propagacji błędu na wyjściach otrzymuje ładne zrekonstruowane zdjęcia jednak nie jestem do końca pewien czy warstwa ukryta poprawnie się uczy. Dodając elementy wzorów z podanego artykułu nie do końca jest już tak pięknie, zdjęcia się krzaczą. I tutaj tez mam kilka pytań:

a. czy wagi w warstwie dekodera są transformacją wag z warstwy encodera tylko raz na początku sieci czy w każdym cyklu nauczania? (gdy ustawiam mapowanie wag z pierwszej warstwy na każdy cykl nauczania sieć dziwnie się zachowuje)
b. czy błąd w ostatniej może być to różnica wartości oczekiwanej między wartością wyjściowa danego neuronu? Czy w przypadku Autoencodera musi to być specjalny wzór?
c. Czy błąd w warstwie ukrytej obliczamy stosując drugi wzór na stronie 16. czy ten z logarytmami?
(Ja to odbieram tak, że ten z logarytmami jest do obliczenia całkowitego kosztu sieci a ten bez do obliczenia blędu dla neuronow w warstwie ukrytej jednak tak czy inaczej nie wiem czy poprawnie to działa)

Jak mówie testowałem sieć na różne sposoby z rożnymi wzorami. Jednak mam w głowie za dużo niewiadomych, po części rozumiem sieci jednak mam problem z autoencoderem. Stosując zwykłe backpropagation bez żadnych dodatkowych wzorów, boję się o to że warstwa ukryta nie uczy się poprawnie, a jedynie na wyjściach otrzymuje ładne rekonstrukcje zdjęć. Wizualizacja krawędzi warstwy ukrytej według artykułu w moim przypadku nie działa w żaden sposób i nie wiem co robię źle.

Z góry dziękuje za każdą choćby najmniejszą pomoc ;)

0

Zacznę może od tego, że z lenistwa nie czytałem tego artykułu (tylko pobieżnie przejrzałem).
Interesuję się SSN ale nie w zakresie rozpoznawania obrazów i/lub ich kompresji.

Ad 1) Nie wiem - musiałbym przebrnąć przez ten artykuł a tego chwilowo nie chce mi się robić ;P. Ale czy przypadkiem wzór nie jest podany na stronie 17?

Ad 2) jeśli dobrze zrozumiałem to "m" oznacza wielkość próby (ilość zdjęć w zestawie uczącym) - tak przynajmniej wynika ze zdania na stronie 6. Co do wyrażenia w nawiasie klamrowym to z tego co rozumiem to aj oznacza aktywację neuronu w warstwie ukrytej - czyli wynik neuronu, z zakresu (0,1) - a x(i) to dane wejściowe dla i-tego zestawu. Niestety mam wątpliwości co tu należy zrobić... Musiałbym się nad tym zastanowić.

Ad 3) Co to znaczy, że "pierwsza część jest to encoder a druga decoder"? oraz " sieć uczy się zwykłym wzorem wstecznej propagacji błędu na wyjściach otrzymuje ładne zrekonstruowane zdjęcia"?

Dodając elementy wzorów z podanego artykułu nie do końca jest już tak pięknie, zdjęcia się krzaczą.

Które wzory dodałeś?

Ogólnie to owy "autoencoder" to zwyczajna sieć MLP, którą uczymy w ten sposób, że podajemy jej wektor danych wejściowych jako wzorzec. Innymi słowy wrzucamy do sieci wektor X i próbujemy otrzymać X. Takie sieci nazywa się również autoasocjacyjne.

0

ad.1 Tak na stronie 17 moja pomyłka już poprawiłem.

ad.2 Co do "m" tam właśnie myślałem, upewniłeś mnie jedynie w tym. Bardzo mi zależy na tym wyrażeniu w klamrach też go nie jestem do końca pewien, nie jasno jest to tam opisane.

ad. 3 Encoder to jest pierwsza warstwa a decoder druga, która odtwarza zdjęcie. Chodzi tutaj o nauczanie w głębokich sieciach (uczenie warstwa po warstwie i odtworzenie głębokiej sieci na podstawie warstw ukrytych), tak jak jest to pokazane poniżej:

http://ufldl.stanford.edu/wiki/index.php/Stacked_Autoencoders

Zwykłe wzory miałem na myśli pierwszy wzór na wyliczanie błędów bez parametrów p oraz pj, ponieważ sieć z tymi parametrami nie uczy się poprawnie, a z tego co widzę poprawna sieć autoencoder musi korzystać z tych parametrów. Bardziej uogólniony opis wzorów jest w adresie poniżej:

http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity

Nie wiem czy to jest to samo co MLP, tutaj chodzi o poprawne nauczenie warstwy ukrytej tak aby później odtworzyć z tego głęboką sieć tak jak jest to pokolei pokazane na rysunkach w adresie do "Wiki stanford".

0

Przejrzałem pobieżnie kilka prac i rzeczywiście nie jest to to samo co MLP ;-). Temat mnie nawet zaciekawił więc spróbuję dojść o co kaman ;). Niestety ostatnio mam mało czasu więc nie wiem jak szybko uda mi rozwikłać tą zagadkę :P.
A próbowałeś analizować jakieś kody źródłowe? W jakim w ogóle języku programujesz?

0

Programuję w C# ale kody w Pythonie analizowałem, jednak temat jest dość świeży i nie wszystkim kodom źródłowym można ufać ;) Jeżeli mógłbyś mi chociaż troszkę pomóc będę bardzo wdzięczny, również interesuje się sieciami jednak na temat uczenia głębokich sieci są szczątkowe informacje.

0

I jak postępy? ;-)
Co do pytań to po krótkim zastanowieniu się i poszperaniu w sieci wydaje mi się, że:
ad 1) - jeszcze nie próbowałem tego rozwiązać. Nie podoba mi się, że na tym obrazku jest 10x10 obrazków a każdy z nich ma 10x10 pixeli... czyli tak jakby było 100 neuronów ukrytych (?!?)
ad 2) wzór na "pj" z daszkiem to zwykła średnia wyjść j neuronu O_o. Wcześniej miałem wątpliwość jak to odczytać (chyba oznaczenia mnie zgubiły - jakoś mi nie leżą... - no i nie chciało mi się przeczytać tego co było czarno na białym napisane O_o), ale przecież nawet akapit wyżej informuje o tym, że to tylko dla jasności aj(2) zostaje zmienione na aj(2)(x(i))... Innymi słowy sumujesz wyjścia każdego neuronu w warstwie ukrytej dla każdego wzorca a następnie dzielisz przez ilość wzorców. Zresztą koło aj(2) są nawiasy czyli powinno być oczywiste, że jest to funkcja, która przyjmuje wektor x-ów ;).
ad 3a) nie wiem jak w tym artykule, bo nie chciało mi się go jeszcze przeczytać, ale zdaje się, że są dwa podejścia:

  1. wagi w każdej warstwie są nie zależne i należy je uczyć osobno (tak jak w sieci MLP) lub
  2. (opcja chyba częściej spotykana dla tego typu sieci) wagi w warstwie dekodera to są te same wagi co w warstwie encodera i musisz to uwzględnić przy liczeniu pochodnej! Oczywiście macierz z wagami w warstwie dekodującej musi być transponowana co jest chyba oczywiste (jeśli jest N wejść i M neuronów w warstwie ukrytej to w warstwie encodera masz macierz NxM a w warstwie decodera MxN)
    ad 3b) Błąd w ostatniej warstwie jest liczony jako kwadrat z różnicy między wyjściem każdego neuronu w warstwie wyjściowej a zmienną wejściową oryginalną. Natomiast dla zmiennych binarnych (warstwa wejściowa) używasz wzoru z logarytmami. Przynajmniej tak mi się wydaje... - nie czytałem tego artykułu i musiałbym się w to wczytać... Może w wolnym czasie to zrobię...

Możesz sobie również obejrzeć filmiki tego kolesia o tym zagadnieniu:

EDIT:
co do Ad 1) to zdaje się, że rzeczywiście tam jest mowa o sieci, która ma 100 neuronów w warstwie ukrytej i wszystko by się zgadzało... Wzór jest podany i jest banalnie prosty: Każdy obrazek odzwierciedla "siłę" wagi w i-tym neuronie. Jeśli mamy zdjęcia 10x10 pixeli to każdy pixel ma swoją wagę. Znaczenie każdej wagi obliczamy przez podzielenie owej wagi przez pierwiastek z sumy kwadratów wszystkich wag w i-tym neuronie. I to w zasadzie wszystko ;-)

0

Na razie przy małej ilości próbek widać efekty, teraz czekam aż sieć się nauczy według wszystkich próbek MNIST.
Przy mocy obliczeniowej mojego kompa troszkę poczekam. Jak będą wyniki podeślę ;)

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