深度学习面试准备

 

1.反卷积(deconv)与转置卷积(transposed conv)是同一种卷积形式,对图像的上采样,卷积的逆过程

规范表达:

DL中的deconv,是一种上采样过程;卷积的输入input  通过卷积得到输出output, 而从output到input就是反卷积。反卷积等于将将卷积的卷积核水平翻转再垂直翻转得到的卷积核作用于卷积的操作的ouput上,得到卷积操作的input。

2.L1 与L2 损失,以及其正则化

L0损失定义为:向量中非零元素的个数,常常用于压缩感知,压缩传感计划试图找到欠定线性系统(under-determinedlinear system)最稀疏的解(sparsest solution)。最稀疏的解意味着解有最少的非零元素。

L1 损失:

L2损失(欧几里得范数):

作为损失函数: 用 L2 一定只有一条最好的预测线,L1 则因为其性质可能存在多个最优解;L1鲁棒性 (Robust) 更强,对异常值更不敏感

作为正则项:

 L1 最重要的一个特点,输出稀疏,会把不重要的特征直接置零,而 L2 则不会;L1一个天然的特征选择器;L2 有唯一解,而 L1 不是

为什么输出稀疏特征??

3.常用模型压缩方法

模型压缩的方法:对模型预测精度无明显影响,压缩模型的参数数量,深度来降低模型空间的复杂度,不显著提高训练时间复杂度,降低预测时间的复杂度。

(1)更精细的模型设计

  • 将3x3卷积核替换为1x1卷积核(1个1x1卷积核的参数是3x3卷积核参数的1/9,这一改动理论上可以将模型尺寸压缩9倍)。
  • 减小输入到3x3卷积核的输入通道数
  • 尽可能的将降采样放在网络后面的层中
  • 借鉴ResNet思想,对原始网络结构做了修改,增加了旁路分支,将分类精度提升了约3%。
  • 借鉴mobileNet的思想(借鉴factorized convolution的思想),将普通卷积操作分成两部分:深度卷积(每个卷积核滤波器只针对特定的输入通道进行卷积操作)和逐点卷积(采用1x1大小的卷积核将depthwise convolution层的多通道输出进行结合)
  • shuffleNet :基于MobileNet的group思想,将卷积操作限制到特定的输入通道。而与之不同的是,ShuffleNet将输入的group进行打散,从而保证每个卷积核的感受野能够分散到不同group的输入中,增加了模型的学习能力。

(2)模型的裁剪(剪枝)

挑选出模型中不重要的参数将其剔除而不会对模型的效果造成太大的影响。在剔除不重要的参数之后,通过一个retrain的过程来恢复模型的性能。如何找到一个有效的对参数重要性的评价手段基于模型裁剪的方法是最为简单有效的模型压缩方式

a)单个权重剪枝(非结构化):定义:任意权重被看作是单个参数并进行随机非结构化剪枝。

b)核内权重剪枝(核稀疏化)(结构化):对权重的更新加以正则项进行限制,使其更加稀疏,使大部分的权值都为0。

c)卷积核/特征图/通道剪枝(结构化):减去第i层的filter,进而减去第i层产生的部分特征图和第i+1层的部分kernel。

d)中间隐层剪枝:删除一些层,即改变网络结构

(3)网络分解(zhang laing)(张量分解)

方法:a)将三维张量铺展成二维张量,使用标准SVD;b)使用多个一维张量外积求和逼近

通常基于张量的低秩近似理论和方法,将原始的权重张量分解为两个或者多个张量,并对分解张量进行优化调整;

优缺点:

低秩方法很适合模型压缩和加速。

低秩方法的实现并不容易,因为它涉及计算成本高昂的分解操作

目前的方法逐层执行低秩近似,无法执行非常重要的全局参数压缩,因为不同的层具备不同的信息

分解需要大量的重新训练来达到收敛

(4)权值共享

1)结构化矩阵:如果一个 m x n 阶矩阵只需要少于 m×n 个参数来描述,就是一个结构化矩阵。通常这样的结构不仅能减少内存消耗,还能通过快速的矩阵-向量乘法梯度计算显著加快推理和训练的速度

