机器学习面试问题总结和回答

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1、为什么引入非线性激活函数如果不用激励函数,在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。2、为什么使用ReLU激活函数第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。3、权重初始化错误:全零初始化:因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。小随机数初始化:因此,权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。其思路是:如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。小随机数权重初始化的实现方法是:W=0.01*np.random.randn(D,H)。其中randn函数是基于零均值和标准差的一个高斯分布来生成随机数的。根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。也可以使用均匀分布生成的随机数,但是从实践结果来看,对于算法的结果影响极小。使用1/sqrt(n)校准方差:随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。也就是说,建议将神经元的权重向量初始化为:w=np.random.randn(n)/sqrt(n)。其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。4、解释logistic回归为了实现logistic分类器,我们可以在每个特征上都乘以一个回归系数,然后所有的相乘结果进行累加,将这个总结作为输入,输入到sigmoid函数中,从而得到一个大小为0~1之间的值,当该值大于0.5归类为1,否则归类为0,这样就完成了二分类的任务。所以logistic回归可以看成是一种概率估计。通过极大似然法来估计回归系数w和b,给定数据集,logistic回归模型最大化“对数似然”,即令每个样本属于其真实标记的概率越大越好。将最大化公式,变形为最小化公式,然后采用梯度下降的方法来求得最优解。5、Unet网络和Vnet网络的区别Unet网络:可以分为两个部分,第一个部分对图像进行下采样,第二个部分对图像进行上采样。共做了四次下采样和四次上采样,下采样采用maxpool的方法(最大值池化),上采样采用反卷积的方法,在每次采样之前对图像做两次卷积,没有padding,因此图像在卷积过程中大小在缩小。在下采样过程中,通道数是不断翻倍,上采样过程,通道数是不断减半。同时将相对应的下采样过程中的特征图裁剪添加至上采样的特征图中,来弥补分割的细节度。Unet网络在卷积的过程中采样激活函数为ReLUVnet网络:可以分为两部分部分,第一个部分对图像进行下采样,第二个部分对图像进行上采样。共做了四次下采样和四次上采样,下采样采用卷积的方法,步长为2,因此图像大小减半(相比于池化的方法,使用卷积下采样,内存占用更小,因为在反向传播的时候最大值池化需要存储最大值所在的位置)上采样采用反卷积的方法,在每次采样之前对图像做卷积,使用了padding,图像大小不变。在下采样过程中,通道数是不断翻倍,上采样过程,通道数是不断减半。同时将相对应的下采样过程中的特征图添加至上采样的特征图中,来弥补分割的细节度。Vnet网络在卷积的过程中采样激活函数为PReLU6、C,C++程序编译的内存分配情况有哪几种,并简要解释。一、从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快,不容易出错,因为有系统会善后。例如全局变量,static变量等。二、在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配:即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。7、简述CNN和FCN的区别CNN网络的目的在于分类。在末端是一个全连接层,将原来二维特征图转换成一维的固定长度的特征向量,这就丢失了空间信息,最后输出一个特定长度的向量,表示输入图像属于每一类的概率,以此作为分类的标签。FCN网络的目的在于语义分割。FCN在结构上将CNN网络最后的全连接层变成卷积层。FCN可以接受任意尺寸的输入图像。通过反卷积层对最后一个卷积层的featuremap进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像中的空间信息,最后在与输入图等大小的特征图上对每个像素进行分类,逐像素地用softmax分类计算损失,相当于每个像素对应一个训练样本。8、什么是多态见讲义。9、解释graphcut10、解释随机梯度下降SGD随机抽取一批样本,利用现有参数对该样本的每一个输入生成一个估计输出y,然后跟实际输出比较,统计该批样本的误差,求平均以后得到平均误差,以此来作为更新参数的依据。由于是抽取,因此不可避免的,得到的梯度肯定有误差.因此学习速率需要逐渐减小.否则模型无法收敛。因为误差,所以每一次迭代的梯度受抽样的影响比较大,也就是说梯度含有比较大的噪声,不能很好的反映真实梯度.在实践中,一般采用SGD+momentum的配置,相比普通的SGD方法,这种配置通常能极大地加快收敛速度。虽然名字为动量,其物理意义更接近于摩擦,其可以降低速度值,降低了系统的动能,防止石头在山谷的最底部不能停止情况的发生。动量的取值范围通常为[0.5,0.9,0.95,0.99],一种常见的做法是在迭代开始时将其设为0.5,在一定的迭代次数(epoch)后,将其值更新为0.99。在算法迭代过程中逐步降低学习率(step_size)通常可以加快算法的收敛速度。常用的用来更新学习率的方法有三种:逐步降低(Stepdecay),即经过一定迭代次数后将学习率乘以一个小的衰减因子;指数衰减(Exponentialdecay);倒数衰减(1/tdecay)。实践中发现逐步衰减的效果优于另外两种方法,一方面在于其需要设置的超参数数量少,另一方面其可解释性也强于另两种方法。11、正则化的意义正则化是用来降低overfitting(过拟合)的,减少过拟合的的其他方法有:增加训练集数量,等等。对于数据集梳理有限的情况下,防止过拟合的另外一种方式就是降低模型的复杂度,怎么降低?一种方式就是在loss函数中加入正则化项,正则化项可以理解为复杂度,loss越小越好,但loss加上正则项之后,为了使loss小,就不能让正则项变大,也就是不能让模型更复杂,这样就降低了模型复杂度,也就降低了过拟合。这就是正则化。正则化也有很多种,常见为两种L2和L1。12、解释最大似然估计和最小二乘法最大似然估计:现在已经拿到了很多个样本(你的数据集中所有因变量),这些样本值已经实现,最大似然估计就是去找到那个(组)参数估计值,使得前面已经实现的样本值发生概率最大。因为你手头上的样本已经实现了,其发生概率最大才符合逻辑。这时是求样本所有观测的联合概率最大化,是个连乘积,只要取对数,就变成了线性加总。此时通过对参数求导数,并令一阶导数为零,就可以通过解方程(组),得到最大似然估计值。最小二乘:找到一个(组)估计值,使得实际值与估计值的距离最小。本来用两者差的绝对值汇总并使之最小是最理想的,但绝对值在数学上求最小值比较麻烦,因而替代做法是,找一个(组)估计值,使得实际值与估计值之差的平方加总之后的值最小,称为最小二乘。“二乘”的英文为leastsquare,其实英文的字面意思是“平方最小”。这时,将这个差的平方的和式对参数求导数,并取一阶导数为零,就是OLSE。13、减少过拟合的方法一、引入正则化二、Dropout三、提前终止训练四、增加样本量五、Batchnormalization六、Bagging和其他集成方法(正则化)七、辅助分类节点(正则化)八、参数绑定和参数共享14、输入数据归一化的原因原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。15、课题研究的意义16、图像分割需要处理类别不平衡吗如果采用交叉熵来作为loss,图像分割问题可以理解为像素级的分类问题,其肯定需要处理类别不平衡的问题。统计目标分割图中类别的分布概率加入到最后的交叉熵中,这可理解为一种“再缩放”的方式来处理像素级的类别不平衡。如果使用dice系数作为loss,那图像分割在我的理解上,就是考察输出结果和目标的符合度,diceloss就不需要处理类别不平衡了,毕竟类别不平衡是处理分类问题。17、batchsize一、在合理范围内,增大Batch_Size有何好处?内存利用率提高了,大矩阵乘法的并行化效率提高。跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起训练震荡越小。二、盲目增大Batch_Size有何坏处?内存利用率提高了,但是内存容量可能撑不住了。跑完一次epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。Batch_Size增大到一定程度,其确定的下降方向已经基本不再变化。18、比较diceloss和cross-entropyloss,说明优缺点采用cross-entropyloss而不是采用diceloss,因为cross-entropyloss的梯度好,diceloss的梯度相比cross-entropyloss难以计算,并且容易梯度爆炸,训练的时候不稳定。采用diceloss的主要原因是为了直接优化评价指标,而cross-entropyloss只是一个代理,但是可以最大化利用反向传播。另外,diceloss在类别不平衡的问题表现得更好19、解释batchnormlization随着输入数据的不断变化,以及网络中参数不断调整,网络的各层输入数据的分布则会不断变化,那么各层在训练的过程中就需要不断的改变以适应这种新的数据分布,从而造成网络训练困难,难以拟合的问题。BN算法解决的就是这样的问题,他通过对每一层的输入进行归一化,保证每层的输入数据分布是稳定的,从而达到加速训练的目的。首先,BN算法在每一次iteration中的每一层输入都进行了归一化,将输入数据的分布归一化为均值为0,方差为1的分布,如下式:最

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功