共计 2264 个字符,预计需要花费 6 分钟才能阅读完成。
背景介绍
深度学习在过去十年经历了快速的发展,其中 CNN(Convolutional Neural Network, 卷积神经网络)、GAN(Generative Adversarial Network, 生成对抗网络)和 LSTM(Long Short-Term Memory, 长短期记忆网络)是三个里程碑式的架构。它们的流行时间大致如下:

- CNN:2012 年 AlexNet 在 ImageNet 竞赛中夺冠后开始流行,主要用于图像识别。
- GAN:2014 年由 Ian Goodfellow 提出,迅速成为生成模型的主流方法。
- LSTM:1997 年提出,但在 2010 年后随着序列数据处理需求的增加而广泛应用。
架构对比
1. CNN:局部感知与平移不变性
原理 :
CNN 通过卷积核(Kernel)在图像上滑动,提取局部特征。其核心公式为:
(f * g)(x, y) = \sum_{i=-k}^{k} \sum_{j=-k}^{k} f(i, j) \cdot g(x-i, y-j)
优点 :
– 局部感知 :减少参数量,避免全连接层的过拟合。
– 平移不变性 :同一物体在不同位置仍能被识别。
缺点 :
– 对序列数据(如时间序列、文本)处理能力有限。
– 难以捕捉长距离依赖关系。
结构图 :
[输入层] -> [卷积层] -> [池化层] -> ... -> [全连接层] -> [输出层]
2. GAN:生成对抗特性
原理 :
GAN 由生成器(Generator)和判别器(Discriminator)组成,通过对抗训练优化目标函数:
\min_G \max_D V(D, G) = E_{x\sim p_{data}}[\log D(x)] + E_{z\sim p_z}[\log (1 - D(G(z)))]
优点 :
– 生成能力 :可以生成逼真的图像、音频等数据。
– 无监督学习 :不需要大量标注数据。
缺点 :
– 训练不稳定,容易出现模式崩溃(Mode Collapse)。
– 生成结果难以控制。
结构图 :
[噪声输入] -> [生成器] -> [生成样本] -> [判别器] -> [真 / 假判断]
3. LSTM:长时记忆能力
原理 :
LSTM 通过门控机制(输入门、遗忘门、输出门)控制信息流动,解决 RNN 的梯度消失问题。其核心公式为:
f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)
优点 :
– 长时记忆 :能够捕捉长距离依赖关系。
– 序列建模 :适合处理时间序列、文本等数据。
缺点 :
– 计算复杂度高,训练速度慢。
– 参数量大,容易过拟合。
结构图 :
[输入] -> [遗忘门] -> [输入门] -> [输出门] -> [隐藏状态]
演进关系
- CNN -> GAN:
- CNN 擅长特征提取,但无法生成新数据。
-
GAN 通过对抗训练弥补了这一不足,实现了数据生成。
-
GAN -> LSTM:
- GAN 在序列数据生成上表现不佳。
- LSTM 通过门控机制解决了序列建模问题。
应用场景
- CNN:图像分类(如 ResNet)、目标检测(如 YOLO)。
- GAN:图像生成(如 StyleGAN)、数据增强。
- LSTM:机器翻译(如 Transformer)、股票预测。
避坑指南
- CNN:
- 问题:过拟合。
-
解决:使用 Dropout、数据增强。
-
GAN:
- 问题:训练不稳定。
-
解决:使用 Wasserstein GAN(WGAN)或梯度惩罚(GP)。
-
LSTM:
- 问题:梯度消失。
- 解决:使用 GRU(Gated Recurrent Unit)简化结构。
代码示例
CNN 示例(PyTorch)
import torch.nn as nn
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc = nn.Linear(32 * 16 * 16, 10)
def forward(self, x):
x = self.pool(nn.ReLU()(self.conv1(x)))
x = x.view(-1, 32 * 16 * 16)
x = self.fc(x)
return x
GAN 示例(TensorFlow)
import tensorflow as tf
def generator(z):
x = tf.layers.dense(z, 128, activation=tf.nn.relu)
x = tf.layers.dense(x, 784, activation=tf.nn.sigmoid)
return x
def discriminator(x):
x = tf.layers.dense(x, 128, activation=tf.nn.relu)
x = tf.layers.dense(x, 1, activation=tf.nn.sigmoid)
return x
LSTM 示例(PyTorch)
import torch.nn as nn
class LSTM(nn.Module):
def __init__(self):
super(LSTM, self).__init__()
self.lstm = nn.LSTM(input_size=10, hidden_size=20, num_layers=2)
self.fc = nn.Linear(20, 2)
def forward(self, x):
x, _ = self.lstm(x)
x = self.fc(x[-1, :, :])
return x
总结与思考
在实际业务场景中,选择架构时需考虑以下问题:
– 数据是图像、序列还是其他类型?
– 任务是分类、生成还是预测?
– 计算资源是否有限?
通过理解各架构的原理和优缺点,可以更高效地选择适合的模型。
