深度学习常见面试题目

基础知识题:

1. 如何解决过拟合?如何提高模型的泛化能力

欠拟合指模型无法得到较低的训练误差;
过拟合指模型的训练误差远小于它在测试数据集上的误差。

解决过拟合

  • 选择复杂度合适的模型
  • 避免使用过少的训练样本,收集更多的数据
  • 使用丢弃法(dropout)
  • 使用early stopping
  • 用L1正则化和L2正则化降低模型的复杂度

提高模型的泛化能力
数据上提升性能:

  1. 收集更多的数据。
  2. 对数据做缩放和变换。
  3. 特征组合和重新定义问题。

算法调优上提升性能:用可靠的模型诊断工具对模型进行诊断,

  1. 权重的初始化,用小的随机数初始化权重。
  2. 对学习率进行调节。
  3. 尝试选择合适的激活函数。
  4. 调整网络的拓扑结构。
  5. 调节batch和epoch的大小。
  6. 添加正则化的方法。
  7. 尝试使用其它的优化方法,使用early stopping。

2. L1和L2的区别,各自的优缺点,L1为什么产生稀疏解

知乎详解
l1 loss在零点不平滑,用的较少。一般来说,l1正则会制造稀疏的特征,大部分无用的特征的权重会被置为0。
(适合回归任务,简单的模型,由于神经网络通常解决复杂问题,很少使用。)

l2 loss:对离群点比较敏感,如果feature是unbounded的话,需要好好调整学习率,防止出现梯度爆炸的情况。l2正则会让特征的权重不过大,使得特征的权重比较平均。
(适合回归任务,数值特征不大)

smooth l1 loss修改零点不平滑问题,L1-smooth比l2 loss对异常值的鲁棒性更强。具有l1和l2的优点,当绝对差值小于1,梯度不至于太大,损失函数较平滑,当差别大的时候,梯度值足够小,较稳定,不容易梯度爆炸。
(回归,当特征中有较大的数值,适合大多数问题)

3. Batchnorm的作用

各种norm
motivation
首先,在进行训练之前,一般要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布
此外,为了解决internal covarivate shift问题,这个问题定义是随着batch normalization这篇论文提出的,在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。

所以batch normalization就是强行将数据拉回到均值为0,方差为1的正太分布上,这样不仅数据分布一致,而且避免发生梯度消失。

此外,internal corvariate shift和covariate shift是两回事,前者是网络内部,后者是针对输入数据,比如我们在训练数据前做归一化等预处理操作。

在这里插入图片描述
加入缩放平移变量的原因是:保证每一次数据经过归一化后还保留原有学习来的特征,同时又能完成归一化操作,加速训练。 这两个参数是用来学习的参数

BN在训练测试时是不同的,测试freeze了参数

BN层的作用是把一个batch内的所有数据,从不规范的分布拉到正态分布。这样做的好处是使得数据能够分布在激活函数的敏感区域,敏感区域即为梯度较大的区域,因此在反向传播的时候能够较快反馈误差传播。避免梯度消失的问题.

4. 梯度消失,梯度爆炸的原因,如何解决?

参考

原因:

梯度消失的根源—–深度神经网络和反向传播
两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。梯度爆炸一般出现在深层网络权值初始化值太大的情况下。

1. 深层网络角度:
对激活函数进行求导,如果此部分大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果此部分小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失

总结:从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

2. 激活函数角度
计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了。
如果使用sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。
同理,tanh作为激活函数比sigmoid要好一些,但是它的导数仍然是小于1的。

解决方案