2)哈希:将参数映射到相应的哈希桶内,在同一个哈希桶内的参数则共享同一值

(5)权重量化

思想:通过减少表示每个权重所需的比特数来压缩原始网络。

(6)迁移学习/网络精馏

迁移学习:将一个模型的性能迁移到另一个模型上

网络精馏:在同一个域上迁移学习的一种特例

(7)计算加速

(8)对数据进行转换

4.softmax 的公式以及反向传递

自己手推

5.mobileNet :深度可分离卷积,shuffleNet

MobileNets:

移动和嵌入式设备提出的高效模型,MobileNets基于流线型架构(streamlined),使用深度可分离卷积(depthwise separable convolutions,即Xception变体结构)来构建轻量级深度神经网络

MobileNet描述了一个高效的网络架构,允许通过两个超参数直接构建非常小、低延迟易满足嵌入式设备要求的模型

现阶段在建立小型高效的神经网络工作:

(1)压缩预训练模型。获得小型网络的一个办法是减小、分解或压缩预训练网络,例如量化压缩(product quantization)、哈希(hashing )、剪枝(pruning)、矢量编码( vector quantization)和霍夫曼编码(Huffman coding)等;此外还有各种分解因子(various factorizations )用来加速预训练网络一种训练小型网络的方法叫蒸馏(distillation ),使用大型网络指导小型网络;

(2)直接训练小模型:Flattened networks利用完全的因式分解的卷积网络构建模型,显示出完全分解网络的潜力;Factorized Networks引入了类似的分解卷积以及拓扑连接的使用。

Depthwise Separable Convolution

MobileNet是基于深度可分离卷积的, 深度可分离卷积干的活是:把标准卷积分解成深度卷积(depthwise convolution)和逐点卷积(pointwise convolution)。这么做的好处是可以大幅度降低参数量和计算量;这么做的好处是可以大幅度降低参数量和计算量;

https://blog.csdn.net/u011974639/article/details/79199306:深度卷积和逐点卷积的推导;深度卷积负责滤波作用, 逐点卷积负责转换通道;如果是需要下采样,则在第一个深度卷积上取步长为2.;MobileNet模型几乎将所有的密集运算放到1×1 卷积上,这可以使用general matrix multiply (GEMM) functions优化。在MobileNet中有95%的时间花费在1×1 1×11×1卷积上,这部分也占了75%的参数:剩余的其他参数几乎都在FC层上了。

论文提出了一种基于深度可分离卷积的新模型MobileNet,同时提出了两个超参数用于快速调节模型适配到特定环境。实验部分将MobileNet与许多先进模型做对比,展现出MobileNet的在尺寸、计算量、速度上的优越性。宽度因子α \alphaα(Width multiplier )
 分辨率因子ρ \rhoρ(resolution multiplier ).


shuffleNet:https://blog.csdn.net/u014380165/article/details/75137111

https://blog.csdn.net/u011974639/article/details/79200559

一个效率极高的CNN架构ShuffleNet,专门应用于计算力受限的移动设备。新的架构利用两个操作:逐点群卷积(pointwise group convolution)和通道混洗(channel shuffle);该文章主要采用channel shuffle、pointwise group convolutions和depthwise separable convolution来修改原来的ResNet单元,接下来依次讲解。

ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。channel shuffle解决了多个group convolution叠加出现的边界效应,pointwise group convolution和depthwise separable convolution主要减少了计算量。

6.python 的多进程与多线程(进程和现成的区别)

进程:是系统进行资源分配和运行调用的独立单位。可以简单地理解为操作系统中正在执行的程序,每个应用程序都有一个自己的进程

每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程

线程:线程是一个基本的 CPU 执行单元。它必须依托于进程存活。一个线程是一个execution context(执行上下文),即一个 CPU 执行时所需要的一串指令;

进程和线程的区别:

  • 线程必须在某个进行中执行。
  • 一个进程可包含多个线程,其中有且只有一个主线程。
  • 多线程共享同个地址空间、打开的文件以及其他资源。
  • 多进程共享物理内存、磁盘、打印机以及其他资源。

