1. CNN 的基本结构与作用
CNN 全称为 Convolutional Neural Network,中文叫卷积神经网络,主要用于处理图像这类具有空间结构的数据。
一个典型的 CNN 结构可以表示为:
输入层 → 卷积层 Conv → 激活层 ReLU → 池化层 Pooling → 重复多组 Conv + ReLU + Pool → 全连接层 FC 或全局平均池化 → 输出层各部分的作用可以简单理解为:
- 卷积层:提取图像特征
- 激活层:引入非线性
- 池化层:压缩特征图
- 全连接层:综合特征并完成最终判断
- 输出层:给出类别、概率或其他预测结果
例如识别一张猫的图片时,CNN 可能逐层学习:
浅层:边缘、颜色变化 → 中层:纹理、角点、局部形状 → 深层:耳朵、眼睛、胡须 → 输出:判断是否为猫CNN 最擅长处理图像等空间数据,但并不是只能处理“静态数据”。
CNN 也可以处理:
- 视频中的单帧图像
- 音频频谱图
- 一维时间序列
- 文本中的局部特征
不过,普通 CNN 本身不擅长直接表达长时间顺序关系。对于视频、文本和时间序列,通常会结合 RNN、Transformer、3D CNN 或时序卷积等结构。
2. 卷积层与卷积核
卷积层通过卷积核在输入图像或特征图上不断滑动,提取局部特征。
假设有一个 3 × 3 的卷积核:
k1 k2 k3 k4 k5 k6 k7 k8 k9卷积核覆盖输入中的一个 3 × 3 区域,将对应位置的数值分别相乘后求和,再加上偏置:
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:
ReLU(x) = max(0, x)ReLU 会将小于 0 的值变为 0,大于 0 的值保持不变。
它的主要作用是:
给网络引入非线性,使网络能够学习更加复杂的图像特征。
池化层
池化层用于缩小特征图的宽和高,在保留主要特征的同时减少计算量。
例如对下面的 2 × 2 区域进行最大池化:
1 3 2 6最大池化取其中最大值:
max(1, 3, 2, 6) = 6因此,一个 2 × 2 的区域被压缩成一个数值。
常见池化方式包括:
- 最大池化:保留区域中最强的特征
- 平均池化:保留区域中的平均信息
- 全局平均池化:将每个通道压缩成一个数值
池化层的主要作用包括:
- 减小特征图尺寸
- 降低计算量和显存占用
- 扩大后续神经元的感受野
- 增强模型对轻微位置变化的适应能力
但池化也会丢失部分空间信息,因此在目标检测和图像分割任务中不能无限制地进行池化。
现代网络中,也常使用步长大于 1 的卷积代替部分池化操作。
全连接层
全连接层是指:
当前层的每一个神经元,都与上一层的所有神经元连接。
假设上一层有三个输入:
x1, x2, x3全连接层中的一个神经元可以写成:
y = w1*x1 + w2*x2 + w3*x3 + b全连接层可以综合前面提取出的所有特征,完成最终分类或预测。
例如:
尖耳朵 + 胡须 + 圆脸 → 综合判断 → 猫全连接层的主要问题是:
- 参数数量可能非常大
- 占用更多内存和计算资源
- 容易过拟合
- 通常要求固定大小的输入
- 将特征图展开后,会弱化原有空间位置信息
4. 为什么用卷积或全局平均池化替代全连接层
这里需要区分两种情况。
用卷积层替代全连接层
全连接层可以在某些情况下等价地改写成卷积层。
例如输入特征图大小为:
7 × 7 × 512可以使用一个覆盖整个特征图的卷积核,将全连接运算改写成卷积运算。
这样做能够让网络成为全卷积网络,主要优点是:
- 可以保留空间结构
- 可以处理不同尺寸的输入
- 更适合目标检测和图像分割
- 可以输出不同空间位置对应的预测结果
需要注意:
仅仅把全连接层等价地改写成覆盖整个输入的卷积层,并不一定会减少参数,因为两者在数学上可能完全等价。
真正能够明显减少参数的是使用较小卷积核、参数共享,或者使用全局平均池化压缩特征。
用全局平均池化替代大型全连接层
假设特征图大小为:
7 × 7 × 512将其直接展开,会得到:
7 * 7 * 512 = 25088个输入。
全局平均池化会对每个通道的 7 × 7 个数值求平均,最终得到:
1 × 1 × 512也就是将 25088 个数压缩为 512 个数。
然后再连接一个较小的分类层,可以明显减少参数和过拟合风险。
因此,现代 CNN 常采用:
卷积特征图 → 全局平均池化 → 较小的分类层 → 输出5. 文本如何输入神经网络
计算机不能直接理解文字,因此需要先把词语或字符转换为数字表示。
常见方法是词嵌入,也叫 Word Embedding。
例如:
“猫” → [0.2, 0.8, -0.4, ...] “狗” → [0.3, 0.7, -0.2, ...] “汽车” → [-0.6, 0.1, 0.9, ...]每个词都会被表示成一个固定维度的向量。
如果两个词语含义相近,它们的向量通常也会比较接近。
可以使用点积或余弦相似度衡量两个向量的相似程度。
余弦相似度可以直观写成:
cosine_similarity = dot(vector1, vector2) / (length(vector1) * length(vector2))余弦相似度越接近 1,通常表示两个向量方向越相似。
但词向量相似,只说明词语本身在语义上可能相关,并不能完整表达一句话中的词序、语法和上下文关系。
6. 为什么不能简单把词向量全部平铺
假设一句话有 100 个词,每个词向量有 300 维。
将所有词向量直接拼接后,输入维度为:
100 * 300 = 30000如果后面接一个有 1000 个神经元的全连接层,参数数量大约为:
30000 * 1000 = 30000000这样会带来两个主要问题。
参数数量过多
句子越长,展开后的输入维度越大,全连接层的参数数量也会明显增加。
而且全连接层通常要求输入长度固定。
例如模型按 100 个词设计,那么:
- 不足 100 个词的句子需要补齐
- 超过 100 个词的句子需要截断
词语顺序不容易自然表达
虽然平铺后不同位置仍对应不同输入位置,但普通全连接网络没有天然的顺序处理机制。
它需要分别学习“第一个词”“第二个词”“第三个词”所在位置的参数,难以自然处理不同长度的序列。
例如:
猫追狗和:
狗追猫包含的词相同,但顺序不同,含义完全不同。
因此,文本模型不仅需要理解每个词,还需要理解词语之间的先后顺序和上下文关系。
7. RNN 的基本原理
RNN 全称为 Recurrent Neural Network,中文叫循环神经网络,主要用于处理具有顺序关系的数据。
RNN 不会把所有词一次性平铺后送入网络,而是按照顺序逐个处理:
我 → 喜欢 → 吃 → 苹果RNN 在处理当前词时,会同时使用:
- 当前词的向量 x_t
- 上一个时刻的隐藏状态 h_previous
其计算可以直观写成:
h_current = activation( Wx * x_current + Wh * h_previous + b )其中:
- x_current:当前词的向量
- h_previous:前面词语形成的记忆
- h_current:更新后的当前记忆
- Wx、Wh、b:需要训练的参数
例如:
处理“我” → 得到记忆 h1 处理“喜欢” + h1 → 得到记忆 h2 处理“吃” + h2 → 得到记忆 h3 处理“苹果” + h3 → 得到记忆 h4因此可以简单理解为:
前一个词的计算结果会参与下一个词的计算,使信息按照顺序不断向后传递。
RNN 具有以下优点:
- 能够表达词语先后顺序
- 能够保留一定的上下文信息
- 每个时间步共享同一套参数
- 参数数量不会直接随着句子长度增加
- 可以处理不同长度的序列
需要注意:
句子变长时,RNN 的参数数量通常不会增加,但计算步骤会增加。
8. RNN 的两个主要缺点
难以捕捉长期依赖
长期依赖是指:
当前词的理解,需要依赖距离很远的前文信息。
例如:
我出生在中国,后来去过很多国家学习和工作, 但我说得最流利的语言仍然是中文。要理解最后的“中文”,需要记住句子开头的“中国”。
在普通 RNN 中,前面的信息需要经过很多时间步才能传到后面:
h1 → h2 → h3 → ... → h100在不断传递的过程中,早期信息可能逐渐被削弱、覆盖或遗忘。
训练时,梯度也需要经过很多时间步反向传播。
如果每一步梯度都乘上一个小于 1 的数,经过很多次相乘后,梯度会越来越小,这叫梯度消失。
例如:
0.5^10 ≈ 0.001当梯度接近 0 时,句子后面的误差几乎无法有效影响前面的参数,因此模型难以学习远距离词语之间的依赖关系。
普通 RNN 不是完全无法学习长期依赖,而是很难稳定地学习长期依赖。
LSTM 和 GRU 通过门控机制改善了这个问题。
无法在时间维度并行计算
RNN 当前时刻的计算依赖上一个时刻的隐藏状态:
h2 依赖 h1 h3 依赖 h2 h4 依赖 h3因此必须按照顺序执行:
先计算 h1 → 再计算 h2 → 再计算 h3 → 最后计算 h4不能同时计算所有词对应的隐藏状态。
句子越长,顺序计算步骤越多,训练速度越慢,也无法充分利用 GPU 的并行计算能力。
RNN 的两个问题,本质上都来自同一个特点:
信息必须沿时间顺序一步一步传递。
这既会使远距离信息逐渐衰减,也会使后一步必须等待前一步完成。
Transformer 使用自注意力机制,使不同词语可以直接建立联系,并且在训练时能够并行处理整段输入,因此逐渐取代了 RNN,成为自然语言处理中的主流结构。