Introducció als Autoencoders

Els autoencoders són un tipus de xarxa neuronal utilitzada per aprendre representacions eficients (codificacions) d'un conjunt de dades, típicament per a la reducció de dimensionalitat o per a la detecció d'anomalies. La idea principal darrere dels autoencoders és aprendre una representació comprimida (codificació) de les dades d'entrada i després reconstruir-les a partir d'aquesta codificació.

Components d'un Autoencoder

Un autoencoder consta de dues parts principals:

  1. Codificador (Encoder): Transforma l'entrada en una representació comprimida.
  2. Decodificador (Decoder): Reconstrueix l'entrada original a partir de la representació comprimida.

Arquitectura Bàsica

L'arquitectura bàsica d'un autoencoder es pot representar de la següent manera:

Entrada -> Codificador -> Codificació (Latent Space) -> Decodificador -> Sortida (Reconstructed Input)

Funció de Pèrdua

La funció de pèrdua en un autoencoder mesura la diferència entre l'entrada original i la sortida reconstruïda. La funció de pèrdua més comuna és l'error quadràtic mitjà (MSE):

\[ \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (x_i - \hat{x}_i)^2 \]

on \( x_i \) és l'entrada original i \( \hat{x}_i \) és la sortida reconstruïda.

Tipus d'Autoencoders

Autoencoders Clàssics

Els autoencoders clàssics tenen una estructura simètrica amb el mateix nombre de neurones a les capes d'entrada i sortida. La capa latent té menys neurones que les capes d'entrada i sortida, forçant així la xarxa a aprendre una representació comprimida.

Variational Autoencoders (VAE)

Els VAE són una variant dels autoencoders que imposen una distribució probabilística sobre la capa latent. Això permet generar noves dades similars a les dades d'entrenament.

Denoising Autoencoders

Els denoising autoencoders estan dissenyats per eliminar el soroll de les dades. S'entrenen amb dades sorolloses com a entrada i dades netes com a sortida.

Sparse Autoencoders

Els sparse autoencoders imposen una penalització de sparsity (escassetat) a la capa latent, forçant la xarxa a aprendre representacions on només unes poques unitats estan actives alhora.

Exemple Pràctic amb Keras

A continuació, es presenta un exemple pràctic d'un autoencoder simple utilitzant Keras:

import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist

# Carregar les dades de MNIST
(x_train, _), (x_test, _) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))

# Dimensions de l'entrada
input_dim = x_train.shape[1]
encoding_dim = 32  # Dimensionalitat de la capa latent

# Definir el model
input_img = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(input_dim, activation='sigmoid')(encoded)

# Crear l'autoencoder
autoencoder = Model(input_img, decoded)

# Compilar el model
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

# Entrenar l'autoencoder
autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size=256,
                shuffle=True,
                validation_data=(x_test, x_test))

# Codificador per obtenir les representacions comprimides
encoder = Model(input_img, encoded)

# Decodificador per reconstruir les imatges
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
decoder = Model(encoded_input, decoder_layer(encoded_input))

# Codificar i decodificar algunes imatges
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)

Explicació del Codi

  1. Carregar les dades: Es carreguen les dades de MNIST i es normalitzen.
  2. Definir el model: Es defineix l'arquitectura de l'autoencoder amb una capa d'entrada, una capa latent (codificador) i una capa de sortida (decodificador).
  3. Compilar el model: Es compila el model amb l'optimitzador 'adam' i la funció de pèrdua 'binary_crossentropy'.
  4. Entrenar l'autoencoder: Es realitza l'entrenament de l'autoencoder amb les dades d'entrenament.
  5. Codificador i Decodificador: Es defineixen models separats per al codificador i el decodificador per obtenir les representacions comprimides i reconstruir les imatges.

Exercici Pràctic

Objectiu

Crear un autoencoder per reduir la dimensionalitat de les dades de MNIST i visualitzar les representacions comprimides.

Passos

  1. Carregar les dades de MNIST.
  2. Definir l'arquitectura de l'autoencoder.
  3. Entrenar l'autoencoder.
  4. Visualitzar les representacions comprimides utilitzant tècniques de visualització com PCA o t-SNE.

Solució

import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

# Visualitzar les representacions comprimides
encoded_imgs = encoder.predict(x_test)

# Utilitzar t-SNE per reduir la dimensionalitat a 2D
tsne = TSNE(n_components=2, random_state=0)
encoded_imgs_2d = tsne.fit_transform(encoded_imgs)

# Visualitzar les representacions comprimides
plt.figure(figsize=(6, 6))
plt.scatter(encoded_imgs_2d[:, 0], encoded_imgs_2d[:, 1], c=y_test, cmap='viridis')
plt.colorbar()
plt.show()

Explicació del Codi

  1. Visualitzar les representacions comprimides: Es codifiquen les imatges de test utilitzant el codificador.
  2. t-SNE: Es redueix la dimensionalitat de les representacions comprimides a 2D utilitzant t-SNE.
  3. Visualització: Es visualitzen les representacions comprimides en un gràfic de dispersió.

Conclusió

Els autoencoders són una eina poderosa per a la reducció de dimensionalitat i la detecció d'anomalies. Amb una comprensió clara de la seva arquitectura i funcionament, es poden aplicar a una àmplia varietat de problemes en el camp del deep learning.

© Copyright 2024. Tots els drets reservats