Autoencodery nie mogą nauczyć się istotnych funkcji

24

Mam 50 000 obrazów takich jak te dwa:

przykład danych przykład danych 2

Przedstawiają wykresy danych. Chciałem wydobyć funkcje z tych obrazów, więc użyłem kodu autoencodera dostarczonego przez Theano (deeplearning.net).

Problem polega na tym, że te autoencodery wydają się nie uczyć żadnych funkcji. Próbowałem RBM i to samo.

Zestaw danych MNIST zapewnia ładne funkcje, ale moje dane nie wydają się przynosić żadnych. Załączam przykłady poniżej:

Filtry utworzone w MNIST:

filtr mnistyczny

Filtry utworzone przez szkolenie na moich danych:

filtry z moich danych

Użyłem wielu różnych kombinacji ukrytych rozmiarów warstw i epok treningowych, ale wyniki są zawsze takie same.

Dlaczego to nie działa? Dlaczego autoencodery nie mogą wyodrębnić funkcji z tych obrazów?

EDYTOWAĆ:

Dla każdego, kto ma podobny problem. Rozwiązanie było naprawdę proste, a przyczyna naprawdę głupia. Właśnie zapomniałem przeskalować wartości pikseli z kodowania RGB, aby były zmienne w zakresie 0 - 1.

Przeskalowanie wartości rozwiązało problem.

b93dh44
źródło

Odpowiedzi:

15

Debugowanie sieci neuronowych zwykle obejmuje modyfikowanie hiperparametrów, wizualizację wyuczonych filtrów i wykreślanie ważnych metryk. Czy możesz udostępnić jakich hiperparametrów używałeś?

  • Jaki jest twój rozmiar partii?
  • Jaki jest twój wskaźnik uczenia się?
  • Jakiego rodzaju autoencodera używasz?
  • Czy próbowałeś użyć Denoising Autoencoder? (Jakie wartości korupcji próbowałeś?)
  • Ile ukrytych warstw i jakiego rozmiaru?
  • Jakie są wymiary twoich obrazów wejściowych?

Przydatna jest także analiza dzienników treningowych. Narysuj wykres utraty rekonstrukcji (oś Y) jako funkcję epoki (oś X). Czy Twoja utrata rekonstrukcji jest zbieżna czy rozbieżna?

Oto przykład autoencodera do klasyfikacji płci ludzkiej, który był rozbieżny, został zatrzymany po 1500 epokach, dostrojony hiperparametrami (w tym przypadku zmniejszenie szybkości uczenia się) i ponownie uruchomiony z tymi samymi wagami, które były rozbieżne i ostatecznie zbiegły się.

Oto jeden, który jest zbieżny: (chcemy tego)

Waniliowy „nieograniczony” może napotkać problem, w którym po prostu uczy się mapowania tożsamości. To jeden z powodów, dla których społeczność stworzyła smaki denoisingowe, rzadkie i skurczowe.

Czy możesz tutaj opublikować niewielki podzbiór swoich danych? Byłbym bardziej niż chętny, aby pokazać wam wyniki jednego z moich autoencoderów.

Na marginesie: możesz zadać sobie pytanie, dlaczego używasz obrazów wykresów, skoro wykresy te można łatwo przedstawić jako wektor danych. To znaczy,

[0, 13, 15, 11, 2, 9, 6, 5]

Jeśli jesteś w stanie przeformułować problem jak wyżej, zasadniczo ułatwiasz życie auto-enkodera. Najpierw nie musi nauczyć się widzieć obrazów, zanim będzie mógł spróbować nauczyć się generowania rozkładu.

Odpowiedź uzupełniająca (biorąc pod uwagę dane).

Oto filtry z 1000 ukrytych jednostek, jednowarstwowego autokodera odszumiającego. Zauważ, że niektóre filtry są pozornie losowe. To dlatego, że tak wcześnie przestałem trenować, a sieć nie miała czasu na naukę tych filtrów.

Oto hiperparametry, z którymi trenowałem:

batch_size = 4
epochs = 100
pretrain_learning_rate = 0.01
finetune_learning_rate = 0.01
corruption_level = 0.2

Po 58. epoce przestałem ćwiczyć przed treningiem, ponieważ filtry były wystarczająco dobre, aby opublikować tutaj. Gdybym był tobą, na początek wyszkoliłbym pełny 3-warstwowy skumulowany autoencoder denoisingowy o architekturze 1000 x 1000 x 1000.

