Autoencoders and VAEs for Dimensionality Reduction: Architectures and Implementations in TensorFlow and PyTorch
Autoencoders and Variational Autoencoders (VAEs) are neural network architectures that compress high-dimensional data into a lower-dimensional latent space and reconstruct it, with VAEs adding probabilistic constraints for better generalization and generative capabilities.
Autoencoders and VAEs for dimensionality reduction provide powerful unsupervised learning techniques for compressing complex data while preserving essential features. In the microsoft/AI-For-Beginners repository, comprehensive implementations demonstrate these architectures using both TensorFlow and PyTorch frameworks. This guide explores the source code from the computer vision lessons to explain how autoencoders encode data into latent representations and how VAEs extend this with variational inference.
What Are Autoencoders?
Autoencoders are neural networks designed to learn efficient data representations through unsupervised learning. According to the microsoft/AI-For-Beginners source code, these models consist of two primary components that work in tandem to compress and reconstruct input data.
Encoder-Decoder Architecture
The encoder compresses high-dimensional input into a lower-dimensional latent space (also called the bottleneck), while the decoder reconstructs the original input from this compressed representation. As illustrated in lessons/4-ComputerVision/09-Autoencoders/images/autoencoder_schema.jpg, this architecture forces the network to learn salient features while discarding noise.
Reconstruction Loss
Training relies on reconstruction loss, typically measured using Mean Squared Error (MSE) or Binary Cross-Entropy between the original input and the decoder's output. The network minimizes this loss to ensure the compressed latent vector retains sufficient information for accurate reconstruction.
Understanding Variational Autoencoders (VAEs)
Variational Autoencoders extend standard autoencoders by treating the latent space as a probability distribution rather than a deterministic vector. The implementations in AutoencodersTF.ipynb and AutoEncodersPyTorch.ipynb demonstrate how VAEs enable generative modeling through probabilistic encoding.
Probabilistic Latent Space
Unlike deterministic autoencoders, VAEs encode inputs as probability distributions (typically Gaussian) characterized by mean (μ) and variance (σ²) parameters. This stochastic approach allows the model to generate new data points by sampling from the learned latent distribution.
The Reparameterization Trick
To enable backpropagation through random sampling, VAEs employ the reparameterization trick: z = μ + σ · ε, where ε is sampled from a standard normal distribution N(0,1). This technique, implemented in the PyTorch VAEEncoder class, moves the sampling operation outside the gradient computation path while maintaining stochasticity.
KL-Divergence Loss Term
VAEs introduce a Kullback-Leibler (KL) divergence term in the loss function to regularize the learned latent distribution toward a standard normal prior N(0,1). The total loss combines reconstruction error and KL divergence: Loss = Reconstruction_Loss + β · KL_Divergence(μ, σ), where β controls regularization strength.
Implementation in TensorFlow and PyTorch
The microsoft/AI-For-Beginners repository provides complete implementations in both frameworks, utilizing convolutional layers from the preceding ConvNets lessons.
TensorFlow Implementation
The AutoencodersTF.ipynb notebook implements VAEs using Keras layers. The architecture leverages convolutional building blocks defined in lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb to create encoder and decoder networks. The training loop explicitly computes both reconstruction loss and KL divergence.
PyTorch Implementation
The AutoEncodersPyTorch.ipynb notebook defines modular classes: VAEEncoder, VAEDecoder, and VAEAutoEncoder. These components inherit from torch.nn.Module and implement the reparameterization trick within the forward pass. The encoder outputs mean and log-variance tensors, while the decoder reconstructs images from sampled latent vectors.
Practical Code Examples
The following PyTorch implementation demonstrates the architecture defined in the repository's notebooks:
import torch
import torch.nn as nn
import torch.nn.functional as F
class VAEEncoder(nn.Module):
def __init__(self, latent_dim=20):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, 3, stride=2, padding=1)
self.conv2 = nn.Conv2d(32, 64, 3, stride=2, padding=1)
self.fc_mu = nn.Linear(64 * 7 * 7, latent_dim)
self.fc_logvar = nn.Linear(64 * 7 * 7, latent_dim)
def forward(self, x):
x = F.relu(self.conv1(x))
x = F.relu(self.conv2(x))
x = x.view(x.size(0), -1)
mu = self.fc_mu(x)
logvar = self.fc_logvar(x)
return mu, logvar
class VAEDecoder(nn.Module):
def __init__(self, latent_dim=20):
super().__init__()
self.fc = nn.Linear(latent_dim, 64 * 7 * 7)
self.deconv1 = nn.ConvTranspose2d(64, 32, 3, stride=2, padding=1, output_padding=1)
self.deconv2 = nn.ConvTranspose2d(32, 1, 3, stride=2, padding=1, output_padding=1)
def forward(self, z):
x = F.relu(self.fc(z))
x = x.view(-1, 64, 7, 7)
x = F.relu(self.deconv1(x))
x = torch.sigmoid(self.deconv2(x))
return x
class VAEAutoEncoder(nn.Module):
def __init__(self, latent_dim=20):
super().__init__()
self.encoder = VAEEncoder(latent_dim)
self.decoder = VAEDecoder(latent_dim)
def reparameterize(self, mu, logvar):
std = torch.exp(0.5 * logvar)
eps = torch.randn_like(std)
return mu + eps * std
def forward(self, x):
mu, logvar = self.encoder(x)
z = self.reparameterize(mu, logvar)
return self.decoder(z), mu, logvar
For TensorFlow implementations, the loss function combines reconstruction error with KL divergence:
def vae_loss(x, x_reconstructed, mu, log_var):
reconstruction_loss = tf.reduce_mean(
tf.reduce_sum(
tf.keras.losses.binary_crossentropy(x, x_reconstructed),
axis=(1, 2)
)
)
kl_loss = -0.5 * tf.reduce_mean(
tf.reduce_sum(1 + log_var - tf.square(mu) - tf.exp(log_var), axis=1)
)
total_loss = reconstruction_loss + kl_loss
return total_loss
Summary
- Autoencoders compress data through an encoder-decoder architecture using reconstruction loss, as demonstrated in
lessons/4-ComputerVision/09-Autoencoders/. - Variational Autoencoders introduce probabilistic latent spaces with mean and variance parameters, enabling generative modeling beyond simple compression.
- The reparameterization trick allows gradient flow through stochastic nodes by separating the random sampling from the network parameters.
- KL-divergence regularizes the latent distribution toward a standard normal prior, preventing overfitting and ensuring smooth latent spaces.
- The microsoft/AI-For-Beginners repository provides complete implementations in both TensorFlow (
AutoencodersTF.ipynb) and PyTorch (AutoEncodersPyTorch.ipynb), utilizing convolutional layers from the ConvNets lessons.
Frequently Asked Questions
What is the difference between autoencoders and VAEs for dimensionality reduction?
Standard autoencoders learn deterministic mappings from input to latent space, while VAEs learn probability distributions. This means VAEs can generate new data samples by sampling from the learned latent distribution, whereas standard autoencoders only compress existing data. The VAE's KL-divergence term also ensures the latent space is continuous and interpolatable.
Why is the reparameterization trick necessary in VAEs?
The reparameterization trick enables backpropagation through the stochastic sampling node. Without it, the random sampling operation would block gradient flow from the loss back to the encoder parameters. By expressing the random variable z as a deterministic function of μ, σ, and a separate noise variable ε, gradients can propagate through μ and σ while maintaining the stochastic nature of the sampling process.
How does the KL-divergence term affect the VAE training?
The KL-divergence term acts as a regularizer that pulls the learned latent distribution toward a standard normal distribution N(0,1). This prevents the latent space from memorizing individual data points and ensures that similar inputs map to nearby points in latent space. The balance between reconstruction quality and latent space regularization is controlled by the β parameter in the loss function.
Can I use the convolutional layers from the ConvNets lessons for autoencoders?
Yes, the microsoft/AI-For-Beginners repository specifically demonstrates CNN-based autoencoders using convolutional building blocks from lessons/4-ComputerVision/07-ConvNets/ConvNetsTF.ipynb and ConvNetsPyTorch.ipynb. These convolutional layers are used in both encoders (for downsampling) and decoders (using transposed convolutions for upsampling), making them ideal for image data dimensionality reduction.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →