CNN面试必知

Posted e-dreamer-blogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CNN面试必知相关的知识,希望对你有一定的参考价值。

PS: 经常看到一些卷积神经网络的知识,自己凭着自己看过的问法记录然后再寻找答案,答案不一定准确,另外,题目的顺序没有章法,基本上就是一些重点的问题, 如果有错误之处,还望指出。 

本文涉及问题包含来自: https://blog.nowcoder.net/n/9c67c993bf9842a68aaa7622228c2299  (很不错的博客,在此向大佬致敬)

           https://www.zhihu.com/search?type=content&q=mobile%20net%20v1%20%E3%80%81%20v2%20%E3%80%81%20v3%20

1.卷积的概念

  对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器 filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

2.图像卷积输出size 计算公式

  output_size = (input_size - kernel_size + 2*padding)/ stride +1 

3.感受野的概念和计算公式

  感受野: CNN每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小.。 

  计算机公式: 技术图片, 其中 lk-1 表示第 k-1层的感受野,而fk是当前层的卷积核大小,Si为第i 层的步长。 

4.解释权值共享

  卷积的时候,卷积核上面的一组权重是恒定不变的,也可以这样说,用一个卷积核去卷积一张图,这张图每个位置是被同样数值的卷积核操作的,权重是一样的,也就是参数共享。 

5.CNN的特性

  a.局部连接

  b.权值共享

  c.池化操作

  d.多层系统

6. pooling 的作用及 max-pooling 和 average-pooling 的应用场景

  pooling:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。

  通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性。 pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,在分类问题中,我们需要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种情况下显然max pooling比average pooling更合适。在网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去

  average-pooling:更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在信息的完整传递这个维度上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
  average-pooling在全局平均池化操作中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近分类器的末端使用全局平均池化还可以代替Flatten操作,使输入数据变成一位向量。

7. resnet提出解决的问题

  解决深层卷积神经网络在反向传播中梯度消失问题。 

8.CNN参数与计算量的计算

  卷积输入为 W * H * C ,卷积核 K * K * N ,输出W?* ?*?

    1. 计算量:W?* ?* ? * K * K * C 
    2. 参数量:C1?* K * K * C?

9.解决类别不平衡的相关方式

技术图片

10. 激活函数的种类和优缺点

技术图片

11.简述 Inception v1-v4区别、改进

V1

  1. 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
  2. 将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性
  3. 为了减少计算量,增加了1x1卷积。

V2

  1. 卷积分解,将单个的5x5卷积层用2个连续的3x3卷积层组成的小网络来代替,在保持感受野范围的同时又减少了参数量,也加深了网络。
  2. 提出了著名的Batch Normalization (BN) 方法。BN会对每一个mini-batch数据的内部进行标准化(normalization),使输出规范到N(0,1)的正态分布,加快了网络的训练速度,还可以增大学习率。
  3. BN某种意义上起到了正则化的作用,所以可以减少或者取消dropout,简化网络结构。V2在训练达到V1准确率时快了14倍,最后收敛的准确率也比V1高。

V3

  1. 考虑了nx1卷积核,将一个较大的二维卷积拆成两个较小的一维卷积(7x7拆成了7x1和1x7,3x3拆成了1x3和3x1),一方面节约了大量参数,加速运算并减轻了过拟合),同时网络深度进一步增加,增加了网络的非线性。
  2. 优化了Inception Module的结构。

V4

  利用残差连接(Residual Connection)来改进V3结构。

12. Inception v1中的inception结构怎么设计的

  1. 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合
  2. 该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性

技术图片

 

   然而上面这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,约需要1.2亿次的计算量,造成了特征图的厚度很大。
  3. 为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:

技术图片

13. 1*1 卷积的作用

  a.升维和降维,可以节省参数量;

  b.增加网络的非线性; 

  c.增加通道之间的交流和联系。 

14.简述 CNN 的发展历程

  1. LeNet:2个卷积3个全连接,最早用于数字识别
  2. AlexNet:12年ImageNet冠军,5个卷积3个全连接,多个小卷积代替单一大卷积;使用ReLU激活函数,解决梯度小数问题;引入dropout避免模型过拟合;最大池化。
  3. ZF-Net:13年ImageNet冠军,只用了一块 GPU 的稠密连接结构;将AlexNet第一层卷积核由11变成7,步长由4变为2。
  4. VGG-Nets:14年ImageNet分类第二名,更深的网络,卷积层使用更小的filter尺寸和间隔;多个小卷积让网络有更多的非线性,更少的参数。
  5. GoogLeNet:14年ImageNet分类第一名。引入Inception模块,采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;采用了average pooling来代替全连接层;避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。
  6. ResNet:引入残差单元,简化学习目标和难度,加快训练速度,模型加深时,不会产生退化问题;能够有效解决训练过程中梯度消失和梯度爆炸问题。
  7. DenseNet:密集连接;加强特征传播,鼓励特征复用,极大的减少了参数量。

