AI基础概念之十一:CNN算法的基本原理

一、 多层感知机的缺陷

多层感知机(MLP)的层与层之间采用全连接(每个神经元与上一层所有神经元相连),这种结构在处理图像、语音等二维 / 一维网格数据时,存在三个致命问题。

参数爆炸,计算效率极低

  • 以一张 28×28 的手写数字图片为例,输入层有 784 个神经元,若隐藏层设 1000 个神经元,仅这一层的权重参数就有 784×1000=784000 个;

  • 若处理 224×224×3 的彩色图像,输入层有 150528 个神经元,隐藏层设 2048 个神经元,权重参数会达到 150528×2048≈3.1×108 个 ------ 参数过多会导致训练慢、过拟合风险高、需要海量数据支撑。

丢失空间结构信息,无法利用数据局部相关性

  • 图像、语音等数据的核心特征是局部相关的:比如图像的边缘、纹理是由相邻像素组成的,语音的声调是由连续帧组成的;

  • MLP 会将输入的二维图像展平为一维向量(如 28×28→784×1),完全破坏了像素的空间位置关系 ------ 它无法区分 "左上角的像素和相邻像素" 与 "左上角的像素和右下角的像素" 的差异,只能学习到无结构的特征。

缺乏平移不变性,泛化能力差

  • 平移不变性:图像中的物体(如猫)无论在左、中、右位置,模型都应该识别出来;

  • MLP 不具备这种能力:若训练数据中猫在图像左侧,当测试数据中猫在右侧时,MLP 会因为输入向量的元素顺序改变而无法识别;

二、 CNN 算法的诞生

  1. 1989 年:CNN 的雏形LeNet-1。 杨立昆(Yann LeCun)团队受生物视觉系统 "局部感受野" 的启发,提出卷积神经网络的早期模型 ,首次引入卷积层、池化层的核心结构:卷积层:用共享权重的卷积核提取图像局部特征(边缘、角点),大幅减少参数;池化层:下采样降维,保留关键特征的同时降低计算量。

  2. 1998 年:LeNet-5 模型。 杨立昆团队正式提出LeNet-5 ,这是第一个完整的卷积神经网络模型,专为手写数字识别设计(MNIST 数据集)。它包含 3 层卷积 + 2 层池化 + 2 层全连接,能以 99% 以上的准确率识别手写数字,是 CNN 的里程碑。但受限于计算能力不足、数据集规模小,LeNet-5 仅用于实验室场景,未大规模落地,神经网络再次进入低谷(此时支持向量机 SVM 等传统机器学习算法更受青睐)。

  3. 2006 年:深度学习的起点。 杰弗里・辛顿(Geoffrey Hinton)在《Science》发表论文,提出两个关键技术:预训练 + 微调 :用受限玻尔兹曼机(RBM)对深层网络逐层预训练,再用 BP 算法微调,解决深层网络训练时的 "梯度消失" 问题;首次明确深度神经网络(Deep Neural Network, DNN)的概念:指层数 ≥ 5 层的神经网络(区别于传统 2-3 层的浅层网络)。这一突破让学术界意识到 "深层网络" 的潜力,深度学习时代正式开启。

  4. 2012 年:AlexNet 引爆深度学习革命。 辛顿的学生亚历克斯・克里泽夫斯基(Alex Krizhevsky)提出AlexNet ,一个 8 层的深度卷积神经网络,在 ImageNet 图像分类大赛中以15.3% 的错误率 碾压第二名(传统方法错误率 26.2%),震惊学界。AlexNet 的成功关键是在算力、数据和算法上同时进行了大幅度的改进。 这一事件标志着卷积神经网络(CNN)成为计算机视觉的核心模型,深度学习从实验室走向工业界。

  • 利用GPU 并行计算 :大幅提升训练速度(当时用 2 块 GTX580 GPU)。AlexNet 的参数达到 6000 万,是 LeNet-5 的 1000 倍,足够支撑复杂图像的特征提取

  • AlexNet 的训练数据是 ImageNet-2012 ,包含 120 万张标注图像、1000 个类别,覆盖了真实世界的复杂场景

算法创新:解决深层网络训练难题,提升模型鲁棒性

AlexNet 在 LeNet-5 的基础上,做了 4 个关键改进,让深层 CNN 的训练变得稳定且高效:

创新点 解决的问题 商用价值
ReLU 激活函数 替代 Sigmoid,解决深层网络的梯度消失问题 让网络可以堆叠到 8 层,且训练收敛速度提升 10 倍
Dropout 正则化 随机丢弃部分神经元,防止过拟合 让模型在大规模数据上的泛化能力更强,商用场景下准确率更稳定
重叠池化(Overlapping Pooling) 池化核 3×3、步长 2,避免特征混叠 提升特征提取的精度,减少商用场景的误判(如安防识别错人)
LRN 层(局部响应归一化) 增强特征的区分度 提升分类任务的准确率,

如今CNN已经在全领域落地应用,CNN 和深度神经网络彻底改变了多个行业:计算机视觉:车牌识别、人脸识别、自动驾驶图像检测、医疗影像诊断;语音识别:智能音箱、语音转文字;自然语言处理:机器翻译、聊天机器人。

Geoffrey Hinton 与 Yoshua Bengio、Yann LeCun(深度学习三巨头)因对深度神经网络的奠基性贡献,共同荣获**2018 年 ACM 图灵奖。**在CNN的发展中,Hinton和Yann LeCun都有着及其重要的奠基性作用。

三、 CNN 算法的核心模块:卷积层(Convolutional Layer)

这是 CNN 的灵魂模块,核心作用是提取图像的局部特征(如边缘、纹理、形状)。用一组可学习的卷积核(Filter/Kernel) 滑过输入图像,卷积核与图像的局部区域做点积运算,输出特征图(Feature Map)。卷积核的大小决定局部感受野(如 3×3、5×5),即每次关注图像的一小块区域。其关键特性包括:权值共享:同一个卷积核在整张图像上重复使用,大幅减少参数数量(相比全连接层,参数量可降低几个数量级)。空间不变性:无论特征在图像的哪个位置,卷积核都能识别,让模型具备平移不变性。

卷积中常用到的几个基础概念:

术语 含义 示例
输入(Input) 卷积层的输入,可为原始图像或上层特征图 28×28 的灰度图(单通道)、32×32×3 的彩色图(3 通道)
卷积核(Kernel/Filter) 可学习的权重矩阵,用于提取局部特征 3×3×3(高 × 宽 × 输入通道数)
步长(Stride) 卷积核每次滑动的像素数 Stride=1(逐像素滑动)、Stride=2(隔 1 像素滑动)
填充(Padding) 在输入边缘补 0,用于保持输出尺寸 Padding=1(3×3 卷积核补 1 圈 0,输出尺寸与输入一致)
输出(Feature Map) 卷积运算后的结果,即提取的特征 输入 28×28、3×3 核、Stride=1、Padding=1 → 输出 28×28

卷积层的分步实现(以 2D 卷积为例)我们以单通道输入 + 单卷积核的最简场景为例,拆解每一步计算过程:

步骤 1:输入预处理(可选 Padding)

目的:避免卷积后特征图尺寸缩小(尤其是多层卷积时,尺寸会持续收缩)。

  • 规则:若输入尺寸为 H×W,卷积核尺寸为 K×K,步长 S,填充 P,则输出尺寸为:
  • 示例:输入 5×5,3×3 卷积核,Stride=1,Padding=1,输出 5×5;无 Padding 则输出 3×3。

步骤 2:卷积核滑动与局部点积(核心步骤)

这是卷积层的核心运算,本质是卷积核与输入局部区域的加权求和

  1. 将卷积核覆盖到输入的第一个局部区域(左上角);

  2. 对卷积核的每个权重与输入对应位置的像素值做点积(相乘后求和);

  3. 将结果作为输出特征图对应位置的像素值;

  4. 按步长滑动卷积核,重复 1-3 步,直到遍历输入的所有区域。

直观示例(有Padding、Stride=1):

Padding 的核心作用是补 0 保持输出尺寸与输入一致**,**以下是 5×5 输入 + Padding=1+3×3 卷积核的完整过程:

补 0 后的输入(7×7):

复制代码
[[0, 0, 0, 0, 0, 0, 0],
 [0, 1, 2, 3, 4, 5, 0],
 [0, 6, 7, 8, 9, 10, 0],
 [0, 11,12,13,14,15, 0],
 [0, 16,17,18,19,20, 0],
 [0, 21,22,23,24,25, 0],
 [0, 0, 0, 0, 0, 0, 0]]

Hout​=(5+2×1−3)/1+1=5,Wout​=5,输出为 5×5 矩阵(与原输入尺寸一致)。

计算输出 [0,0]

复制代码
[[0, 0, 0],
 [0, 1, 2],
 [0, 6, 7]]

