深度学习面试题常见问答

目录

有哪些方法可以避免过拟合?

造成过拟合的原因:

解决办法:

dropout在训练时和推理时的区别是什么?

L1和L2正则化的区别?为什么L1比L2更稀疏?

Batch Size大小如何影响收敛速度?

BN的原理,与白化的联系

损失/代价函数有哪些,分别有什么特点?

反向传播算法

分类问题的评价标准?

回归问题的评价标准?

优化算法SGD、Momentum、Nesterov Momentum(也称作NAG Nesterov Acceleration Gradient)、Adagrad、RMSprop、Adam区别与联系

梯度消失和爆炸的原因以及解决办法

参数初始化的方法和作用?

Inception各版本的改进

1x1卷积有什么用

RCNN,FAST-RCNN,FASTER-RCNN的区别和进步,faster-rcnn和SSD以及YOLO之间的区别和联系

综述: https://zhuanlan.zhihu.com/p/36088972 

RCNN

FAST-RCNN:

Faster-RCNN:

Mask-RCNN:

YOLO:

YOLO V2:https://zhuanlan.zhihu.com/p/25167153

YOLO3

SSD

 

 增大感受野的方法?

转置卷积(transposed Convolutions)怎么做?

深度可分离卷积(depthwise separable convolution)?

Residual机制(残差网络)有什么优势?

Transfer-learning与Fine-tuning

GAN算法的机制?

CGAN, CYCLEGAN, WGAN分别有什么优点或改进?

引起GAN collapse mode的原因是什么?

GAN可以处理哪些问题(应用场景)?如何处理?

Focal Loss for Dense Object Detection有什么用?

人脸识别算法softmax是如何改进的?

attention机制为什么比RNN好?

attention和self-attention的区别?

encoder-decoder训练时和预测时有什么区别?


  • 有哪些方法可以避免过拟合?

造成过拟合的原因:

  1. 数据规模太小
  2. 数据有很多噪声
  3. 假设过于复杂,导致模型过于复杂,而数据分布并不那么复杂

解决办法:

  1. early stopping:观察loss或者accuracy或error曲线,在正常训练的情况下train error会一直减小,但过拟合时val error会开始增大。早停最简单的做法是,训练过程中记录当前最好的验证集精度,并保存模型,当连续10次epoch(或更多)没有达到最佳验证集精度时则停止训练
  2. 扩增数据集:1)从数据源头采集更多数据;2)复制原有数据并加上随机噪声或转换(如翻转、15度旋转,对语音数据可以加速或减速);3)重采样;4)根据当前数据集攻击数据分布参数,使用该分布产生更多的数据
  3. 控制模型参数大小(正则化:L1, L2):对模型的代价函数加上正则项,L1是加一个权重的绝对值,L2是加一个权重的平方,严格来说,early stopping也是正则化的一种
  4. dropout(某种程度上相当于减少参数的数量)
  5. Batch Normalization:将一个batch的数据缩成期望=0,方差=1的形式
  • dropout在训练时和推理时的区别是什么?

假设有100个神经元,dropout=0.5

训练时:每一个batch训练中只有50个神经元参与,一个batch更新这50个神经元的参数之后,再恢复所有的神经元,下一个batch训练再从这100个神经元中选50个神经元参与训练

推理时:使用100个神经元,但是参数w要乘0.5。

  • L1和L2正则化的区别?为什么L1比L2更稀疏?

L1正则化:在优化损失函数的时候L1正则化会产生稀疏矩阵,导致一部分w为0,注意这也是L1正则化的核心思想。产生稀疏矩阵之后,一部分w为0,一部分不为0,这样即可对特征进行选择。选择比较重要、明显的特征作为分类和预测的依据,抛弃那些不重要的特征。

L2正则化:L2正则项的求导在超参数都为正的情况下就是个正数,所以在梯度更新的过程中会减去这个正数,相当于一个权值衰减的过程。最后会构造一个所有参数都比较小但比较平滑的模型,L2对大数的惩罚比小点的数多。

由于L1正则项求导时在w=0处有一个绝对值造成的突变,因此w=0处是一个极小值,所以在训练过程优化时,很容易优化到该极小值上,即w=0。

  • Batch Size大小如何影响收敛速度?

Batch Size 太小:极限取1时,相当于最原始的SGD,训练时会造成震荡,在很多epoch下不能收敛,因为太少的数据不能很好地代表所有数据的特性。

Batch Size太大:会造成显存或者内存不足,迭代次数减少的情况下也可能造成收敛变慢。

策略:对于小数据集的训练,可以直接使用所有的数据来当作一个batch;对于大数据集根据具体的数据数量可以参考128,256,512等,不可以使用过大的batch。