15.讲一下CNN,每个层及作用

CNN的特征检测层通过训练数据进行学习

  1. 所以在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习
  2. 由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。
  3. 卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性。权值共享降低了网络的复杂性,特别是***输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度

卷积神经网络(CNN)主要由卷积层、激活函数、池化层、全连接层组成。

  1. 卷积层(Conv):使用卷积核进行特征提取和特征映射
  2. 激活函数(Activation):由于卷积也是一种线性运算,因此需要增加非线性映射
  3. 池化层(Pool):对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征
  4. 全连接层(FC):连接所有的特征,将输出值送给分类器

16. Pooling层怎么反向传播

  CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化(步长也为2),假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的

mean pooling

  mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,图示如下 :4

技术图片

 

max pooling

  max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :

 技术图片

17. Mobilenet V1、V2、V3

  Molilenet V1:介绍MobileNetV1(以下简称V1)只有一句话, V1就是把VGG中的标准卷积层换成深度可分离卷积就可以了。 

  深度可分离卷积 = 深度卷积 + 逐点卷积(1*1 卷积)

  Depthwise +Pointwise 卷积是提供一种把 feature map 的空间信息(height&width)和通道信息(channel)拆分分别处理的方法,而 group 卷积只是单纯的通道分组处理,降低复杂度。
  Standard convolution :是采用 N 个大小为 DK*DK 的卷积核进行操作(注意卷积核大小是 DK*DK, DK*DK*M 是具体运算时一个卷积核的大小!)
  Depth-wise convolution :一个卷积核负责一个通道,一个通道只被一个卷积核卷积;则这里有 M 个 DK*DK 的卷积核;
  Pointwise convolution:为了达到输出 N 个 feature map 的操作,所以采用 N 个 1*1的卷积核进行卷积,这里的卷积方式和传统的卷积方式是一样的,只不过采用了 1*1 的卷积核;其目的就是让新的每一个 feature map 包含有上一层各个 feature map 的信息!在此理解为将 depth-wise convolution 的输出进行「串」起来。
深度可分离卷积节省的参数量和计算量(注: 这里首先需要理解本文上面的计算量和参数量计算公式)

技术图片

  其中, DK 为标准卷积核大小,M 是输入 feature map 通道数,DF 为输出 feature map 大小,N 是输出 feature map 通道数,深度卷积的卷积核尺寸Dk×Dk×M,一共要做Dw×Dh次乘加运算;逐点卷积的卷积核尺寸为1×1×M,有N个,一共要做Dw×Dh次乘加运算。

  实例: 

  假设输出为一个224×224×3的图像,VGG网络某层卷积输入的尺寸是112×112×64的特征图,卷积核为3×3×128,标准卷积的运算量是:

  3×3×128×64×112×112 = 924844032

  深度可分离卷积的运算量是:

  3×3×64×112×112+128×64×112×112 = 109985792

  这一层,MobileNetV1所采用的深度可分离卷积计算量与标准卷积计算量的比值为:

  109985792 /924844032 = 0.1189  ,与我们所计算的九分之一到八分之一一致。

Mobilenet V2:

  提出原因:V1中的深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的, 对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少:

  解决方法: 引入的具有线性瓶颈的倒残差结构(the inverted residual with linear bottleneck);

MobileNet V2 & Resnet 

技术图片

可以发现,都采用了 1×1 -> 3 ×3 -> 1 × 1 的模式,以及都使用Shortcut结构。但是不同点呢:

  • ResNet 先降维 (0.25倍)、卷积、再升维。
  • MobileNetV2 则是 先升维 (6倍)、卷积、再降维。

刚好V2的block刚好与Resnet的block相反,作者将其命名为Inverted residuals。就是论文名中的Inverted residuals

 

MobileNet V3:

 

  • 0.网络的架构基于NAS实现的MnasNet(效果比MobileNetV2好)
  • 1.引入MobileNetV1的深度可分离卷积
  • 2.引入MobileNetV2的具有线性瓶颈的倒残差结构
  • 3.引入基于squeeze and excitation结构的轻量级注意力模型(SE)
  • 4.使用了一种新的激活函数h-swish(x)
  • 5.网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt
  • 6.修改了MobileNetV2网络端部最后阶段

