人工智能之核心基础 机器学习 第二十章 深度学习入门

12 阅读7分钟

人工智能之核心基础 机器学习

第二十章 深度学习入门


@TOC


20.1 深度学习与机器学习的区别与联系

🧠 核心关系

  • 深度学习 ⊂ 机器学习 ⊂ 人工智能
  • 深度学习是机器学习的一个子领域,专注于多层神经网络

🔍 对比表格

维度传统机器学习深度学习
特征工程需要人工设计特征(如TF-IDF、SIFT)自动学习特征(端到端)
数据需求中小规模数据(千~万级)大规模数据(百万级以上)
计算资源CPU即可需要GPU/TPU
可解释性较高(如决策树、线性模型)黑盒性强
典型任务表格数据、简单图像/文本图像识别、语音、NLP、生成模型
代表算法SVM、随机森林、逻辑回归CNN、RNN、Transformer

✅ 联系与互补

  • 深度学习不是取代,而是扩展
    • 小数据 → 用传统ML
    • 大数据 + 高维(图像/语音/文本)→ 用DL
  • 混合系统常见
    • 用CNN提取图像特征 → 用SVM分类
    • 用BERT提取文本特征 → 用XGBoost做预测

💡 一句话总结机器学习靠“人工特征 + 简单模型”,深度学习靠“原始数据 + 复杂模型”


20.2 神经网络基础

🧩 1. 感知机(Perceptron)— 神经网络的“原子”

结构
  • 输入:x1,x2,...,xnx_1, x_2, ..., x_n
  • 权重:w1,w2,...,wnw_1, w_2, ..., w_n
  • 偏置:bb
  • 输出:y=sign(w1x1+w2x2+...+wnxn+b)y = \text{sign}(w_1x_1 + w_2x_2 + ... + w_nx_n + b)
局限
  • 只能解决线性可分问题(如AND、OR)
  • 无法解决异或(XOR)问题

🧱 2. 多层感知机(MLP)— 真正的“深度”起点

结构
  • 输入层一个或多个隐藏层输出层
  • 每层神经元全连接(Dense Layer)
  • 引入非线性激活函数 → 可拟合任意函数(万能近似定理)
graph LR
Input[x1,x2] --> Hidden1[h1,h2,h3]
Hidden1 --> Output[y1,y2]

⚡ 3. 激活函数(让网络“活”起来!)

函数公式特点适用场景
Sigmoidσ(x)=11+ex\sigma(x) = \frac{1}{1+e^{-x}}输出(0,1),可解释为概率二分类输出层
Tanhtanh(x)=exexex+ex\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}输出(-1,1),零中心隐藏层(早期)
ReLUReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)计算快,缓解梯度消失现代默认选择
Leaky ReLULReLU(x)=max(0.01x,x)\text{LReLU}(x) = \max(0.01x, x)解决ReLU“死亡”问题ReLU失效时备用

为什么需要非线性? 如果没有激活函数,多层网络等价于单层线性模型!


📐 前向传播 vs 反向传播

  • 前向传播(Forward Pass):输入 → 输出(用于预测)
  • 反向传播(Backward Pass):计算损失 → 更新权重(用于训练)

核心:链式法则 + 梯度下降


20.3 深度学习常用框架

🆚 TensorFlow vs PyTorch

特性TensorFlowPyTorch
开发公司GoogleFacebook (Meta)
计算图静态图(TF 2.x 默认动态)动态图(Eager Execution)
易用性中等更Pythonic,调试方便
部署TF Serving, TFLite 强大TorchScript, ONNX
研究 vs 工业工业部署强学术研究首选

💡 初学者建议从 PyTorch 开始(更直观)


🧪 PyTorch 快速入门

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 快速入门

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 简化版)
# 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?
  • 传统网络无法处理变长序列
  • 忽略时间依赖性(如“不”+“好” ≠ “好”+“不”)
核心思想
  • 共享权重 + 隐藏状态传递
  • ht=tanh(Whht1+Wxxt+b)h_t = \text{tanh}(W_h h_{t-1} + W_x x_t + b)
问题与改进
问题解决方案
梯度消失/爆炸LSTM / GRU
长程依赖弱Attention 机制
LSTM(长短期记忆)核心
  • 三个门:遗忘门、输入门、输出门
  • 细胞状态:像传送带,信息可长期保留
# 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

graph LR
A[原始数据] --> B[数据预处理]
B --> C[构建模型]
C --> D[定义损失函数]
D --> E[选择优化器]
E --> F[训练循环]
F --> G[验证/测试]
G --> H[部署]

📊 关键实践技巧

技巧说明
Batch Normalization加速训练,提升稳定性
Dropout防止过拟合(训练时随机失活神经元)
学习率调度初始大学习率 → 后期小学习率
早停(Early Stopping)验证损失不再下降时停止

💻 完整实战:手写数字识别(MNIST)

PyTorch 实现

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、学习率调度

📚 学习路线建议

  1. 先掌握基础:MLP + MNIST
  2. 进阶CNN:CIFAR-10 → ResNet
  3. 尝试RNN:IMDB情感分析
  4. 拥抱Transformer:BERT、ViT(现代主流)
  5. 动手项目
    • 图像分类(猫狗识别)
    • 文本生成(诗歌、歌词)
    • 风格迁移(艺术滤镜)

🌟 建议深度学习不是魔法——它是“数据 + 模型 + 算力”的科学组合。 从简单开始,逐步深入,你也能构建AI奇迹!

资料关注

公众号:咚咚王 gitee:gitee.com/wy185850518…

《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》