从全连接层到卷积
学过MLP的小伙伴们都知道,假设我们对一个MLP模型进行图像分类任务时,我们对输入图像的第一步操作就是将一个二维的图像展平为一维作为输出。但这样的处理方式有一个显而易见的缺点——忽略了每张图像的空间结构信息。显然这是不准确的,它会导致我们对于图像的识别率降低。除此之外,使用MLP模型进行图像分类任务还有一个致命的缺点——所需参数过大。我们知道现代的图片一般都有个几百万的像素,这里我们做一个假设,假设我们手里有一张像素为1200万像素的图片,如果我们对其进行全连接的话,我们使用100个隐藏单元大小的隐藏层,则其所需参数量为1亿2千万,这甚至是不考虑3原色通道的情况下,已经相当于一个小语言模型的参数规模了,这显然是低效高耗的。那有没有什么办法能够既能读取图片的空间特征又可以减少参数量呢?答案当然是有,那就是我们接下来将要讨论的卷积神经网络(convolutional neural network,CNN)。
为了解决上述的问题,卷积神经网络利用了提取信息的两大原则:平移不变性和局部性
平移不变性
首先,多层感知机的输入是二维图像X,其隐藏表示H在数学上是一个矩阵,在代码中表示为二维张量。 其中X和H具有相同的形状。 为了方便理解,我们可以认为,无论是输入还是隐藏表示都拥有空间结构。
使用\([X]_{i, j}\)和\([H]_{i, j}\)分别表示输入图像和隐藏表示中位置\((i, j)\)处的像素。 为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵(如同我们先前在多层感知机中所做的那样)替换为四阶权重张量\(W\)。假设\(U\)包含偏置参数,我们可以将全连接层形式化地表示为
其中,从\(W\)到\(V\)的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系。 我们只需重新索引下标\((k, l)\),使\(k=i+a, l=j+b\),由此可得\([V]_{i, j, a, b}=[W]_{i, j, i+a, j+b}\)。 索引a和b通过在正偏移和负偏移之间移动覆盖了整个图像。简单来说,就是不断地扫描图形中的像素点。
现在引用上述的第一个原则:平移不变性。这意味这检测对象再输入X上的平移并不会导致隐藏表示H中的平移,也就是不会影响权重,即\([V]_{i, j, a, b}=[V]_{a, b}\)。因此,我们可以简化\(H\)的定义为:
这就是卷积(convolution),我们使用系数\([V]_{a, b}\)对位置\((i, j)\)附近的像素\((i+a, j+b)\)进行加权得到\([H]_{i, j}\)。注意,\([V]_{a, b}\)的系数\([V]_{i, j, a, b}\)少很多,因为前者不在依赖于图像中的位置,能大大减少参数量。
局部性
局部性简单来说,就是我们在识别图像时,并不关注整张图像,而是像侦探一样,通过一个放大镜来扫描图片的某些特征或者细节,只关注图形的一部分区域,因此,我们可以重写\(H\)的定义为:
这就是一个卷积层,在深度学习社区\(V\)称为卷积核(convolution kernel)或滤波器(filter),或者简单地称为该卷积核的权重,而这里的\(\Delta\)就是卷积核的范围。
总结
卷积的引入大大减少了模型的参数量,而且卷积层中的神经元仅与输入数据的局部区域连接,这反映了图像的空间局部性,使得网络能够有效提取局部特征,除此之外,较少的参数数量有助于减少过拟合的风险,使得模型在未见过的数据上具有更好的泛化能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义