一定范围内增大batch size

  1. 提高了内存的利用率,大矩阵乘法的并行化效率提高
  2. 运行一次epoch所需要的迭代次数减少,相同数据量的数据处理速度加快。
  3.  Batch_size越大下降方向越准,引起的训练震荡越小。

batchsize已经取了很小了但是仍然出现内存不够的问题,主要有以下几种原因:

  1. 模型太过复杂,复杂的模型容易占用大量的内存。
  2. 使用nvida-smi命令来查看是否有其他占用内存的程序在运行。
  3. train和test的batchsize都要改成一致的。
  4. 图片太大,导致无法训练下去。

参考:https://blog.csdn.net/wangmengmeng99/article/details/82460437 

  • BN的原理,与白化的联系

白化(Whitening)做法:对数据的预处理,用于去除数据间的相关性(也可以理解为去除冗余性),生成的新数据集满足两个条件:一是特征相关性较低;二是特征具有相同的方差。在对数据做PCA处理(通过协方差矩阵求特征向量,然后将特征映射到特征向量上)后,再对每一维特征做一个标准差归一化处理,就叫做PCA白化。由于白化需要计算特征向量,计算量很大,而且白化不是处处可微,在深度学习中很少使用。

Batch Normalization做法:在一层网络的Wx+b后激活函数之前,每一维度数据减去自身均值,再除以自身标准差。初始的W是从标准高斯分布中采样得到的,而W中元素的数量远大于x,Wx+b每维的均值本身就接近0、方差接近1,所以在Wx+b后使用Batch Normalization能得到更稳定的结果)Wx+b的均值和方差是对整张map求得的,在batch_size * channel * height * width这么大的一层中,对总共batch_size*height*width个像素点统计得到一个均值和一个标准差,共得到channel组参数。

白化一般用于输入数据的预处理,而BN可以用于每一层网络,即逐层的归一化。

BN的优点

  1. 归一化了每层和每维度的scale,所以可以整体使用一个较高的学习率,而不必像以前那样迁就小scale的维度。现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。
  2. 归一化后使得更多的权重分界面落在了数据中,降低了overfit的可能性,因此一些防止overfit但会降低速度的方法,例如dropout和权重衰减(L2)就可以不使用或者降低其权重,BN具有提高网络泛化能力的特性。
  3. 替代局部响应归一化层(LRN层),不再需要LRN。

