深度学习面试知识点归纳总结

深度学习主要针对CV计算机视觉方向哦,NLP自然语言的童鞋还需自行查漏补缺

深度学习基础部分

  1. 卷积神经网络(CNN)特点:局部区域连接权值共享
    局部区域连接:图像的空间联系是局部比较紧密的,每个神经元其实没有必要对全局图像进行感知,只需对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。
    权值共享:图像的一部分统计特性与其它部分是一样的。意味着在这一部分学习的特征也能用在另一部分上。通过设置不同的kernel,能获取不同特征的信息。
  2. Pooling的作用: 引入不变性(max pooling);扩大感受野降维(减少参数量)
    使用池化可以看做是增加了一个无限强的先验,这一层学的的函数必须具有对少量平移保持不变的特性。
  3. max-pooling和average-pooling的异同: max-pooling和average-pooling都对数据做了下采样,但max-pooling更像是做了一个特征选择的操作,选出了分类辨识度更好的特征,也提供了非线性,特征提取的误差主要来自2个方面:①领域大小受限造成的估计值方差增大 ②卷积层参数造成的估计均值的偏移。average-pooling能减小第一种误差,更多保留图像的背景信息,max-pooling能减小第二种误差,更多保留纹理信息。average-pooling更强调对整体特征信息进行下采样,在减少参数维度的贡献上多一点,更多体现在信息完整传递这个维度上,比如DenseNet模块间的连接大多数采用average-pooling,除此之外,average-pooling在全局平均池化中应用比较广,在ResNet和Inception中最后一层都用了平均池化,用全局平均池化可以替代flatten操作,使输入变成一维向量。
  4. 梯度消失、爆炸:根本原因在于反向传播训练法则先天不足,不同层学习速率差异很大,表现为网络中靠近输出的层学习情况很好,靠近输入的层学习很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。具体而言,梯度消失可能是在深层网络中采用了不合适的激活函数。梯度爆炸一般出现在深层网络中和权重初始值太大的情况下。
  5. 梯度消失、爆炸的解决方案:好的参数初始化方式(He、MSRA);梯度裁剪和权重正则;非饱和的激活函数(ReLU);BatchNormalization;残差结构;LSTM结构
  6. CNN和RNN的梯度消失是一样的吗?
    基本一样,CNN因为网络层数太多导致,RNN因为时间迭代次数多导致,都是因为链式求导次数太多的原因
  7. 有哪些防止过拟合的方法?
    Early Stop、Data Augmentation、正则、Dropout、BatchNormalization、集成学习
  8. 降低欠拟合风险的方法:加入新的特征;增加模型复杂度;减小正则化项的系数
  9. 激活函数的优缺点比较:
    sigmoid :便于求导的平滑函数,能够压缩数据,适用于前向传播,但易出现梯度消失,不是0均值的,幂运算相对耗时。
    tanh:值压缩到-1~1,解决了非0均值的问题,也存在梯度消失和幂运算问题。
    ReLU:解决了梯度消失问题,收敛速度快,计算复杂度低不需要指数运算,适用于后向传播,但它不是0均值的,还会出现神经元坏死的情况(某些神经元可能永远也不会被激活,导致参数不会被更新,产生这种现象有两个原因,参数初始化的问题或者是学习率太高导致在训练过程中参数更新太大)【注:这个部分神经元失活,到底是利是弊,还挺难说的,部分的失活,其实一定程度上也解决了一些过拟合的问题】,ReLU不会对数据做幅度压缩,数据的幅度会随着模型层数的增加不断扩张。
    sigmoid:常用于二分类的输出层。
    tanh:常用于输出对称的结果的时候,比如(-1,1)
    ReLU:应用于各种类型的神经网络,卷积网络的隐藏层
    LeakyReLU:虽然解决了失活神经元的问题,但在实践中并没有发现LeakyReLU效果比ReLU好。
  10. 深度学习中 batch size对训练结果的影响
    一般来说,在合理范围之内,越大的batch size使下降方向越准确,震荡越小,batch size如果过大,内存可能撑不住,跑完一次epoch所需的迭代次数减少,要想达到相同的精度,所花费的时间大大增加了,对参数的修正也就更加缓慢,当batch size增加到一定程度,其确定的下降方向已经基本不再变化。batch size太小,引入的随机性比较大,很难收敛。
  11. 深度理解Batch Normalization
    ①BN就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同的分布。主要面对的是“Internal Covariate Shift”这个问题,如果隐层的输入分布总是变来变去,模型是很难稳定的学习的,所以BN的基本思想就是能不能让每个隐藏节点的输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。受图像白化操作的启发,所谓白化,就是对输入数据分布变换到0均值,单位方差的正态分布。BN可以理解为对深层神经网络每个隐藏层神经元的激活值做一个简化版本的白化操作。
    ②深层神经网络在做非线性变换前的激活输入值随着网络深度加深或训练过程中,其分布逐渐发生偏移或变动,之所以训练慢,一般是整体分布逐渐往非线性函数取值区间的上下限两端靠近,导致反向传播时低层神经网络的梯度消失。BN是通过一定的规范化手段,把每层神经网络任意神经元输入值的分布强行拉回到均值为0方差为1的标准正态分布。
    总结:对于每个隐层神经元,把逐渐拉向非线性函数映射后向取值区间极限饱和区靠拢的数据分布拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换的输入值落入到输入比较敏感的区域,以避免梯度消失的问题。
    有一个疑问:如果都通过这样的BN,那么不就跟把非线性函数替换成线性函数效果相同了吗?这就意味着网络的表达能力下降了,那这样的话深度的意义就没有了。所以BN为了保证非线性的获得,对变换后满足均值为0,方差为1的X又进行了scale和shift,这两个参数通过学习获得,意思是通过scale和shift把这个值从标准正态分布左移或右移一点,长胖或变瘦一点,等价于把非线性函数的值从正中心周围的线性区域向非线性区域挪了挪。核心思想是想找到一个线性和非线性的较好的平衡点,既能享受非线性较强的表达能力,又避免太靠近非线性区使得网络收敛速度太慢。
    好处:1)大大提升了训练速度,收敛过程大大加快。
    2)调参过程变得简单很多,对于初始化要求没那么高了,可以用较大的学习率。
    3)防止过拟合,类似于Dropout的一种防止过拟合的正则化表达方式。

    BN在测试时,每次可能只会出入单个数据,此时模型会使用全局统计量代替统计量。(也叫移动平均)【训练每个batch时都会得到一组均值和方差,所谓全局统计量就是这些均值和方差的数学期望。】
    =>为什么在训练时不用移动平均?
    1)使用BN的目的是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷。2)BN作者认为训练时用移动平均会与梯度优化产生矛盾。
    12.L1/L2正则:
    区别:L1正则化可以产生更稀疏的权值矩阵,可以用来特征选择,同时一定程度上防止过拟合。L1正则化适用于特征之间有关联的情况,L2适用于没有关联的情况。
    为什么L1和L2正则化可以防止过拟合?
    1)L1&L2正则化会使模型偏好于更小的权值;2)更小的权值意味着更低的模型复杂度,添加L1&L2正则化相当于为模型添加了某种先验,限制了参数的分布,从而降低了模型的复杂度
  12. Dropout
    可以把Dropout类比成将许多大的神经网络进行集成的一种bagging方法。每一个神经网络的训练是非常耗时和占用内存的,训练很多的神经网络进行集合分类就显得很不实际。但是,Dropout可以训练所有子网络的集合,这些子网络通过去除整个网络中的一些神经元来获得。相比于bagging,所有的模型都是共享参数的,不像在bagging中分类器都是独立的,Dropout也没有明确的各个模型并行的训练过程。
    总而言之,Dropout通过参数共享提供了一种廉价的bagging集成近似——Dropout策略相当于集成了包括所有从基础网络除去部分单元后形成的网络。
  13. Data Augmentation的常见方法
    ①color jittering:对颜色的数据增强。亮度、饱和度、对比度。
    ②random crop
    ③random scale
    ④水平/垂直翻转
    ⑤shift平移
    ⑥旋转
    ⑦noise,高斯噪声,模糊
  14. 神经网络不收敛的常见问题:
    没有对数据进行归一化;忘记检查输入和输出;没有对数据进行预处理;没有对数据正则化;使用过大的样本;使用不正确的学习率;在输出层使用错误的激活函数;网络中包含坏梯度;初始化权重错误;过深的网络;隐藏单元数量错误。reference click me
  15. 梯度下降原理:梯度向量从几何意义上讲,就是函数变化增加最快的地方。沿着梯度向量相反的方向,梯度减少最快,也就是更加容易找到函数最小值。在机器学习算法中,在最小化损失函数时,可通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。
    梯度下降算法变种:
    ① Batch gradient descent(BGD):需要计算整个训练集的梯度
    ② SGD:仅计算某个样本的梯度。更新频次快,优化速度更快,有一定随机性导致有可能跳出局部最优。随机性可能会导致收敛复杂化,SGD过程充满震荡。
    ③ mini-batch gradient descent:参数更新的动荡较小,收敛过程更稳定,降低了收敛难度。
    SGD放弃了梯度的准确性,仅采用一部分样本来估计当前梯度,因此SGD对梯度的估计常常出现偏差,造成目标函数收敛不稳地,甚至不收敛。
    Momentum:利用惯性,即当前梯度与上次梯度进行加权,如果方向一致,则累加导致更新步长变大,如果方向不同,则相互抵消中和导致更新趋向平滑。
    Adagrad:raw SGD、SGD with momentum均是以相同学习率去更新参数的各个分量,而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。对于更新不频繁的参数,希望单次步长更大,多学习一些知识。对于更新频繁的参数,我们希望步长较小,使学习到的参数更稳定,不至于被单个样本影响太多。=>引入了二阶动量,对于此前频繁更新过的参数,其二阶动量的对应分量较大,学习率较小。这种优化方法存在的最大问题就是有可能学习率太小会导致训练困难,甚至提前结束。(自Adagrad及下面介绍的都属于参数自适应的优化方法。)
    RMSprop(和AdaDelta几乎同时独立提出,表达上略有不同):考虑在计算二阶动量时不累积全部历史梯度,而只关注最近某一时间内的下降梯度。(主要是为了handle Adagrad学习率过度衰减问题)
    Adam:Adam可以认为是RMSprop和Momentum的结合。和RMSprop对二阶动量使用指数移动平均类似,Adam中对一阶动量也是用指数移动平均计算。
  16. 常见的损失函数
    1)0-1损失函数;2)感知损失函数;3)平方损失函数;4)Hinge损失函数(SVM中);5)对数损失函数;6)交叉熵损失函数(本质上也是一种对数损失函数,常用于多分类问题中);7)绝对值损失函数;8)Huber损失函数
  17. 反卷积(转置卷积):
    它的过程是正常卷积的逆向,只是size上的逆向,内容上不一定,区分于数学中的反卷积。转置卷积最大的用途就是上采样了,在正常卷积中stride大于1时我们进行的是等距下采样,size比输入小,转置卷积层用stride小于1的卷积进行上采样,使输出的size变大,所以又叫分数卷积层。
    为实现扩充的目的,需要对输入以某种方式进行填充。反卷积内部实际上执行的是常规的卷积操作。转置卷积只是为了重建先前的空间分辨率,执行了卷积操作。虽然转置卷积并不能还原数值,但是广泛应用于编码器-解码器的结构中,效果不错。这样,转置卷积可以同时实现图像的粗粒化和卷积操作,而不是通过两个独立过程完成。
  18. 空洞卷积:主要为解决分割问题提出,通过pooling增大感受野的同时会缩小图像尺寸,然后通过upsampling还原图像,但是这个过程造成了精度的损失。
  19. ReLU代替sigmoid的弊:
    ①神经网络比较小时,sigmoid表现更好。
    ②ReLU不是全程可导的(其实不是什么大问题)。
    ③sigmoid输出有界,适合作为下一层的输入,或者输出。
  20. 为什么只对权重做正则惩罚,而不对偏置做惩罚?
    精确拟合偏置所需的数据通常比拟合权重少得多,每个权重会指定两个变量如何相互作用,我们需要在各种条件下观察这两个变量才能良好的拟合权重,而每个偏置仅控制一个单变量。这意味着,我们不对其进行正则化也不会导致太大的方差。另外,正则化偏置参数可能会导致明显的欠拟合。
  21. 为什么在模型训练时对输入(隐藏单元或权重)添加方差较小的噪声?
    对于某些模型而言,向输入添加方差较小的噪声等价于对权重施加范数惩罚。在一般情况下,注入噪声会比简单的收缩参数强大。特别是噪声被添加到隐藏单元时更加强大。Dropout方法是这种做法的主要发展方向。
  22. 迁移学习:迁移学习和领域自适应指的是用一个任务中已经学到的内容去改善另一个任务中的泛化情况。把训练好的模型参数迁移到新的模型来帮助新模型的训练。考虑到大部分数据或任务是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可以理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率,不用从零开始学习。

未完待续。。。。今天太累了,写不下去了,之后慢慢补全,找工作实习艰难啊~深度学习面试知识点归纳总结_第1张图片

你可能感兴趣的:(deep-learning)