共计 1906 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
卷积神经网络(CNN)和 Transformer 是深度学习领域两大主流架构,分别主导了计算机视觉和自然语言处理领域。CNN 通过局部连接和权重共享高效处理网格状数据(如图像),而 Transformer 凭借自注意力机制擅长捕捉长距离依赖关系。理解它们的结构差异,对于模型选型和优化至关重要。

模型结构对比
CNN 层级结构
- 输入层 :接收三维张量(高度×宽度×通道数)
- 卷积层核心组件 :
- 卷积核:可学习的空间滤波器
- 步长(stride):控制滑动步幅
- 填充(padding):保持特征图尺寸
- 典型结构块 :
- Conv → BatchNorm → ReLU 组合
- 池化层(Max/Average)降低空间维度
- 全连接层 :将特征展平后分类
Transformer 架构
- 自注意力机制 :
- Query-Key-Value 计算权重
- 多头注意力并行捕捉不同特征
- 编码器 - 解码器结构 :
- 编码器:N 个相同层(自注意力 +FFN)
- 解码器:新增交叉注意力机制
- 核心创新 :
- 位置编码替代 RNN 时序处理
- 残差连接缓解梯度消失
可视化实现
CNN 结构图绘制(Matplotlib 示例)
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
def draw_cnn_layer(ax, x, y, width, height, label, color='lightblue'):
ax.add_patch(Rectangle((x, y), width, height, fill=True, color=color))
ax.text(x + width/2, y + height/2, label,
ha='center', va='center', fontsize=8)
fig, ax = plt.subplots(figsize=(10, 4))
# 绘制输入层(28x28x1)draw_cnn_layer(ax, 0, 0, 2, 2, 'Input\n28×28×1')
# 绘制卷积层(24x24x32)draw_cnn_layer(ax, 3, 0, 1.7, 1.7, 'Conv1\n24×24×32')
# 添加箭头连接
ax.arrow(2.1, 1, 0.8, 0, head_width=0.2, head_length=0.2, fc='k')
plt.axis('off')
plt.show()
Transformer 可视化(Graphviz)
from graphviz import Digraph
def visualize_transformer():
dot = Digraph(comment='Transformer')
# 添加编码器层
with dot.subgraph(name='encoder') as e:
e.node('E1', 'Encoder\n(Self-Attention + FFN)')
e.edges([('E1', 'E2'), ('E2', 'E3')])
# 添加解码器层
with dot.subgraph(name='decoder') as d:
d.node('D1', 'Decoder\n(Masked Attention + Cross Attention)')
# 连接输入输出
dot.edge('Input', 'E1')
dot.edge('E3', 'D1')
dot.edge('D1', 'Output')
return dot
性能考量
- 计算复杂度 :
- CNN:O(k²·H·W·C_in·C_out) 与图像尺寸相关
- Transformer:O(n²·d) 随序列长度平方增长
- 内存占用 :
- CNN 参数量集中在最后全连接层
- Transformer 参数量主要在注意力权重矩阵
- 任务表现 :
- CNN 在局部特征提取任务(如物体检测)占优
- Transformer 更擅长需要全局建模的任务(如机器翻译)
避坑指南
常见问题
- CNN 典型错误 :
- 未正确设置 padding 导致特征图尺寸意外缩小
- 池化层位置不当损失重要空间信息
- Transformer 陷阱 :
- 未缩放注意力分数导致梯度爆炸
- 位置编码维度与模型不匹配
超参数建议
- CNN 初始学习率:0.001-0.01
- Transformer warmup 步骤:4000-8000
- 注意力头数选择:8-16(需被嵌入维度整除)
总结与思考
当处理具有强局部相关性的数据(如图像)时,CNN 仍是首选;而需要建模全局关系或处理序列数据时,Transformer 更具优势。建议读者:
- 使用 TensorBoard 或 Netron 工具可视化实际模型
- 在自定义数据集上对比两种结构的验证曲线
- 尝试混合架构(如 Vision Transformer)探索新可能
通过理解这些架构的本质差异,我们可以更明智地选择适合特定任务的模型,并在必要时进行针对性改进。
正文完
发表至: 深度学习
近一天内
