【算法岗必看系列】深度学习高频面试题一
前言
大家好,我是鬼仔里,是去年毕业的应届生,目前就职于腾讯应用研究岗位。最近正值招聘季,准备整理下自己以前搜集的一些高频算法岗面试题,做成一个系列,分享给牛友们。上个月写了第一篇,感兴趣的牛友们可以复习下:https://www.nowcoder.com/discuss/873063 。这篇主要想写下深度学习相关的面试题,题目较为基础,主要是为了查缺补漏,后续会持续更新进阶的面试题,欢迎同学们点赞收藏关注!
一、介绍一下卷积神经网络
卷积神经网络是一种更适合图像、语音识别任务的神经网络结构。先说全连接神经网络为什么不太适合图像识别任务,一是参数太多,二是没有利用像素之间的位置信息,三是网络层数限制,全连接网络超过三层很容易出现梯度消失问题。然后说说卷积神经网络,一个卷积神经网络由若干卷积层、池化层、全连接层组成。
卷积神经网络几个特点:
- 激活函数一般用relu,能有效减轻梯度消失的问题。
- 局部感受野,卷积神经网络的输入不需要转换成一维向量,比如一张图像28x28x3,这就是一个输入,而局部感受野就是一个区域,比如5x5的区域,通过在图像上向右或向下移动感受野,每次移动都把感受野里的像素和卷积核做一个卷积运算得到一个新的值(实际就是每个相对应的元素相乘求和),输入层和隐藏层只是一个局部连接。
- 共享权值。对隐藏层每一个元素都使用相同的权值,也就是用同一个卷积核,这大大减少了卷积网络的参数。
- 卷积层之间会周期地插入一个池化层,池化层的作用是逐渐降低数据体的空间尺寸,这样就能减少网络中参数的数量,同时控制过拟合。
二、最优化方法
最优化方法包括一阶的最优化算法(梯度下降)和二阶的最优化算法(牛顿法)。
1. 一阶的最优化算法:梯度下降方法
1.1 批量梯度下降(BGD):批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
- 优点:(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行,迭代的次数相对较少。(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
- 缺点:(1)当样本数目很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
1.2 随机梯度下降(SGD):每次迭代使用一个样本来对参数进行更新。使得训练速度加快。
- 优点:(1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
- 缺点:(1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。(2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。(3)不易于并行实现。
1.3 小批量梯度下降(MBGD):是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代使用 batch_size个样本来对参数进行更新。
- 优点:(1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。(2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(3)可实现并行化。
- 缺点:(1)batch_size的不当选择可能会带来一些问题。
1.4 batch_size的选择带来的影响:
- 在合理地范围内,增大batch_size的好处:(1)内存利用率提高了,大矩阵乘法的并行化效率提高。(2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。(3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
- 盲目增大batch_size的坏处:(1)内存利用率提高了,但是内存容量可能撑不住了。(2)跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。(3)Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
2. 二阶的最优化算法:牛顿法
牛顿法是用来求方程根的,但求方程根和求极值本质上是一个问题,因为求极值就是求导数为0的点,即导数方程的根。求一元方程根的时候,随机一个初始点,求它的切线,找到切线和x轴的交点对应的函数点,再求切线,这样迭代就能找到根。求极值就是求导函数的根,所以二次导数是斜率,可以求到导函数的切线。
- 牛顿法推理:利用泰勒展开公式。
- 牛顿法存在的问题:Hessian矩阵的逆矩阵计算量大,且可能不可逆。当目标函数非凸时,更容易收敛到鞍点。
- 拟牛顿法:用一个正定矩阵近似牛顿法中的海塞矩阵的逆矩阵H-1。常用的有DFP、BFGS
- 牛顿法和梯度下降法的区别:牛顿法是二阶的,梯度下降是一阶的,牛顿法的收敛速度更快,梯度下降法只考虑了方向,而牛顿法还兼顾了步子的大小。
三、循环神经网络
循环神经网络是一种适合处理数据有先后顺序的一种神经网络结构。循环神经网络中隐藏层的输出不仅取决于当前的输入x,还取决于上一次隐藏层的输出值。训练方法常用BPTT算法,其与标准的反向传播算法基本一样,不同点在于我们计算权重的梯度时要把每个时刻的加起来。
四、批量归一化(Batch Normalization)
Batch Normalization是一个自适应的重新参数化的方法,它给每层的输出都做一次归一化(网络上相当于加了一个线性变换层), 使得下一层的输入接近高斯分布。其基本思想是:因为深层神经网络在做非线性变化前的激活函数值随着网络加深或训练过程中,会逐渐发生偏移,往往是朝着激活函数的饱和区靠近,所以BN就是通过一定的规范化手段,对每个隐藏层神经元,把他的输入分布强制拉回到标准正态分布里,使得激活函数的输入值落入到比较敏感的区域,有效避免梯度消失问题。
- 主要优点:可以使用较高的学习率(梯度更具有预测性和稳定性),加快网络的训练速度,提升效果。缓解梯度爆炸和梯度消失的现象(BN规范化把梯度缩放到一个比较合理的取值范围)。减少对参数初始化方法的依赖(各层输入输出具有相同的统计分布)
五、梯度消失和梯度爆炸
1. 梯度消失的原因
根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。
2. 梯度爆炸的原因
根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大。
3. 解决办法
采用Relu激活函数;引入Bacth Nomalization。
六、过拟合
过拟合是指模型参数在拟合过程中,把抽样误差和噪声都拟合了,具体表现为模型在训练集上效果好,在测试集上效果差,模型的泛化能力弱。原因主要有两个:数据太少和模型太复杂。
常用的解决方法:
- 提前停止训练:如在训练中多次迭代后发现模型性能没有显著提高就停止训练
- 数据集扩增:获取更多的数据、原有数据加随机噪声、重采样
- 正则化,正则化可以限制模型的复杂度
- 改善网络结构,dropout随机失活,BN批量归一化
- 特征选择/特征降维,结合多种模型
- 交叉验证,创建一个验证集是最基本的防止过拟合的方法。我们最终训练得到的模型目标是要在验证集上面有好的表现,而不是训练集。