找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3901

积分

0

好友

534

主题
发表于 1 小时前 | 查看: 2| 回复: 0

这份笔记虽然有些年头,但其内在的逻辑框架和高亮标注依然清晰,非常适合刚刚入门的小白。已经是大佬的朋友,可以快速滑过查漏补缺!

一张表示疲惫的柴犬表情包

引入

卷积神经网络(Convolutional Neural Network, CNN)是一种有监督的深度学习模型框架。它尤其擅长处理像图像这样的二维数据问题,在行人检测、人脸识别、信号处理等领域大放异彩。作为首个真正意义上成功训练多层网络的算法,CNN是一种带有卷积结构的深度神经网络。

CNN与传统神经网络的主要区别在于权值共享非全连接。权值共享能够有效避免算法过拟合,同时通过特定的拓扑结构建立层与层之间的非全连接空间关系,从而显著降低需要训练的参数数量,这正是卷积神经网络的核心思想。

CNN通过反馈式的训练,学习到多个能够有效提取输入数据特征的卷积核。这些卷积核与输入数据进行逐层卷积和池化操作,从而逐级提取隐藏在数据拓扑结构中的深层特征。

随着网络结构的层层深入,所提取的特征也变得越来越抽象,最终能够获得输入数据具有平移、旋转及缩放不变性的特征表示。

相比传统的神经网络,CNN将特征提取分类这两个过程同时进行,巧妙避免了两者在算法匹配上的难点,这也是其强大性能的关键之一。

一、CNN基本结构

CNN的核心结构主要由卷积层 (Ci)下采样层 (Si) 交替重复出现来构建。

  • 卷积层:它的任务是提取输入神经元数据的局部特征。这样做不仅能增强特征信息,还能有效降低图像中的噪声。通常,我们可以选择不同尺寸的卷积核来提取多尺度特征,从而捕获不同大小的局部信息。
  • 下采样层:该层的作用是对其上一层提取的特征图进行缩放映射,以减小后续处理的数据量,同时也使得提取的特征具备一定的缩放不变性。

例如,一个用于图像识别的经典CNN基本框架如图所示,它包含两层卷积、两层下采样、一层全连接,最后输出分类结果:

经典CNN结构示意图:输入图 -> C1特征图(卷积)-> S2特征图(下采样)-> C3特征图(卷积)-> S4特征图(下采样)-> 全连接层 -> 输出

1、卷积层

图像矩阵滤波矩阵(卷积核) 做内积(即逐个元素相乘再求和)的操作就是卷积。你可以把图像看作一个数据窗口,而滤波矩阵则是我们学到的权重层。下图展示了神经网络中一个基础的加权求和与激活过程:

神经网络节点计算示意图:输入x1, x2与权重w1, w2及偏置b计算z,经激活函数g(z)得到输出a

而卷积的具体操作如下图所示,以一个3x3的卷积核对图像的一部分进行加权计算:

卷积操作示意图:卷积核覆盖源像素区域,计算加权和后得到新的目标像素值

在上图中,因为卷积核是3x3的,所以一次卷积操作会将一个3x3区域内的9个数汇总为1个数。每计算完一个数据窗口内的局部数据后,这个数据窗口会按照设定的步长不断平移滑动,直到遍历完所有数据。 这个过程涉及几个关键参数:

  1. 深度 (Depth):指的是滤波器的数量,它决定了输出特征图的厚度(即通道数)。
  2. 步长 (Stride):指滑动窗口每次移动的像素数。例如,一个3x3的卷积核,步长设为2,意味着每次水平或垂直移动2个像素。
  3. 填充值 (Zero-padding):在输入图像外围补充若干圈0像素。这样做的好处是,可以让我们从初始位置开始,刚好以步长为单位滑移到图像的末尾,确保输出尺寸的规整。

在滑动过程中,数据窗口的内容不断变化,但每次滤波器(卷积核)都只对某一局部的数据窗口(一个小的感受野) 进行卷积,这就是所谓的CNN的局部感知机制。同时,在整个图像的不同位置滑动时,滤波器的权重值是保持不变的,这就是CNN的参数(权重)共享机制,它能极大减少模型参数。

输入图像可学习的卷积核进行卷积操作,再经过一个激活函数,就得到了该卷积层的输出,即特征图。卷积层的计算公式如下:

卷积层计算公式:C_k^l = F ( Σ_{n∈I_k} ω_nk * M_n^{l-1} + b_n^l )

其中:

  • C表示第 l 层的第 k 个特征图。
  • I_k 表示参与计算第 k 个特征图的所有输入特征图的集合。
  • ω_nk 表示对应滤波器核的可学习权重参数。
  • M_n^{l-1} 表示第 l-1 层的第 n 个特征图(即本层的输入)。
  • b_n^l 表示第 l 层第 n 个输入所对应的加权偏置。
  • F(·) 是卷积层的激励函数(如ReLU)。

