人工智能之核心基础 机器学习
第二十章 深度学习入门
文章目录
- [人工智能之核心基础 机器学习](#人工智能之核心基础 机器学习)
- [20.1 深度学习与机器学习的区别与联系](#20.1 深度学习与机器学习的区别与联系)
- [🧠 核心关系](#🧠 核心关系)
- [🔍 对比表格](#🔍 对比表格)
- [✅ 联系与互补](#✅ 联系与互补)
- [20.2 神经网络基础](#20.2 神经网络基础)
- [20.3 深度学习常用框架](#20.3 深度学习常用框架)
- [🆚 TensorFlow vs PyTorch](#🆚 TensorFlow vs PyTorch)
- [🧪 PyTorch 快速入门](#🧪 PyTorch 快速入门)
- [🧪 TensorFlow/Keras 快速入门](#🧪 TensorFlow/Keras 快速入门)
- [20.4 经典深度学习模型入门](#20.4 经典深度学习模型入门)
- [🎯 本章补充:深度学习完整流程](#🎯 本章补充:深度学习完整流程)
- [🔁 标准训练 Pipeline](#🔁 标准训练 Pipeline)
- [📊 关键实践技巧](#📊 关键实践技巧)
- [💻 完整实战:手写数字识别(MNIST)](#💻 完整实战:手写数字识别(MNIST))
- [PyTorch 实现](#PyTorch 实现)
- [🎯 本章总结:深度学习入门地图](#🎯 本章总结:深度学习入门地图)
- [📚 学习路线建议](#📚 学习路线建议)
- 资料关注
20.1 深度学习与机器学习的区别与联系
🧠 核心关系
- 深度学习 ⊂ 机器学习 ⊂ 人工智能
- 深度学习是机器学习的一个子领域 ,专注于多层神经网络
🔍 对比表格
| 维度 | 传统机器学习 | 深度学习 |
|---|---|---|
| 特征工程 | 需要人工设计特征(如TF-IDF、SIFT) | 自动学习特征(端到端) |
| 数据需求 | 中小规模数据(千~万级) | 大规模数据(百万级以上) |
| 计算资源 | CPU即可 | 需要GPU/TPU |
| 可解释性 | 较高(如决策树、线性模型) | 黑盒性强 |
| 典型任务 | 表格数据、简单图像/文本 | 图像识别、语音、NLP、生成模型 |
| 代表算法 | SVM、随机森林、逻辑回归 | CNN、RNN、Transformer |
✅ 联系与互补
- 深度学习不是取代,而是扩展 :
- 小数据 → 用传统ML
- 大数据 + 高维(图像/语音/文本)→ 用DL
- 混合系统常见 :
- 用CNN提取图像特征 → 用SVM分类
- 用BERT提取文本特征 → 用XGBoost做预测
💡 一句话总结 :
机器学习靠"人工特征 + 简单模型",深度学习靠"原始数据 + 复杂模型"
20.2 神经网络基础
🧩 1. 感知机(Perceptron)--- 神经网络的"原子"
结构
- 输入: x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn
- 权重: w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n w1,w2,...,wn
- 偏置: b b b
- 输出: y = sign ( w 1 x 1 + w 2 x 2 + . . . + w n x n + b ) y = \text{sign}(w_1x_1 + w_2x_2 + ... + w_nx_n + b) y=sign(w1x1+w2x2+...+wnxn+b)
局限
- 只能解决线性可分问题(如AND、OR)
- 无法解决异或(XOR)问题
🧱 2. 多层感知机(MLP)--- 真正的"深度"起点
结构
- 输入层 → 一个或多个隐藏层 → 输出层
- 每层神经元全连接(Dense Layer)
- 引入非线性激活函数 → 可拟合任意函数(万能近似定理)
x1,x2
h1,h2,h3
y1,y2
⚡ 3. 激活函数(让网络"活"起来!)
| 函数 | 公式 | 特点 | 适用场景 |
|---|---|---|---|
| Sigmoid | σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+e−x1 | 输出(0,1),可解释为概率 | 二分类输出层 |
| Tanh | tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x | 输出(-1,1),零中心 | 隐藏层(早期) |
| ReLU | ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x) | 计算快,缓解梯度消失 | 现代默认选择 |
| Leaky ReLU | LReLU ( x ) = max ( 0.01 x , x ) \text{LReLU}(x) = \max(0.01x, x) LReLU(x)=max(0.01x,x) | 解决ReLU"死亡"问题 | ReLU失效时备用 |
✅ 为什么需要非线性?
如果没有激活函数,多层网络等价于单层线性模型!
📐 前向传播 vs 反向传播
- 前向传播(Forward Pass):输入 → 输出(用于预测)
- 反向传播(Backward Pass):计算损失 → 更新权重(用于训练)
核心:链式法则 + 梯度下降
20.3 深度学习常用框架
🆚 TensorFlow vs PyTorch
| 特性 | TensorFlow | PyTorch |
|---|---|---|
| 开发公司 | Facebook (Meta) | |
| 计算图 | 静态图(TF 2.x 默认动态) | 动态图(Eager Execution) |
| 易用性 | 中等 | 更Pythonic,调试方便 |
| 部署 | TF Serving, TFLite 强大 | TorchScript, ONNX |
| 研究 vs 工业 | 工业部署强 | 学术研究首选 |
💡 初学者建议 :从 PyTorch 开始(更直观)
🧪 PyTorch 快速入门
python
import torch
import torch.nn as nn
import torch.optim as optim
# 1. 张量(Tensor)--- 类似NumPy数组,但支持GPU
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * 2
z = y.sum()
z.backward() # 自动求导
print(x.grad) # 输出: tensor([2., 2., 2.])
# 2. 构建简单神经网络
class SimpleNet(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super().__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
# 3. 训练流程
model = SimpleNet(784, 128, 10)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 假设 data_loader 已定义
for images, labels in data_loader:
images = images.view(images.size(0), -1) # 展平
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
🧪 TensorFlow/Keras 快速入门
python
import tensorflow as tf
from tensorflow import keras
# 1. 构建模型(Sequential API)
model = keras.Sequential([
keras.layers.Dense(128, activation='relu', input_shape=(784,)),
keras.layers.Dense(10, activation='softmax')
])
# 2. 编译
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 3. 训练
model.fit(X_train, y_train, epochs=5, batch_size=32, validation_split=0.2)
# 4. 预测
predictions = model.predict(X_test)
✅ Keras 优势 :几行代码搞定深度学习!
20.4 经典深度学习模型入门
🖼️ 1. 卷积神经网络(CNN)--- 图像处理之王
为什么需要 CNN?
- 全连接网络参数太多(如 224×224×3 图像 → 15万输入!)
- 无法利用局部相关性 和空间不变性
核心组件
| 组件 | 作用 |
|---|---|
| 卷积层(Conv) | 提取局部特征(边缘、纹理等) |
| 池化层(Pooling) | 降维 + 平移不变性(MaxPool最常用) |
| 全连接层(FC) | 分类头 |
经典结构(LeNet-5 简化版)
python
# PyTorch CNN 示例
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = self.pool(self.relu(self.conv1(x))) # -> [32, 14, 14]
x = self.pool(self.relu(self.conv2(x))) # -> [64, 7, 7]
x = x.view(-1, 64 * 7 * 7)
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
应用场景
- 图像分类(ResNet, EfficientNet)
- 目标检测(YOLO, Faster R-CNN)
- 语义分割(U-Net)
📝 2. 循环神经网络(RNN)--- 序列数据专家
为什么需要 RNN?
- 传统网络无法处理变长序列
- 忽略时间依赖性(如"不"+"好" ≠ "好"+"不")
核心思想
- 共享权重 + 隐藏状态传递
- h t = tanh ( W h h t − 1 + W x x t + b ) h_t = \text{tanh}(W_h h_{t-1} + W_x x_t + b) ht=tanh(Whht−1+Wxxt+b)
问题与改进
| 问题 | 解决方案 |
|---|---|
| 梯度消失/爆炸 | LSTM / GRU |
| 长程依赖弱 | Attention 机制 |
LSTM(长短期记忆)核心
- 三个门:遗忘门、输入门、输出门
- 细胞状态:像传送带,信息可长期保留
python
# PyTorch LSTM 示例(情感分析)
class LSTMClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, num_classes)
def forward(self, x):
embedded = self.embedding(x) # [batch, seq_len] → [batch, seq_len, embed_dim]
lstm_out, (hidden, _) = self.lstm(embedded)
# 取最后一个时间步
last_hidden = hidden[-1] # [batch, hidden_dim]
output = self.fc(last_hidden)
return output
应用场景
- 文本生成(ChatGPT 前身)
- 机器翻译(早期Seq2Seq)
- 时间序列预测(股票、天气)
⚠️ 注意 :现代 NLP 已被 Transformer 主导,但 RNN 仍在某些场景有用(如低资源设备)
🎯 本章补充:深度学习完整流程
🔁 标准训练 Pipeline
原始数据
数据预处理
构建模型
定义损失函数
选择优化器
训练循环
验证/测试
部署
📊 关键实践技巧
| 技巧 | 说明 |
|---|---|
| Batch Normalization | 加速训练,提升稳定性 |
| Dropout | 防止过拟合(训练时随机失活神经元) |
| 学习率调度 | 初始大学习率 → 后期小学习率 |
| 早停(Early Stopping) | 验证损失不再下降时停止 |
💻 完整实战:手写数字识别(MNIST)
PyTorch 实现
python
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
# 1. 数据加载
transform = transforms.Compose([transforms.ToTensor()])
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
# 2. 定义CNN模型
class MNIST_CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, 3, padding=1)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
self.dropout = nn.Dropout(0.5)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x)))
x = x.view(-1, 64 * 7 * 7)
x = torch.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
# 3. 训练
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = MNIST_CNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(5):
for i, (images, labels) in enumerate(trainloader):
images, labels = images.to(device), labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print(f'Epoch [{epoch+1}/5], Step [{i+1}/{len(trainloader)}], Loss: {loss.item():.4f}')
# 4. 测试
model.eval()
with torch.no_grad():
correct = 0
total = 0
for images, labels in testloader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'测试准确率: {100 * correct / total:.2f}%')
✅ 结果:5个epoch后,准确率通常 >98%!
🎯 本章总结:深度学习入门地图
| 模块 | 关键内容 |
|---|---|
| 基础概念 | MLP、激活函数、前向/反向传播 |
| 框架选择 | PyTorch(研究)、TensorFlow(部署) |
| CNN | 卷积、池化 → 图像任务 |
| RNN/LSTM | 隐藏状态、门控 → 序列任务 |
| 训练技巧 | Dropout、BN、学习率调度 |
📚 学习路线建议
- 先掌握基础:MLP + MNIST
- 进阶CNN:CIFAR-10 → ResNet
- 尝试RNN:IMDB情感分析
- 拥抱Transformer:BERT、ViT(现代主流)
- 动手项目 :
- 图像分类(猫狗识别)
- 文本生成(诗歌、歌词)
- 风格迁移(艺术滤镜)
🌟 建议 :
深度学习不是魔法------它是"数据 + 模型 + 算力"的科学组合。
从简单开始,逐步深入,你也能构建AI奇迹!
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》