深度学习面试题
一、神经网络基础问题
(1)Backpropagation(反向传播)
后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。
(2)梯度消失、梯度爆炸
梯度消失:这本质上是由于激活函数的选择导致的, 最简单的sigmoid函数为例,在函数的两端梯度求导结果非常小(饱和区),导致后向传播过程中由于多次用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就出现了梯度消失的现象。
梯度爆炸:同理,出现在激活函数处在激活区,而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多。
(3)过拟合
过拟合的原因是算法的学习能力过强;一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。
处理方法:
1、早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练
数据集扩增:在原始数据上做改动,从而可得到更多的数据,做各种变换。如:将原始图片旋转一个小角度;在图像上添加噪声;做一些有弹性的畸变;截取原始图像的一部分、原有数据加随机噪声、重采样
2、正则化 L1 regularization,L2 regularization,
3、交叉验证
4、特征选择/特征降维
5、增加网络的稀疏度,降低网络的复杂度(深度)
6、添加Dropout,适当降低Learning rate,适当减少epoch的次数
(4) 为何使用Batch Normalization:
若用多个梯度的均值来更新权重的批量梯度下降法可以用相对少的训练次数遍历完整个训练集,其次可以使更新的方向更加贴合整个训练集,避免单个噪音样本使网络更新到错误方向。然而也正是因为平均了多个样本的梯度,许多样本对神经网络的贡献就被其他样本平均掉了,相当于在每个epoch中,训练集的样本数被缩小了。batch中每个样本的差异性越大,这种弊端就越严重。一般的解决方法就是在每次训练完一个epoch后,将训练集中样本的顺序打乱再训练另一个epoch,不断反复。这样重新组成的batch中的样本梯度的平均值就会与上一个epoch的不同。而这显然增加了训练的时间。同时因为没办法保证每次更新的方向都贴合整个训练集的大方向,只能使用较小的学习速率。这意味着训练过程中,一部分steps对网络最终的更新起到了促进,一部分steps对网络最终的更新造成了干扰,这样“磕磕碰碰”无数个epoch后才能达到较为满意的结果。
为了解决这种“不效率”的训练,BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布。
(5) 神经网络模型优化的常用方案
1、增加(减少)隐藏层的复杂度,如增加隐藏层数,调整隐藏层的神经元个数,或者在隐藏层使用更加复杂的网络结构,如CNN、RNN、LSTM、GRU或者增加Attention层等等;
2、添加Dropout层,使用Dropout的原理优化网络参数,防止过拟合;
3、尝试不同的优化器,常用的优化器包括SGD、Adam、RMSprop(动量相关);
4、增加迭代次数,一般为了快速检验模型效果训练次数比较少,优化过程中可以增加训练次数;
5、调整优化器的学习率,学习率太小会造成模型收敛速度下降,还有可能求出的是局部最优解,训练模型时的损失函数下降慢;学习率过大会引起模型无法到达最优解,在最优解附近来回跳转,但是一般情况下学习率并不是一成不变的,而是随着模型的训练在优化;
6、增加批处理的大小,采用批处理的方式训练数据时每个batch的数据进行一次反向传播,更新参数,所以每个batch的数据分布对模型训练有着一定的影响,调整batch_size的大小,对模型优化有一定的作用;
7、正则化,可以优化模型太过复杂而引起运行时间过长的问题,也可以在一定程度上防止模型过拟合。(过拟合也就是模型把训练数据的内部关系都记下来了,在训练集损失函数很小,但是在测试集上损失函数开始增大,也就是在测试集上的效果开始下降)
(6)常用特征提取方法
1、潜在语义索引:利用SVD奇异值分解方法来获得文本的主题
2、主成分分析(PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
3、线性判别分析
在自然语言处理领域, LDA是隐含狄利克雷分布,他是一种处理文档的主题模型。LDA是一种监督学习的降维技术,而PCA是无监督的降维技术,LDA是在降维的基础上考虑了类别的因素,希望得到的投影类内方差最小,类与类之间的方差最大。
(7)为什么要卷积?
第一种称为参数共享。理想的是,在图像的一个部分中有用的特征检测器可能在图像的另一部分中有用。例如,边缘检测器可能对图像的许多部分有用。参数的共享允许参数的数量很小并且还允许稳健的平移不变性。翻译不变性是指猫移动和旋转的概念仍然是猫的图片。
第二个被称为稀疏连接。每个输出层只是少量输入的函数(特别是滤波器大小的平方)。这大大减少了网络中的参数数量,并允许更快的培训。
二、CNN、RNN、DNN相关问题
1. CNN的三个优点:
sparse interaction(稀疏的交互),parameter sharing(参数共享),equivalent respresentation(等价表示)。适合于自动问答系统中的答案选择模型的训练。
2. CNN与DNN的区别:
DNN的输入是向量形式,并未考虑到平面的结构信息,在图像和NLP领域这一结构信息尤为重要,例如识别图像中的数字,同一数字与所在位置无关(换句话说任一位置的权重都应相同),CNN的输入可以是tensor,例如二维矩阵,通过filter获得局部特征,较好的保留了平面结构信息。
3. filter尺寸计算:
Feature Map的尺寸等于(input_size + 2 * padding_size − filter_size)/stride+1
4. RNN为什么具有记忆功能?
这个是在RNN就解决的问题,就是因为有递归效应,上一时刻隐层的状态参与到了这个时刻的计算过程中,直白一点呢的表述也就是选择和决策参考了上一次的状态。
5. 为什么LSTM记的时间长?
因为特意设计的结构中具有CEC的特点,误差向上一个状态传递时几乎没有衰减,所以权值调整的时候,对于很长时间之前的状态带来的影响和结尾状态带来的影响可以同时发挥作用,最后训练出来的模型就具有较长时间范围内的记忆功能。
误差回传的主力还是通过了Memory Cell而保持了下来。所以我们现在用的LSTM模型,依然有比较好的效果。
最后整个梳理一下误差回传的过程,误差通过输出层,分类器,隐层等进入某个时刻的Block之后,先将误差传递给了Output Gate和Memory Cell两个地方。
到达输出门的误差,用来更新了输出门的参数w,到达Memory Cell之后,误差经过两个路径:一是通过这个cell向前一个时刻传递或者更前的时刻传递,二是用来传递到input gate和block的输入,用来更新了相应的权值(注意!不会经过这里向前一个时刻传递误差)。
最关键的问题就是,这个回传的算法,只通过中间的Memory Cell向更前的时刻传递误差。
在RNN中U、V、W的参数都是共享的,也就是只需要关注每一步都在做相同的事情,只是输入不同,这样来降低参数个数和计算量。
6. RNN特点:
时序长短可变(只要知道上一时刻的隐藏状态ht−1ht−1与当前时刻的输入xtxt,就可以计算当前时刻的隐藏状态htht。并且由于计算所用到的WxhWxh与WhhWhh在任意时刻都是共享的。递归网络可以处理任意长度的时间序列)顾及时间依赖,未来信息依赖(双向递归)
7. RNN主要包括LSTM,GRU
GRU对LSTM做了两个大改动:将输入门、遗忘门、输出门变为两个门:更新门(Update Gate)和重置门(Reset Gate); 将单元状态与输出合并为一个状态。
GRU只用了两个gates,将LSTM中的输入门和遗忘门合并成了更新门。并且并不把线性自更新建立在额外的memory cell上,而是直接线性累积建立在隐藏状态上,并靠gates来调控。
三、招聘需求
1.有过ocr(光学字符识别)、人脸识别或其他图像识别相关工作或研究经验者优先;
2.熟悉至少一种常用的深度学习框架比如pytorch,tensorflow,Caffe,MxNet等
3.在遥感图像处理、目标检测与分割框架(Mask_Rcnn、Yolo等)、对arcmap或者QGIS等地理信息软件的处理等等有实践经验
4.熟悉python、C/C++、Git
5.用过opencv(计算机视觉库)、dlib(机器学习、人脸识别相关库),CNN、RNN等深度学习算法,熟悉一些常用的机器学习算法比如SVM,adaboost等
6、较流畅的英文技术材料阅读能力;对系统优化和算法模型应用有浓厚兴趣;阅读过相关源码,理解该类架构设计者优先;具备分布式计算框架的使用和并行算法的开发经验者优先。
7、精通Linux系统应用开发;了解机器学习算法原理,对算法高效实现有浓厚兴趣,有一定机器学习算法实现经验;有并行计算、GPU计算相关经验者优先。