深度学习面试每日一题

1、反卷积(deconvolution)

  • 反卷积的用途:实现上采样,近似重构输入图像,卷积层可视化。

  • 反卷积也称为转置卷积,如果用矩阵乘法实现卷积操作,将卷积核平铺为矩阵,则转置卷积在正向计算时左乘这个矩阵的转置W^{T},在反向传播时左乘W,这与卷积操作刚好相反。即卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘WW^{T},而反卷积层的前向反向计算分别为乘W^{T}W。需要注意的是,反卷积不是卷积的逆运算。

  • 卷积:Y=WX,反卷积:X=W^{T}Y

  • 卷积层输入特征与输出特征尺寸和卷积核参数的关系为:o = \left \lfloor \frac{i+2p-k}{s} \right \rfloor + 1,其中i为输入特征尺寸,p为padding,k为kernel_size,s为stride,o为输出特征尺寸。

2、梯度下降算法

  • 介绍:假设我们有一个可微分的函数,我们的目标就是找到这个函数的最小值。在函数中,我们需要找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快。因为梯度的方向就是函数之变化最快的方向。我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值。
  • 梯度的意义:
    • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率。
    • 在多变量的函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。
  • \Theta ^{1}=\Theta ^{0}-\alpha J(\Theta ),此公式的意义是:J是关于\Theta的一个函数,我们当前所处的位置为\Theta ^{0}点,要从这个点走到J的最小值点。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是\alpha,走完这段步长,就到达了\Theta ^{1}这个点。然后反复迭代,直至找到最小值点。\alpha在梯度下降算法中被称作为学习率或者步长,不能太大也不能太小。梯度前加一个负号,就意味着朝着梯度相反的方向前进。
  • 梯度下降算法(图像分类训练)的步骤:
    1. 用随机值初始化权重和偏差。
    2. 把输入传入网络,得到输出值。
    3. 计算预测值和真实值之间的误差。
    4. 对每一个产生误差的神经元,调整相应的权重值以减少误差。
    5. 重复迭代,直至得到网络权重的最佳值。

3、Dropout

  • Dropout出现的原因:在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。过拟合的具体表现:模型在训练数据上损失函数较小,预测准确率较高,但是在测试数据上损失函数表较大,预测准确率较低。如果模型过拟合,那么得到的模型几乎不能用,为了解决过拟合问题,一般会采用模型集成的办法,即训练多个模型进行组合,但是此时训练多个模型很费时。Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。
  • Dropout的介绍:Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。Dropout说简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,以为它不会太依赖某些局部的特征。
  • Dropout具体工作流程
    1. 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变。
    2. 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照梯度下降法更新对应的参数(w,b)。
    3. 然后不断重复这一过程:恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新);从隐藏神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数);对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b)(没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
  • Dropout在神经网络中的使用:在训练模型阶段,需要在训练网络的每个单元都要添加一道概率流程,即让哪些隐层节点值为0;在测试模型阶段,需要对每一个神经单元的权重参数乘以概率p。
  • Dropout的具体作用
    • 取平均的作用:如果是训练多个模型解决过拟合问题时,最后采用的是多个模型结果的均值或者多数取胜的投票策略。而Dropout随机去掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一般隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均,而不同的网络产生不同的拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
    • 减少神经元之间复杂的共适应关系:因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特性仅仅在其它特定特征下才有效果的情况。迫使网络去学习更加鲁棒性的特征,这些特征在其他的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看Dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
    • Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

4、下面哪项操作能首先跟神经网络中Dropout的类似效果:

  • A.Boosting 
  • B.Bagging 
  • C.Stacking 
  • D.Mapping

解析

  • 典型的神经网络训练过程是将输入通过网络进行正向传导,然后将误差进行反向传播,Dropout就是针对这一过程之中,随机地删除隐藏神经层的部分单元,然后进行上述过程。步骤为:1)随机删除网络中的一些隐藏神经元,保持输入输出神经元保持不变;2)将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播;3)然后重复上述操作。Dropout可以有效地减轻过拟合的发生,一定程度上达到了正则化的效果。
  • A:Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。B:Bagging同样是弱分类组合的思路,它首先随机地抽取训练集,以之为基础训练多个弱分类器。然后通过取平均,或者投票的方式决定最终的分类结果。因为它随机选取训练集的特点,Bagging可以以一定程度上避免过拟合。C.Stacking所做的是在多个分类器的结果上,再套一个新的分类器。这个新的分类器就基于弱分类器的分析结果,加上训练标签进行训练。一般最后一层用的是LR。D: Sammon Mapping降维算法。