方案1-预训练加微调
采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。
此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
方案2-梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是 l 1 l_1 l1正则和 l 2 l_2 l2正则。
正则化是通过对网络权重做正则限制过拟合,仔细看正则项在损失函数的形式:
L o s s = ( y − W T x ) 2 + α ∣ ∣ W ∣ ∣ 2 Loss=(y-W^Tx)^2+\alpha||W||^2 Loss=(yWTx)2+αW2
其中, α \alpha α是指正则项系数,因此,如果发生梯度爆炸,权值的范数就会变的非常大,通过正则化项,可以部分限制梯度爆炸的发生。
方案3-relu、leakrelu、elu等激活函数
Relu思想也很简单,如果激活函数的导数为1,那么就不存在梯度消失爆炸的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。
在这里插入图片描述
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu的主要贡献在于:
– 解决了梯度消失、爆炸的问题
– 计算方便,计算速度快
– 加速了网络的训练
同时也存在一些缺点:
– 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
– 输出不是以0为中心的
leakrelu
leakrelu就是为了解决relu的0区间带来的影响,其数学表达为: l e a k r e l u = m a x ( k ∗ x , x ) leakrelu=max(k∗x,x) leakrelu=max(kx,x)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
在这里插入图片描述
leakrelu解决了0区间带来的影响,而且包含了relu的所有优点。
elu
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:在这里插入图片描述
在这里插入图片描述
elu相对于leakrelu来说,计算要更耗时间一些
解决方案4-batchnorm
Batchnorm本质上是解决反向传播过程中的梯度问题,具有加速网络收敛速度,提升训练稳定性的效果。
通过规范化操作将输出信号x规范化保证网络的稳定性。
具体来说就是反向传播中,经过每一层的梯度会乘以该层的权重,举个简单例子:
正向传播中
f 2 = f 1 ( w T ∗ x + b ) f_2=f_1(w^T∗x+b) f2=f1(wTx+b),那么反向传播中, ∂ f 2 ∂ w = ∂ f 2 ∂ f 1 x \frac{\partial f_2}{\partial w}=\frac{\partial f_2}{\partial f_1}x wf2=f1f2x
反向传播式子中有x的存在,所以x的大小影响了梯度的消失和爆炸,batchnorm就是通过对每一层的输出规范为均值和方差一致的方法,消除了x带来的放大缩小的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
解决方案5-残差结构
短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。所以残差学习会更容易。

5. 如何解决模型不收敛问题?

原因:
1. 数据和标签
数据分类标注是否准确?数据是否干净?数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题。
2. 学习率设定不合理
在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡
有的时候候学习率太低走不出低谷,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。
3. 网络设定不合理
如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛。可以尝试加深当前网络。
4. 数据集label的设置
检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。
5. 数据归一化
一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化

6. 优化器的区别,SGD,Adam, RMSP等

参考我的博客专栏深度学习optimizer
sgd:
每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定。
缺点:
Mini-batch gradient descent 不能保证很好的收敛性,
learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。
有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate。
SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定
Momentum
模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
Adagrad
上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。
自适应地为各个参数分配不同学习率的算法。
缺点:
其学习率是单调递减的,训练后期学习率非常小
其需要手工设置一个全局的初始学习率
更新xt时,左右两边的单位不统一
Adadelta
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。
Adam
就是在 RMSprop 的基础上加了 bias-correction 和 momentum

7. Xgboost和GBDT的区别,如何改进和提升Xgboost模型?

知乎

传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
**xgboost在代价函数里加入了正则项,用于控制模型的复杂度。**正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

8. Svm如何解决不容易找到超平面的问题?

知乎SVM

9. 什么是线性模型?LR为什么是线性模型?

线性模型可以是用曲线拟合样本,但是分类的决策边界一定是直线的,例如logistics模型。
区分是否为线性模型,主要是看一个乘法式子中自变量x前的系数w,如果w只影响一个x,那么此模型为线性模型。或者判断决策边界是否是线性的。
最简单判别一个模型是否为线性的,只需要判别决策边界是否是直线,也就是是否能用一条直线来划分。
虽然逻辑回归的模型特征经过非线性函数Sigmoid的转换,但是它的决策边界是线性方程,所以逻辑回归LR是非常典型的线性分类器。
参考知乎

10. Sigmoid和relu的区别

Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象

relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。

算法题:

1. 递归和迭代的反转链表

2. 输出完全二叉树的最后一排最后一个node,要求时间复杂度小于O(n),树的剪枝

3. 合并K个有序链表

4. 两数之和的各种变型

5. m*n矩阵从左上角走到右下角一共有多少种走法?如果有障碍物的话怎么求?求最大的路径和?先从左上到右下在从右下返回到左上,重复走的节点值为0,求两条路径加和最大值?(都是DP)

LeetCode(不同路径)

