Hinton et Salakhutdinov, dans Reducing the Dimensionality of Data with Neural Networks, Science 2006, ont proposé une ACP non linéaire grâce à l'utilisation d'un auto-encodeur profond. J'ai essayé de construire et d'entraîner plusieurs fois un autoencodeur PCA avec Tensorflow mais je n'ai jamais pu obtenir de meilleurs résultats qu'un PCA linéaire.
Comment puis-je former efficacement un autoencodeur?
(Édition ultérieure par @amoeba: la version originale de cette question contenait du code Python Tensorflow qui ne fonctionnait pas correctement. On peut le trouver dans l'historique des éditions.)
Réponses:
Voici le chiffre clé de l'article scientifique de 2006 de Hinton et Salakhutdinov:
Il montre la réduction de la dimensionnalité de l'ensemble de données MNIST ( images en noir et blanc de chiffres uniques) des 784 dimensions d'origine à deux.28×28
Essayons de le reproduire. Je n'utiliserai pas Tensorflow directement, car il est beaucoup plus facile d'utiliser Keras (une bibliothèque de niveau supérieur fonctionnant au-dessus de Tensorflow) pour de simples tâches d'apprentissage en profondeur comme celle-ci. H&S a utilisé une architecture avec des unités logistiques, pré-entraînée avec la pile de machines Boltzmann restreintes. Dix ans plus tard, cela semble très old-school. J'utiliserai une architecture plus simple avec des unités linéaires exponentielles sans aucune pré-formation. J'utiliserai l'optimiseur Adam (une implémentation particulière de la descente de gradient stochastique adaptatif avec momentum).784 → 512 → 128 → 2 → 128 → 512 → 784
Le code est copié-collé à partir d'un ordinateur portable Jupyter. Dans Python 3.6, vous devez installer matplotlib (pour pylab), NumPy, seaborn, TensorFlow et Keras. Lors de l'exécution dans le shell Python, vous devrez peut-être ajouter
plt.show()
pour afficher les tracés.Initialisation
PCA
Cela produit:
Formation de l'autoencodeur
Cela prend environ 35 secondes sur mon bureau de travail et génère:
vous pouvez donc déjà voir que nous avons dépassé la perte de PCA après seulement deux périodes d'entraînement.
(Soit dit en passant, il est instructif de modifier toutes les fonctions d'activation
activation='linear'
et d'observer comment la perte converge précisément vers la perte PCA. En effet, l'autoencodeur linéaire est équivalent à PCA.)Tracer la projection PCA côte à côte avec la représentation du goulot d'étranglement
Reconstructions
Et maintenant, regardons les reconstructions (première rangée - images originales, deuxième rangée - PCA, troisième rangée - encodeur automatique):
On peut obtenir de bien meilleurs résultats avec un réseau plus profond, une certaine régularisation et une formation plus longue. Expérience. L'apprentissage en profondeur est facile!
la source
from __future__ import absolute_import from __future__ import division from __future__ import print_function
D'énormes accessoires à @amoeba pour avoir fait ce grand exemple. Je veux juste montrer que la procédure de formation et de reconstruction de l'encodeur automatique décrite dans ce post peut également être effectuée en R avec une facilité similaire. L'auto-encodeur ci-dessous est configuré pour émuler l'exemple d'amibe aussi près que possible - même optimiseur et architecture globale. Les coûts exacts ne sont pas reproductibles car le backend TensorFlow n'est pas semé de la même manière.
Initialisation
PCA
Encodeur automatique
Tracer la projection PCA côte à côte avec la représentation du goulot d'étranglement
Reconstructions
On peut faire la reconstruction des chiffres de la manière habituelle. (La rangée du haut représente les chiffres d'origine, la rangée du milieu les reconstructions PCA et la rangée du bas les reconstructions de l'encodeur automatique.)
Comme indiqué, plus d'époques et un réseau plus profond et / ou mieux formé donneront de bien meilleurs résultats. Par exemple, l'erreur de reconstruction PCA de = 9 est d'environ , nous pouvons obtenir presque la même erreur ( ) de l'autoencodeur décrit ci-dessus, simplement en augmentant les époques d'apprentissage de 5 à 25. Dans ce cas d'utilisation, le 2 Les composants dérivés de l'autoencodeur fourniront une erreur de reconstruction similaire à 9 composants principaux. Cool!0,0356 0,0359k 0.0356 0.0359
la source
Voici mon cahier jupyter où j'essaie de reproduire votre résultat, avec les différences suivantes:
L'entrée PCA est toujours constituée de données avec une moyenne = 0 et std = 1Peut-être que je vais juste relancer cela plus tard avec des données [0-1] pour PCA et AEMon MSE résulte pour PCA de la réduction de dimensionnalité de 1 à 6 (où l'entrée a 6 colonnes) et pour AE de dim. rouge. de 1 à 6 sont ci-dessous:
Avec l'entrée PCA étant (moyenne = 0, std = 1) tandis que l'entrée AE est dans la plage [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: PCA1Le PCA linéaire sans réduction de dimensionnalité peut atteindre 9e-15 car il peut simplement pousser tout ce qu'il n'a pas pu intégrer dans le dernier composant.
la source