由公式可知,一个输出特征图可能由多个输入特征图卷积累加得到。但对于同一幅输入特征图,其卷积核参数在整个图像空间上是共享的,这正是“权值共享”的数学体现。

卷积核的初始值并非完全随机设置,有时会通过无监督的预训练来初始化,或者按照一定先验知识给定,例如模仿生物视觉特征使用Gabor滤波器进行初始化。

这里提到的卷积操作特指针对图像的二维离散卷积,主要步骤是:先将卷积核模板旋转180°,然后将卷积核的中心平移到待计算的像素点处,执行卷积操作(对应位置元素相乘后累加),从而得到该像素点在输出特征图上的值。

2、下采样层

下采样层也常被称为池化层 (Pooling Layer)。池化操作是指在特征图的高度和宽度方向上执行缩小运算,其主要目的是增强模型的鲁棒性——当输入数据发生微小位移或形变时,输出结果能保持相对稳定。下采样层通过降低特征图的空间分辨率来增强特征的缩放和平移不变性。其计算公式如下:

下采样层计算公式:S_k^l = F (β Σ_{n∈I_k} M_n^{l-1} + b_n^l)

其中,β 是一个可训练的标量参数,其值随下采样方法的不同而变化。最常用的下采样方法是最大值池化 (Max Pooling)平均值池化 (Average Pooling)。最大值池化更适合提取图像的纹理特征,而平均值池化则能更好地保留图像的背景信息。

例如,对于平均值采样,β = 1/m,表示对一个 m x m 的像素块进行下采样(最常用的是 2 x 2 的块)。这样,输出特征图在每个维度上的尺寸都变为原图的 1/m。每个输出特征图也都有一个对应的加权偏置 b,结果再输入到一个非线性函数(如Sigmoid函数)中。

假设我们有一个 4x4 的特征图,池化窗口大小 (kernel size) 为 2,池化步长 (stride) 也为 2,那么最大池化的结果如下(平均池化则是取每个 2x2 窗口的平均值):

最大池化操作示意图:一个4x4矩阵经过2x2滤波器、步长为2的最大池化,得到2x2的结果矩阵

下采样层的优势

  1. 降维:显著减少网络需要学习的参数数量,降低计算复杂度。
  2. 防止过拟合:通过引入一定的信息压缩,增强模型的泛化能力。
  3. 增大感知野:使得后续层的神经元能够看到原始输入图像中更大的区域。
  4. 实现不变性:在一定程度上提供平移、旋转和尺度不变性。

当然,其劣势在于下采样过程会不可避免地丢失一些特征信息。不过,后续的网络设计和一些特定技术(如跳跃连接)可以在一定程度上弥补这个损失。

3、全连接层

在传统神经网络中,相邻层的所有神经元之间都有连接,这样的层称为全连接层 (Fully Connected Layer)。在全连接神经网络中,它通常起到分类器的作用。

全连接层一般出现在CNN的最后几层,常用 Affine层(即线性变换层)来实现。该层的每个神经元都与前一层的所有神经元进行全连接,其作用是把前面所有卷积和池化层提取到的局部特征综合起来,通过加权和的方式形成全局的、高层次的语义特征表示。

由于全连接的特性,其参数数量往往是整个网络中最多的。为了提升CNN网络的性能,全连接层后常使用 ReLU 等激活函数来引入非线性:

全连接网络结构示例:输入2 -> Affine -> ReLU -> ... -> Affine -> Softmax -> 输出

上图展示了一个全连接神经网络,其中堆叠了多个Affine-ReLU组合,最后通过一个Affine层和Softmax层输出最终的概率分布。注意,这里的例子中,只有最后的Affine+Softmax才是我们通常说的输出分类层。前面的网络层可以根据需要选择是否全连接。 CNN的输出层一般采用线性全连接层,目前最常用的分类方法是逻辑回归Softmax分类

全连接层的主要作用

  1. 线性/非线性映射:将输入数据从低维特征空间映射到高维空间。如果加入非线性激活函数,则可以实现复杂的非线性映射。
  2. 特征整合与分类:如果说卷积层、池化层等操作是将原始数据映射到隐层特征空间,那么全连接层则起到了将学到的“分布式特征表示”映射到样本标记空间的作用。它把前面学到的所有局部特征,通过一个权值矩阵重新组装并映射到最终的分类标签上。

举例说明:下图展示了一个9x9的图像经过一系列卷积、池化、激活函数操作后,即将进入全连接层(红框部分)的过程:

CNN完整流程示例图:从9x9输入图像,经过卷积、ReLU、池化等操作,最终进入全连接层并输出“是X”和“不是X”

