机器学习:卷积神经网络基础

阅读量 ,评论量

前言

卷积神经网络适用场景:输入信号在空间上和时间上存在一定关联性的场景。

封面图左侧为基础网络结构的调整,右侧为基础网络深度的增加。

基础概念

卷积(convolution)

一次卷积的计算量(FLOPs)为\(O(k*k*C_{in}*M*N*C_{out})\),一次卷积的参数量(MAC)为\(O(k*k*C_{in}*C_{out})\)。其中卷积后的大小为\(M=\frac{M-k+2*padding}{stride}+1\);若希望卷积前后大小一致,则需设\(padding=\frac{k-1}{2}\)\(stride=1\)

定义

\[ (f*g)(n) = \int_{-\infin}^{+\infin}f(x)g(n-x) \mathrm{d} x \]

两个在某种角度上具有一定关联性的函数 f 与 g,在二者自变量之和为一常数 n 的约束(更一般化地,在二者自变量的线性组合为一常数的约束)下,两函数之积在某个区间上的积分称为这两个函数在该区间上的卷积。

总之,两函数的卷积是两函数之积在某种线性组合(如 x+y=n)的约束下的特殊积分。

命名

之所以称为卷积,是因为该运算的结果是两函数的张量积构成的平面(或超平面)沿两函数各自自变量线性组合等式约束的轨迹做卷褶得到的降维的线(或超平面)上的某一点(线性组合等式约束决定的点)的值。

简而言之就是将张量积卷褶后的重合点之和即为卷积

理解角度

  1. 从对单通道二维图像做卷积的角度理解:

    f 为图像像素值对位置的函数,g 为实现某种功能的滤波器(又称为卷积核、模板),其具体操作为对两矩阵的哈达玛积的所有元素求和。

  2. 要想实现更加复杂的非线性滤波器,需要用一大堆的简易非线性滤波器,并通过很多层的组合得到。NIN(network in network)提出了一种“偷吃步”的方法(MLPconv)来降低计算复杂度和模型复杂度。可从两个角度来理解 MLPconv:

    (假设第一层的卷积核与输入图像相同大小)

    简单来说,非 NIN 结构的多层卷积是跨越了不同尺寸的感受野,在相同范围内的感受野只有一次简易非线性滤波;而 NIN 结构的多层卷积是作用在同一尺寸上的感受野,可认为在相同范围内的感受野由一次复杂的非线性滤波,能够提取更强的非线性特征。

  3. 针对不同尺度特征自然需要不同大小的卷积核,考虑到不同尺度特征可能属于同一级别的抽象,故提出了 inception 结构。该结构本质是对几个不同大小卷积核的 MLPconv 的结果的 concat。该结构的合理性是基于以下两点原因的:

    inception-v1 结构如下图所示(从左至右,为提取尺度越来越大的特征,最左侧的特征可认为是在该抽象程度上尺度为零的特征):

inception_v1

​ 对 inception module 如此设计的理解:

  1. VGG-net 中的 trick:用多个 3×3 卷积核代替更大面积的卷积核,这不仅减少了参数,减轻过拟合,而且多次卷积代替一次卷积的方案更增加了非线性,有利于特征的提取。后来在 inception-v3 中发现,非对称的卷积结构拆分比用多个 3×3 卷积进行拆分的效果更明显,参数也更少。这被称为 Factorization in Small Convolutions 思想。

inceptionv1v2v3

  1. ResNet 中的 trick:引入shortcut

resnet_v1_v2

resnet_structure

  1. DenseNet:

densenet_structure

在神经网络上的实现方法及理由(任务依赖的正则化)

  1. 局部感知:每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息;
  2. 参数共享:图像具有一种“静态性”的属性:图像的一部分的统计特性与某些其他部分是一样的,即平移不变性的特征。由此提出了卷积核和特征图的概念。

池化(polling)

池化过程本质为特征突出过程,去除特征图中的无用像素点。(查看西瓜书的样本不均衡问题)

卷积核类型

对深度模型的一些优化

issues_deeplearning

ReLu

https://www.zhihu.com/question/59031444/answer/177786603

LRN

LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

很少再用,现多用 dropout。

dropout

  1. 一种更恶化环境训练、更舒服环境战斗的思想。
  2. Hinton 认为 dropout 是通过特殊的训练策略实现的隐式的模型集成。
  1. 达到了一种Vote的作用。对于全连接神经网络而言,我们用相同的数据去训练5个不同的神经网络可能会得到多个不同的结果,我们可以通过一种vote机制来决定多票者胜出,因此相对而言提升了网络的精度与鲁棒性。同理,对于单个神经网络而言,如果我们将其进行分批,虽然不同的网络可能会产生不同程度的过拟合,但是将其公用一个损失函数,相当于对其同时进行了优化,取了平均,因此可以较为有效地防止过拟合的发生。
  2. 减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过Dropout的话,就有效地组织了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。

简而言之:Dropout在实践中能很好工作是因为其在训练阶段阻止了神经元的共适应。

应对梯度爆炸/弥散

ResNet

ResNet 是一种学习残差的框架,即用非线性层去显式地拟合一个残差映射,而不再是去拟合一个期望的潜在映射。

解决了随着网络层数不断加深,求解器不能找到解决途径的问题。

code: resnet_tf

深度神经网络在 ReLU 和 BN 层的加入后,网络变深不再有梯度弥散的问题, 但却会出现随着网络的加深,准确度反而下降的现象,即退化现象。

ResNet 使得下述所需的函数变得更易拟合求解得到:通过几个非线性映射的堆叠去拟合一个恒等映射,由此使得对某个低级特征贡献不大的输入可以一下子被拉到更深的层,其对更高级特征的贡献由更深层的权重学习到。至于输入对哪种抽象特征的贡献度更大,在求解最优化的过程中可自动学习到。

从集成学习的观点,可以将更深的网络看做是在增加该指数的幂次( ResNet ),将更宽的网络看做是在增加该指数的基底( ResNeXt )。

resnet_pros

实现方面的细节

反向传播

卷积层的梯度反传

卷积神经网络中的梯度反传是 2D,与传统神经网络中的 1D 反传不同,但其数学本质相同(见梯度反传),只是表现形式上有略微的不同

conv_delta_backprocess

  1. 当已得到卷积层误差,求对卷积核参数的梯度时,以卷积层误差为卷积核,对与卷积核参数处于同一层的 feature map 做卷积(1D 反传时是误差与激活值直接做内积)得到在卷积核参数处的梯度;
  2. 若要继续反传得到图中卷积层的上一层(图中称为池化层是默认一个卷机后接一个池化)误差,须将卷积核参数旋转 180 度(不是转置)后对卷积层误差做 full 类型(其他类型还有 valid,same )的卷积,便得到了上一层的误差,进而递归地用第一条。

池化层的梯度反传

池化层不需要计算梯度,因为没有要训练的参数,但在梯度反传时,误差的形状需要发生变化以保证和上一层的参数能够对位,处理方式的原则是:保证传递的误差总和不变

  1. 对于均值池化,便是把误差每个元素等分成n份传递给前一层;
  2. 对于最大值池化,需要先在前传时记住最大值的位置,反传时将误差对应到所记录的位置上,其他位置置零。

后记

对 CNN 的研究主要有三种方法:

  1. 观察学习到的 filter
  2. 通过对抗样本
  3. 通过破坏网络结构,观察性能变化

调参

  1. 训练时loss或者权重出现NaN问题:ref