线程主要可以划分为:主线程,子线程,后台线程(守护线程),前台线程

Python的多线程:其他语言,CPU 是多核时是支持多个线程同时执行。但在 Python 中,无论是单核还是多核,同时只能由一个线程在执行。其根源是 GIL 的存在

GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 Python 设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且在一个 Python 进程中,GIL 只有一个。拿不到通行证的线程,就不允许进入 CPU 执行。

GIL 只在 CPython 中才有,而在 PyPy 和 Jython 中是没有 GIL 的。每次释放 GIL锁,线程进行锁竞争切换线程,会消耗资源。这就导致打印线程执行时长,会发现耗时更长的原因。

Python提供两个模块进行多线程的操作,分别是threadthreading前者是比较低级的模块,用于更底层的操作,一般应用级别的开发不常用。

Python 要进行多进程操作,需要用到muiltprocessing,其中的Process类跟threading模块的Thread类很相似。所以直接看代码熟悉多进程。进程之间不共享数据的。如果进程之间需要进行通信,则要用到Queue模块或者Pipi模块来实现。

  • CPU 密集型:程序比较偏重于计算,需要经常使用 CPU 来运算。例如科学计算的程序,机器学习的程序等。

  • I/O 密集型:顾名思义就是程序需要频繁进行输入输出操作。爬虫程序就是典型的 I/O 密集型程序。

如果程序是属于 CPU 密集型,建议使用多进程。而多线程就更适合应用于 I/O 密集型程序。

7.手写Resnet的跳转连接(pytorch),以类的形式封装好,后续别的网络模块可直接调用

已手写

8.CNN梯度的反向传播

推荐:https://blog.csdn.net/haolexiao/article/details/72628083

9.怎么选择卷积核的大小,以及怎么选择全连接层神经元的个数

怎么选择卷积核的大小:https://www.zhihu.com/question/38098038

怎么选择全联接层神经元的个数:

10. BN的反向传递,BN为什么会加入缩放量和偏移量

已经手推

BN层的主要功能总结为两点:

1)归一化scale

没有BN层时若LR设置较大,在配合ReLU激活函数时,容易出现Dead ReLU问题

2)数据初始化集中,缓解overfitting(这里还理解得不是很透彻)

Overfitting主要发生在一些较远的便捷点,BN操作可以使初始化数据在数据内部。

通常提到BN层,我们会想到,若使用sigmoid激活函数时,它可以将数据归一化到梯度较大的区域,便于梯度更新。
在BN中的gamma对于ReLU的影响很小,因为数值的收缩,不会影响是否大于0。但是如果没有偏移量beta,就会出现数据分布在以0为中心的位置,强行将一半的神经元输出置零。因此偏移量beta是必不可少的。

引入gamma和beta两个参数是为了避免数据只用sigmoid的线性部分如果不使用gamma和beta,激活值基本上会在[0.1 0.9]这个近似线性的区域中;这与深度神经网络所要求的“多层非线性函数逼近任意函数”的要求不符,所以引入gamma和beta还是有必要的,深度网络会自动决定使用哪一段函数。

BN的算法优势:

(1) 可以使用更高的学习率。如果每层的scale不一致实际上每层需要的学习率是不一样的,同一层不同维度的scale往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降Batch Normalization将每层、每维的scale保持一致,那么我们就可以直接使用较高的学习率进行优化。

(2) 移除或使用较低的dropout。 dropout是常用的防止overfitting的方法,而导致overfit的位置往往在数据边界处如果初始化权重就已经落在数据内部,overfit现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的40%-50%相比,可以大大提高训练速度。

(3) 降低L2权重衰减系数(减少对L1和L2正则化的依赖)。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用L2衰减可以缓解这一问题,现在用了Batch Normalization,就可以把这个值降低了,论文中降低为原来的5倍。

(4) 取消Local Response Normalization层。 由于使用了一种Normalization,再使用LRN就显得没那么必要了。而且LRN实际上也没那么work。

(5) 减少图像扭曲的使用。 由于现在训练epoch数降低,所以要对输入数据少做一些扭曲,让神经网络多看看真实的数据。

还包括对BN的求导

