神经网络架构
什么是神经网络?
神经网络(Neural Network)是一类受生物神经元启发的机器学习模型,由大量互连的计算节点(神经元)组成,通过调整节点间的权重来学习数据中的模式。自 1958 年 Rosenblatt 提出感知机以来,神经网络经历了多次浪潮:1980 年代的反向传播算法、2012 年 AlexNet 引爆深度学习革命、2017 年 Transformer 架构彻底改变 NLP,以及 2020 年代扩散模型在生成领域的突破。
不同的任务需要不同的架构:图像识别用 CNN,序列建模用 RNN/LSTM,自然语言和多模态用 Transformer,图像生成用 GAN 或扩散模型。本指南将系统讲解每种架构的原理、核心组件、代码实现和最佳适用场景。
前馈神经网络 (FNN)
前馈神经网络是最基础的神经网络架构。数据从输入层经过一个或多个隐藏层,最终到达输出层,信息单向流动,不存在循环连接。每一层的神经元与下一层全连接(Fully Connected),通过激活函数(如 ReLU、Sigmoid)引入非线性。
FNN 适用于结构化数据的简单分类和回归任务,例如表格数据预测、信用评分等。当数据具有空间结构(图像)或时间序列特性时,应选择 CNN 或 RNN。
关键流程
PyTorch
import torch
import torch.nn as nn
class FNN(nn.Module):
def __init__(self, in_dim, hidden, out_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_dim, hidden),
nn.ReLU(),
nn.Linear(hidden, hidden),
nn.ReLU(),
nn.Linear(hidden, out_dim),
)
def forward(self, x):
return self.net(x)
model = FNN(784, 256, 10) # e.g. MNIST digits
卷积神经网络 (CNN)
CNN 通过卷积核(filter)在输入数据上滑动,自动提取局部特征(边缘、纹理、形状)。卷积层使用权重共享,大幅减少参数量;池化层(Pooling)降低空间维度,增强平移不变性。多层卷积堆叠后,网络能从低级特征(边缘)逐步抽象为高级语义特征(物体部件、完整物体)。
CNN 是计算机视觉的基础架构,从图像分类、目标检测到语义分割均有广泛应用。近年来 Vision Transformer(ViT)在某些任务上超越了 CNN,但 CNN 仍以其高效性和成熟的工具链占据重要地位。
核心组件流程
经典 CNN 模型
| 模型 | 年份 | 关键创新 | 层数 | 参数量 |
|---|---|---|---|---|
| LeNet-5 | 1998 | 首个实用 CNN,手写数字识别 | 5 | 60K |
| AlexNet | 2012 | ReLU + Dropout + GPU 训练,引爆深度学习 | 8 | 60M |
| VGG-16 | 2014 | 统一使用 3x3 小卷积核,更深的网络 | 16 | 138M |
| ResNet-50 | 2015 | 残差连接 (skip connection),解决梯度消失 | 50 | 25M |
| EfficientNet | 2019 | 复合缩放(深度/宽度/分辨率) | ~82 | 5-66M |
PyTorch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(64 * 8 * 8, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, num_classes),
)
def forward(self, x):
return self.classifier(self.features(x))
RNN / LSTM / GRU
循环神经网络(RNN)专为序列数据设计。每个时间步的隐藏状态 h(t) 既依赖当前输入 x(t),也依赖上一步的隐藏状态 h(t-1),从而捕获序列中的时间依赖关系。然而,标准 RNN 在长序列上存在严重的梯度消失/爆炸问题。
LSTM(Long Short-Term Memory)通过引入"遗忘门、输入门、输出门"三个门控机制和独立的记忆单元(cell state),有效解决了长距离依赖问题。GRU(Gated Recurrent Unit)是 LSTM 的简化版本,将遗忘门和输入门合并为"更新门",参数更少且训练速度更快,在许多任务上效果相当。
RNN vs LSTM vs GRU 对比
| 特性 | RNN | LSTM | GRU |
|---|---|---|---|
| 门控机制 | 无 | 3 个门(遗忘/输入/输出) | 2 个门(重置/更新) |
| 长距离依赖 | 差(梯度消失) | 优秀 | 良好 |
| 参数量 | 最少 | 最多(4x 隐藏层) | 中等(3x 隐藏层) |
| 训练速度 | 快 | 慢 | 中等 |
| 推荐场景 | 短序列 | 长文本、语音 | 中等序列、资源受限 |
PyTorch
import torch.nn as nn
class LSTMClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden, num_classes):
super().__init__()
self.emb = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, hidden, num_layers=2,
batch_first=True, dropout=0.3)
self.fc = nn.Linear(hidden, num_classes)
def forward(self, x):
x = self.emb(x) # (B, T, E)
_, (h_n, _) = self.lstm(x) # h_n: (2, B, H)
out = self.fc(h_n[-1]) # last layer hidden
return out
Transformer
Transformer 是 2017 年 Google 在论文"Attention Is All You Need"中提出的架构,它完全摒弃了循环结构,仅依靠自注意力机制(Self-Attention)来建模序列中任意位置之间的依赖关系。这使得 Transformer 可以高度并行化训练,解决了 RNN 的顺序瓶颈。
Transformer 的核心是多头注意力机制(Multi-Head Attention):将输入映射为 Query、Key、Value 三个矩阵,通过缩放点积注意力计算每个位置对其他所有位置的关注权重。位置编码(Positional Encoding)用于注入序列位置信息,因为自注意力本身不感知顺序。
核心公式
架构组成
Transformer 变体
| 变体 | 结构 | 代表模型 | 核心任务 | 参数量 |
|---|---|---|---|---|
| Encoder-only | 仅编码器,双向注意力 | BERT, RoBERTa, DeBERTa | 理解任务(分类、NER、QA) | 110M-340M |
| Decoder-only | 仅解码器,因果注意力(单向) | GPT-4, Claude, LLaMA, Gemini | 生成任务(对话、代码、推理) | 7B-1.8T |
| Encoder-Decoder | 完整编解码器,交叉注意力 | T5, BART, mBART | 翻译、摘要、Seq2Seq | 220M-11B |
| Vision Transformer | 图像分块 + Transformer 编码器 | ViT, DeiT, Swin Transformer | 图像分类、检测 | 86M-632M |
PyTorch — Self-Attention
import torch
import torch.nn as nn
import math
class SelfAttention(nn.Module):
def __init__(self, d_model, n_heads):
super().__init__()
self.n_heads = n_heads
self.d_k = d_model // n_heads
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
self.W_o = nn.Linear(d_model, d_model)
def forward(self, x):
B, T, C = x.shape
q = self.W_q(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
k = self.W_k(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
v = self.W_v(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
# Scaled dot-product attention
attn = (q @ k.transpose(-2,-1)) / math.sqrt(self.d_k)
attn = torch.softmax(attn, dim=-1)
out = (attn @ v).transpose(1,2).contiguous().view(B, T, C)
return self.W_o(out)
# Usage: attn = SelfAttention(d_model=512, n_heads=8)
GAN (生成对抗网络)
GAN 由 Ian Goodfellow 于 2014 年提出,包含两个相互对抗的网络:生成器(Generator)试图从随机噪声生成逼真的数据,判别器(Discriminator)试图区分真实数据和生成数据。两者通过博弈论中的极小极大游戏进行训练,最终生成器能够产生难以分辨的高质量样本。
GAN 的训练不稳定是其主要挑战,容易出现模式崩溃(mode collapse)和训练震荡。WGAN、Spectral Normalization 等技术在一定程度上缓解了这些问题。
GAN 变体
| 变体 | 关键创新 | 应用 |
|---|---|---|
| DCGAN | 使用卷积层替代全连接层 | 图像生成 |
| StyleGAN (1/2/3) | 风格映射网络,逐层控制生成 | 高质量人脸生成 |
| CycleGAN | 无配对图像的域转换(循环一致性损失) | 风格迁移、季节转换 |
| Pix2Pix | 有配对图像的条件生成 | 图像翻译(草图→照片) |
| WGAN | Wasserstein 距离替代 JS 散度 | 更稳定的训练 |
PyTorch — Simple GAN
import torch.nn as nn
class Generator(nn.Module):
def __init__(self, z_dim=100, img_dim=784):
super().__init__()
self.net = nn.Sequential(
nn.Linear(z_dim, 256), nn.LeakyReLU(0.2),
nn.Linear(256, 512), nn.LeakyReLU(0.2),
nn.Linear(512, img_dim), nn.Tanh(),
)
def forward(self, z):
return self.net(z)
class Discriminator(nn.Module):
def __init__(self, img_dim=784):
super().__init__()
self.net = nn.Sequential(
nn.Linear(img_dim, 512), nn.LeakyReLU(0.2),
nn.Linear(512, 256), nn.LeakyReLU(0.2),
nn.Linear(256, 1), nn.Sigmoid(),
)
def forward(self, x):
return self.net(x)
扩散模型 (Diffusion Models)
扩散模型是一类基于概率的生成模型,其核心思想分两步:前向过程(forward process)逐步向数据添加高斯噪声直至变为纯噪声;反向过程(reverse process)学习从噪声中逐步去噪恢复原始数据。通过参数化一个去噪网络(通常是 U-Net 架构),模型学会在每一步预测并移除噪声。
相比 GAN,扩散模型训练更稳定、生成质量更高、多样性更好,但推理速度较慢(需要多步去噪)。DDPM、DDIM 等采样策略可以加速推理过程。
代表性模型
| 模型 | 架构 | 特点 |
|---|---|---|
| Stable Diffusion | 潜空间扩散 (LDM) + U-Net + CLIP | 开源,文本到图像,可微调 |
| DALL-E 2/3 | CLIP + 扩散先验 + 解码器 | 高质量文本到图像 |
| Midjourney | 自研扩散架构 | 艺术风格突出 |
| Sora | Diffusion Transformer (DiT) | 文本到视频生成 |
架构综合对比
| 架构 | 最佳用途 | 关键创新 | 参数范围 | 年份 |
|---|---|---|---|---|
| FNN | 表格数据分类/回归 | 全连接 + 反向传播 | 1K - 10M | 1986 |
| CNN | 图像/视觉任务 | 卷积核 + 权重共享 + 池化 | 60K - 138M | 1998 |
| RNN/LSTM | 短/中等长度序列 | 循环连接 + 门控机制 | 100K - 50M | 1997 |
| Transformer | NLP、多模态、长序列 | 自注意力 + 位置编码 | 110M - 1.8T | 2017 |
| GAN | 图像生成/风格迁移 | 生成器-判别器对抗训练 | 1M - 200M | 2014 |
| Diffusion | 高质量图像/视频生成 | 逐步去噪 + 概率建模 | 100M - 8B | 2020 |
架构选型指南
根据任务类型选择最合适的神经网络架构:
| 任务 | 推荐架构 | 推荐模型 |
|---|---|---|
| 图像分类 | CNN / ViT | ResNet, EfficientNet, ViT, ConvNeXt |
| 目标检测 | CNN | YOLOv8, Faster R-CNN, DETR |
| 语义分割 | CNN / Transformer | U-Net, SegFormer, Mask2Former |
| 文本分类 / NLU | Transformer (Encoder) | BERT, RoBERTa, DeBERTa |
| 文本生成 / 对话 | Transformer (Decoder) | GPT-4, Claude, LLaMA 3, Gemini |
| 机器翻译 | Transformer (Enc-Dec) | T5, mBART, NLLB |
| 时间序列预测 | LSTM / Transformer | LSTM, Temporal Fusion Transformer, PatchTST |
| 图像生成 | Diffusion / GAN | Stable Diffusion, DALL-E 3, StyleGAN |
| 视频生成 | Diffusion Transformer | Sora, Runway Gen-3, Kling |
| 多模态理解 | Vision Transformer | CLIP, LLaVA, GPT-4V, Gemini |
| 语音识别 | Transformer | Whisper, Wav2Vec 2.0, Conformer |
| 推荐系统 | FNN / Transformer | DeepFM, DLRM, SASRec |
相关资源
深入了解机器学习和深度学习框架:
常见问题 (FAQ)
CNN 和 Transformer 哪个更适合图像任务?
两者各有优势。CNN 在小数据集上表现更好,因为卷积的归纳偏置(局部性、平移不变性)提供了良好的先验;训练效率更高,推理速度也更快。Vision Transformer(ViT)在大规模数据集(如 ImageNet-21K、JFT-300M)上通常优于 CNN,因为自注意力可以捕获全局依赖。实践中的趋势是混合架构(如 ConvNeXt 借鉴了 Transformer 的设计理念,但仍使用卷积操作),以及在中小规模数据上使用预训练的 ViT 进行微调。
为什么 Transformer 取代了 RNN 成为 NLP 的主流?
主要有三个原因:(1)并行化——RNN 必须按顺序处理,而 Transformer 的自注意力允许所有位置同时计算,训练速度提升数十倍;(2)长距离依赖——自注意力直接建模任意两个位置间的关系,不受序列长度影响(理论上),而 LSTM 即使有门控机制,在极长序列上仍会遗忘;(3)可扩展性——Transformer 的架构在参数量扩展到数千亿时仍能持续提升性能(scaling law),这是 RNN 无法匹敌的。
GAN 和扩散模型哪个更好?
扩散模型在生成质量和多样性上已全面超越 GAN,尤其在文本条件生成方面。但 GAN 在推理速度上仍有优势(一次前向传播 vs 扩散模型需要 20-50 步去噪)。对于实时应用或资源受限场景,GAN 可能仍是更好的选择。不过,蒸馏技术(如 Consistency Models、LCM)正在大幅缩短扩散模型的推理步数,使其越来越接近实时。在 2026 年,如果不考虑速度约束,扩散模型是图像生成的首选。
深度学习入门应该先学哪个架构?
建议按以下顺序学习:(1)先学 FNN(全连接网络),理解前向传播、反向传播、梯度下降等基础概念;(2)然后学 CNN,理解卷积、池化和特征提取,用 MNIST/CIFAR-10 实践;(3)了解 RNN/LSTM 的基本概念(即使 Transformer 已成为主流,理解循环结构有助于理解序列建模的本质);(4)最后深入 Transformer,它是当前最重要的架构。推荐用 PyTorch 作为学习框架,代码更直观、调试更方便。
如何选择预训练模型的大小(参数量)?
模型大小的选择取决于三个因素:(1)数据量——根据 Chinchilla 缩放定律,最优训练 token 数约为参数量的 20 倍,如果数据不足,大模型反而可能过拟合;(2)计算资源——7B 参数模型在推理时需要约 14GB 显存(FP16),70B 模型需要约 140GB,需要多卡并行;(3)任务复杂度——简单分类任务用 BERT-base(110M)就足够,复杂推理任务可能需要 70B+ 模型。实践建议是从小模型开始,在验证集上评估,如果性能不足再逐步扩大模型。