Oto wyniki z kroku dostrajającego:

validation error 24.15 percent
test error 24.15 percent

Na pierwszy rzut oka wydaje się to lepsze niż przypadek, jednak gdy przyjrzymy się podziałowi danych między dwiema etykietami, widzimy, że ma on dokładnie taki sam procent (75,85% rentowności i 24,15% nierentowności). Oznacza to, że sieć nauczyła się po prostu reagować „opłacalnie”, niezależnie od sygnału. Prawdopodobnie trenowałbym to przez dłuższy czas z większą siecią, aby zobaczyć, co się stanie. Wygląda również na to, że dane te są generowane z pewnego rodzaju bazowego zestawu danych finansowych. Polecam zajrzeć do Rekurencyjnych Sieci Neuronowych po przeformułowaniu problemu na wektory, jak opisano powyżej. RNN mogą pomóc uchwycić niektóre zależności czasowe występujące w danych typu timeseries, takich jak ten. Mam nadzieję że to pomoże.

Sabalaba
źródło
Mój rozmiar partii to 20. Szybkość uczenia się wynosi 0,1. Próbowałem skurczowych i odmawiających autoencoderów bezskutecznie. Używam jednej ukrytej warstwy. Próbowałem wszystkiego od 50 do 1000 neuronów. Przeskalowałem obrazy do 25x25 - więc są jeszcze mniejsze niż mnistyczne. Dla tego, co jest warte, załączam wszystkie moje dane do tego archiwum: Czy możesz pokazać mi wyniki swoich autoencoderów i tych danych?
b93dh44
Archiwum: mega.co.nz/…
b93dh44
OK, wyszkoliłem sieć z tymi danymi. Zobacz edycję w odpowiedzi.
sabalaba
To wygląda naprawdę interesująco. Czy możesz opublikować swój kod? Doceniłbym to. Myślę, że mogę mieć jakiś błąd w moim kodzie, który uniemożliwia szkolenie sieci. Zauważyłem, że masz scenę dostrajającą? Wydaje mi się, że mój autoencoder trenuje tylko bez dostrajania. Czy możesz mi pokazać swoje rozwiązanie, jeśli nie masz nic przeciwko?
b93dh44
Nie mogę opublikować mojego kodu, ponieważ jest to moja firma, ale mogę wskazać ten samouczek, który zawiera przykładowy kod do tworzenia Denoising Autoencoder: deeplearning.net/tutorial/dA.html . Wszystkie porady dotyczące hiperparametrów będą dotyczyć tego kodu.
sabalaba
3

Nie mam wystarczającej liczby przedstawicieli, aby móc komentować, więc odpowiem na to pytanie. Jednak nie znam dokładnego powodu:

  1. Wzór w lewym dolnym obszarze wygląda podobnie do twojego drugiego przykładu, a wzór w prawym dolnym rogu wydaje się bardzo podobny do pierwszego przykładu, gdy jest dokładnie sprawdzany. Pytanie brzmi: ile różnorodności są w danych źródłowych? Jeśli wszystkie 50 000 obrazów jest odmianami tego samego wzoru, te 3 znaczące mapy funkcji, które widzimy, mogą wystarczyć do automatycznego wyjaśnienia i zrekonstruowania wszystkich danych.

  2. Po drugie, możesz spojrzeć na błąd rekonstrukcji i rzeczywiste zrekonstruowane obrazy. Jak dobre są wyniki? Jeśli błąd rekonstrukcji jest niski, możesz mieć przeregulowanie, być może z powodu opisanych poniżej rezonów (lub może kombinacja tych 3 wzorców wystarczy, aby opisać wszystkie zainteresowane dane). W przeciwnym razie autoencoder po prostu nie może nauczyć się rekonstruować danych i potrzebujesz większego autoencodera lub lepszego algorytmu szkoleniowego.

Denis Tarasow
źródło
1. Myślę, że w tych danych jest wiele różnorodności. Każdy z tych 50 000 wykresów jest nieco inny. Myślę, że to niemożliwe, aby autoencoder mógł je zrekonstruować na podstawie zaledwie 3 filtrów. 2. Wszelkie wskazówki dotyczące szacowania błędu rekonstrukcji? Kod, którego używam, zawiera błąd, ale jest to naprawdę duża liczba, która niewiele mi mówi. Czy powinienem porównywać błąd rekonstrukcji z rozmiarem wejścia lub liczbą ukrytych warstw?
b93dh44