进入全连接层时,需要将多维的特征图 (Feature Map) 展平成一维向量

  1. 假设到达全连接层前是3个2x2的矩阵,那么展平后就得到一个12x1的向量,这个向量的每个元素就是全连接层输入层的一个神经元。
  2. 然后,这个一维向量输入到全连接网络中,最终以概率(通过Softmax函数)的方式判断输入属于哪个类别(例如“是X”或“不是X”)。图中较粗的连接线表示对分类贡献较大的特征连接。
  3. 根据网络计算得到的权重矩阵,对输入特征进行加权求和,得到每个类别的得分,再经过Softmax函数转换为概率。例如下图中,经过计算,判断为“X”的概率是0.92,判断为“不是X”的概率是0.5:

全连接层分类决策可视化:展示输入特征与输出类别“X”和“不是X”之间的权重连接及最终概率

(关于逻辑回归、Softmax分类、卷积核的权值与偏置、以及归一化等话题,后续可以单独深入探讨。)

二、CNN参数训练

CNN的参数训练过程与传统的人工神经网络类似,都采用误差反向传播 (Backpropagation, BP) 算法,包括前向传播和反向传播两个阶段。

假设我们共有 N 个训练样本,分为 C 个类别。常用的误差函数(损失函数) 是均方误差,定义如下:

误差函数公式:E^N = 1/2 Σ_{n=1}^N Σ_{k=1}^C (y_k^n - t_k^n)^2

其中:

  • y_k^n 是网络对第 n 个样本在第 k 维上的输出值。
  • t_k^n 是对应的真实标签(期望值)。
  • 误差函数 E^N 就是所有样本所有类别上输出与期望值之差的平方和的一半。

参数训练过程通常采用随机梯度下降 (SGD) 算法,但也有一些优化算法如LBFGS在卷积神经网络的参数优化中表现出比SGD更好的效果。

在实际应用中,卷积神经网络会遇到很多问题,例如网络参数如何初始化(预学习)、收敛条件的设定、以及非全连接规则的设计等,都需要根据具体任务进一步解决和优化。

这里简要介绍一种思路:Boosting-like CNN算法。其核心思想是为每个训练样本引入一个动态的惩罚权重 α。假设第 l 层的加权输入为 u^l,它与上一层的输出 x^{l-1} 存在如下线性关系:

带权重的网络层计算公式:u^l = αw^l x^{l-1} + b^l, x^l = f(u^l)

其中,w^l 为第 l 层的权值,b^l 为偏置,均在训练过程中调整。f(·) 为激活函数,一般为Sigmoid或双曲正切函数。

通过求导,我们可以得到输出层的灵敏度(误差对加权输入的导数)δ^l 为:

输出层灵敏度公式:δ^l = f‘(u^l) * (y^n - t^n)

进而,误差 E 对权值 w^l 的偏导数如下:

误差对权重的偏导公式:∂E/∂w^l = δ^l ∂u/∂w = x^{l-1} f‘(u^l) * (y^n - t^n)α

最后,对每个神经元的权值运用梯度下降法进行更新:

权重更新公式:ω^{l+1} = ω^l - η x^{l-1} f’(u^l) * (y^n - t^n)α

其中,η 为学习率。由此,我们就得到了权值 w 的迭代更新方法。

我们可以将CNN看作多个特征提取器串联而成的系统。每一个特征提取器(即网络层)所提取的特征从低级(如边缘、角点)向高级(如物体部件、整体)演进。并且,这些特征的提取过程是相互制约的——一个特征提取器的分类结果不仅受到前一层输入特征的影响,还会受到后一层反馈误差的调节。

假设一个CNN有 n 个阶段(可理解为 n 个层次的特征),我们可以用不同阶段的输出来训练分类器,得到 n 个“弱分类器”。借鉴Boosting算法的思想,在训练过程中不断调整样本的权重分布,给不同网络层次提供更有效的分类反馈信息,从而提升整体网络的性能和稳定性。具体实现细节可参考相关研究论文。

总结

深度学习是一种能够自动学习分类任务所需低层次或高层次特征的算法范式。以机器视觉为例,深度学习算法能从原始图像中直接学习到低层次表达(例如边缘和纹理),然后在这些低层次表达的基础上,通过线性或非线性的组合,进一步建立起更高层次的、更具语义性的表达。

深度学习的优势在于它能学习到更优的数据特征表示。由于模型层次深、参数多,因此有能力处理海量数据。对于像图像、语音这种特征不明显、难以手工设计的问题,深度学习通过大规模数据训练往往能取得突破性的效果。

此外,以CNN为代表的深度学习框架将特征提取分类整合在一个统一的端到端框架内。模型直接用数据去学习特征,这极大地减少了手工设计特征的巨大工作量,不仅效果更好,使用起来也更为便捷。这种“表示学习”的能力,正是其强大之处的核心。对这类话题感兴趣的朋友,欢迎到云栈社区算法与数据结构计算机基础板块交流探讨更多细节。




上一篇:打工人也要买单?2024年AI编程工具开销全解析
下一篇:VoxClaw开源:为AI Agent添加语音反馈,优化命令行与多设备工作流
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-10 11:05 , Processed in 0.520237 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表