Hinton und Salakhutdinov schlugen bei der Reduzierung der Dimensionalität von Daten mit neuronalen Netzen in Science 2006 eine nichtlineare PCA durch die Verwendung eines tiefen Autoencoders vor. Ich habe mehrmals versucht, einen PCA-Autoencoder mit Tensorflow zu bauen und zu trainieren, aber ich konnte nie ein besseres Ergebnis erzielen als mit linearem PCA.
Wie kann ich einen Autoencoder effizient trainieren?
(Später bearbeitet von @amoeba: Die Originalversion dieser Frage enthielt Python Tensorflow-Code, der nicht richtig funktionierte. Man kann ihn im Bearbeitungsverlauf finden.)
Antworten:
Hier ist die Schlüsselfigur aus dem Science Paper von 2006 von Hinton und Salakhutdinov:
Es zeigt die Dimensionsreduktion des MNIST-Datensatzes ( Schwarzweißbilder mit einzelnen Ziffern) von den ursprünglichen 784-Dimensionen auf zwei.28 ×28
Versuchen wir es zu reproduzieren. Ich werde Tensorflow nicht direkt verwenden, da es viel einfacher ist, Keras (eine übergeordnete Bibliothek, die auf Tensorflow läuft) für einfache vertiefende Lernaufgaben wie diese zu verwenden. H & S verwendete eine Architektur von mit logistischen Einheiten, die mit dem Stapel der eingeschränkten Boltzmann-Maschinen vorab trainiert wurden. Zehn Jahre später klingt das sehr altmodisch. Ich werde eine einfachere Architektur mit exponentiellen Lineareinheiten ohne Vorkenntnisse verwenden. Ich werde den Adam-Optimierer verwenden (eine spezielle Implementierung des adaptiven stochastischen Gradientenabfalls mit Impuls).
Der Code wird aus einem Jupyter-Notizbuch kopiert. In Python 3.6 müssen Sie matplotlib (für pylab), NumPy, seaborn, TensorFlow und Keras installieren. Wenn Sie in der Python-Shell arbeiten, müssen Sie möglicherweise hinzufügen
plt.show()
, um die Diagramme anzuzeigen.Initialisierung
PCA
Dies gibt aus:
Training des Autoencoders
Dies dauert ca. 35 Sekunden auf meinem Arbeits-Desktop und gibt Folgendes aus:
Sie sehen also bereits, dass wir den PCA-Verlust nach nur zwei Trainingsepochen überschritten haben.
(Übrigens ist es
activation='linear'
aufschlussreich , alle Aktivierungsfunktionen zu ändern und zu beobachten, wie der Verlust genau zum PCA-Verlust konvergiert. Dies liegt daran, dass der lineare Autoencoder dem PCA äquivalent ist.)Nebeneinanderzeichnen der PCA-Projektion mit der Flaschenhalsdarstellung
Rekonstruktionen
Und jetzt schauen wir uns die Rekonstruktionen an (erste Reihe - Originalbilder, zweite Reihe - PCA, dritte Reihe - Autoencoder):
Mit einem tieferen Netzwerk, etwas Regularisierung und längerem Training kann man viel bessere Ergebnisse erzielen. Experiment. Tiefes Lernen ist einfach!
quelle
from __future__ import absolute_import from __future__ import division from __future__ import print_function
Riesige Requisiten an @amoeba für dieses großartige Beispiel. Ich möchte nur zeigen, dass das in diesem Beitrag beschriebene Auto-Encoder-Training und -Rekonstruktionsverfahren auch in R mit ähnlicher Leichtigkeit durchgeführt werden kann. Der folgende Auto-Encoder ist so eingerichtet, dass er das Beispiel von Amoeba so genau wie möglich nachahmt - derselbe Optimierer und die gleiche Gesamtarchitektur. Die genauen Kosten sind nicht reproduzierbar, da das TensorFlow-Backend nicht auf ähnliche Weise gesät wird.
Initialisierung
PCA
Autoencoder
Nebeneinanderzeichnen der PCA-Projektion mit der Flaschenhalsdarstellung
Rekonstruktionen
Wir können die Rekonstruktion der Ziffern auf die übliche Weise durchführen. (Obere Reihe sind die Originalziffern, mittlere Reihe die PCA-Rekonstruktionen und untere Reihe die Autoencoder-Rekonstruktionen.)
quelle
Hier ist mein Jupyter-Notizbuch, in dem ich versuche, Ihr Ergebnis mit den folgenden Unterschieden zu replizieren:
PCA-Eingabe wird als Daten mit Mittelwert = 0 und Standard = 1 beibehaltenVielleicht führe ich das später noch einmal mit [0-1] Daten für PCA und AE ausMeine MSE ergibt sich für PCA aus der Dimensionsreduktion von 1 auf 6 (wobei die Eingabe 6 Spalten hat) und für AE aus dim. rot. von 1 bis 6 sind unten:
Bei PCA-Eingang (Mittelwert = 0, Standard = 1) und AE-Eingang [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: PCA1Lineares PCA ohne Dimensionsreduzierung kann 9e-15 erreichen, da es nur das drücken kann, was nicht in die letzte Komponente passen konnte.
quelle