18.为什么现在基本不用大卷积核

  在达到相同感受野的情况下,卷积核越小,所需要的参数和计算量越小。具体来说。卷积核大小必须大于 1 才有提升感受野的作用,1 排除了。而大小为偶数的卷积核即使对称地加 padding 也不能保证输入 feature map 尺寸和输出 feature map 尺寸不变(画个图算一下就可以发现),2 排除了。所以一般都用 3 作为卷积核大小。

20. 梯度消失与梯度爆炸

梯度消失:因为通常神经网络所用的激活函数是 sigmoid 函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到 0 和 1 之间,并且对这个函数求导的结果是 f′(x)=f(x)(1−f(x))。因此两个 0 到 1 之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于 1 的数而越来越小,最终就会变为 0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
梯度爆炸:梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。网络层之间的梯度(值大于 1.0)重复相乘导致的指数级增长会产生梯度爆炸。

解决方法

A. 预训练加微调; 

B. 梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸; 

C.另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是[Math Processing Error] l1l1正则,和[Math Processing Error] l2l2正则,在各个深度框架中都有相应的API可以使用正则化; 

D. relu、leakrelu、elu等激活函数; 

E. batchnormalization: 从根本上解决梯度消失和梯度爆炸问题。

21.减缓过拟合方法

a . 引入正则化

b. Dropout

c. 提前终止训练

d. 增加样本量

e. Batch norma| lization

f. Bagging和其他集成方法(正则化)

g. 辅助分类节点(正则化)

h. 参数绑定和参数共享

22.解决欠拟合方式

* 增加模型复杂度
* 调整模型初始化方式
* 调整学习率
* 集成多种模型

23. 梯度下降与拟牛顿法的异同?

* 参数更新模式相同
* 梯度下降法利用误差的梯度来更新参数,拟牛顿法利用海塞矩阵的近似来更新参数
* 梯度下降是泰勒级数的一阶展开,而拟牛顿法是泰勒级数的二阶展开
* SGD能保证收敛,但是L-BFGS在非凸时不收敛

24. CNN如何减少参数?

  CNN中减少网络的参数的三个思想:
  1) 局部连接(Local Connectivity)
  每个神经元没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。
  2) 权值共享(Shared Weights)
  对于同一个卷积核,它在一个区域提取到的特征,也能适用于于其他区域。在一个卷积核的情况下,进行权值共享。
  3) 池化(Pooling)
  池化一般分为max pooling和average pooling。定义池化窗口,最大池化为取窗口中最大的那个值,平均池化为取窗口中所有数的平均值。
  4)  1x1卷积核 inception
  1x1的卷积核可以进行降维或者升维,也就是通过控制卷积核(通道数)实现,这个可以帮助减少模型参数,也可以对不同特征进行尺寸的归一化;同时也可以用于不同channel上特征的融合。一个trick就是在降维的时候考虑结合传统的降维方式,如PCA的特征向量实现,这样效果也可以得到保证。

25. Dropout 在训练阶段与测试阶段的异同

  Dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

  在测试阶段,将参与学习的节点和那些被隐藏的节点以一定的概率p加权求和,综合计算得到网络的输出。

26. NN的权重参数能否初始化为0?

  在神经网络中,如果将权值初始化为 0 ,或者其他统一的常量,会导致后面的激活单元具有相同的值,所有的单元相同意味着它们都在计算同一特征,网络变得跟只有一个隐含层节点一样,这使得神经网络失去了学习不同特征的能力!

27. relu的有优点?又有什么局限性?他们的系列改进方法是啥?

* 部分解决了梯度消失问题
* 收敛速度更快
* 在小于0部分相当于神经元死亡而且不会复活
* Leaky ReLU解决了神经元死亡问题

28. dropout为何能防止过拟合?

* 相当于同时训练了多个网络,类似集成学习的效果
* 削弱了神经元之间的依赖性
 
持续添加更新中!!!

 

以上是关于CNN面试必知的主要内容,如果未能解决你的问题,请参考以下文章

sql面试应急必知

Python工程师求职必知的经典面试题!

Python工程师求职必知的经典面试题分享

新手小白必知的5道Web前端经典面试题

产品新人面试必知的3招

Java架构面试必知必会的微服务面试题解析