深度学习2——CNN与RNN概述

1. CNN 的基本结构与作用

CNN 全称为 Convolutional Neural Network,中文叫卷积神经网络,主要用于处理图像这类具有空间结构的数据。

一个典型的 CNN 结构可以表示为:

text 复制代码
输入层
→ 卷积层 Conv
→ 激活层 ReLU
→ 池化层 Pooling
→ 重复多组 Conv + ReLU + Pool
→ 全连接层 FC 或全局平均池化
→ 输出层

各部分的作用可以简单理解为:

  • 卷积层:提取图像特征
  • 激活层:引入非线性
  • 池化层:压缩特征图
  • 全连接层:综合特征并完成最终判断
  • 输出层:给出类别、概率或其他预测结果

例如识别一张猫的图片时,CNN 可能逐层学习:

text 复制代码
浅层:边缘、颜色变化
→ 中层:纹理、角点、局部形状
→ 深层:耳朵、眼睛、胡须
→ 输出:判断是否为猫

CNN 最擅长处理图像等空间数据,但并不是只能处理"静态数据"。

CNN 也可以处理:

  • 视频中的单帧图像
  • 音频频谱图
  • 一维时间序列
  • 文本中的局部特征

不过,普通 CNN 本身不擅长直接表达长时间顺序关系。对于视频、文本和时间序列,通常会结合 RNN、Transformer、3D CNN 或时序卷积等结构。


2. 卷积层与卷积核

卷积层通过卷积核在输入图像或特征图上不断滑动,提取局部特征。

假设有一个 3 × 3 的卷积核:

text 复制代码
k1  k2  k3
k4  k5  k6
k7  k8  k9

卷积核覆盖输入中的一个 3 × 3 区域,将对应位置的数值分别相乘后求和,再加上偏置:

text 复制代码
output =
x1*k1 + x2*k2 + x3*k3
+ x4*k4 + x5*k5 + x6*k6
+ x7*k7 + x8*k8 + x9*k9
+ b

这个计算结果会成为输出特征图中的一个位置。

卷积核继续在图像上滑动,就可以得到完整的特征图。

卷积层有两个重要特点:

局部连接

卷积核每次只观察输入中的一小块区域,而不是一次连接整张图像。

这样更符合图像的特点,因为边缘、纹理等特征通常由附近像素共同构成。

参数共享

同一个卷积核会在整张图像的不同位置重复使用。

例如一个 3 × 3 的单通道卷积核只有 9 个权重。无论图片多大,卷积核的参数数量都不会随着图像位置增加。

这能够明显减少参数量。

不同卷积核能够提取不同特征,例如:

  • 某个卷积核学习检测水平边缘
  • 某个卷积核学习检测竖直边缘
  • 某个卷积核学习颜色变化
  • 某个卷积核学习纹理或形状

需要注意:

在深度学习中,卷积核中的权重通常不是人工设计的,而是像其他参数一样,通过训练自动学习得到的。


3. 激活层、池化层与全连接层

激活层

卷积运算本质上仍然是线性变换。

如果只连续堆叠卷积层,而不加入激活函数,整个网络的表达能力仍然有限。

因此通常在卷积层后加入 ReLU:

text 复制代码
ReLU(x) = max(0, x)

ReLU 会将小于 0 的值变为 0,大于 0 的值保持不变。

它的主要作用是:

给网络引入非线性,使网络能够学习更加复杂的图像特征。

池化层

池化层用于缩小特征图的宽和高,在保留主要特征的同时减少计算量。

例如对下面的 2 × 2 区域进行最大池化:

text 复制代码
1  3
2  6

最大池化取其中最大值:

text 复制代码
max(1, 3, 2, 6) = 6

因此,一个 2 × 2 的区域被压缩成一个数值。

常见池化方式包括:

  • 最大池化:保留区域中最强的特征
  • 平均池化:保留区域中的平均信息
  • 全局平均池化:将每个通道压缩成一个数值

池化层的主要作用包括:

  • 减小特征图尺寸
  • 降低计算量和显存占用
  • 扩大后续神经元的感受野
  • 增强模型对轻微位置变化的适应能力

但池化也会丢失部分空间信息,因此在目标检测和图像分割任务中不能无限制地进行池化。

现代网络中,也常使用步长大于 1 的卷积代替部分池化操作。

全连接层

全连接层是指:

当前层的每一个神经元,都与上一层的所有神经元连接。