5、生成对抗网络(GAN)简述

  • GAN之所以是对抗的,是因为GAN的内部是竞争关系,一方叫generator,它的主要工作是生成图片,并且尽量使得其看上去是来自于训练样本的。另一方是discriminator,其目标是判断输入图片是否属于真实训练样本。GAN的主要思想是拥有两个竞争的神经网络模型。一个将噪声数据作为输入,并产生样本(所谓的生成器)。另一个模型(称为判别器)从生成器和训练数据接受样本,并且必须能够区分两个来源。这两个网络进行连续的博弈,生成器学习产生越来越多的现实样本,鉴别器学习越来越好地区分生成的数据和实际数据。这两个网络同时进行训练,最后的希望是竞争能够使得生成器生成的样本与实际数据不可区分。

6、参数初始化

  • 简介:神经网络的训练过程中的参数学习是基于梯度下降法进行优化的。梯度下降法需要在开始训练时给每一个参数赋一个初始值。这个初始值的选取十分关键,一般我们希望数据和参数的均值都为0,输入和输出数据的方差一致。在实际应用中,参数服从高斯分布或者均匀分布都是比较有效的初始化方式。一个好的权重初始化有利于模型性能和收敛速度,对解决梯度消失和梯度爆炸有很大的帮助。
  • 参数初始化分类:
    • 全零初始化:每层中的每个神经元都将学习到同样的东西,无法打破对称性。为什么将所有权重初始化为0是错误的?因为如果所有的参数都是0,那么所有神经元的输出都将是相同的,那在back propagation的时候同一层内所有的神经元的行为也是相同的(梯度相同,权重更新也相同),这显然是一个不可接受的结果。
    • 随机初始化:网络输出数据分布的方差会随着输入神经元个数改变。这个方法是由弊端的,一旦随机分布选择不当,就会导致网络优化陷入困境(导致梯度很小,使得参数难以被更新)。
    • Xavier初始化:没有考虑激活函数对输出数据分布的影响。它的思想是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0
    • He初始化:考虑了ReLU对输出数据分布的影响,使得输入和输出数据方差一致。He初始化的思想是:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以要保持方差不变,只需要在Xavier的基础上再除以2。推荐在ReLU中使用。
    • 随机初始化With BN:BN减少了网络对初始值尺度的依赖,使用较小的标准差初始化即可。BN是一种巧妙而粗暴的方法来削弱bad initialization的影响。我们想要的是在非线性激活之前,输出值应该有比较好的分布(例如高斯分布),以便于反向传播时计算梯度,更新权重。BN将输出值强行做一次Gaussian Normalization和线性变化。
    • Pre-train初始化:将预训练模型的参数作为新任务上模型的参数初始化(fine-tuning)。
  • 总结:
    • 使用ReLU(without BN)激活函数时,最好选用He初始化方法,将参数初始化服从高斯分布或者均匀分布的较小随机数。
    • 使用BN时,减少了网络对参数初始值尺度的依赖,此时使用较小的标准差(如0.01)进行初始化即可。
    • 借助预训练模型中参数作为新任务参数初始化的方式也是一种简便易行且十分有效的模型参数初始化方法。

7、overfitting怎么解决

  • overfitting介绍:所谓过拟合,指的是一个模型过于复杂之后,它可以很好地”记忆“每一个训练数据中随机噪音的部分而忘记了去”训练“数据中的通用趋势。过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。
  • 解决办法:
    • 数据增强,增加数据多样性。
    • Parameter Norm Penalties(参数范数惩罚),使用L1,L2参数惩罚限制模型的能力,从而降低过拟合风险。
    • Dropout。
    • 模型融合,比如Bagging和其他集成方法。
    • BN(Batch Normalization)。
    • Early Stopping(提前终止训练)。基于梯度下降的深度学习算法都存在一个训练周期的问题,训练的次数越多,训练错误率就越低。由于我们真正目的是降低测试错误率,因此我们期望验证错误率也与训练错误率有相似的曲线,但期望总是事与愿违,真实环境的验证错误率并没有随着训练次数的增多而减少,而是形成了一种"U型"曲线,验证错误率先减小后上升。那很自然地,我们就期望能在验证错误率地最低点或者最低点附近停止训练算法,这就是所谓地早停。

