Hinton y Salakhutdinov en la reducción de la dimensionalidad de los datos con redes neuronales, Science 2006 propusieron un PCA no lineal mediante el uso de un autoencoder profundo. He intentado construir y entrenar un codificador automático de PCA con Tensorflow varias veces, pero nunca he podido obtener un mejor resultado que el PCA lineal.
¿Cómo puedo entrenar eficientemente un autoencoder?
(Edición posterior de @amoeba: la versión original de esta pregunta contenía código de Python Tensorflow que no funcionaba correctamente. Se puede encontrar en el historial de edición).
Respuestas:
Aquí está la figura clave del artículo de Ciencia de 2006 de Hinton y Salakhutdinov:
Muestra la reducción de dimensionalidad del conjunto de datos MNIST (28 × 28 imágenes en blanco y negro de un solo dígito) desde las dimensiones originales del 784 a dos.
El código está copiado de un cuaderno Jupyter. En Python 3.6 necesita instalar matplotlib (para pylab), NumPy, seaborn, TensorFlow y Keras. Cuando se ejecuta en Python Shell, es posible que deba agregar
plt.show()
para mostrar los gráficos.Inicialización
PCA
Esto produce:
Entrenando al autoencoder
Esto lleva ~ 35 segundos en mi escritorio de trabajo y resultados:
así que ya puedes ver que superamos la pérdida de PCA después de solo dos épocas de entrenamiento.
(Por cierto, es instructivo cambiar todas las funciones de activación
activation='linear'
y observar cómo la pérdida converge precisamente a la pérdida de PCA. Esto se debe a que el autoencoder lineal es equivalente a PCA).Trazar la proyección PCA lado a lado con la representación del cuello de botella
Reconstrucciones
Y ahora veamos las reconstrucciones (primera fila - imágenes originales, segunda fila - PCA, tercera fila - autoencoder):
Se pueden obtener resultados mucho mejores con una red más profunda, cierta regularización y capacitación más larga. Experimentar. ¡El aprendizaje profundo es fácil!
fuente
from __future__ import absolute_import from __future__ import division from __future__ import print_function
Enormes apoyos a @amoeba por hacer este gran ejemplo. Solo quiero mostrar que el procedimiento de reconstrucción y entrenamiento del codificador automático descrito en esa publicación también se puede hacer en R con similar facilidad. El codificador automático a continuación está configurado para que emule el ejemplo de ameba lo más cerca posible: el mismo optimizador y la arquitectura general. Los costos exactos no son reproducibles debido a que el backend TensorFlow no se sembró de manera similar.
Inicialización
PCA
Autoencoder
Trazar la proyección PCA lado a lado con la representación del cuello de botella
Reconstrucciones
Podemos hacer la reconstrucción de los dígitos de la manera habitual. (La fila superior son los dígitos originales, la fila central las reconstrucciones de PCA y la fila inferior las reconstrucciones del codificador automático).
fuente
Aquí está mi cuaderno jupyter donde trato de replicar su resultado, con las siguientes diferencias:
La entrada de PCA se mantiene como datos con media = 0 y estándar = 1Tal vez volveré a ejecutar esto más tarde con [0-1] datos para PCA y AEMi MSE resulta para PCA de reducción de dimensionalidad de 1 a 6 (donde la entrada tiene 6 columnas) y para AE de tenue. rojo. de 1 a 6 están abajo:
Con la entrada PCA (media = 0, estándar = 1) mientras que la entrada AE es [0-1] rango - 4e-15: PCA6 - .015: PCA5 - .0502: AE5 - .0508: AE6 - .051: AE4 - .053: AE3 - .157: PCA4 - .258: AE2 - .259: PCA3 - .377: AE1 - .483: PCA2 - .682: PCA1El PCA lineal sin reducción de dimensionalidad puede alcanzar 9e-15 porque solo puede empujar lo que no pudo encajar en el último componente.
fuente