推荐:https://blog.csdn.net/wfei101/article/details/79997708

11. inception, squeezeNet网络结构

inception:https://blog.csdn.net/u010402786/article/details/52433324/

神经网络更深(层数),更宽(神经元个数)的缺点:

1.参数太多,容易过拟合,若训练数据集有限;

2.网络越大计算复杂度越大,难以应用;

3.网络越深,梯度越往后穿越容易消失(梯度弥散),难以优化模型

为了解决这样的问题当然是增加网络深度和宽度的同时,减少参数量

inception v1:

在3x3前,5x5前,max pooling后分别加上了1x1的卷积核起到了降低特征图厚度的作用,减少计算量。

inception V2:

加入了BN层,减少了Internal Covariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯;

另外一方面学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算 。

inception v3:

v3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。

使用3×3的已经很小了,那么更小的2×2呢?2×2虽然能使得参数进一步降低,但是不如另一种方式更加有效,那就是Asymmetric方式,即使用1×3和3×1两种来代替3×3的卷积核。这种结构在前几层效果不太好,但对特征图大小为12~20的中间层效果明显。 

inception v4:

v4研究了Inception模块结合Residual Connection能不能有改进?发现ResNet的结构可以极大地加速训练,同时性能也有提升,得到一个Inception-ResNet v2网络,同时还设计了一个更深更优化的Inception v4模型,能达到与Inception-ResNet v2相媲美的性能。 
 

Squeeze and Excitation Net(SENet):https://blog.csdn.net/wangkun1340378/article/details/79092001

Squeeze(挤压) 和 Excitation(激励) 是两个非常关键的操作;希望显式地建模特征通道之间相互依赖关系;我们并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性

最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定

12.可变形卷积网络--Deformable Convolutional Networks

参考博客:https://blog.csdn.net/zhangjunhit/article/details/67638559

本文可以看做是对 Spatial Transformer Networks 工作的深入,通过 deformable convolution deformable RoI pooling提升当前CNN网络的空间信息建模能力。Spatial Transformer Networks建立的是 global、sparse transformation本文的Deformable Convolutional Networks建立的是 local and dense transformation。

上图显示可变形卷积可以提高模型对 scale, aspect ratio and rotation 等映射的泛化能力。这个偏移量是可以通过学习得到并不需要额外的监督。因为是对网络内部结构进行了改进。因此新的module可以应用在很多vision tasks上,本文拿segmentation和detection进行举例。

卷积该具体怎么deformable,这个可以通过一个卷积层来学习;对于输入的一张feature map,假设原来的卷积操作是3*3的,那么为了学习offset,我们定义另外一个3*3的卷积层,输出的offset field其实就是原来feature map大小,channel数等于2*3*3=18(分别表示后面feature map上某点对应前一张feature map上9个采样点的x,y方向的偏移)。这样的话,有了输入的feature map,有了和feature map一样大小的offset field,我们就可以进行deformable卷积运算。所有的参数都可以通过反向传播学习得到。

deformable RoI pooling这个 offsets 通过一个全链接层学习 ;offset通常不是整数,因此我们需要用双线性插值的方法确定偏移之后的采样点的值;假设对于一个ROI,需要pooling成spatial size为3*3大小。为了获得3*3个bin对应的offset,首先正常roi pooling一下,然后接上一个全连接层学习这9个offset,然后再reshape。所有的参数也是可以学习得到的。

比较同类方法:可以用几何变换增强数据集,或者设计一些transformation invariant的描述子这些方法都是建立在我们已经知道数据集里面存在哪些几何变换的基础上,对于未知的变换无法适应

为什么提出可变形卷积网络?

同一层的激活单元的感受野是一样大的,这对于目标检测来说就是不太合理的,因为不同位置对应的目标大小是不一样的。如果能够使得感受野在不同位置的大小进行自适应调整,那么对于目标检测语义分割等等任务的帮助必然很大。

13.常用的数据增强方法有哪些?

为什么要进行数据增强

比较成功的神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,而实际情况中数据并没有我们想象中的那么多

数据增强的作用:

  1. 增加训练的数据量提高模型的泛化能力
  2. 增加噪声数据提升模型的鲁棒性