场景题:

1. 斗地主有人拿到两张王的概率

解法一:
一共54张牌,其中地主20张,两个农民各17张。
将牌重新组合,将54张牌一次排成一列,分成三堆,前20张给地主,中间17张给第一个农民,最后17张给第二个农民。
问题关键:仅考虑大小王的位置,而不考虑其他所有牌。
所有情况: A 54 2 = 54 ∗ 53 A_{54}^2=54*53 A542=5453
王炸在地主手里: A 20 2 = 20 ∗ 19 A_{20}^2=20*19 A202=2019
王炸在农民手里: 2 A 17 2 = 2 ∗ 17 ∗ 16 2A_{17}^2=2*17*16 2A172=21716
所求概率为:
在这里插入图片描述
解法二:
一副牌54张,斗地主时并不是每个人拿18张,而是两个人拿17张一个人拿20张,每种分配方式的概率是相同的,一共有 C 54 20 C 34 17 C 17 17 C_{54}^{20}C_{34}^{17}C_{17}^{17} C5420C3417C1717 种。如果王炸在地主(拿20张牌者)手上,共有种 C 2 2 C 52 18 C 34 17 C 17 17 C_{2}^{2}C_{52}^{18}C_{34}^{17}C_{17}^{17} C22C5218C3417C1717 情况,即先把王炸给地主,再给地主补足牌,最后分配农民的牌;如果王炸在农民(拿17张牌者)手上,共有 2 C 2 2 C 52 15 C 37 20 C 17 17 2C_{2}^{2}C_{52}^{15}C_{37}^{20}C_{17}^{17} 2C22C5215C3720C1717 种情况,即先把王炸给农民,再给他补足手牌,然后给地主分牌,最后给第二个农民分牌。由于两个农民是对称的,因此乘2.按照这个模型,所求概率即为两种符合条件概率相加除以总方法数,结果约为154/477,约等于32.28%

2. 百度搜索为什么快?

倒排

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
诸葛耘墒AI面试题: 1. 请解释一下深度学习中的“梯度消失”问题。 深度学习中的“梯度消失”问题指的是在深层神经网络中,梯度反向传播时逐层乘以权重,导致梯度逐渐变小并且趋向于消失的现象。该问题出现的主要原因是神经网络的参数初始化不恰当或者所用的激活函数导致梯度传播时的缩放问题。为解决这一问题,可以采用合适的参数初始化方法,如Xavier初始化;或者使用激活函数ReLU等。 2. 请简要介绍一下卷积神经网络(CNN)的原理。 卷积神经网络(CNN)是一种特殊的神经网络结构,主要用于图像和视频处理任务。CNN的核心思想是通过卷积层、池化层和全连接层等模块来提取并学习图像特征。它采用多个卷积核对输入数据进行卷积操作,从而实现对特征的提取和抽象。通过卷积和池化层的交替使用,CNN可以逐渐缩小特征图的尺寸并增加特征的数量。最后,通过全连接层将提取到的特征进行分类或回归等任务。 3. 请解释一下生成对抗网络(GAN)的原理。 生成对抗网络(GAN)是一种由生成器网络和判别器网络组成的对抗模型。生成器网络负责生成与训练样本相似的虚拟样本,而判别器网络负责区分真实样本和虚拟样本。GAN的核心思想是通过两个网络的对抗学习,使生成器网络逐渐提高生成虚拟样本的能力,同时判别器网络也逐渐提高对虚拟样本的判断能力。最终标是使生成器能够生成逼真的虚拟样本。 4. 请简要介绍一下自然语言处理(NLP)中的词嵌入技术。 自然语言处理中的词嵌入技术是将文本中的单词表示为连续向量空间中的向量,使得具有相似语义的单词在向量空间中距离较近。常见的词嵌入方法有One-hot编码和Word2Vec等。One-hot编码是使用多维向量表示单词,每个维度代表一个词汇,向量的元素为0或1,表示该维度上对应的单词是否存在。Word2Vec是一种基于神经网络的词嵌入方法,通过训练神经网络模型,将单词映射为稠密向量,并保留了部分语义信息。词嵌入技术提供了一种有效的方式来表示和处理文本数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值