假设上一层有三个输入:

text 复制代码
x1, x2, x3

全连接层中的一个神经元可以写成:

text 复制代码
y = w1*x1 + w2*x2 + w3*x3 + b

全连接层可以综合前面提取出的所有特征,完成最终分类或预测。

例如:

text 复制代码
尖耳朵 + 胡须 + 圆脸
→ 综合判断
→ 猫

全连接层的主要问题是:

  • 参数数量可能非常大
  • 占用更多内存和计算资源
  • 容易过拟合
  • 通常要求固定大小的输入
  • 将特征图展开后,会弱化原有空间位置信息

4. 为什么用卷积或全局平均池化替代全连接层

这里需要区分两种情况。

用卷积层替代全连接层

全连接层可以在某些情况下等价地改写成卷积层。

例如输入特征图大小为:

text 复制代码
7 × 7 × 512

可以使用一个覆盖整个特征图的卷积核,将全连接运算改写成卷积运算。

这样做能够让网络成为全卷积网络,主要优点是:

  • 可以保留空间结构
  • 可以处理不同尺寸的输入
  • 更适合目标检测和图像分割
  • 可以输出不同空间位置对应的预测结果

需要注意:

仅仅把全连接层等价地改写成覆盖整个输入的卷积层,并不一定会减少参数,因为两者在数学上可能完全等价。

真正能够明显减少参数的是使用较小卷积核、参数共享,或者使用全局平均池化压缩特征。

用全局平均池化替代大型全连接层

假设特征图大小为:

text 复制代码
7 × 7 × 512

将其直接展开,会得到:

text 复制代码
7 * 7 * 512 = 25088

个输入。

全局平均池化会对每个通道的 7 × 7 个数值求平均,最终得到:

text 复制代码
1 × 1 × 512

也就是将 25088 个数压缩为 512 个数。

然后再连接一个较小的分类层,可以明显减少参数和过拟合风险。

因此,现代 CNN 常采用:

text 复制代码
卷积特征图
→ 全局平均池化
→ 较小的分类层
→ 输出

5. 文本如何输入神经网络

计算机不能直接理解文字,因此需要先把词语或字符转换为数字表示。

常见方法是词嵌入,也叫 Word Embedding。

例如:

text 复制代码
"猫" → [0.2, 0.8, -0.4, ...]
"狗" → [0.3, 0.7, -0.2, ...]
"汽车" → [-0.6, 0.1, 0.9, ...]

每个词都会被表示成一个固定维度的向量。

如果两个词语含义相近,它们的向量通常也会比较接近。

可以使用点积或余弦相似度衡量两个向量的相似程度。

余弦相似度可以直观写成:

text 复制代码
cosine_similarity =
dot(vector1, vector2)
/
(length(vector1) * length(vector2))

余弦相似度越接近 1,通常表示两个向量方向越相似。

但词向量相似,只说明词语本身在语义上可能相关,并不能完整表达一句话中的词序、语法和上下文关系。


6. 为什么不能简单把词向量全部平铺

假设一句话有 100 个词,每个词向量有 300 维。

将所有词向量直接拼接后,输入维度为:

text 复制代码
100 * 300 = 30000

如果后面接一个有 1000 个神经元的全连接层,参数数量大约为:

text 复制代码
30000 * 1000 = 30000000

这样会带来两个主要问题。

参数数量过多

句子越长,展开后的输入维度越大,全连接层的参数数量也会明显增加。

而且全连接层通常要求输入长度固定。

例如模型按 100 个词设计,那么:

  • 不足 100 个词的句子需要补齐
  • 超过 100 个词的句子需要截断

词语顺序不容易自然表达

虽然平铺后不同位置仍对应不同输入位置,但普通全连接网络没有天然的顺序处理机制。

它需要分别学习"第一个词""第二个词""第三个词"所在位置的参数,难以自然处理不同长度的序列。

例如:

text 复制代码
猫追狗

和:

text 复制代码
狗追猫

包含的词相同,但顺序不同,含义完全不同。

因此,文本模型不仅需要理解每个词,还需要理解词语之间的先后顺序和上下文关系。


7. RNN 的基本原理

RNN 全称为 Recurrent Neural Network,中文叫循环神经网络,主要用于处理具有顺序关系的数据。

RNN 不会把所有词一次性平铺后送入网络,而是按照顺序逐个处理:

text 复制代码
我 → 喜欢 → 吃 → 苹果

