一、卷积操作的正向传播:像拼图一样提取特征

想象你拿着一个带小窗口的放大镜(卷积核)在照片上滑动。每次停留时,窗口内的像素会和放大镜上的数字(权重)做乘法再相加,得到一个新数字——这就是正向传播的核心。

技术栈:Python + NumPy

import numpy as np

# 输入图片(3x3的灰度图)
input_img = np.array([[1, 0, 1],
                      [0, 1, 0],
                      [1, 0, 1]])

# 卷积核(2x2的权重矩阵)
kernel = np.array([[1, -1],
                   [-1, 1]])

# 正向卷积计算(步长=1,无填充)
def conv_forward(input, kernel):
    output = np.zeros((2, 2))  # 输出大小:(输入高-核高+1) x (输入宽-核宽+1)
    for i in range(2):
        for j in range(2):
            # 对应位置的元素相乘后求和
            output[i, j] = np.sum(input[i:i+2, j:j+2] * kernel)
    return output

# 输出结果:[[0, 2], [2, 0]]
print(conv_forward(input_img, kernel))

注释说明

  • 左上角窗口计算:(1×1 + 0×-1 + 0×-1 + 1×1) = 0
  • 滑动时边界会自动收缩,因此输出尺寸比输入小

二、反向传播的奥秘:误差如何修正参数

当网络预测错误时,反向传播就像侦探回溯脚印:

  1. 先计算最终输出与真实值的误差
  2. 将误差按贡献比例反向分配给卷积核的每个权重

技术栈延续NumPy示例

# 假设上游传回的梯度是d_output(形状同正向输出)
d_output = np.array([[0.5, -0.5],
                     [-0.5, 0.5]])

# 反向传播计算卷积核的梯度
def conv_backward(input, d_output):
    d_kernel = np.zeros_like(kernel)
    for i in range(2):
        for j in range(2):
            # 权重梯度 = 对应输入区域 × 上游梯度
            d_kernel += input[i:i+2, j:j+2] * d_output[i, j]
    return d_kernel

# 卷积核的梯度:[[0.5, -1.5], [-1.5, 0.5]]
print(conv_backward(input_img, d_output))

关键差异

  • 正向传播用卷积核扫描输入,反向传播则是用输入矩阵扫描梯度
  • 参数更新时,梯度大小取决于"哪些输入区域贡献了更多误差"

三、参数更新的技术内幕

优化器(如SGD)会根据梯度调整卷积核。例如学习率η=0.1时:

# 原始卷积核
kernel = np.array([[1, -1], [-1, 1]])

# 更新后的卷积核(kernel -= η * d_kernel)
new_kernel = kernel - 0.1 * np.array([[0.5, -1.5], [-1.5, 0.5]])
# 结果:[[0.95, -0.85], [-0.85, 0.95]]

注意事项

  • 学习率太大会导致参数震荡,太小则收敛慢
  • 现代优化器(如Adam)会动态调整每个参数的学习步长

四、应用场景与技术思考

典型应用

  • 图像识别:边缘检测卷积核(如Sobel算子)
  • 自然语言处理:1D卷积处理文本序列

优缺点对比
| 方向 | 优点 | 缺点 |
|-----------|---------------------|---------------------|
| 正向传播 | 计算高效,支持并行 | 输出尺寸可能缩小 |
| 反向传播 | 精准定位参数错误 | 计算复杂度高,需存储中间结果 |

调试技巧

  • 使用梯度检查(Gradient Check)验证反向传播实现
  • 对深度网络,注意梯度消失/爆炸问题

五、总结与延伸思考

正向传播像工厂流水线,按固定规则生产特征;反向传播则是质检员,通过误差反馈调整生产线参数。理解这两者的差异,能帮助我们:

  1. 更高效地设计网络结构
  2. 快速定位训练失败的原因
  3. 定制特殊的卷积操作(如空洞卷积)

当使用框架(如PyTorch)时,虽然自动求导隐藏了细节,但掌握原理仍能让你在模型调优时游刃有余。