深度学习
→ 返回机器学习
通过多层神经网络自动提取数据的层次化特征表示,在图像、语音、文本等领域取得了突破性进展,也是现代大语言模型的技术基础。
神经网络基础
神经元计算
- :权重(学习参数)
- :偏置
- :激活函数(引入非线性)
前向传播
输入层 X → 隐藏层 1 → 隐藏层 2 → ... → 输出层 ŷ
数据逐层流动,每层对上一层的输出做线性变换 + 激活。
反向传播
利用链式法则从输出层向输入层传播误差梯度,计算每个参数对损失的贡献,用于梯度下降更新权重。
激活函数
| 函数 | 输出范围 | 特点 |
|---|---|---|
| Sigmoid | (0, 1) | 梯度消失,用于二分类输出层 |
| Tanh | (-1, 1) | 零均值,深层仍会梯度消失 |
| ReLU | [0, +∞) | 计算简单,缓解梯度消失,隐藏层首选 |
| Leaky ReLU | (-∞, +∞) | 解决 ReLU 神经元死亡问题 |
| GELU | (-∞, +∞) | Transformer 常用,平滑版 ReLU |
| Softmax | (0,1) 且和为1 | 多分类输出层 |
损失函数
| 任务 | 损失函数 | 说明 |
|---|---|---|
| 二分类 | 二元交叉熵 | 输出层用 Sigmoid |
| 多分类 | 交叉熵 | 输出层用 Softmax |
| 回归 | MSE | 均方误差 |
| 回归(鲁棒) | Huber Loss | 对异常值不敏感 |
优化器
| 优化器 | 特点 |
|---|---|
| SGD | 单样本/小批量更新,噪声大 |
| Momentum | 累积历史梯度,加速收敛减少震荡 |
| AdaGrad | 自适应学习率,稀疏特征友好 |
| RMSProp | 指数加权移动平均,解决 AdaGrad 衰减过快 |
| Adam | Momentum + RMSProp,目前最常用 |
import torch.optim as optim
optimizer = optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
# 学习率调度
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience=5)卷积神经网络(CNN)
专为图像设计,通过卷积核自动提取空间特征。
核心操作
| 操作 | 作用 |
|---|---|
| 卷积层 | 滑动卷积核提取局部特征,参数共享 |
| 池化层 | 降采样,减少参数,增强平移不变性 |
| 全连接层 | 特征展平后分类 |
架构演进
| 模型 | 年份 | 创新点 |
|---|---|---|
| LeNet-5 | 1998 | 第一个实用 CNN |
| AlexNet | 2012 | ReLU、Dropout、GPU 训练 |
| VGGNet | 2014 | 统一 3×3 卷积,网络更深 |
| GoogLeNet | 2014 | Inception 多尺度特征融合 |
| ResNet | 2015 | 残差连接,解决深层退化 |
| EfficientNet | 2019 | 宽度/深度/分辨率复合缩放 |
残差连接(ResNet 核心)
跳跃连接让梯度直接回传,使 100+ 层网络可以稳定训练。
class ResBlock(nn.Module):
def __init__(self, ch):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(ch, ch, 3, padding=1), nn.BatchNorm2d(ch), nn.ReLU(),
nn.Conv2d(ch, ch, 3, padding=1), nn.BatchNorm2d(ch),
)
def forward(self, x):
return F.relu(self.net(x) + x)循环神经网络(RNN)
处理序列数据,隐藏状态在时间步间传递:
梯度消失问题:长序列中早期时间步的梯度指数级衰减,信息难以传递。
LSTM
引入三个门控机制解决长期依赖:
| 门 | 作用 |
|---|---|
| 遗忘门 | 决定丢弃细胞状态中的哪些信息 |
| 输入门 | 决定写入哪些新信息 |
| 输出门 | 决定输出细胞状态的哪个部分 |
GRU
LSTM 的简化版,只有重置门和更新门,参数更少,速度更快,效果相当。
Transformer
基于注意力机制,已取代 RNN 成为序列建模主流,也是所有大语言模型的基础架构。
自注意力(Self-Attention)
- 每个位置可以直接关注序列中任意位置,不受距离限制
- 缩放防止点积过大导致梯度消失
多头注意力
多个注意力头并行,各自关注不同的语义维度(语法、指代、语义关联等),结果拼接输出。
位置编码
无循环结构,需显式注入位置信息。常用方案:
| 方案 | 说明 |
|---|---|
| 正弦/余弦编码 | 原始 Transformer,固定编码 |
| RoPE | 旋转位置编码,LLaMA 系列采用 |
| ALiBi | 线性偏置,外推性更好 |
主流预训练模型
| 模型 | 架构 | 适用任务 |
|---|---|---|
| BERT | Encoder | 文本理解、分类、NER |
| GPT 系列 | Decoder | 文本生成、对话 |
| T5 | Encoder-Decoder | 翻译、摘要、问答 |
| LLaMA / Qwen | Decoder | 开源通用生成 |
正则化技术
Dropout
训练时随机置零部分神经元,防止过度依赖特定路径。
self.dropout = nn.Dropout(p=0.3)
x = self.dropout(x) # 推理时自动关闭Batch Normalization
对每层输出归一化,加速训练稳定梯度。适合 CNN、MLP。
Layer Normalization
对单个样本的特征维度归一化,适合 RNN 和 Transformer(对变长序列友好)。
数据增强
from torchvision import transforms
train_tf = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor(),
transforms.Normalize(mean, std),
])迁移学习
| 策略 | 做法 | 适用场景 |
|---|---|---|
| 特征提取 | 冻结预训练层,只训练分类头 | 数据少且域相似 |
| Fine-tune | 解冻部分/全部层,小学习率训练 | 有一定数据量 |
| 全量训练 | 预训练权重初始化后完整训练 | 数据充足且域差异大 |
import torchvision.models as models
model = models.resnet50(pretrained=True)
for param in model.parameters():
param.requires_grad = False # 冻结全部
model.fc = nn.Linear(2048, num_classes) # 替换分类头
optimizer = optim.Adam(model.fc.parameters(), lr=1e-3)训练技巧
梯度裁剪
# 防止梯度爆炸,RNN 和大模型训练必备
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)混合精度训练
FP16 计算 + FP32 权重,显著节省显存、加速训练。
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
loss = criterion(model(X), y)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()Early Stopping
best_loss, patience, counter = float('inf'), 10, 0
for epoch in range(max_epochs):
val_loss = validate(model)
if val_loss < best_loss:
best_loss = val_loss
torch.save(model.state_dict(), 'best.pt')
counter = 0
else:
counter += 1
if counter >= patience:
breakPyTorch 完整示例
import torch, torch.nn as nn, torch.optim as optim
class MLP(nn.Module):
def __init__(self, in_dim, hid_dim, out_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(in_dim, hid_dim),
nn.BatchNorm1d(hid_dim),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hid_dim, out_dim),
)
def forward(self, x):
return self.net(x)
model = MLP(784, 256, 10).to('cuda')
optimizer = optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()
for epoch in range(50):
model.train()
for X, y in train_loader:
X, y = X.to('cuda'), y.to('cuda')
optimizer.zero_grad()
criterion(model(X), y).backward()
optimizer.step()应用方向
| 方向 | 代表任务 | 常用架构 |
|---|---|---|
| 计算机视觉 | 图像分类、目标检测、分割 | ResNet、YOLO、ViT |
| 自然语言处理 | 文本分类、翻译、问答 | BERT、GPT、T5 |
| 语音处理 | 语音识别、合成、分离 | Wav2Vec、Whisper |
| 生成模型 | 图像生成、文本生成 | GAN、VAE、扩散模型 |
| 多模态 | 图文理解与生成 | CLIP、GPT-4V |