RNN 在处理当前词时,会同时使用:

  • 当前词的向量 x_t
  • 上一个时刻的隐藏状态 h_previous

其计算可以直观写成:

text 复制代码
h_current =
activation(
Wx * x_current
+ Wh * h_previous
+ b
)

其中:

  • x_current:当前词的向量
  • h_previous:前面词语形成的记忆
  • h_current:更新后的当前记忆
  • Wx、Wh、b:需要训练的参数

例如:

text 复制代码
处理"我" → 得到记忆 h1
处理"喜欢" + h1 → 得到记忆 h2
处理"吃" + h2 → 得到记忆 h3
处理"苹果" + h3 → 得到记忆 h4

因此可以简单理解为:

前一个词的计算结果会参与下一个词的计算,使信息按照顺序不断向后传递。

RNN 具有以下优点:

  • 能够表达词语先后顺序
  • 能够保留一定的上下文信息
  • 每个时间步共享同一套参数
  • 参数数量不会直接随着句子长度增加
  • 可以处理不同长度的序列

需要注意:

句子变长时,RNN 的参数数量通常不会增加,但计算步骤会增加。


8. RNN 的两个主要缺点

难以捕捉长期依赖

长期依赖是指:

当前词的理解,需要依赖距离很远的前文信息。

例如:

text 复制代码
我出生在中国,后来去过很多国家学习和工作,
但我说得最流利的语言仍然是中文。

要理解最后的"中文",需要记住句子开头的"中国"。

在普通 RNN 中,前面的信息需要经过很多时间步才能传到后面:

text 复制代码
h1 → h2 → h3 → ... → h100

在不断传递的过程中,早期信息可能逐渐被削弱、覆盖或遗忘。

训练时,梯度也需要经过很多时间步反向传播。

如果每一步梯度都乘上一个小于 1 的数,经过很多次相乘后,梯度会越来越小,这叫梯度消失。

例如:

text 复制代码
0.5^10 ≈ 0.001

当梯度接近 0 时,句子后面的误差几乎无法有效影响前面的参数,因此模型难以学习远距离词语之间的依赖关系。

普通 RNN 不是完全无法学习长期依赖,而是很难稳定地学习长期依赖。

LSTM 和 GRU 通过门控机制改善了这个问题。

无法在时间维度并行计算

RNN 当前时刻的计算依赖上一个时刻的隐藏状态:

text 复制代码
h2 依赖 h1
h3 依赖 h2
h4 依赖 h3

因此必须按照顺序执行:

text 复制代码
先计算 h1
→ 再计算 h2
→ 再计算 h3
→ 最后计算 h4

不能同时计算所有词对应的隐藏状态。

句子越长,顺序计算步骤越多,训练速度越慢,也无法充分利用 GPU 的并行计算能力。

RNN 的两个问题,本质上都来自同一个特点:

信息必须沿时间顺序一步一步传递。

这既会使远距离信息逐渐衰减,也会使后一步必须等待前一步完成。

Transformer 使用自注意力机制,使不同词语可以直接建立联系,并且在训练时能够并行处理整段输入,因此逐渐取代了 RNN,成为自然语言处理中的主流结构。

相关推荐
绝世番茄1 小时前
鸿蒙HarmonyOS ArkTS原生拖拽排序深度解析
深度学习·华为·list·harmonyos·鸿蒙
CClaris3 小时前
大模型量化从0到1(九):用 llama.cpp 把模型转成 GGUF 并跑本地推理
人工智能·pytorch·python·深度学习·llama
数聚天成DeepSData4 小时前
遥感农业数据集下载全攻略
数据库·人工智能·深度学习·机器学习·自然语言处理·数据挖掘
一只空白格5 小时前
Transformer架构面试题目
人工智能·深度学习·transformer
爱勇宝6 小时前
DeepSeek实习生日薪5500:真正恐怖的不是工资
人工智能·深度学习·面试
Feisy6 小时前
出口锂电池-无人机等危险品的拍摄多张外包装申报照片的落地方案
深度学习·手机自动拍照·照片采集·电池外观拍摄·出口电池
直接冲冲冲8 小时前
两层神经网络与三层神经网络的区别
人工智能·深度学习·神经网络
QiZhang | UESTC10 小时前
学习agent开发
深度学习
蓝悦无人机13 小时前
自动驾驶论文解读:深度学习自动驾驶系统预测与规划集成综述
人工智能·深度学习·自动驾驶