数据增强的分类:

数据增强可以分为两类,一类是离线增强,一类是在线增强

离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch 的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

常用的数据增强技术:

1)翻转 2)旋转 3)缩放 4)裁剪 5)平移

6)添加噪声:过拟合通常发生在神经网络学习高频特征的时候 (因为低频特征神经网络很容易就可以学到,而高频特征只有在最后的时候才可以学到) 而这些特征对于神经网络所做的任务可能没有帮助,而且会对低频特征产生影响,为了消除高频特征我们随机加入噪声数据来消除这些特征。

7)color jittering

7)gan生成图像进行数据增强

8)纹理贴图,自造假数据

推荐博客:https://blog.csdn.net/zhelong3205/article/details/81810743

14. 常见的激活函数有哪些,以及它们的特点,及相应的导数

为什么要使用激活函数:

如果不用激励函数,每一层输出都是上层输入的线性函数无论神经网络有多少层输出都是输入的线性组合(感知机就是这样的)
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数这样神经网络就可以应用到众多的非线性模型中。

(1)sigmoid

特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数(由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况。)

缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。产生的一个结果就是:

那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新要么都往负方向更新导致有一种捆绑的效果使得收敛缓慢。 如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。

缺点3:解析式中含有幂运算,计算机求解时相对来讲比较耗时对于规模比较大的深度网络,这会较大地增加训练时间

(2)tanh 函数

它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

(3)Relu函数

ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient;ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:

1) 解决了gradient vanishing问题 (在正区间)   2)计算速度非常快,只需要判断输入是否大于0   3)收敛速度远快于sigmoid和tanh

单侧抑制;相对广阔的兴奋边界;稀疏激活(只对部分信号进行响应,提高学习精度,更好地提取稀疏特性);x<0 硬饱和,大于0不饱和,保持梯度不变,从而缓解梯度消息问题;

ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

(4)Leaky Relu (PRelu)函数

人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx而非0,通常α=0.01 。另外一种直观的想法是基于参数的方法
理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

(5)ELU ((Exponential Linear Units))函数

它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

(6)MaxOut函数

如何选择神经元激活函数:

凭经验:

1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

推荐博客https://blog.csdn.net/u011584941/article/details/71534828

https://blog.csdn.net/tyhj_sf/article/details/79932893

15.mobielNetV2 与V1的对比

为什么MobileNetV2会先扩张在压缩呢?

因为MobileNet 网络结构的核心就是Depth-wise此卷积方式可以减少计算量和参数量。而为了引入shortcut结构,若参照Resnet中先压缩特征图的方式将使输入给Depth-wise的特征图大小太小,接下来可提取的特征信息少所以在MobileNet V2中采用先扩张后压缩的策略。

为什么在1*1的压缩卷积后会连接线性激活函数?

因为在激活函数之前,已经使用1*1卷积对特征图进行了压缩而ReLu激活函数对于负的输入值,输出为0,会进一步造成信息的损失,所以使用Linear激活函数。
推荐博客:https://blog.csdn.net/gbyy42299/article/details/82690105

https://blog.csdn.net/attitude_yu/article/details/82969184

16.传统的hand-crafted特征(SIFT、ORB等)与基于学习的ConvNet特征的对比以及使用场景

???

17.了解RNN和LSTM的基本特点和网络结构,它们之间的区别?LSTM与GRU的原理与区别

已手写

18.各种优化器的特点

梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent)。

(1)标准SD(梯度下降的算法)

假设要学习训练的模型参数为W,代价函数为J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W),学习率为ηt,则使用梯度下降法更新参数为:

其中,Wt表示t时刻的模型参数。

基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步参考当前位置最陡的方向(即梯度)进而迈出下一步。

标准梯度下降法主要有两个缺点:

训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解
容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点落入鞍点,梯度为0,使得模型参数不在继续更新。


(2)批量梯度下降(BGD)

(3)SGD 随机梯度下降

参考自己的笔记

优点:
虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
缺点
SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
此外,SGD也没能单独克服局部最优解的问题。

(4)动量梯度下降

动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。

