参考资料

可视化网站:https://poloclub.github.io/cnn-explainer/#article-input

卷积&全连接&卷积模式:https://zhuanlan.zhihu.com/p/76606892

骰子例子:https://www.zhihu.com/question/22298352

自从我转专业到软件以来,卷积神经网络这个词就一直萦绕在我耳边,CNN的大名也是无数次地听到。但即使如此,对于什么是卷积,对于卷积神经网络训练的过程,我从来没有真正掌握,今天在选修课上又一次接触到了这一概念,想到之后保研面试肯定是要问这些的,不如现在就趁着时间还早打好基础,把机器学习的系统思维真正地构建起来,为之后的保研和陶瓷做准备。

image-20240309003157678

1 卷积

“卷积”一词来源于信号处理领域,人们想要知道一个输入信号在经过一个可以用单位冲击响应函数描述的线性系统后的输出是什么,由此引出了卷积运算。

假设有输入信号和系统响应如下:

img

首先要知道,某一时刻的信号输出值是当前和之前所有输入信号的累积效果,我现在想知道时信号的输出值,那么就要考虑的情况,是刚输入的所以输出分量为。f(9)已经输入了1s,所以输出分量为。由此一直累加到

img

由此可推导出连续函数的卷积公式:

{\displaystyle (f*g)(t)\triangleq \int _{-\infty }^{\infty }f(\tau )g(t-\tau )\,\mathrm {d} \tau }

离散型随机变量也可以进行卷积,只要把上面的积分换成求和即可,但是在那之前,我们先从概率论的角度推一遍卷积公式。

条件非常简单,求两个独立随机变量X、Y的和Z = X + Y的概率密度函数。

IMG_1F0AA84E73E6-1

我们再来看看离散型随机变量的例子,我们以掷骰子为例,由前面的证明我们知道,我们需要构造的是两次掷的骰子点数之和。

假设我们要求,由上面的公式我们知道应该是


。对应在图像上就是先把第二个骰子“卷”过来再对应位置相加相乘。

img

CNN中所用的是多维互相关,也就是没有翻转的卷积。我们先来看多维卷积,具体来说是二维,公式如下:

image-20240309142927669

该操作需要先将卷积核翻转,然后再与输入点相乘。但是CNN中省略了翻转这一过程,因为翻转本身没有什么意义,还会改变特征的方向特征,所以CNN中用的是互相关(Cross-Correlation):

image-20240309143618906

另外,卷积操作其实就是对输入向量乘以一个稀疏的全连接矩阵。

卷积和全连接实质上都是一组线性转换,但是卷积相比全连接而言,其参数矩阵更加稀疏,kernel matrix 中很多为零(sparse connectivity),同时非零部分的参数实际上是共享的(parameter sharing)。这两个特点让卷积可以大大减少参数的数量,同时同一套参数(卷积核)在多个地方复用更有利于捕捉局部的特征

卷积有三种模式,分别是FULL,VALID和SAME模式。下面的图像可以直观表述它们的区别:

  • FULL: - - 从有相交的地方开始卷积,该方法输出的尺寸最大

img

  • VALID - - 从重叠的地方开始卷积,参考网站用的就是这种方法

img

  • SAME – 输出大小 = 输入大小,可能需要不对称Padding

img

2 CNN基本概念

CNN首先是一个神经网络,是一种用来在数据中识别模式的算法。神经网络是由一系列组织成层的有着Weights和Bias参数的神经元构成的。

  • tensor张量,表示多维数组,0维张量就是数字,1维张量就是向量,2维张量就是矩阵,n维张量就是n维矩阵。
  • Neuron神经元是一个接受多个输入,提供一个输出的计算单元
  • Layer层是一系列执行相同类型操作的神经元的集合,它们有相同的超参数(P,KS,S)
  • Weights&Bias权重与偏置是每一个神经元在训练的时候优化的参数。

3 CNN层

3.1 Input Layer输入层

由于CNN一般被用来处理图片分类问题,所以一般输入图片有RGB三个通道。

3.2 Convolutional Layer卷积层

这是CNN的核心层,重要的是分清楚两层之间的联系。注意到下图中的卷积层是全连接的,也就是说每一个卷积层神经元都连接着上一个层的所有神经元,用含有相同超参数,但是具体weight不同的卷积核对三个通道分别进行卷积后再将对应位置的值相加,最后加上偏置向量Bias就完成了一个神经元的计算。

需要注意的是,如果按照这种全连接的方式,在input和conv层之间就需要3 * 10 = 30个有着不同weights的卷积核。

clicking on topmost first conv. layer activation map

3.3 Pooling Layer池化层

池化层的目的是减小网络规模,降低计算量和计算成本。

其中用的最多的是最大池化层,这种方法用一个预先取定大小和步长的池化核遍历图片,将每种遍历情况下的最大值构建新的张量值,直到遍历完成。

池化的优点是可以简化网络计算,避免过拟合风险。

3.4 Flatten Layer展平层

在模型输出之前,我们需要将张量展平,以便使用Softmax function进行激活并输出预测结果。

4 超参数解析

假设我们用VALID模式进行卷积,有对应关系F(input_size, padding, kernel_size, stride)

image-20240309171000203

image-20240309145808631

image-20240309145840720

5 激活函数

5.1 RELU

RELU函数是典型的非线性激活函数,对于神经网络来说非常重要,神经网络之所以能够实现这么高的精度,很大一部分原因就是能够表达非线性关系,而RELU函数就是很好的表达。

img

5.2 Softmax

image-20240309150210305

Softmax函数非常适合用来作为输出层,因为其所有分量之和加起来是1,这就与概率天然挂钩了,而且由于其指数的特性,能够放大不同值之间的差异,从而更好地实现分类。

对于不同激活函数的介绍和差异,之前学吴恩达老师的课程的时候我写了一篇笔记,请参看:https://tj-jiaoao.github.io/2023/04/26/Activate_function/