8、Bagging vs Boosting

  • Bagging(bootstrap aggregating)算法过程如下:
    1. 从原始样本中抽取训练集。每轮从原始样本集中使用Bootstrapping的方法抽取n个训练样本。共进行k轮抽取,得到k个数据集。(k个训练集之间是相互独立的)
    2. 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。
    3. 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有的模型重要性相同)
  • Boosting主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。即每一轮根据上一轮的分类结果动态调整每个样本在分类器中的权重,训练得到k个弱分类器,他们都有各自的权重,通过加权组合的方式得到最终的分类结果。关于Boosting的两个核心问题:
    1. 在每一轮如何改变训练数据的权值或概率分布?通过提高那些在前一轮被弱分类分错样例的权值,减少前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
    2. 通过什么方式来组合弱分类器?通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
  • Bagging和Boosting两者之间的区别:
    • 样本选择上:
      • Bagging:训练集是在原始集上有放回选取的,从原始集中选出的各轮训练集之间是独立的。
      • Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
    • 样例权重:
      • Bagging:使用均匀取样,每个样例的权重相等。
      • Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
    • 预测函数:
      • Bagging:所有预测函数的权重相等。
      • Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
    • 并行计算:
      • Bagging:各个预测函数可以并行生成。
      • Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
  • 总结:这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高原单一分类器的分类效果,但是也增大了计算量。

9、梯度爆炸

  • 误差梯度是神经网络训练过程中计算的方向和数量,用于以正确的方向和合适的量更新网络权重。
  • 在深层网络或循环神经网络中,误差梯度可在更新中累积,变成非常大的梯度,然后导致网络权重的大幅更新,并因此使网络变得不稳定。在极端情况下,权重的值变得非常大,以至于溢出,导致NaN值。
  • 网络层之间的梯度(值大于1.0)重复相乘导致的指数增长会产生梯度爆炸。

10、梯度消失问题

  • 神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用BP算法,核心思想是:计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。
  • 梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是:许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0,造成学习停止。
  • 缓解梯度消失问题方法:改进激活函数,选用更不容易饱和的函数,如ReLU函数。

11、k折交叉验证

  • 简介:将原始数据集划分为k个子集,将其中一个子集作为验证集,其余k-1个子集作为训练集,如此训练和验证一轮称为一次交叉验证。交叉验证重复k次,每个子集都做一次验证集,得到k个模型,加权平均k个模型的结果作为评估整体模型的依据。
  • 关于k折交叉验证,需要注意什么:k越大,不一定效果越好,而且越大的k会加大训练时间;在选择k时,需要考虑最小化数据集之间的方差,比如对于2分类任务,采用2折交叉验证,即将原始数据集对半分,若此时训练集中都是A类别,验证集都是B类别,则交叉验证效果会非常差。