Momentum

  • 使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。
  • 动量主要解决SGD的两个问题一是随机梯度的方法(引入的噪声)二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)
    理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。

牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种。

理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算Wt−αvt−1Wt−αvt−1可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。
在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从O(1/k)(k步后)改进到O(1/k平方)。然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。
 

(5)自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。

目前的自适应学习率优化算法主要有:AdaGrad算法RMSProp算法Adam算法以及AdaDelta算法。 

推荐博客:https://blog.csdn.net/weixin_40170902/article/details/80092628

20.resnet 的特点,为什么要这么设计?

残差网络单元其中可以分解成右图的形式,从图中可以看出,残差网络其实是由多种路径组合的一个网络,直白了说,残差网络其实是很多并行子网络的组合,整个残差网络其实相当于一个多人投票系统(Ensembling)。

如果把残差网络理解成一个Ensambling系统,那么网络的一部分就相当于少一些投票的人,如果只是删除一个基本的残差单元,对最后的分类结果应该影响很小;而最后的分类错误率应该适合删除的残差单元的个数成正比的,论文里的结论也印证了这个猜测。 

其实ResNet是由大多数中度网络和一小部分浅度网络和深度网络组成的,说明虽然表面上ResNet网络很深,但是其实起实际作用的网络层数并没有很深;大多数的梯度其实都集中在中间的路径上论文里称为effective path。 从这可以看出其实ResNet只是表面上看起来很深,事实上网络却很浅。 所示ResNet真的解决了深度网络的梯度消失的问题了吗?似乎没有,ResNet其实就是一个多人投票系统。

 

 

 

 

由于上下组的卷积层通道数不同(类似于VGG网络通道数的特点),使得短路连接不能直接相加,故需要在后四组连接上一组的第一个卷积层的短路连接通路添加投影卷积

由于ResNet的结构有别于传统的卷积结构,使得信号的前向传播和梯度的反向传播变得更复杂。为了稳定训练时信号的前向传播和梯度的反向传播,从ResNet开始,网络普遍使用Batch Normalization

resnetxt:

出自论文“Aggregated Residual Transformations for Deep Neural Networks”,主要是将残差块的中间的3x3卷积层变成group卷积,同时扩大了3x3卷积的输入输出通道数,使得在与对应的ResNet网络的计算量和参数个数相近的同时提高网络的性能。值得一提的是,ResNeXt与常用的ResNet对应的层数完全相同,都是50、101、152层。ResNeXt已经被很多网络用来当作backbone,例如Mask RCNN中除了使用ResNet,也尝试使用了ResNeXt-101和ResNeXt-152。
 

21.过拟合的处理方法?BN为什么可以防止过拟合?

BN防止过拟合的原因:在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。

22. python hash 存储的内部实现原理; python map reduce函数的作用?

哈希表的定义:哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址并将数据元素存入到相应地址的存储单元中。

查找时再根据要查找的关键字采用同样的函数计算出哈希地址,然后直接到相应的存储单元中去取要找的数据元素即可。

哈希表(hash table)实现字典操作的一种有效的数据结构。

尽管最坏的情况下,散列表中查找一个元素的时间与链表中查找的时间相同,达到了O(n)。在一些合理的假设下,在散列表中查找一个元素的平均时间是O(1)。

建立hash建立的过程

1) step1 取数据元素的关键字key,计算其哈希函数值(地址)。若该地址对应的存储空间还没有被占用,则将该元素存入;否则执行step2解决冲突。  

2) step2 根据选择的冲突处理方法,计算关键字key的下一个存储地址。若下一个存储地址仍被占用,则继续执行step2,直到找到能用的存储地址为止。

构造哈希函数的方法有很多,总的原则是尽可能将关键字集合空间均匀的映射到地址集合空间中,同时尽可能降低冲突发生的概率

常用的hash函数:

影响哈希查找效率的一个重要因素是哈希函数本身。当两个不同的数据元素的哈希值相同时,就会发生冲突。为减少发生冲突的可能性,哈希函数应该将数据尽可能分散地映射到哈希表的每一个表项中。

(1)开放地址法

如果两个数据元素的哈希值相同,则在哈希表中为后插入的数据元素另外选择一个表项。

