深度学习入门与实践:从神经网络到Transformer
深度学习入门与实践:从神经网络到Transformer
一、什么是深度学习?
深度学习(Deep Learning)是机器学习的一个子领域,它通过多层神经网络模拟人脑的神经元结构,从大量数据中自动学习特征和模式。与传统机器学习方法不同,深度学习无需手动设计特征提取器,而是通过"端到端"的方式直接从原始数据中学习。
深度学习的核心优势
- 自动特征提取:从原始数据中自动学习层次化特征
- 强大的表达能力:深层网络可以拟合极其复杂的函数
- 迁移学习能力:预训练模型可以快速适应新任务
二、核心神经网络架构
2.1 全连接神经网络(FCNN)
最基础的神经网络结构,每一层的每个神经元与下一层的所有神经元连接。
输入层 -> 隐藏层1 -> 隐藏层2 -> 输出层
PyTorch实现示例:
import torch
import torch.nn as nn
class SimpleFCNN(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(SimpleFCNN, self).__init__()
self.layer1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.layer2 = nn.Linear(hidden_size, hidden_size)
self.layer3 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
x = self.layer1(x)
x = self.relu(x)
x = self.layer2(x)
x = self.relu(x)
x = self.layer3(x)
return x
2.2 卷积神经网络(CNN)
专门用于处理网格状数据(如图像)的架构,通过卷积核提取局部特征。
核心组件:
- 卷积层(Convolutional Layer)
- 池化层(Pooling Layer)
- 全连接层(Fully Connected Layer)
PyTorch实现示例:
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, num_classes)
self.relu = nn.ReLU()
def forward(self, x):
x = self.pool(self.relu(self.conv1(x)))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(x.size(0), -1)
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
2.3 循环神经网络(RNN)与LSTM
用于处理序列数据(如文本、时间序列),具有记忆能力。
LSTM(长短期记忆网络) 解决了传统RNN的梯度消失问题:
import torch.nn as nn
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, num_classes):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out, _ = self.lstm(x)
out = out[:, -1, :]
out = self.fc(out)
return out
2.4 Transformer架构
2017年Google提出的革命性架构,彻底改变了NLP和计算机视觉领域。
核心创新:
- 自注意力机制(Self-Attention):捕捉序列中任意两个位置的关系
- 多头注意力(Multi-Head Attention):从不同子空间学习信息
- 位置编码(Positional Encoding):为序列提供位置信息
简化实现示例:
import torch
import torch.nn as nn
import math
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super(MultiHeadAttention, self).__init__()
self.num_heads = num_heads
self.d_model = d_model
self.d_k = d_model // num_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 scaled_dot_product_attention(self, Q, K, V, mask=None):
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
attention_weights = torch.softmax(scores, dim=-1)
return torch.matmul(attention_weights, V)
def forward(self, Q, K, V, mask=None):
batch_size = Q.size(0)
Q = self.W_q(Q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
K = self.W_k(K).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
V = self.W_v(V).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
attention = self.scaled_dot_product_attention(Q, K, V, mask)
attention = attention.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
return self.W_o(attention)
三、深度学习的典型应用场景
| 领域 | 应用 | 常用架构 |
|---|---|---|
| 计算机视觉 | 图像分类、目标检测、图像分割 | CNN、Vision Transformer |
| 自然语言处理 | 机器翻译、情感分析、问答系统 | Transformer、BERT、GPT |
| 语音识别 | 语音转文字、说话人识别 | RNN、Conformer |
| 推荐系统 | 个性化推荐、点击率预测 | DNN、Graph Neural Network |
| 强化学习 | 游戏AI、机器人控制 | DQN、PPO |
四、训练一个完整的深度学习模型
以下是一个完整的训练流程示例,使用PyTorch在MNIST数据集上训练CNN:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
# 1. 数据准备
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = torchvision.datasets.MNIST(
root='./data', train=True, transform=transform, download=True
)
train_loader = torch.utils.data.DataLoader(
train_dataset, batch_size=64, shuffle=True
)
# 2. 定义模型
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
self.dropout1 = nn.Dropout2d(0.25)
self.dropout2 = nn.Dropout2d(0.5)
self.fc1 = nn.Linear(9216, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = nn.functional.relu(x)
x = self.conv2(x)
x = nn.functional.relu(x)
x = nn.functional.max_pool2d(x, 2)
x = self.dropout1(x)
x = torch.flatten(x, 1)
x = self.fc1(x)
x = nn.functional.relu(x)
x = self.dropout2(x)
x = self.fc2(x)
output = nn.functional.log_softmax(x, dim=1)
return output
model = CNN()
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 4. 训练循环
def train(model, device, train_loader, optimizer, epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} '
f'({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
for epoch in range(1, 4):
train(model, device, train_loader, optimizer, epoch)
五、学习路径建议
-
基础入门(2-4周)
- 学习Python编程基础
- 理解线性代数、概率论基础知识
- 学习深度学习基本概念
-
框架实践(4-8周)
- 掌握PyTorch或TensorFlow
- 实现经典网络结构(CNN、RNN)
- 完成Kaggle入门竞赛
-
进阶提升(8-16周)
- 深入学习Transformer和注意力机制
- 学习生成模型(GAN、VAE、扩散模型)
- 阅读经典论文,复现实验结果
-
项目实战(持续)
- 参与开源项目
- 解决实际业务问题
- 构建个人作品集
六、总结
深度学习已经成为人工智能领域最强大的技术之一。从最初的简单神经网络到如今的Transformer和大语言模型,深度学习技术正在不断演进。掌握深度学习不仅需要理解理论知识,更需要大量的实践和项目经验。希望本文能帮助你建立对深度学习的系统认识,开启你的深度学习之旅!
浙公网安备 33010602011771号