Hinton i Salakhutdinov w zmniejszaniu wymiarów danych za pomocą sieci neuronowych Science 2006 zaproponowali nieliniowe PCA poprzez zastosowanie głębokiego autoencodera. Kilka razy próbowałem zbudować i wyszkolić autoencoder PCA z Tensorflow, ale nigdy nie byłem w stanie uzyskać lepszego wyniku niż liniowy PCA.
Jak mogę skutecznie trenować autoencoder?
(Późniejsza edycja przez @amoeba: oryginalna wersja tego pytania zawierała kod Pythona Tensorflow, który nie działał poprawnie. Można go znaleźć w historii edycji.)
Odpowiedzi:
Oto kluczowa postać z dokumentu naukowego z 2006 r. Autorstwa Hintona i Salachutdinowa:
Pokazuje zmniejszenie wymiarów zestawu danych MNIST ( czarno-białych obrazów pojedynczych cyfr) z oryginalnych 784 wymiarów do dwóch.28×28
Spróbujmy to odtworzyć. Nie będę używać Tensorflow bezpośrednio, ponieważ o wiele łatwiej jest używać Keras (biblioteka wyższego poziomu działająca na Tensorflow) do prostych zadań głębokiego uczenia się, takich jak to. H&S użył architektury architektury z jednostkami logistycznymi, wstępnie przeszkolonymi ze stosu Ograniczonych Maszyn Boltzmanna. Dziesięć lat później to brzmi bardzo oldschoolowo. prostszej architektury z wykładniczymi jednostkami liniowymi bez żadnego wstępnego treningu. Użyję optymalizatora Adama (szczególna implementacja adaptacyjnego stochastycznego spadku gradientu z pędem).784 → 512 → 128 → 2 → 128 → 512 → 784
Kod jest wklejany z notesu Jupyter. W Pythonie 3.6 musisz zainstalować matplotlib (dla pylab), NumPy, seaborn, TensorFlow i Keras. Podczas działania w powłoce Pythona może być konieczne dodanie,
plt.show()
aby pokazać wykresy.Inicjalizacja
PCA
To daje:
Szkolenie autokodera
Zajmuje to ~ 35 sekund na moim pulpicie roboczym i wyświetla:
więc już widać, że pokonaliśmy straty PCA już po dwóch epokach treningowych.
(Nawiasem mówiąc, pouczające jest, aby zmienić wszystkie funkcje aktywacyjne
activation='linear'
i obserwować, w jaki sposób strata dokładnie zbiega się ze stratą PCA. Jest tak, ponieważ liniowy autoencoder jest równoważny PCA.)Rysowanie projekcji PCA obok siebie z reprezentacją wąskiego gardła
Rekonstrukcje
A teraz spójrzmy na rekonstrukcje (pierwszy rząd - oryginalne obrazy, drugi rząd - PCA, trzeci rząd - autoencoder):
Można uzyskać znacznie lepsze wyniki dzięki głębszej sieci, pewnej regularyzacji i dłuższemu szkoleniu. Eksperyment. Głębokie uczenie się jest łatwe!
źródło
from __future__ import absolute_import from __future__ import division from __future__ import print_function
Ogromne rekwizyty dla @amoeba za zrobienie tego wspaniałego przykładu. Chcę tylko pokazać, że procedura szkolenia i rekonstrukcji automatycznego kodera opisana w tym poście może być wykonana również w R z podobną łatwością. Automatyczny koder poniżej jest skonfigurowany, więc emuluje przykład ameby tak blisko, jak to możliwe - ten sam optymalizator i ogólna architektura. Dokładne koszty nie są odtwarzalne, ponieważ zaplecze TensorFlow nie jest rozstawione w podobny sposób.
Inicjalizacja
PCA
Autoencoder
Rysowanie projekcji PCA obok siebie z reprezentacją wąskiego gardła
Rekonstrukcje
Możemy odtworzyć cyfry w zwykły sposób. (Górny rząd to oryginalne cyfry, środkowy rząd to rekonstrukcje PCA, a dolny rząd to rekonstrukcje autoencodera.)
Jak wspomniano, więcej epok i głębsza i / lub bardziej inteligentnie wyszkolona sieć da znacznie lepsze wyniki. Na przykład błąd rekonstrukcji PCA wynoszący = 9 wynosi około , możemy uzyskać prawie taki sam błąd ( ) z opisanego powyżej autoencodera, po prostu poprzez zwiększenie epok treningowych z 5 do 25. W tym przypadku użycia 2 komponenty pochodzące z autoencodera zapewnią podobny błąd rekonstrukcji jak 9 głównych komponentów. Fajne!0.0356 0.0359k 0.0356 0.0359
źródło
Oto mój notatnik jupyter, w którym próbuję powtórzyć twój wynik, z następującymi różnicami:
Dane wejściowe PCA są nadal przechowywane jako dane ze średnią = 0 i std = 1Może po prostu ponownie uruchomię to później z danymi [0-1] zarówno dla PCA, jak i AEMoje wyniki MSE dla PCA ze zmniejszenia wymiarów od 1 do 6 (gdzie wejście ma 6 kolumn) i dla AE z dim. czerwony. od 1 do 6 są poniżej:
Przy wejściu PCA będącym (średnia = 0, std = 1), podczas gdy wejście AE jest w zakresie [0-1] - 4e-15: PCA6 - .015: PCA5 - .0502: AE5 - .0508: AE6 - .051: AE4 - .053: AE3 - .157: PCA4 - .258: AE2 - .259: PCA3 - .377: AE1 - .483: PCA2 - .682: PCA1Liniowy PCA bez redukcji wymiarów może osiągnąć 9e-15, ponieważ może po prostu wepchnąć wszystko, czego nie był w stanie zmieścić w ostatnim elemencie.
źródło