深度学习入门:从CNN、RNN到Transformer的核心原理与实战对比

1次阅读
没有评论

共计 2123 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

深度学习入门:从 CNN、RNN 到 Transformer 的核心原理与实战对比

背景痛点

传统机器学习在处理图像、序列数据时存在明显的局限性。例如,传统的 SVM 或随机森林在处理图像分类任务时,需要手工提取特征(如 SIFT、HOG),这不仅耗时耗力,而且难以捕捉图像的深层语义信息。对于序列数据(如文本、时间序列),传统方法往往无法有效建模长距离依赖关系。

深度学习入门:从 CNN、RNN 到 Transformer 的核心原理与实战对比

  • 图像数据 :传统方法无法自动学习多层次特征
  • 序列数据 :难以捕捉长距离依赖关系
  • 通用性问题 :手工特征工程泛化能力差

技术对比

CNN 的局部感知与参数共享特性

卷积神经网络(CNN, Convolutional Neural Network)通过局部感知野和参数共享机制,高效处理图像数据。例如,经典的 LeNet- 5 结构包含卷积层、池化层和全连接层。

  • 局部感知 :每个卷积核只关注输入的一个局部区域
  • 参数共享 :同一个卷积核在图像的不同位置共享权重
  • 层级结构 :浅层捕捉边缘、纹理,深层捕捉语义信息

RNN 的时序记忆能力与梯度消失问题

循环神经网络(RNN, Recurrent Neural Network)通过隐藏状态传递时序信息,但存在梯度消失问题。LSTM(Long Short-Term Memory)通过门控机制缓解这一问题。

  • 时序记忆 :隐藏状态携带历史信息
  • 梯度消失 :反向传播时梯度指数衰减
  • LSTM 门控 :输入门、遗忘门、输出门控制信息流动

Transformer 的自注意力机制

Transformer 通过自注意力机制(Self-Attention)捕捉序列中的长距离依赖关系,无需递归计算。

  • QKV 矩阵 :Query、Key、Value 计算注意力权重
  • 位置编码 :Positional Encoding 引入序列顺序信息
  • 并行计算 :自注意力层可并行处理所有位置

代码实战

CNN 实现 MNIST 分类

import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)  # 输入通道 1,输出通道 32,卷积核 3x3
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout = nn.Dropout(0.5)
        self.fc = nn.Linear(1600, 10)  # MNIST 有 10 类

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.max_pool2d(x, 2)
        x = torch.relu(self.conv2(x))
        x = torch.max_pool2d(x, 2)
        x = torch.flatten(x, 1)
        x = self.dropout(x)
        return self.fc(x)

LSTM 股票价格预测

class LSTMModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_dim, hidden_dim, batch_first=True)
        self.linear = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        out, _ = self.lstm(x)  # out 形状: (batch, seq_len, hidden_dim)
        out = out[:, -1, :]  # 取最后一个时间步的输出
        return self.linear(out)

Transformer 文本分类

from transformers import BertTokenizer, BertForSequenceClassification

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')

inputs = tokenizer("Hello, world!", return_tensors="pt")
outputs = model(**inputs)

生产考量

  • 计算资源 :Transformer 通常需要更多 GPU 内存
  • 数据量 :CNN 在小样本场景表现更好
  • 推理速度 :RNN 适合实时性要求高的场景

避坑指南

  1. CNN 学习率 :大卷积核需更小的学习率
  2. RNN 序列 padding:使用 pack_padded_sequence 避免无效计算
  3. Transformer 复杂度 :采用稀疏注意力或分块计算

延伸阅读

  • 论文:Attention Is All You Need
  • 开源项目:HuggingFace Transformers
  • 教程:PyTorch 官方文档

总结

本文对比了 CNN、RNN 和 Transformer 的核心原理与实战应用。CNN 适合图像数据,RNN 适合短序列任务,而 Transformer 在长序列建模中表现优异。在实际项目中,应根据数据特点和资源限制选择合适的模型。

正文完
 0
评论(没有评论)