本博客基于牛客【深度学习】专项刷题梳理的相关知识点,可用于入门、面试或者作为刷题配套解析。万字长文编辑不易,如有错误烦请指出。
目录
具体内容:
卷积和池化计算特征图公式,感受野计算公式
普通卷积、深度可分离卷积、分组卷积、部分卷积参数量与计算量计算公式
梯度消失与梯度爆炸
梯度下降算法的正确步骤是什么?
在感知机中(Perceptron)的任务顺序是什么?
当数据过大以至于无法在RAM中同时处理时,哪种梯度下降方法更加有效?
在哪种情况下,一阶梯度下降不一定正确工作(可能会卡住)?
在一个神经网络中,怎么获知每个神经的权重和偏移?(梯度下降)
提升卷积核的大小会显著提升卷积神经网络的性能,这种说法是错误的。
有关深度神经网络的训练和推断,以下说法中不正确的是:
什么情况下神经网络模型被称为深度学习模型?
处理过拟合问题的方法:
批规范化(Batch Normalization)的好处都有啥?
BatchNorm层对于input batch会统计出mean和variance用于计算 EMA。如果input batch 的 shape 为(B, C, H, W),统计出的 mean 和 variance 的 shape 为: (1 * C * 1 * 1)
激活函数需要具有的属性:
常见的激活函数
基于二次准则函数的H-K算法较之于感知器算法的优点是可以判别问题是否线性可分,其解的适应性更好。
假设有一个5层的神经网络,这个神经网络在使用一个4GB显存显卡时需要花费3个小时来完成训练。而在测试过程中,单个数据需要花费2秒的时间。 如果我们现在把架构变换一下,当评分是0.2和0.3时,分别在第2层和第4层添加Dropout,那么新架构的测试所用时间会变为多少?仍是2s
考虑某个具体问题时,你可能只有少量数据来解决这个问题。不过幸运的是你有一个类似问题已经预先训练好的神经网络。可以用下面哪种方法来利用这个预先训练好的网络?(只对最后几层进行调参(fine tune))
假设我们拥有一个已完成训练的、用来解决车辆检测问题的深度神经网络模型,训练所用的数据集由汽车和卡车的照片构成,而训练目标是检测出每种车辆的名称(车辆共有10种类型->分类)。现在想要使用这个模型来解决另外一个问题,问题数据集中仅包含一种车(福特野马)而目标变为定位车辆在照片中的位置。
假设我们有一个使用ReLU激活函数(ReLU activation function)的神经网络,假如我们把ReLU激活替换为线性激活,那么这个神经网络能够模拟出同或函数(XNOR function)吗?(不能)
假设我们有一个如下图所示的隐藏层。隐藏层在这个网络中起到了一定的降维作用。假如现在我们用另一种维度下降的方法,比如说主成分分析法(PCA)来替代这个隐藏层,那么,这两者的输出效果是一样的吗?(否)
现有一1920*1080 的单通道图像,每个像素用 float32 存储,对其进行 4 个 3*3 核的卷积(无 padding),卷积核如下,若原图像由于量化问题出现了 100 个 INFINITY,而其他的值都在(-1,1)区间内,则卷积的结果至少有多少个 NaN?(284)
googlenet提出的Inception结构优势
关于Attention-based Model
关于caffe
有关深度学习加速芯片,以下的说法中不正确的是:(C)
在选择神经网络的深度时需要考虑以下参数:
下列哪项关于模型能力(model capacity)的描述是正确的?
当在卷积神经网络中加入池化层时,平移变换的不变性会被保留,是吗?
调整超参数最小化代价函数(cost function)的技术:
CNN常见的Loss函数
直接记住这几句话:
VIP:
常用于情感分析的方法有:
以下哪种模型使用了Sequence to Sequence结构?
LSTM组成介绍
如果回归模型中存在多重共线性(multicollinearity),应该如何解决这一问题而不丢失太多信息?
现在需要计算三个稠密矩阵A,B,C的乘积ABC
在训练神经网络时,损失函数(loss)在最初的几个epochs时没有下降,可能的原因是?
卷积和池化计算特征图公式,感受野计算公式
1. 卷积:输入图像尺寸W×W,K×K卷积核,步长S,填充P,输出特征图尺寸为N×N,核数等于输出通道数。
2. 池化:输入图像尺寸W×W,K×K池化核,步长S,无填充,输出特征图尺寸为N×N,核数等于输出通道数。
3. 感受野计算: R0=1
普通卷积、深度可分离卷积、分组卷积、部分卷积参数量与计算量计算公式
输入特征图Hin×Win×Cin,卷积核大小K×K,输出特征图Hout×Wout×Cout,不考虑bias
普通卷积:
参数量:K×K×Cin×Cout
计算量:K×K×Cin×Cout×Hout×Wout
深度可分离卷积:包括深度卷积和逐点卷积两部分,深度卷积进行逐通道卷积,逐点卷积就是1×1普通卷积,所以参数量和计算量是普通卷积的1/Cout+1/k²
参数量:K×K×Cin+Cin×Cout
计算量:K×K×Cin×Hout×Wout+Cin×Cout×Hout×Wout
分组卷积:输入特征图按通道数平均划分为g组(Hin×Win×Cin×1/g)×g,卷积核也对应划分为g组,所以参数量和计算量为普通卷积操作的1/g,当g=Cout时就是深度卷积
参数量:K×K×Cin/g×Cout/g×g
计算量:K×K×Cin/g×Cout/g×Hout×Wout×g
部分卷积:输入通道的一部分(这里默认是1/4)上使用普通卷积进行空间特征提取,并保持其余通道不变,所以参数量和计算量为普通卷积操作的1/16
参数量:K×K×Cin/4×Cout/4
计算量:K×K×Cin/4×Cout/4×Hout×Wout
梯度消失与梯度爆炸
定义:神经网络在进行反向传播(BP)的时候会对参数W进行更新,梯度消失就是靠后面网络层能够正常的得到一个合理的偏导数,但是靠近输入层的网络层,计算得到的偏导数近乎零,W几乎无法得到更新。梯度爆炸是靠近输入层的网络层,计算得到的偏导数极其大,更新后W变成一个很大的数(爆炸)。
精简版:由于反向传播,在梯度消失情况下越接近输入层,其梯度越小;在梯度爆炸的情况下越接近输入层,其梯度越大。
产生原因:在神经网络中使用了sigmoid激活函数并且网络很深。
解决方法:
用ReLU激活函数取代sigmoid激活函数->梯度消失LSTM的结构设计也可以改善RNN中的梯度消失问题残差结构->梯度消失预训练加微调 -> 梯度消失和爆炸batch normalization-> 梯度消失和爆炸梯度剪切->梯度爆炸正则化->梯度爆炸
梯度下降算法的正确步骤是什么?
用随机值初始化权重和偏差把输入传入网络,得到输出值计算预测值和真实值之间的误差对每一个产生误差的神经元,调整相应的(权重)值以减小误差重复迭代,直至得到网络权重的最佳值
在感知机中(Perceptron)的任务顺序是什么?
随机初始化感知机的权重对一个输入样本,计算输出值如果预测值和输出不一致,则调整权重去到数据集的下一批(batch)
当数据过大以至于无法在RAM中同时处理时,哪种梯度下降方法更加有效?
梯度下降法分随机梯度下降(每次用一个样本)、小批量梯度下降法(每次用一小批样本算出总损失, 因而反向传播的梯度折中)、全批量梯度下降法则一次性使用全部样本。这三个方法, 对于全体样本的损失函数曲面来说, 梯度指向一个比一个准确。但是在工程应用中,受到内存/磁盘IO的吞吐性能制约, 若要最小化梯度下降的实际运算时间, 需要在梯度方向准确性和数据传输性能之间取得最好的平衡。所以,对于数据过大以至于无法在RAM中同时处理时, RAM每次只能装一个样本, 那么只能选随机梯度下降法。
在哪种情况下,一阶梯度下降不一定正确工作(可能会卡住)?
除了局部极小值,还有一类值为“鞍点”(Saddle Point),简单来说,它就是在某一些方向梯度下降,另一些方向梯度上升,形状似马鞍。
在一个神经网络中,怎么获知每个神经的权重和偏移?(梯度下降)
赋予一个初始值,然后检查跟最佳值的差值,不断迭代调整权重
提升卷积核的大小会显著提升卷积神经网络的性能,这种说法是错误的。
卷积核的大小是一个超参数(hyperparameter),也就意味着改变它既有可能提高亦有可能降低模型的表现。增加卷积核的个数容易导致过拟合。
有关深度神经网络的训练和推断,以下说法中不正确的是:
A 将数据分组部署在不同GPU上进行训练能提高深度神经网络的训练速度。B TensorFlow使用GPU训练好的模型,在执行推断任务时,也必须在GPU上运行。(GPU只是用来加速计算,与模型本身没有直接的关系,可以在GPU or CPU上推理 )C 将模型中的浮点数精度降低,例如使用float16代替float32,可以压缩训练好的模型的大小。D GPU所配置的显存的大小,对于在该GPU上训练的深度神经网络的复杂度、训练数据的批次规模等,都是一个无法忽视的影响因素。
什么情况下神经网络模型被称为深度学习模型?
加入更多层,使神经网络的深度增加
处理过拟合问题的方法:
增加更多的数据/样本使用数据扩增技术(data augmentation)使用归纳性更好的架构正规化(regularization)==增加参数惩罚(正则化会给给代价函数增加一个惩罚项,使得系数不会达到很大的值。)降模型复杂度Dropout:Dropout可以认为是一种极端的Bagging,每一个模型都在单独的数据上训练,同时,通过和其他模型对应参数的共享,从而实现模型参数的高度正则化。提前终止训练Batch Normalization
batch normalization一般在机器视觉领域使用,针对数据大小一致的情况下可以使用batch normalization,而对于序列数据,其长度不固定,一般采用layer normalization。
批规范化(Batch Normalization)的好处都有啥?
BN通过将每一层网络的输入进行normalization,保证输入分布的均值与方差固定在一定范围内(让每一层的输入的范围都大致固定),减少了网络中的Internal Covariate Shift问题,并在一定程度上缓解了梯度消失,加速了模型收敛;并且BN使得网络对参数、激活函数更加具有鲁棒性,降低了神经网络模型训练和调参的复杂度;最后BN训练过程中由于使用mini-batch的mean/variance作为总体样本统计量估计,引入了随机噪声,在一定程度上对模型起到了正则化的效果。
BatchNorm层对于input batch会统计出mean和variance用于计算 EMA。如果input batch 的 shape 为(B, C, H, W),统计出的 mean 和 variance 的 shape 为: (1 * C * 1 * 1)
B代表图像的batch,即多少张图像一个batch。C代表图像的通道数。 BN是对多张图像的同一通道做Normalization,所以有多少通道就有多少个mean和variance。
激活函数需要具有的属性:
计算简单非线性几乎处处可微单调性非饱和性输出范围有限接近恒等变换参数少
常见的激活函数
常用的激活函数合集(详细版)_激活函数有哪些_小wu学cv的博客-CSDN博客
sigmoidtanhReLU及其变体
基于二次准则函数的H-K算法较之于感知器算法的优点是可以判别问题是否线性可分,其解的适应性更好。
HK算法的思想是在最小均方误差准则下求得权矢量。相对于感知器算法的优点在于,它适用于线性可分和非线性可分的情况。对于线性可分的情况,给出最优权矢量;对于非线性可分的情况,能够判别出来,以退出迭代过程。
假设有一个5层的神经网络,这个神经网络在使用一个4GB显存显卡时需要花费3个小时来完成训练。而在测试过程中,单个数据需要花费2秒的时间。 如果我们现在把架构变换一下,当评分是0.2和0.3时,分别在第2层和第4层添加Dropout,那么新架构的测试所用时间会变为多少?仍是2s
在架构中添加Dropout这一改动仅会影响训练过程,而并不影响测试过程。Dropout是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。而在测试时,应该用整个训练好的模型,因此不需要dropout。
考虑某个具体问题时,你可能只有少量数据来解决这个问题。不过幸运的是你有一个类似问题已经预先训练好的神经网络。可以用下面哪种方法来利用这个预先训练好的网络?(只对最后几层进行调参(fine tune))
如果有个预先训练好的神经网络, 就相当于网络各参数有个很靠谱的先验代替随机初始化。若新的少量数据来自于先前训练数据(或者先前训练数据量很好地描述了数据分布,而新数据采样自完全相同的分布),则冻结前面所有层而重新训练最后一层即可;但一般情况下,新数据分布跟先前训练集分布有所偏差,所以先验网络不足以完全拟合新数据时,可以冻结大部分前层网络,只对最后几层进行训练调参(这也称之为fine tune)。
魔法:
(样本少,相似性低)--> 冻结训练(fine tune)(样本多,相似性低)--> 重新训练(样本少,相似性高)--> 修改输出层(最后一层)(样本多,相似性高)--> 预训练权重+重新训练
假设我们拥有一个已完成训练的、用来解决车辆检测问题的深度神经网络模型,训练所用的数据集由汽车和卡车的照片构成,而训练目标是检测出每种车辆的名称(车辆共有10种类型->分类)。现在想要使用这个模型来解决另外一个问题,问题数据集中仅包含一种车(福特野马)而目标变为定位车辆在照片中的位置。
对神经网络中的最后几层进行微调,同时将最后一层(分类层)更改为回归层
假设我们有一个使用ReLU激活函数(ReLU activation function)的神经网络,假如我们把ReLU激活替换为线性激活,那么这个神经网络能够模拟出同或函数(XNOR function)吗?(不能)
使用ReLU激活函数的神经网络是能够模拟出同或函数的。但如果ReLU激活函数被线性函数所替代之后,神经网络将失去模拟非线性函数的能力。同或函数是必须要非线性激活函数才能拟合的。
假设我们有一个如下图所示的隐藏层。隐藏层在这个网络中起到了一定的降维作用。假如现在我们用另一种维度下降的方法,比如说主成分分析法(PCA)来替代这个隐藏层,那么,这两者的输出效果是一样的吗?(否)
PCA 提取的是数据分布方差比较大的方向,隐藏层可以提取有预测能力的特征 。or : PCA降维的特点在于使用矩阵分解求特征值的方式,提取的是数据分布方差比较大的方向,提取的是主要成分;hidden layer主要是点乘+非线性变换,目的是特征的提取,转换 。
现有一1920*1080 的单通道图像,每个像素用 float32 存储,对其进行 4 个 3*3 核的卷积(无 padding),卷积核如下,若原图像由于量化问题出现了 100 个 INFINITY,而其他的值都在(-1,1)区间内,则卷积的结果至少有多少个 NaN?(284)
需要知道:INFINITY*0 = NAN (infinity即inf,无穷的意思)第一个卷积核中间为0,将该卷积核对图像进行扫描,四周的边框都不会被扫描到,将infinity放于四周,则不会出现NAN第二个卷积核:两个对角为0,可以想象,使用该卷积核对整个图像进行扫描,有8个位置不会被0扫描到。将这8个位置都设为infinity,不会出现NAN。所以该种情况出现NAN情况为100-8 = 92第三个卷积核:同第二个一样第四个卷积核:图像所有点都会被0扫描,所以必会出现100个NAN最少 = 100+92+92 =284
googlenet提出的Inception结构优势
利用该结构有效减轻网络的权重。
关于Attention-based Model
Attention-based Model其实就是一个相似性的度量(相似度度量模型),当前的输入与目标状态越相似,那么在当前的输入的权重就会越大,说明当前的输出越依赖于当前的输入。严格来说,Attention并算不上是一种新的model,而仅仅是在以往的模型中加入attention的思想,所以Attention-based Model或者Attention Mechanism是比较合理的叫法,而非Attention Model。
关于caffe
blob是caffe中的基本数据存储单元,layer是caffe中的基本计算单元。所谓的优化方法是指对于训练网络的loss进行优化。caffe中在Solver配置,在神经网络中,用forward pass来求解loss,用backward pass来求解梯度。六种优化方法分别为:
Stochastic Gradient Descent (type: “SGD”), 随机梯度下降AdaDelta (type: “AdaDelta”) 自适应学习率Adaptive Gradient (type: “AdaGrad”) 自适应梯度:使用的是一阶导Adam (type: “Adam”) 自适应学习,推荐使用Nesterov’s Accelerated Gradient (type: “Nesterov”) 加速梯度法RMSprop (type: “RMSProp”)
有关深度学习加速芯片,以下的说法中不正确的是:(C)
A GPU既可以做游戏图形加速,也可以做深度学习加速B 用于玩游戏的高配置显卡,也可以用于深度学习计算C Google TPU已经发展了三代,它们只能用于推断(Inference)计算,不能用于训练(Training)计算(google tpu既能进行推理又能训练计算)D FPGA最早是作为CPLD的竞争技术而出现的
在选择神经网络的深度时需要考虑以下参数:
神经网络的类型(如MLP,CNN)输入数据 计算能力(硬件和软件能力决定) 学习速率 映射的输出函数
特征抽取所需分层越多, 输入数据维度越高, 映射的输出函数非线性越复杂, 所需深度就越深. 另外为了达到最佳效果, 增加深度所带来的参数量增加, 也需要考虑硬件计算能力和学习速率以设计合理的训练时间。
下列哪项关于模型能力(model capacity)的描述是正确的?
A隐藏层层数增加,模型能力一定增加->网络深度过深则容易出现过拟合BDropout的比例增加,模型能力增加->比例过多容易欠拟合C学习率增加,模型能力增加->学习率过大模型不收敛D都不正确
当在卷积神经网络中加入池化层时,平移变换的不变性会被保留,是吗?
不变性,对于一个函数,如果对其输入施加的某种操作丝毫不会影响到输出,那么这个函数就对该变换具有不变性。 池化算法比如取最大值/取平均值等, 都是输入数据旋转后结果不变, 所以多层叠加后也有不变性。
调整超参数最小化代价函数(cost function)的技术:
穷举搜索随机搜索Bayesian优化
CNN常见的Loss函数
softmax_losssigmoid_loss->sigmoidloss指的就是采用了sigmoid函数处理后,经过熵计算的损失函数Contrastive_Loss->对比损失siamese_loss:不包括它
在传统的siamese network中一般使用Contrastive Loss作为损失函数,这种损失函数可以有效的处理孪生神经网络中的paired data的关系。
直接记住这几句话:
神经网络属于特征学习算法,K近邻算法、随机森林都不属于。
混沌度(Perplexity)是一种常见的应用在使用深度学习处理NLP问题过程中的评估技术,混浊度越低越好。
学习率过小,收敛太慢,学习率过大,不收敛。
CNN、RNN结构会发生权重共享,FC不会。
RNN有反馈连接。
深度学习与机器学习算法之间的区别在于,深度学习可以自行完成特征提取过程而机器学习需要人工来处理特征内容。
训练CNN时,可以对输入进行旋转、平移、缩放等预处理提高模型泛化能力。
每个神经元可以有一个或多个输入和一个或多个输出。
如果增加多层感知机(Multilayer Perceptron)的隐藏层层数,分类误差便会减小。这种陈述正确还是错误?(错误,可能过拟合,误差增大)
Bert-base由12层encoder组建构成,Bert-large有20层。
解决诸如包含时序先后顺序信息的文字行识别问题的识别方法是基于RNN/LSTM的文本行识别方法,CNN无法解决时序问题。
常用于情感分析的方法有:
基于情感词典的方法基于机器学习的方法基于深度学习的方法
运行以下python代码
range(6)应该是产生0-5的数字,但是有x:x+1映射,所以变成了1-6,输出[1,2,3,4,5,6]
以下哪种模型使用了Sequence to Sequence结构?
YOLOBERTShuffleNetTransformer->Seq2Seq 模型最常用 Encoder-Decoder 结构构建,Transformer有这两部分
LSTM组成介绍
LSTM 中引入了3个门,即输入门(input gate)、遗忘门(forget gate)和输出门(output gate),以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细胞当成一种特殊的隐藏状态),从而记录额外的信息。
如果回归模型中存在多重共线性(multicollinearity),应该如何解决这一问题而不丢失太多信息?
剔除共线性变量中的一个通过计算方差膨胀因子(Variance Inflation Factor,VIF)来检查共线性程度,并采取相应措施删除相关变量可能会有信息损失,我们可以不删除相关变量,而使用一些正则化方法来解决多重共线性问题,例如Ridge 或 Lasso 回归
如果回归模型中存在共线性变量,那么可以采取相应措施,剔除共线性变量中的一个。为了检验多重共线性,可以创建一个相关矩阵来识别和去除相关度在 75% 以上的变量(阈值大小可人为设置)。此外,可以使用计算方差膨胀因子(VIF)来检查多重共线性的存在。若 VIF <= 4 则没有多重共线性,若 VIF>10 值意味着严重的多重共线性。此外,可以使用容忍度作为多重共线性的指标。方差膨胀因子(Variance Inflation Factor,VIF):是指解释变量之间存在多重共线性时的方差与不存在多重共线性时的方差之比。VIF 跟容忍度是倒数关系。但是,去除相关变量可能导致信息的丢失。为了保留这些变量,可以使用正则化来“惩罚”回归模型,如 Ridge 和 Lasso 回归。此外,可以添加一些随机噪声相关变量,使变量变得彼此不同。但是,增加噪声可能会影响预测精度。
现在需要计算三个稠密矩阵A,B,C的乘积ABC
假设三个矩阵的尺寸分别为m∗n,n∗p,p∗q,且m