深度学习(二)-----算法岗面试题
● 深度学习了解多少,有看过底层代码吗?caffe,tf?
● 除了GMM-HMM,你了解深度学习在语音识别中的应用吗?
参考回答:
● 用过哪些移动端深度学习框架?
参考回答:
● Caffe:整体架构说一下,新加一个层需要哪些步骤,卷积是怎么实现的,多卡机制,数据并行还是模型并行?
参考回答:
总体来说,caffe是通过Layer
Caffe中卷积运算的原理
俗话说,一图胜千言,首先先给出原理示意图,为了方便理解,这里以二维核为例
滑动窗口在图像中每滑动一个地方,将图像中该滑动窗口图像展开为一列,所有列组成图中的滑动窗口矩阵,这里假设pad=1,stride=1,K=3,则滑动窗口矩阵每行大小为W*H,一共K*K行.
每个核展开为一行,N个核形成的核矩阵大小为N*K*K。
最后将核矩阵和滑动窗口矩阵相乘,每一行就是一个特征图,N个卷积核形成N个特征图。
扩展到三维核
caffe支持多GPU并行了,原理比较简单,就是每个GPU分别算一个batch,n个GPU,实际的batchsize就是n*batch,比如原来用一个GPU,batchsize设置成256,现在用4个GPU,把batchsize设置成64,和原来的一个GPU的运算是等价的。
实际使用的时候基本不用设置,和原来一样编译好就可以用了。命令就是在-gpu 后面对多个GPU号用逗号隔开,比如-gpu 1,2,3,4 就是同时使用1-4共4个GPU,GPU编号可以不连续,或者直接用-gpu all,就是使用所有的GPU。
Caffe是数据并行的。
● BN层的作用,为什么要在后面加伽马和贝塔,不加可以吗
参考回答:
● 梯度消失,梯度爆炸的问题,
参考回答:
● Adam
参考回答:
● attention机制
参考回答:
● RNN梯度消失问题,为什么LSTM和GRU可以解决此问题
参考回答:
● GAN网络的思想
参考回答:
● 1*1的卷积作用
参考回答:
● 怎么提升网络的泛化能力
参考回答:
从算法调优上提升性能:用可靠的模型诊断工具对模型进行诊断,权重的初始化,用小的随机数初始化权重。对学习率进行调节,尝试选择合适的激活函数,调整网络的拓扑结构,调节batch和epoch的大小,添加正则化的方法,尝试使用其它的优化方法,使用early stopping。
● 什么是seq2seq model
参考回答:
● 激活函数的作用
参考回答:
● 为什么用relu就不用sigmoid了
参考回答:
● 讲一下基于WFST的静态解码网络的语音识别流程?
参考回答:
● 目标检测了解吗,Faster RCNN跟RCNN有什么区别
参考回答:
随着计算机技术的发展和计算机视觉原理的广泛应用,利用计算机图像处理技术对目标进行实时跟踪研究越来越热门,对目标进行动态实时跟踪定位在智能化交通系统、智能监控系统、军事目标检测及医学导航手术中手术器械定位等方面具有广泛的应用价值。
使用方法 |
缺点 |
改进 |
|
R-CNN
|
1、SS提取RP; 2、CNN提取特征; 3、SVM分类; 4、BB盒回归。 |
1、 训练步骤繁琐(微调网络+训练SVM+训练bbox); 2、 训练、测试均速度慢 ; 3、 训练占空间 |
1、 从DPM HSC的34.3%直接提升到了66%(mAP); 2、 引入RP+CNN |
Faster R-CNN
|
1、RPN提取RP; 2、CNN提取特征; 3、softmax分类; 4、多任务损失函数边框回归。 |
1、 还是无法达到实时检测目标; 2、 获取region proposal,再对每个proposal分类计算量还是比较大。 |
1、 提高了检测精度和速度; 2、 真正实现端到端的目标检测框架; 3、 生成建议框仅需约10ms。 |
● SPP,YOLO了解吗?
参考回答:
SPP-Net主要改进有下面两个:
1).共享卷积计算、2).空间金字塔池化
在SPP-Net中同样由这几个部分组成:
ss算法、CNN网络、SVM分类器、bounding box
ss算法的区域建议框同样在原图上生成,但是却在Conv5上提取,当然由于尺寸的变化,在Conv5层上提取时要经过尺度变换,这是它R-CNN最大的不同,也是SPP-Net能够大幅缩短时长的原因。因为它充分利用了卷积计算,也就是每张图片只卷积一次,但是这种改进带来了一个新的问题,由于ss算法生成的推荐框尺度是不一致的,所以在cov5上提取到的特征尺度也是不一致的,这样是没有办法做全尺寸卷积的(Alexnet)。
所以SPP-Net需要一种算法,这种算法能够把不一致的输入产生统一的输出,这就SPP,即空间金字塔池化,由它替换R-CNN中的pooling层,除此之外,它和R-CNN就一样了。
YOLO详解:
YOLO的名字You only look once正是自身特点的高度概括。YOLO的核心思想在于将目标检测作为回归问题解决 ,YOLO首先将图片划分成SxS个区域,注意这个区域的概念不同于上文提及将图片划分成N个区域扔进detector这里的区域不同。上文提及的区域是真的将图片进行剪裁,或者说把图片的某个局部的像素扔进detector,而这里的划分区域,只的是逻辑上的划分。
● 梯度消失梯度爆炸怎么解决
参考回答:
sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。
2)、使用批规范化
通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。从上述分析分可以看到,反向传播式子中有w的存在,所以w的大小影响了梯度的消失和爆炸,Batch Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了w带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
● RNN容易梯度消失,怎么解决?
参考回答:
既然在BP过程中会产生梯度消失(就是偏导无限接近0,导致长时记忆无法更新),那么最简单粗暴的方法,设定阈值,当梯度小于阈值时,更新的梯度为阈值。
优点:简单粗暴
缺点:很难找到满意的阈值
2)、LSTM(Long Short-Term Memory)
一定程度上模仿了长时记忆,相比于梯度裁剪,最大的优点就是,自动学习在什么时候可以将error反向传播,自动控制哪些是需要作为记忆存储在LSTM cell中。一般长时记忆模型包括写入,读取,和忘记三个过程对应到LSTM中就变成了input_gate,output_gate,
forget_gate,三个门,范围在0到1之间,相当于对输入输出进行加权的学习,利用大量数据来自动学习加权的参数(即学习了哪些错误可以用BP更新参数)。具体的公式表达:
优点:模型自动学习更新参数
● LSTM跟RNN有啥区别
参考回答:
RNN在处理long term memory的时候存在缺陷,因此LSTM应运而生。LSTM是一种变种的RNN,它的精髓在于引入了细胞状态这样一个概念,不同于RNN只考虑最近的状态,LSTM的细胞状态会决定哪些状态应该被留下来,哪些状态应该被遗忘。
下面来看一些RNN和LSTM内部结构的不同:
RNN
LSTM
由上面两幅图可以观察到,LSTM结构更为复杂,在RNN中,将过去的输出和当前的输入concatenate到一起,通过tanh来控制两者的输出,它只考虑最近时刻的状态。在RNN中有两个输入和一个输出。
而LSTM为了能记住长期的状态,在RNN的基础上增加了一路输入和一路输出,增加的这一路就是细胞状态,也就是途中最上面的一条通路。事实上整个LSTM分成了三个部分:
1)哪些细胞状态应该被遗忘
2)哪些新的状态应该被加入
3)根据当前的状态和现在的输入,输出应该是什么
下面来分别讨论:
1)哪些细胞状态应该被遗忘
这部分功能是通过sigmoid函数实现的,也就是最左边的通路。根据输入和上一时刻的输出来决定当前细胞状态是否有需要被遗忘的内容。举个例子,如果之前细胞状态中有主语,而输入中又有了主语,那么原来存在的主语就应该被遗忘。concatenate的输入和上一时刻的输出经过sigmoid函数后,越接近于0被遗忘的越多,越接近于1被遗忘的越少。
2)哪些新的状态应该被加入
继续上面的例子,新进来的主语自然就是应该被加入到细胞状态的内容,同理也是靠sigmoid函数来决定应该记住哪些内容。但是值得一提的是,需要被记住的内容并不是直接
concatenate的输入和上一时刻的输出,还要经过tanh,这点应该也是和RNN保持一致。并且需要注意,此处的sigmoid和前一步的sigmoid层的w和b不同,是分别训练的层。
细胞状态在忘记了该忘记的,记住了该记住的之后,就可以作为下一时刻的细胞状态输入了。
3)根据当前的状态和现在的输入,输出应该是什么
这是最右侧的通路,也是通过sigmoid函数做门,对第二步求得的状态做tanh后的结果过滤,从而得到最终的预测结果。
事实上,LSTM就是在RNN的基础上,增加了对过去状态的过滤,从而可以选择哪些状态对当前更有影响,而不是简单的选择最近的状态。
在这之后,研究人员们实现了各种LSTM的变种网络。不变的是,通常都会用sigmoid函数做门,筛选状态或者输入。并且输出都是要经过tanh函数。具体为什么要用这两个函数,由于刚接触还不能给出一定的解释,日后理解了再补充。
● 卷积层和池化层有什么区别
参考回答:
卷积层 |
池化层 |
|
功能 |
提取特征 |
压缩特征图,提取主要特征 |
操作 |
可惜是二维的,对于三维数据比如RGB图像(3通道),卷积核的深度必须同输入的通道数,输出的通道数等于卷积核的个数。 卷积操作会改变输入特征图的通道数。 |
池化只是在二维数据上操作的,因此不改变输入的通道数。对于多通道的输入,这一点和卷积区别很大。 |
特性 |
权值共享:减少了参数的数量,并利用了图像目标的位置无关性。 稀疏连接:输出的每个值只依赖于输入的部分值。 |
● 防止过拟合有哪些方法
参考回答:
● dropout咋回事讲讲
参考回答:
在Dropout的情况下,模型是共享参数的,其中每个模型继承的父神经网络参 数的不同子集。参数共享使得在有限可用的内存下代表指数数量的模型变得可能。 在Bagging的情况下,每一个模型在其相应训练集上训练到收敛。
在Dropout的情况下,通常大部分模型都没有显式地被训练,通常该模型很大,以致到宇宙毁灭都不 能采样所有可能的子网络。取而代之的是,可能的子网络的一小部分训练单个步骤,参数共享导致剩余的子网络能有好的参数设定。
● relu
参考回答:
其中横轴是时间(ms),纵轴是神经元的放电速率(Firing Rate)。同年,Attwell等神经科学家通过研究大脑的能量消耗过程,推测神经元的工作方式具有稀疏性和分布性;2003年Lennie等神经科学家估测大脑同时被激活的神经元只有1~4%,这进一步表明了神经元的工作稀疏性。而对于ReLU函数而言,类似表现是如何体现的?其相比于其他线性函数(如purlin)和非线性函数(如sigmoid、双曲正切)又有何优势?下面请各位看官容我慢慢道来。
首先,我们来看一下ReLU激活函数的形式,如下图:
从上图不难看出,ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。可别小看这个简单的操作,正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。这里或许有童鞋会问:ReLU的函数图像为什么一定要长这样?反过来,或者朝下延伸行不行?其实还不一定要长这样。只要能起到单侧抑制的作用,无论是镜面翻转还是180度翻转,最终神经元的输出也只是相当于加上了一个常数项系数,并不影响模型的训练结果。之所以这样定,或许是为了契合生物学角度,便于我们理解吧。
那么问题来了:这种稀疏性有何作用?换句话说,我们为什么需要让神经元稀疏?不妨举栗子来说明。当看名侦探柯南的时候,我们可以根据故事情节进行思考和推理,这时用到的是我们的大脑左半球;而当看蒙面唱将时,我们可以跟着歌手一起哼唱,这时用到的则是我们的右半球。左半球侧重理性思维,而右半球侧重感性思维。也就是说,当我们在进行运算或者欣赏时,都会有一部分神经元处于激活或是抑制状态,可以说是各司其职。再比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。与之类似,当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
此外,相比于其它激活函数来说,ReLU有以下优势:对于线性函数而言,ReLU的表达能力更强,尤其体现在深度网络中;而对于非线性函数而言,ReLU由于非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态。这里稍微描述一下什么是梯度消失问题:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次,如果在深层模型中使用sigmoid作为激活函数,这种现象尤为明显,将导致模型收敛停滞不前。