计算:0×1+0×0+0×(−1)+0×1+1×0+2×(−1)+0×1+6×0+7×(−1)=0−2−7=−9,输出 [0,0] = -9。

最终输出

复制代码
[[-9,  -6,  -8, -10, -7],
 [-3,  -6,  -8, -10, -13],
 [-3,  -6,  -8, -10, -13],
 [-3,  -6,  -8, -10, -13],
 [-15, -6,  -8, -10, -19]]

Padding=1 后,输出尺寸从 3×3 恢复为 5×5,边缘像素的特征也能被提取(无 Padding 时边缘信息会丢失)。

步骤 3:加偏置(Bias)

每个卷积核对应一个可学习的偏置值,在步骤 2 的点积结果上加上偏置,公式:output=点积结果+b偏置的作用是调整特征图的整体数值范围,提升模型的拟合能力。

获得输出后,同样可以采用反向传播 + 梯度下降的方式来实现参数的更新。

四、 CNN 算法的核心模块:池化层(Pooling Layer)

也叫下采样层,核心作用是压缩特征图尺寸、保留关键特征、提升模型鲁棒性。对卷积层输出的特征图进行局部聚合操作 ,用局部区域的统计值(最大值 / 平均值)替代该区域的所有值。两种主流类型:最大池化(Max Pooling) :取局部区域的最大值,能有效保留边缘、纹理等强特征,是最常用的池化方式。平均池化(Average Pooling):取局部区域的平均值,能保留背景等平滑特征,常用于模型的最后几层

池化层的关键作用包括:

  • 降低特征图的宽和高,减少后续计算量;

  • 增强平移不变性(特征位置轻微变化不影响池化结果);

  • 一定程度上防止过拟合。

一、 明确池化层输入,已刚才卷积层的输出作为池化层输入举例

回顾之前 Padding=1 后的卷积输出(5×5):

复制代码
input_pool = np.array([
    [-9,  -6,  -8, -10, -7],
    [-3,  -6,  -8, -10, -13],
    [-3,  -6,  -8, -10, -13],
    [-3,  -6,  -8, -10, -13],
    [-15, -6,  -8, -10, -19]
])

二、 池化层核心参数(通用配置)

  • 池化核大小 K=2×2

  • 步长 S=2

  • 填充 P=0(池化层一般不填充,除非需要严格保持尺寸)

三、 计算输出尺寸

池化输出尺寸公式与卷积一致:

同理 Wout​=2,最终池化输出为 2×2 矩阵(输入边缘不足 2×2 的区域会被舍弃)。

四、 2×2 最大池化(Max Pooling):取局部区域最大值

核心逻辑:滑动 2×2 池化核,取每个区域的最大值作为输出像素。最终输出(2×2)

复制代码
[[-3, -8],
 [-3, -8]]

五、 2×2 平均池化(Average Pooling):取局部区域平均值

最终输出(2×2)

复制代码
[[-6.0, -9.0],
 [-4.5, -9.0]]

池化层处理的核心结论

  1. 输入尺寸影响:5×5 输入经 2×2 步长 2 池化后,输出压缩为 2×2,实现降维;

  2. 无学习参数:池化的 "取最大 / 平均" 规则固定,训练中无需更新参数;

  3. 特征鲁棒性:最大池化保留局部最强特征(如本例的 -3),平均池化保留局部整体趋势(如本例的 -6);

  4. 边缘舍弃:步长 = 2 时,输入最后一行 / 列的剩余 1 个像素会被舍弃,若需保留可设置 Padding=1。

相关推荐
水如烟1 小时前
孤能子视角:“生物学“
人工智能
理想是做全栈工程师1 小时前
基于UNet的带噪黑白数字图像分割模型
人工智能·pytorch·python·anaconda
listhi5201 小时前
空间机器人动力学正逆解及遗传算法路径规划(MATLAB实现)
算法·matlab·机器人
KG_LLM图谱增强大模型1 小时前
知识图谱的演进:从静态到动态、时序与事件的全景综述
人工智能·大模型·知识图谱
GISer_Jing1 小时前
前端Vibe Coding
人工智能·aigc
永远都不秃头的程序员(互关)1 小时前
Transformer模型情感分析实战指南
人工智能·深度学习
Ydwlcloud1 小时前
面向全球用户的网站,AWS是唯一选择吗?
大数据·服务器·人工智能·云计算·aws
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——leetCode 662 题:二叉树最大宽度
c++·算法·结构与算法