BN训练和推理(测试)时候的使用区别:训练时候的均值和标准差是当前batch的均值和标准差,推理的时候没有batch,用的是整个训练集的均值和标准差,所以BN在训练的过程中应该记下每个batch的均值和标准差,用于测试、推理阶段。

  • 损失/代价函数有哪些,分别有什么特点?

  • 平方代价函数(最小二乘法, Ordinary Least Squares ):即样本标签和模型输出值之间的距离。平方代价函数是非凸函数,容易陷入局部最优解;我们希望在神经网络的训练过程中,调参幅度和误差大小成正比,即误差越大,调参幅度应越大,从而使训练加快收敛,但是二次代价函数对应的是sigmoid激活函数,效果正好相反;二次代价函数对参数求偏导时会有激活函数导数项,该项值很小,会导致梯度更新幅度小。替代者交叉熵代价函数用于分类问题,平方代价函数可用于回归问题

       平方损失函数可以通过线性回归在假设样本服从高斯分布的情况下推导出来。

       最小二乘法是线性回归的一种,OLS将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离(Mean squared error, MSE

  • 交叉熵代价函数(log对数代价函数):

       交叉熵代价函数是逻辑回归问题中假设样本服从伯努利分布,然后求得满足该分布的似然函数,接着取对数求极值推导出来的。

  1. Logistic 回归——二分类任务——       C=-\frac{1}{n}\sum_{x}[ylog(a)+(1-y)log(1-a)]
  2. Softmax回归——多分类任务——       C=-\frac{1}{n}\sum_{x}ylog(a)

 

参考:作者:Arya鑫
链接:https://www.jianshu.com/p/93c209ddb9b3

  • 反向传播算法

https://zhuanlan.zhihu.com/p/39195266

  • 分类问题的评价标准?

TP(True Positive):预测为正类,分类正确。
FP(False Positive):预测为正类,分类错误。(实际为负类)
TN(True Negative):预测为负类,分类正确。
FN(False Negative):预测为负类,分类错误。(实际为正类)

所以True和False表示预测的正确与否,Positive和Negative表示预测的种类正负

TP+FN:实际正样本数。
TP+FP:预测结果为正样本的总数,包括预测正确的和错误的。
FP+TN:实际负样本数。
TN+FN:预测结果为负样本的总数,包括预测正确的和错误的。

准确率Accuracy = (TP+TN)/TP+FP+TN+FN = 所有样本中,预测正确的概率

精确率Precision = TP/(TP+FP) = 所有预测为正类样本中正类的概率    

召回率(查全率)Recall = TP/(TP+FN) = 所有正类样本中正类的概率          (对应人脸识别中的1-FRR)

Recall和用户体验相关,recall越高,用户体验越好。Precision和安全性相关,Precision越高,安全性越好。Recall和Precision互斥。

用调和平均值F1-measure来结合precision和recall两个值(默认precision和recall同样重要):

深度学习面试题常见问答_第1张图片P和R都高时,F1也高,即分类效果越好。

如果更看重precision可以给P增加权重(给R的分子上乘Belta):

P-R曲线:纵轴为精确率,横轴为召回率,基于平衡点(P=R)度量各个基分类器的优劣;整体上来说,PR曲线越凸向右上角越好,不过根据不同的工况,可能要求更高的P或者R。

 

TPR = TP/(TP+FN) = Recall  

FPR = FP/(FP+TN)

ROC曲线:纵轴为TPR,横轴为FPR,ROC曲线越靠近左上角,实验的准确性就越高

AUC:ROC曲线下的面积,面积越大,实验的准确性越高。

关于PR曲线和ROC曲线的区别参考:吴良超的学习笔记:ROC 曲线与 PR 曲线

总体来说就是ROC曲线不受正负类样本比例的影响,比较稳定;而PR曲线受正负类样本比例较大,且如果对Precision有要求,可用PR曲线。

目标检测任务指标mAP:(参考mmAP,mAP)

1. 首先需要设定阈值标准,目标检测的结果最后通过IoU来当作置信分数(confidence score),即预测框和真实框之间的交并比,设定正样本的阈值标准为0.5(实际上可以设定不同的阈值,每种阈值下分别求mAP,最后再平均求得mmAP),则IoU>0.5的都被认为是正确检测出来的,IoU<0.5的被认为是遗漏的。

检测出来的框记为DT,真实框记为GT,则DT都被认为是Positive的,IoU大的DT为True,IoU小的为False。

将DTs按照置信度从大到小排列。依次将每个DT与GT进行比较,如果DT与某个GT的IoU>0.5,则该DT被记作True Positive,该GT被认为检测成功,且将该GT从GTs中去除(由于DT是从大到小排列,所以对于同一个GT有多个IoU大于0.5的DT,只有IoU最大的DT被记作TP,GT被去除后,其他多余的检测框会进入后续分类,如果没有其他GT适合,将会被归类为FP);如果DT与每个GT的IoU都<0.5,则将该DT记作False Positive(包括与GT IoU大于0.5但不是最大的框)。当所有DT被遍历完后,GTs中没有被取走的GT被记作False Negative,即没有被检测出来框。

2. 算出TP, FP, FN之后就可以计算precision和recall了。随着阈值的减小,测试样本数量的增加,Recall和Precision的值都会发生变化,所以要用一个综合Recall和Precision的指标,即P-R曲线下的面积。不过AP不是单纯地求曲线下面积。

AP is defined as the average detection precision under different recalls。绘制出precision-recall值的曲线后,在VOC2010之前,将recall等分成M份,对于每个recall值(1/M, ... , M/M),取大于等于该recall值下的最大的precision,求平均值作为AP。在VOC2010以后,需要针对每一个不同的Recall值(包括0和1),选取其大于等于这些Recall值时的Precision最大值,然后计算PR曲线下面积作为AP值。

mAP(mean average precision,多个类别的物体检测) = 所有类别的AP之和/类别数量


参考:https://blog.csdn.net/attitude_yu/article/details/80963323 

  • 回归问题的评价标准?

平均绝对值误差(MAE)

均方差(MSE)

  • 优化算法SGD、Momentum、Nesterov Momentum(也称作NAG Nesterov Acceleration Gradient)、Adagrad、RMSprop、Adam区别与联系

SGD: 这里指Mini-batch Stochastic Gradient ,算法较稳定,结果准确率高,不过容易卡在鞍点,且训练速度慢。该算法还有一个棘手的问题是学习率不好设置,学习率太小训练慢,学习率太大容易震荡不收敛,所以一般模拟退火算法,先设置较大学习率,迭代一定步数后再减小学习率。

MomentumV(t)​=γ⋅V(t−1​)+α⋅▽Θ​J(Θ) 使用物理中的惯性/动量的直觉概念,即t时刻的梯度,继承了t-1时刻梯度的惯性/动量,再结合当前时刻本身的梯度▽Θ​J(Θ)。该方法可以在一定程度上增加稳定性,使训练更快,而且由于惯性的存在,使模型有越过鞍点或者跳出局部最优的性能。

Nesterov MomentumV(t)​=γ⋅V(t−1​)+α⋅▽Θ​J(Θ−γ⋅V(t−1​)​) 在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。与Momentum相比,在第二项当前梯度中减去了γ⋅V(t−1​),可以理解为当前梯度基于累积动量做出的“妥协”,提前预知一下“未来”。这种方法的优化速度要比普通Momentum更快。

Adagrad自适应学习方法,在训练过程中自动对学习率进行调整。对于经常更新的参数,不希望其被单个的样本影响太大,希望学习率慢一些;对于偶尔更新的参数,希望其从偶然出现的样本上学习得多一些(学习率大一些)。为了评估参数更新的频率,使用所有历史动量,给学习率加一个值为历史梯度平方和的根(开方)的分母,更新频率高,该分母就大,学习率就小。Adagrad对每一个参数都作用,Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大(学习率单调递减),从而梯度趋近于0,使得训练提前结束。

RMSprop:Adagrad单调递减的学习率太过激进,RMSprop不累积全部历史梯度,只关注过去一段时间的下降梯度。公式如下:V_{t}=0.9*V_{t-1} + 0.1*g_{t}^{2}    。公式中历史积累梯度有一个0.9(该值可改),再迭代多次后(0.9连乘),之前的梯度影响会变得非常小,只有临近的梯度才会有较大影响,从而避免了学习率Adagrad学习率下降过快的问题。

Adam:Momentum+RMSprop

Nadam:Nesterov Momentum+RMSprop

参考:https://blog.csdn.net/u010089444/article/details/76725843

  • 梯度消失和爆炸的原因以及解决办法

  • 原因:
    • 梯度消失:激活函数求导小于1(sigmoid导数<=0.25, tanh<=1),多层情况下小于1的数连乘导致梯度过小;对参数的偏导公式中也有参数项,如果参数初始化的数值都小于1,连乘也会导致梯度过小,而且实际上,如果权重值越小,模型用在测试集和训练集的效果会越接近,大的权重容易出现过拟合,L2正则化的结果就是让权重都变得很小,而在权重都很小的情况下,梯度消失就很容易出现。
    • 梯度爆炸:反向传播过程中,对参数的偏导公式中也有参数项(weight),如果参数初始化的数值都比较大,多层情况下大数连乘导致梯度爆炸。
  • 解决办法:
  1. 改用Relu激活函数,relu在x>0的情况下,导数为1,可以缓解梯度消失问题,但不能完全解决,因为x<0时,导数为0,容易出现死单元。另外relu也没法解决梯度爆炸的问题。ReLU的衍生品还有leaky Relu,ELU,SELU,GELU等。Relu除了可以缓解梯度消失问题,求导简单,可以加速训练和计算。
  2. 梯度剪切、正则化(针对梯度爆炸):梯度剪切就是给梯度设置一个阈值,即最大值,直接防止梯度过大;正则化见L1和L2正则化的区别?为什么L1比L2更稀疏?在loss中加一个L2正则化项(权重的平方),如果梯度很大,loss也会很大,更新幅度也更大。
  3. Batch Normalization:见BN的原理,与白化的联系,随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致后向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正太分布而不是萝莉分布(哦,是正态分布),其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
  4. Residual残差结构
  5. LSTM里使用的方法:设置一个状态值,和以外状态之间做加法,防止连乘带来的梯度消失。

参考:https://zhuanlan.zhihu.com/p/33006526,https://blog.csdn.net/m0_37477175/article/details/80259773

  • 参数初始化的方法和作用?

参数的初始化对训练很重要,如果参数初始化不当,有可能造成无法收敛,参数过大会导致梯度爆炸,参数过小又会造成梯度消失;同时初始化也影响着收敛的速度;差不多的代价的初始点具有极大的泛化误差。随机的初始化可以打破对称,让不同的单元学到不同的东西。

  • 全0初始化:不可行,因为这样所有神经元的输出都一样,无法进行bp更新
  • 随机初始化(random initialization):最原始的初始化方法,让每一层的参数都是随机正态分布,均值为0,不过当网络层数加深,会出现梯度消失或爆炸,要么梯度都向0靠拢,要么都向1和-1靠拢,不好训练,现基本不用
  • Xavier initialization:Xavier初始化的基本思想是保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0,解决上面随机初始化的问题。适用于输出激活函数为sigmoid/tanh的模型(不适用于Relu)
  • MSRA/HE initialization:解决了Xavier在Relu激活函数的模型中表现不佳的问题。在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2(详见以下链接)。
  • Batch Normalization:BN也可以解决初始化不好的问题(BN真是个神器),初始化不好会带来每一层输出的分布不好(如向0靠拢),BN强行对输出做一次分布调整,让输出再次符合均值为0方差为1的高斯分布(正态分布)。有了BN,用随机初始化也不怕

参考:https://www.cnblogs.com/ying-chease/p/9469826.html

  • Inception各版本的改进

Inception-V1:提出Inception Module,一个Inception里使用不同卷积尺寸的卷积核对同一个feature map同时做卷积,并叠加卷积后得到的feature map。用到了1x1,3x3和5x5的卷积,同时使用了3x3的max pooling。由于一个Inception module有多种卷积核,参数多,使用了1x1的卷积来进行降维。 整个网络的中间还额外添加了两个loss,保证更好的收敛,有正则化的作用;同时,网络最后一个全连接层之前使用的是global average pooling(感受野是整个feature map,如果输入是10*10*16的特征,输出是1*1*16的特征向量,可以减少参数,适当防止过拟合)。

Inception-V2

  1. 学习了 VGG 用两个3x3的卷积代替5x5的大卷积,减少参数的同时,建立了更多的非线性变换(多了层激活函数),使网络更深,表达能力更强。
  2. 使用了Batch Normalization,BN 在用于神经网络某层时,会对每一个 mini-batch 数据的内部进行标准化(normalization)处理,使输出规范化到 N(0,1) 的正态分布,减少了 Internal Covariate Shift(内部神经元分布的改变)。

Inception-V3

  1. 用两个3x3代替5x5
  2. 用3x1和1x3代替3x3,7x1和1x7代替7x7
  3. pooling会带来信息的丢失,为了防止这个问题,应该在池化前增大特征维度,为了不增多参数量,就并行进行卷积和池化,然后将结果直接叠加。

Inception-V4:发现residual对于深层的网络也不是那么有用,没有residual也造成了比较深的网络,不过residual在加速网络训练中起了作用。网络构成上,延续了前三个版本使用到的trick,新增的reduction也是类似的卷积(卷积后的feature map尺寸变小),增加网络的深度,模型的性能会更好。

  • 1x1卷积有什么用

  主要用于降维,同时可以跨通道组织信息,提高网络表达能力。

  • RCNN,FAST-RCNN,FASTER-RCNN的区别和进步,faster-rcnn和SSD以及YOLO之间的区别和联系

综述: https://zhuanlan.zhihu.com/p/36088972 

RCNN

R-CNN检测时的主要步骤为:

1.使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。

2.把所有侯选框缩放成固定大小(原文采用227×227)。

3.用DCNN提取每个候选框的特征,得到固定长度的特征向量。

4.把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。

FAST-RCNN:

  1. 使用patch特征映射,不再对一个框都求一遍卷积,而是只做一次整个图片的卷积运算,再从特征图上寻找对应区域的特征,减少了计算量。(SPP net)
  2. ROI pooling layer:ROI是Region of Interest,该层的目的是为了1.将selective search选出的框映射到特征图上对应区域(如何映射见https://zhuanlan.zhihu.com/p/24780433),2.并将该区域变形成固定尺寸传到全连接层用于后续的分类和回归。这样可以将不同尺寸的输入pooling成单一尺寸的特征图,从而输入图片可以是任意尺寸,变形过程通常是缩小,所以称为pooling。假设变形前的尺寸为h、w,要求变形后统一输出尺寸H、W,则将变形前区域分成单位为h/H和w/W的网格(网格个数为H*W个),再对每个网格进行max pooling即可。(这种方法会有非整数出现,带来精度上的问题. MASK-RCNN使用双线性插值解决了这个问题)。SPP网络是pooling成多个固定尺度,RoI只pooling到单个固定的尺度,pooling成多个尺度mAP会高一点,但是速度会慢很多。
  3. 使用softmax分类器和bbox回归(结合两种loss)。

Faster-RCNN:

深度学习面试题常见问答_第2张图片

                                    图片来自https://zhuanlan.zhihu.com/p/30720870

  • 对图像特征提取前,对图像做了次尺寸调整,将图片缩放成统一尺寸。多尺寸的处理会增加精度,但效率会降低很多。
  • 使用CNN网络提取特征生成feature map。基于特征图产生两个分支(见上图),一个是RPN(Region Proposal Network)网络用于生成候选框,一个是Fast RCNN的原始网络,ROIPooling用于生成预测框结果和分类结果。其中RPN网络再使用一个3*3卷积(padding=SAME,这个卷积相当于没有改变特征图的尺寸,只是加深了特征的提取)后,分支成分类预测和anchor候选框回归(见下图,图像来自https://zhuanlan.zhihu.com/p/30720870)

深度学习面试题常见问答_第3张图片

  • Anchor:RPN网络的卷积后,对每个像素点,可以上采样映射到原始图像一个区域(CNN网络的感受野,映射方法和ROI Pooling正好相反,见https://zhuanlan.zhihu.com/p/24780433) ,找到这个感受野的中心位置,然后基于这个中心位置按规则选取9种anchor box(论文中三种面积,3个aspect ratio( {1:1,1:2,2:1} )),即对特征图的每个像素都设置9个候选区域(anchor)。这些anchor box都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练。其中:
    1. 把每个标定的ground-truth box与其重叠最大的anchor box记为前景样本。(保证每个ground-truth box至少对应一个正样本anchor)
    2. 剩余的anchor box与某个ground-truth box重叠大余0.7的记为前景样本。(每个ground-truth box可能会对应多个正样本anchor。但每个正样本anchor 只可能对应一个grand-truth box)
    3. 与任意一个标记ground-truth box重叠小于0.3的anchor box记为背景样本。
    4. 其余的舍弃。

     代价函数同时最小化分类误差和前景样本的区域位置偏差。

  • Bounding-box Regression种需要学习平移和缩放的映射。
  • 训练方法:四步训练法

    1) 单独训练RPN网络,网络参数由预训练模型载入;

    2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;

    3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;

    4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。
    --------------------- 
    作者:hunterlew 
    来源:CSDN 
    原文:https://blog.csdn.net/hunterlew/article/details/71075925 
    版权声明:本文为博主原创文章,转载请附上博文链接!

Mask-RCNN:

  • 使用了强化的基础网络ResNet-101和FPN网络( Feature Pyramid Networks)来提取图像特征
  • 使用ROIAlign 代替之前使用的ROI Pooling layer。ROIAlign引入了一个插值过程,先通过双线性插值到14*14,再 pooling到7*7,很大程度上解决了仅通过 Pooling 直接采样带来的 Misalignment 对齐问题。该改进对分类问题影响不大,但是对像素级别的分割影响很大。

YOLO:

使用整幅图的特征,预测所有类上的所有box

  1. end-to-end设计:将图片分成7*7个格子(faster-RCNN是分特征框+),如果目标中心落到某个grid种,该grid就负责检测该object。基于GoogleNet设计网络,最后一层FC层输出bbox中心点坐标(x,y,w,h)和p*IOU(p=0或1)。
  2. 由于bbox里经常不包含物体,即p=0,会导致loss收敛效果差,所以坐标预测权重=5,分类预测=0.5。且为了降低不同大小bbox宽高预测的方差,采用平方根形式计算宽高预测loss。
  3. YOLOv1只针对最后7x7的特征图进行分析,使得它对小目标的检测效果不佳,当多个目标出现在一个Grid Cell时不容易区分。

YOLO V2:https://zhuanlan.zhihu.com/p/25167153

  1. 每层卷积层后,加BN层,并去掉dropout层。
  2. 使用Anchor box, 作者在使用anchor boxes时发现模型收敛不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的 (x,y) 坐标的优化上。因此作者就没有采用直接预测offset的方法,而使用了预测相对于grid cell的坐标位置的办法,利用logistic函数把ground truth归一化到0到1之间,坐标值被归一化后,模型优化会更稳定
  3. Dimension Clusters(维度聚类):通过对数据集中的ground true box做聚类,找到ground true box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。
  4. Multi-scale Training:使用了不同尺寸的图片进行训练(更改网络尺寸)

YOLO3

YOLOv3的改进点:

1. 多尺度预测(FPN:features pyramid network),每层独立预测,低特征层提升了对小物体的预测

深度学习面试题常见问答_第4张图片

2. 更好的Backbone网络(Darknet53残差网络)

3. 分类损失采用binary cross-entropy损失函数替换Softmax损失函数(Softmax会选择分数最高的类别判定为当前框所属的类别,而现实中一个目标可能属于多个类别标签)

SSD

SSD对YOLO进行了改进,达到了和两阶段方法相当的精度,同时又保持了较快的运行速度。SSD也采用了网格划分的思想,和Faster RCNN不同的是它将所有的操作整合在一个卷积网络中完成。为了检测不同尺度的目标,SSD对不同卷积层的特征图像进行滑窗扫描在前面的卷积层输出的特征图像中检测小的目标,在后面的卷积层输出的特征图像中检测大的目标。它的主要特点是:

1.基于多尺度特征图像的检测:在多个尺度的卷积特征图上进行预测,以检测不同大小的目标,一定程度上提升了小目标物体的检测精度。

2.借鉴了Faster R-CNN中的Anchor boxes思想,在不同尺度的特征图上采样候选区域,一定程度上提升了检测的召回率以及小目标的检测效果。

深度学习面试题常见问答_第5张图片

注: SSD没有上采样, 只有bottom-up,没有top-down,FPN在top-down过程中为了让高层特征shape和底层相同,使用上采样,将两个方向的特征结合(concat或者用1*1卷积). 在SSD的基础上精度更高, 速度也没怎么下降, 且使用了更大的feature map,对小目标检测更有效(SSD没有用很低特征层的特征).

 

  •  增大感受野的方法?

使用空洞卷积(dilated convolution)

增大卷积核尺寸

  • 转置卷积(transposed Convolutions)怎么做?

2x2的feature map通过3x3的卷积核返回4x4feature map:转置卷积过程中,卷积核和步长都不变(和正向卷积相同),padding需要根据尺寸要求来,此处上下左右padding都为2

转置卷积不是卷积的对称逆(不可通过转置卷积获得卷积前的value,只能获得相同的shape,“反卷积”表达不准确)。

  • 深度可分离卷积(depthwise separable convolution)?

MobileNet中使用到的trick,用于减少参数量,往往精度会有一些下降,但是推理速度会增快很多。

考虑4x4x16的feature map通过3x3的卷积核卷积成2x2x32的feature map

普通卷积参:由于卷积有channel 方向,参数量为3x3x16x32

深度可分离卷积:先使用16个3x3x1的卷积核(channel为1)对16个channel的feature map分别卷积(丢掉了channel方向的联系),得到2x2x16的feature map;再使用32个1x1x16的卷积核对其卷积,用于获取channel方向的联系,得到2x2x32,总参数量为:3x3x16+32x1x1x16=41x16<288x16,参数量变成了1/7

  • Residual机制(残差网络)有什么优势?

                                                    深度学习面试题常见问答_第6张图片

残差诞生的原因:在利用Batch Normalization和Relu激活函数等trick的前提下(消除一些梯度消失问题),理论上网络越深网络的表达应该更好,然而实验证明网络深了会带来网络退化的问题(在训练集上表现下降,不是过拟合,过拟合会在训练集上表现更好),理论上过深的网络与浅的网络相比,即使多出来的网络层都是恒等层(不学习东西),性能也不应该下降,可能原因是过深的网络对这种恒等层的表达形式也很难训练,这种恒等层也是没有意义的,于是想到了用近似恒等或者添加了扰动的恒等来训练更深层的网络关于恒等表达的能力,让网络在加深的时候,模型的能力不至于下降

残差为什么work如果网络需要学习一个恒等映射,将残差优化成0要比使用一些非线性层优化成一个恒等映射相比,要简单得多。与正常网络相比,残差仅仅多了X identity这一项,假设输入x=5,想要学习的输出是5.1,对于正常网络而言,需要更新参数以适应0.1/5=2%的改进;而对于残差网络而言,因为需要更新的是F(x),想要让F(x)直接输出0.1而不是5.1,对于在同一量级上的更新,F(x)显得更加“得心应手”。假设下一个batch的训练,输出想要更新为5.2,那么对于F(x)来说,普通网络是不足2%的更新量,而对于残差来说是100%的更新量。

为什么残差是+X而不是+X/2:作者实验证明+X效果更佳。

参考:https://baike.baidu.com/item/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C/22701838?fr=aladdin

  • Transfer-learning与Fine-tuning

举个例子,假设今天老板给你一个新的数据集,让你做一下图片分类,这个数据集是关于Flowers的。问题是,数据集中flower的类别很少,数据集中的数据也不多,你发现从零训练开始训练CNN的效果很差,很容易过拟合。怎么办呢,于是你想到了使用Transfer Learning,用别人已经训练好的Imagenet的模型来做。

做的方法有很多:

  1. 把Alexnet里卷积层最后一层输出的特征拿出来,然后直接用SVM分类。这是Transfer Learning,因为你用到了Alexnet中已经学到了的“知识”
  2. 把Vggnet卷积层最后的输出拿出来,用贝叶斯分类器分类。思想基本同上。
  3. 甚至你可以把Alexnet、Vggnet的输出拿出来进行组合,自己设计一个分类器分类。这个过程中你不仅用了Alexnet的“知识”,也用了Vggnet的“知识”。
  4. 最后,你也可以直接使用fine-tune这种方法,在Alexnet的基础上,重新加上全连接层,再去训练网络。


综上,Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”。这可以有很多方法和手段。而fine-tune只是其中的一种手段。

作者:何之源
链接:https://www.zhihu.com/question/49534423/answer/127022241
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Transfer-learning解决了数据集很少的问题,同时训练出一个模型的速度也很快,另外利用成熟的模型(别人调好的模型)性能也会较好。

使用fine-tuning时,可以先固定前面网络的参数,只训练新添加的层至loss到达一个比较小的值,再降低学习率,所有参数一起训练,这样不至于破坏原来模型的表征能力,也能在新的数据集上表现更好。

  • GAN算法的机制?

  • CGAN, CYCLEGAN, WGAN分别有什么优点或改进?

  • 引起GAN collapse mode的原因是什么?

  • GAN可以处理哪些问题(应用场景)?如何处理?

  • Focal Loss for Dense Object Detection有什么用?

https://www.zhihu.com/question/63581984

  • 人脸识别算法softmax是如何改进的?

三元组损失:每次在训练数据中取3个图像,第一张图像为???x_i^a,第二张???x_i^p与第一张是同一个人(positive),第三张和第一张是不同的人(negative),希望:

                                                       

                                            注:α是超参数,取值很关键。取距离的平方是为了求导方便。

所以个样本三元组损失函数的定义:   

点:三元组损失直接对距离进行优化,使类内距离更紧凑,类间距离更远,最后得到了一个紧凑的128维人脸特征,其网络使用GoogLeNetInception模型,模型参数量较小,精度更高,在LFW上取得了99.63%的准确率。

点:1. 训练往往需要非常大的人脸数据集(百万级)训练时间很长cpu集群上训练了1000-2000小时)。2. 每次对三元组的取样比较讲究,不能取距离太大的(练出的模型性能比较一般),也不能取距离太小的(训练比较难以收敛),需要研发人员有丰富的数据工程经验

Center Loss

其中,是维持类别中心的损失函数,使特征向所属类别中心聚拢λ是个超参数;c_yi是每个类别的中心,但每次梯度下降都对所有图片算一次c_yi 计算量太大,所以随机初始化c_yi,并同时梯度更新c_yi

Sphereface: 把分类层权重归一化(|W|=1)并且不考虑偏置(b=0),将样本归一到一个球面上,直接优化角度(角度是x和权重w的角度,w=1所以忽略了),得到改进后的损失函数;mmargin超参数,学上可以证明,m>=3 就能保证最大类内距离小于最小类间距离。

            深度学习面试题常见问答_第7张图片

问题:Sphereface 通过特征间的余弦值(cosine距离而不是欧式距离)来衡量相似性,即以角度为相似性的度量。但在训练阶段,其Sphereface 的损失函数并不是在直接优化特征与类中心的角度,而是优化特征与类中心的角度再乘上一个特征的长,即迭代过程中优化的方向还有一部分是去增大特征的长度去了

Normface:训练时除了将权重归一化以外,同时将特征做了L2归一化,这样可以让范数小的特征影响更多,从而覆盖难挖掘的样本。

                                        

AM-softmax / CosFaceNormface解决了特征没有归一化的问题,但是没有marginAM-softmax加了margin特性,式中的mmargincos(?θ)-m< cos(?θ),所以损失函数值更大,惩罚更大,作者推荐m=0.35

                                            深度学习面试题常见问答_第8张图片

ArcFace:和AM-softmax类似,修改了m的位置:

                                    

  • attention机制为什么比RNN好?

  • attention和self-attention的区别?

在encoder-decoder模型中,attention的输入是encoder序列的输出+decoder序列中当前单元的隐状态(decoder上个单元延续的状态),即用在encoder和decoder的衔接中. 而self-attention是用在encoder内部或者decoder内部的attention结构, 用于捕捉序列本身的特征,输入只涉及到自己所在的序列.

在transformer里, encoder的一个大layer(一共有6个)里有一个self-attention,decoder的一个大layer里有一个self-attention和一个衔接encoder和decoder的普通attention(也可以称作context-attention).

  • encoder-decoder训练时和预测时有什么区别?

例: 我是工程师->I am engineer.

decoder训练时的输入是同一层里前一个单元的target,如输出am的单元的输入应该是I, 输出engineer的单元的输入应该是am; 但在预测时的输入是前一个单元的输出(预测时没有现成的target可以用). 

对于transformer模型是同样的训练方法, transformer模型中输出序列整个输入到decoder中,再使用搭配的mask机制来让后面的layer只关注之前单元的输出, 其实就相当于只输入了之前单元的输出,训练时用的直接是target,预测时用的是模型的输出

 

参考:

https://blog.csdn.net/qq_29462849/article/details/83068421

https://blog.csdn.net/wangmengmeng99/article/details/82460437

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

https://blog.csdn.net/shwan_ma/article/details/78354073

你可能感兴趣的:(深度学习)