共计 2094 个字符,预计需要花费 6 分钟才能阅读完成。
引言
自动编码器 (Autoencoder, AE) 是深度学习中的基础模型,广泛应用于数据降维、特征学习和生成任务。它通过压缩输入数据到低维空间再重建的方式,学习数据的有效表示。反向传播算法则是训练 AE 的核心,理解它的数学原理对掌握深度学习至关重要。

数学原理
前向传播与损失计算
AE 由编码器和解码器两部分组成。假设输入数据为 $x$,编码过程为 $h = f(W_1x + b_1)$,解码过程为 $\hat{x} = f(W_2h + b_2)$,其中 $f$ 是激活函数(如 sigmoid)。
损失函数通常采用均方误差:
$$L = \frac{1}{2N}\sum_{i=1}^N (x_i – \hat{x}_i)^2$$
反向传播的梯度推导
反向传播通过链式法则计算各层参数的梯度。以单隐层 AE 为例:
-
输出层梯度:
$$\frac{\partial L}{\partial W_2} = \frac{\partial L}{\partial \hat{x}} \cdot \frac{\partial \hat{x}}{\partial W_2} = (\hat{x}-x) \cdot f'(z_2) \cdot h^T$$ -
隐层梯度:
$$\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial h} \cdot \frac{\partial h}{\partial W_1} = W_2^T(\hat{x}-x)f'(z_2) \cdot f'(z_1) \cdot x^T$$
代码实现
import numpy as np
class Autoencoder:
def __init__(self, input_dim, hidden_dim):
# 初始化权重(Xavier 初始化)self.W1 = np.random.randn(input_dim, hidden_dim) * np.sqrt(2./input_dim)
self.b1 = np.zeros(hidden_dim)
self.W2 = np.random.randn(hidden_dim, input_dim) * np.sqrt(2./hidden_dim)
self.b2 = np.zeros(input_dim)
def forward(self, x):
self.z1 = np.dot(x, self.W1) + self.b1
self.h = self.sigmoid(self.z1)
self.z2 = np.dot(self.h, self.W2) + self.b2
return self.sigmoid(self.z2)
def backward(self, x, lr=0.01):
# 计算梯度
error = self.forward(x) - x
delta2 = error * self.sigmoid_derivative(self.z2)
grad_W2 = np.dot(self.h.T, delta2)
grad_b2 = np.sum(delta2, axis=0)
delta1 = np.dot(delta2, self.W2.T) * self.sigmoid_derivative(self.z1)
grad_W1 = np.dot(x.T, delta1)
grad_b1 = np.sum(delta1, axis=0)
# 参数更新
self.W1 -= lr * grad_W1
self.b1 -= lr * grad_b1
self.W2 -= lr * grad_W2
self.b2 -= lr * grad_b2
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
return self.sigmoid(x) * (1 - self.sigmoid(x))
实验验证
使用 MNIST 数据集训练 AE:
-
数据预处理:
from tensorflow.keras.datasets import mnist (x_train, _), (x_test, _) = mnist.load_data() x_train = x_train.reshape(-1, 784) / 255.0 x_test = x_test.reshape(-1, 784) / 255.0 -
训练过程:
ae = Autoencoder(input_dim=784, hidden_dim=64) for epoch in range(50): ae.backward(x_train) loss = np.mean((ae.forward(x_test) - x_test)**2) print(f"Epoch {epoch+1}, Test Loss: {loss:.4f}")
常见问题
梯度消失 / 爆炸
当网络层数较深时容易出现:
- 梯度消失:使用 ReLU 等非饱和激活函数
- 梯度爆炸:梯度裁剪(
grad = np.clip(grad, -1, 1)) - 权重初始化:采用 Xavier 或 He 初始化
总结
反向传播是深度学习的基础算法,通过本文你可以:
- 理解 AE 中前向传播和反向传播的完整流程
- 掌握梯度计算的数学推导方法
- 实现一个可运行的 AE 模型
延伸思考方向:
– 如何将 AE 应用于异常检测?
– 变分自编码器 (VAE) 与普通 AE 的区别
– 在卷积网络中的应用(卷积 AE)