当程序查找哈希表时,如果没有在第一个对应的哈希表项中找到符合查找要求的数据元素,程序就会继续往后查找,直到找到一个符合查找要求的数据元素,或者遇到一个空的表项。 

python中的hash(dict)采用的是开放地址法的双哈希函数探测法

(2)链地址法

将哈希值相同的数据元素存放在一个链表中,在查找哈希表的过程中,当查找到这个链表时,必须采用线性查找方法。

推荐:https://www.cnblogs.com/5poi/p/7273743.html

python filter map reduce函数的作用:

(1)filter:功能:filter主要作用是过滤掉序列中不符合函数条件的元素,当序列中要删、减元素时,可以使用filter函数。

格式:fliter(function,sequence)

function可以是匿名函数或者自定义函数,它可以对后面的sequence序列的每个元素判定是否符合条件,返回True或者False,从而留下True的元素;sequence可以是列表、元组或者字符串。

注意:迭代器需要进行列表转换

(2)map:功能:map主要作用是求一个序列或者多个序列进行函数映射之后的值。

格式:map(function,iterable1,iterable2)

function中参数值可以是一个,也可以是多个;后面的iterable代表function运算中的参数值,有几个参数值就传入几个iterable。

注意:1.迭代器需要进行列表转换   2.map中如果传入的序列长度不一,会依据最短的序列计算

(3)reduce:功能:reduce是对一个序列进行压缩运算,得到一个值。

格式:reduce(function,iterable)

function中必须传入两个参数,iterable可以是列表或者元组。

注意:reduce使用前需要导包 from functools import reduce,map和filter是内置函数,所以可以直接调用.

23.反卷积如何实现?

在信号处理上,反转180度称作卷积,直接滑动计算称作自相关,在大部分深度学习框架上都没有反转180度的操作,而是直接滑动计算卷积。

目前使用得最多的deconvolution有2种
方法1:full卷积, 完整的卷积可以使得原来的定义域变大
方法2:记录pooling index,然后扩大空间,再用卷积填充

推荐博客:https://blog.csdn.net/Fate_fjh/article/details/52882134

https://blog.csdn.net/itchosen/article/details/77231207

24.DL数据不平衡怎么解决的?

处理不平衡的方法总的来说可以分为两大类:1. 数据增强,2.损失函数权值均衡

一、数据集方法:1.数据增强,2.过采样和欠采样, 3. 人工数据合成

二、损失函数的权值均衡:1.不同类别的loss 权值不一样,最佳参数需要手动调节  2.focal loss

推荐:https://blog.csdn.net/meccaendless/article/details/87092254

25.softmax 层有什么缺点?triplet loss的形式,特点原理?

softmax为什么要用指数作用与神经元的输出(指数函数是一种max的行为可以让大的输出更大)

softmax 主要用于多分类,而sigmoid主要用于二分类;softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布

多个logistic回归通过叠加也同样可以实现多分类的效果但是 softmax回归进行的多分类类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

总结:

Softmax训练的深度特征,会把整个超空间或者超球,按照分类个数进行划分,保证类别是可分的,这一点对多分类任务如MNIST和ImageNet非常合适,因为测试类别必定在训练类别中。

但Softmax并不要求类内紧凑和类间分离,这一点非常不适合人脸识别任务,因为训练集的1W人数,相对测试集整个世界70亿人类来说,非常微不足道,而我们不可能拿到所有人的训练样本,更过分的是,一般我们还要求训练集和测试集不重叠。

所以需要改造Softmax,除了保证可分性外,还要做到特征向量类内尽可能紧凑,类间尽可能分离
推荐:

https://blog.csdn.net/xiaosongshine/article/details/88826715

triplet loss:

推荐:https://blog.csdn.net/u013082989/article/details/83537370

https://blog.csdn.net/tangwei2014/article/details/46788025

26.CNN的原理?把feature map 映射为矩阵?

卷积和反卷积的作用:卷积与反卷积操作使得神经网络可以处理二维以上的数据。它最大的好处在于:1.保持了数据在空间上的位置信息;2.权重共享使得计算复杂度大大降低。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章