12、为什么引入非线性激励函数

  • 对于神经网络来说,网络的每一层相当于f(Wx+b)=f(W^{'}x),对于线性函数,其实相当于f(x)=x,那么在线性激活函数下,每一层相当于用一个矩阵乘以x,那么多层就是反复的用矩阵去乘以输入。根据矩阵的乘法法则,多个矩阵相乘得到一个矩阵。所以线性激励函数下,多层网络与一层网络相当。比如,两层的网络f(W_{1}*f(W_{2}x))=W_{1}W_{2}x=Wx
  • 非线性变化是深度学习有效的原因之一。原因在于非线性相当于对空间进行变化,变换完成后相当于对问题空间进行简化,原来线性不可解的问题现在变得可以解了。
  • 如果不用激励函数(其实相当于激励函数是f(x)=x),在这种情况下每一层输出都是上层输入的线性函数,很容易验证,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是原始的感知机(Perceptron)了。

13、为什么引入ReLU

  • 采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。
  • 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
  • ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

14、Batch Size

  • 简介:批尺寸batch size为每次训练样本个数。迭代次数=样本总数/批尺寸。
  • 在合理范围内,增大batch size有何好处:
    • 内存利用率提高了,大矩阵乘法的并行效率提高。
    • 跑完一个epoch所需要的迭代次数减少,对于相同数据量的处理速度进一步加快。
    • 在一定范围内,一般来说batch size越大,其确定的方向下降方向越准,引起的训练震荡越小。
  • 盲目增大batch size有什么坏处?
    • 内存利用率提高了,但是太大的batch size使得内存容量可能撑不住了。
    • 跑完一次epoch所需要的迭代次数减少,但是需要达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    • batch size大到一定的程度,其确定的下降方向已经基本不再变化。

15、偏差(Bias)和方差(Variance)

  • 偏差和方差分别是用于衡量一个模型泛化误差的两个方面:
    • 模型的偏差:指的是模型预测的期望值和真实值之间的差。反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,算法本身的拟合能力。
    • 模型的方差:指的是模型预测的期望值与预测值之间的差平方和。反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反映预测的波动情况。
  • 在监督学习中,模型的泛化误差可分解为偏差、方差与噪声之和。
  • 偏差用于描述模型的拟合能力,方差用于描述模型的稳定性。
  • 欠拟合会出现高偏差问题。
  • 过拟合会出现高方差问题。

16、无监督学习中存在过拟合吗

  • 会的,和监督学习一样,是有可能发生过拟合的,当然也有可能会欠拟合。一个简单的例子使用K-Means做聚类,如果K太小,很可能会发生欠拟合(模型过于笼统);如果K太大,很可能发生过拟合(模型过于细致)。
  • 不光是聚类,其他非监督学习的算法也会出现过拟合。过拟合的本质就是过分地学习了训练样本中的噪音杂质,从而消弱了泛化能力。比如PCA,如果样本中有一些离谱的噪点,PCA算法的损失函数就会很大程度地被噪点影响,当你把训练出来的PCA作用在新的数据集上的时候,你得到的结果也许就非常离谱,因为你对训练集过拟合了。同样的问题也会出现在autoencoder上,在某个数据集上训练出一个autoencoder,网络中的权重或者结构可以用来重建原数据。当你的损失函数没有考虑到正则化的时候或者你的网络很复杂的时候,autoencoder很可能出现过拟合,训练好的autoencoder在新的数据集上作用之后,输出的数值就未必能够复原新数据集了。

17、PCA(主成分分析)

  • 主要功能:降维。那么为什么需要降维了?因为数据中有些内容没有价值,这些内容没有价值,这些内容的存在会影响算法的性能和准确性。
  • PCA和AutoEncoder的区别
    • PCA限制多,要求数据是线性分布的,AutoEncoder可以解决非线性降维问题。
    • PCA理论基础更强,AutoEncoder可解释性差。AutoEncoder通过挖掘潜在特性提高模型性能,但这些模糊的特性获取会对知识发现的结果产生不良影响。
    • PCA计算速度更快。

18、AutoEncoder

  • AutoEncoder是一种特定类型的前馈神经网络,其中输入和输出相同。其将输入压缩为低维的code,然后从这种表现形式上重构输出。code是输入的紧凑“摘要”或者“压缩”。
  • AutoEncoder由三个部分组成:encoder,code和decoder。encoder压缩输入并生成code,然后decoder仅使用这个code重构输入。所以要构建一个AutoEncoder需要三件事情:一种encoder方法,一种encoder方法,以及一个将输出和目标值进行比较的损失函数。
  • AutoEncoder主要是一种降维(压缩)算法,具有一下几个重要属性:
    • 特定于数据:AutoEncoder只能有效地压缩类似于经过训练的数据。由于它们学习特定于给定训练数据的特征,因此它们不同于标准数据压缩算法(例如gzip)。因此,我们不能指望经过手写数字图像训练的AutoEncoder来压缩风景图像。
    • 有损压缩:AutoEncoder的输出和输入将不完全相同,它将是一个近似但退化的表现形式。如果想要无损压缩,则绝非可行之路。
    • 无监督形式:要训练AutoEncoder,我们不需要任何花哨的事情,只需要将原始数据投入其中即可。AutoEncoder被认为是无监督学习技术,因为它们不需要明确的标签来进行训练。但更确切地说,它是自我监督的,因为他们从训练数据中生成自己的标签。
Image for post
AutoEncoder

 

参考资料:

深度学习中Dropout原理解析

深度学习中的参数初始化

Applied Deep Learning - Part 3: Autoencoders

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值