深度学习
从神经网络到 Transformer,掌握现代深度学习的核心架构与训练方法。
概述
深度学习(Deep Learning, DL)是机器学习的一个子领域,使用多层神经网络来学习数据的层次化表示。它在图像识别、语音合成、自然语言处理等领域取得了突破性成果。
深度学习 vs 传统机器学习的核心区别:
- 自动特征学习:无需手工设计特征,网络自动提取
- 端到端训练:从原始输入直接到最终输出
- 大规模数据:需要大量数据才能发挥优势
- 计算密集:依赖 GPU 加速训练
神经网络基础
人工神经网络受人脑神经元结构启发,由多层相互连接的节点(神经元)组成。
感知机
最简单的神经网络单元,接收多个输入,计算加权和,通过激活函数输出:
output = activation(Σ wᵢxᵢ + b)
激活函数
| 函数 | 公式 | 特点 |
|---|---|---|
| ReLU | max(0, x) | 最常用,缓解梯度消失 |
| Sigmoid | 1/(1+e⁻ˣ) | 输出 0~1,用于二分类 |
| Softmax | eˣⁱ/Σeˣʲ | 多分类输出概率分布 |
| GELU | x·Φ(x) | Transformer 中常用 |
反向传播
深度学习训练的核心算法。通过链式法则计算损失函数对每个参数的梯度,然后使用梯度下降更新参数:
w = w - learning_rate × ∂Loss/∂w
卷积神经网络(CNN)
CNN 专为处理网格状数据(如图像)设计,核心组件包括:
- 卷积层:使用滤波器提取局部特征(边缘、纹理等)
- 池化层:降低空间维度,增强平移不变性
- 全连接层:将特征映射到最终输出
经典架构:LeNet → AlexNet → VGG → ResNet → EfficientNet
循环神经网络(RNN)
RNN 专为序列数据设计,通过隐藏状态传递历史信息:
- 标准 RNN:基础序列模型,存在梯度消失问题
- LSTM:引入门控机制,能学习长期依赖
- GRU:LSTM 的简化版本,参数更少
Transformer 架构
2017 年提出的 Transformer 彻底改变了 NLP 领域,现已成为 AI 的基础架构。
核心机制:自注意力(Self-Attention)
允许序列中每个位置关注所有其他位置,并行计算,捕捉长距离依赖:
Attention(Q,K,V) = softmax(QKᵀ/√dₖ)V
关键组件
- 多头注意力:并行运行多组注意力,捕捉不同模式
- 位置编码:注入序列位置信息
- 前馈网络:对每个位置独立进行非线性变换
- 层归一化:稳定训练过程
💡 大模型的基础
GPT、BERT、LLaMA 等所有现代大语言模型都基于 Transformer 架构。理解 Transformer 是进入大模型领域的必经之路。
训练技巧
- 学习率调度:Warmup + Cosine Decay 是常用策略
- 批量归一化:加速收敛,允许更大学习率
- Dropout:随机丢弃神经元,防止过拟合
- 数据增强:通过变换扩充训练数据
- 梯度裁剪:防止梯度爆炸
- 混合精度训练:使用 FP16 加速训练,节省显存
PyTorch 实战:构建神经网络
Python · PyTorch
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super().__init__()
self.network = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, num_classes)
)
def forward(self, x):
return self.network(x)
# 创建模型
model = SimpleNet(input_size=784, hidden_size=256, num_classes=10)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 训练循环
for epoch in range(10):
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs, y_train)
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")