翻看csdn里的博客,无意间看到一篇分享机器学习面试经验的文章,里面博主列举了他面试遇到的问题,我觉得很不错,然后加上我个人的理解分享给需要的人。
1、 什么是boosting tree?
提升方法(boosting)是一种常见的统计学习方法,它的理论基础是:强可学习与弱可学习是等价的,在概率近似正确(PAC)学习的框架下:
训练过程如下:
提升树是以决策树为基学习器的提升方法。可以表示成以决策树为基学习器的加法模型:
2、 解释一下GBDT?
提升树利用加法模型与前向分步算法实现学习的优化过程中,当损失函数是平方损失或指数损失时,优化求解比较容易。但是对于一般损失函数,优化过程往往不太容易。于是大牛Freidman提出了一种通用的做法:梯度提升算法(gradient boosting)这是利用梯度下降的近似方法,利用损失函数的负梯度在当前模型的值作为算法中残差的近似值,拟合一棵决策树。在回归问题中,称为梯度提升回归树GBRT,在分类问题中,称为梯度提升决策树GBDT。
那么问题来了,为什么我们可以利用损失函数的负梯度来当作残差的近似呢?
其实残差是平方损失函数下的特例。对于其他损失函数,其负梯度就不是残差了。至于说负梯度是残差的近似值,数学上可以这么理解:对于模型的损失函数
3、L1和L2正则为何可以减弱over-fitting?
首先我们知道,监督机器学习问题无非就是最小化损失函数使得我们的模型拟合训练数据,但是过于复杂的模型会导致过拟合,即训练误差很小,但是预测误差很大。我们需要保证模型“简单”的基础上最小化训练误差,而通过加入L1和L2正则项,我们可以人为降低模型复杂度,强行让学习到的模型具有我们想要的特性,如稀疏、低秩、平滑等。正则化是符合奥卡姆剃刀原理的,也是说在可能选择的模型中,我们应该选择能够很好的解释已知数据并且十分简单的模型。从贝叶斯估计得角度来看,正则项对应于模型的先验概率。还有个说法,正则化是结构风险最小化策略的实现,是在经验风险上加入了惩罚项。
4、L1和L2正则有什么区别?
L1和L2正则分别对应于在损失函数上加入L1和L2范数。L1范数是向量中各个元素绝对值之和,它可以实现权重稀疏,也就是使得一部分权重变为0,达到特征选择的作用,使得模型容易解释。L2范数是向量各元素的平方和之后求平方根。它可以使得权重衰减,接近于0。区别有:首先下降速度,L1是绝对值一阶函数, L2是平方二阶函数,由图像我们可以知道在0附近L1比L2下降更快。其次,他们对模型空间的限制不同。考虑二位空间下,L1会与坐标轴相交处会有角出现,实现稀疏,也就是趋向于产生少量特征,而其他特征的权重为0。而L2会选择更多的特征,其都会接近于0。L1常用于特征选择,L2只是一种正则化。
5、KNN和LR有什么本质区别?
KNN与LR的本质区别有:
下面,我们看看LR与SVM的相同与不同处。
相同处:
不同处:
6、怎么理解Dropout?
Dropout 是深度学习中的一种正则化方法,指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。由于大规模神经网络具有两个显著缺点:计算费时和过拟合。问了解决过拟合,一般采用essenble方法,即训练多个模型进行组合,但是这对于大型神经网络是不可取的。Dropout可以被看作是集成大量深度神经网络的使用Bagging方法,比如对于具有N个结点的网络,使用dropout随机进行丢弃后,可以看成 2n 2 n 个“瘦小“的神经网络的集合,达到了一种廉价的Bagging集成近似,但是训练的参数却是不变的。从而摆脱了费事的问题,能够方便且功能强大的训练和评估指数级数量的神经网络。一个关于dropout的重要见解是,通过随机行为训练网络并平均多个随机决定进行预测,实现了一种参数共享的Bagging形式。这种参数共享不一定基于包括和排除。原则上,任何一种随机的修改都是可以接受的。在实践中,我们必须选择让神经网络能够学习对抗的修改类型。
更进一步的观点是:dropout不仅仅是训练一个bagging的集成模型,而且是共享隐藏单元的集成模型。受生物学想法启发:有性繁殖涉及两个不同生物体之间交换基因,进化产生的压力使得基因不仅是良好的,而且要准备好不同有机体之间的交换,这样的基因和这些特点对环境的变化是非常稳健的,因为它们一定会正确适应任何一个有机体或模型不寻常的特性。因此Dropout正则化每个隐藏单元不仅是一个很好的特征,要在很多情况下是良好的特征,dropout会强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
另外还有一种观点是:Dropout是施加到隐藏单元的掩码噪音。就是对于每一个dropout后的网络,进行训练时,相当于做了Data Augmentation,因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。 比如,对于某一层,dropout一些单元后,形成的结果是(1.5,0,2.5,0,1,2,0),其中0是被drop的单元,那么总能找到一个样本,使得结果也是如此。这样,每一次dropout其实都相当于增加了样本。
7、为什么random forest具有特征选择的功能?
首先我们知道,决策树是一种易解释的模型,它可以对特征的重要性进行排序,而随机森林是由决策树构建而成的,一定程度上了揭示了它也是是由特征选择的功能的。那么随机森林如何对特征进行选取呢?方法如下:
平均不纯度减少 mean decrease impurity:随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
平均精确率减少 Mean decrease accuracy:度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。
8、random forest有哪些重要的参数?
重要的参数有:构建随机森林的决策树的数量;每棵树的最大深度;每棵树包含的最大特征数。随机森林通过对样本随机采样,随机选取特征来构建决策树,通过k棵决策树组合成最终的分类器。
9、 DNN为什么功能强大,说说你的理解?
DNN,深度神经网络。机器学习的大部分任务任务简单来说就是从训练数据中学习到一个映射函数,然后用于未知数据的预测。而DNN理论上可以拟合任意的线性非线性函数。传统的机器学习算法可能对线性模型拟合效果很好,对非线性的效果一般较差。DNN通过加入多层的隐藏层以及激活函数,大大的加强了模型对非线性关系的拟合能力。所以说,只要数据足够,计算能力足够,DNN的功能是十分强大的。
10、 SVM的损失函数是什么?怎么理解。
SVM的损失函数是Hinge损失函数,是0-1损失函数的一种变体。对于线性与非线性其表达式略有不同。考虑二分类问题,label={-1,1 }。线性可分时的损失函数形式如下:
11、 介绍下Maxout?
maxout 单元进一步扩展了整流线性单元。其将 z z 划分为每组具有 k k 个值的组,而不是使用作用于每个元素的函数 g(z) g ( z ) 。每个maxout单元则输出每组的最大元素:
这里 G(i) G ( i ) 是组 i i 的输入索引集 {(i−1)k+1,...,ik} { ( i − 1 ) k + 1 , . . . , i k } ,这提供了一种方法来学习输入 x x 空间中多个反向响应的分段线性函数。
12、项目中over-fitting了,你怎么办?
机器学习的一个核心问题是:设计的模型不仅在训练数据上表现好,同时在新输入上泛化好。过拟合指的是训练误差与测试误差之间的差距太大。我们可以通过加入一些正则化来减小测试误差,防止过拟合。具体的方法有:
13、 详细说一个你知道的优化算法(Adam等)?
详细可以看这篇博文优化算法
14、项目(比赛)怎么做的模型的ensemble?
15、stacking是什么?需要注意哪些问题?
stacking 不一种不同于bagging、boosting的组合模型算法,重点在于对不同学习器的组合。具体过程如下:
stcking属于集成学习 ensemble learning 的一种。
集成学习是将多个学习算法组合在一起来获得更好效果的一种方法。
机器学习中,监督学习可以描述成:对于一个具体问题,从一堆假设空间中搜索一个具有较好且相对稳定预测效果的模型。
即使假设空间中包含很好的假设,有时我们也难以找出。集成方法通过组合多个假设以期望得到一个更优的假设,也就是说通过组合多个弱学习器以构成一个强学习器。其中组合的弱学习模型可以是相同类型的,也可以是不同的。
集成方法对大量数据和不充分数据都有很好的效果,对于大数据,将其分成若干小数据集,分别进行训练,最后组合在一起。如果数据量少,可以通过boostrap进行抽象,得到多个数据集,分别训练后再组合。
集成方法用于评估测试的时候,需要更多的计算。可以认为集成学习使用计算换预测效果。同时这也造成了模型中的参数相比单一模型包含的信息较少,导致了太多的冗余。
16、了解哪些online learning的算法?
17、如何解决样本不均衡的问题?
18、fasterRCNN中的ROIPooling是如何实现的?
19、如何进行特征的选择?
20、如何进行模型的选择?
21、什么是梯度消失?怎么解决?
22、常用的有哪些损失函数?
除了我们常用的平方损失函数,绝对值损失函数。详见之前的文章机器学习之损失函数
任何一 个由负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概率 分布之间的交叉熵。例如,均方误差是经验分布和高斯模型之间的交叉熵。
23、XX用户画像挖掘怎么做的feature engineering?
24、假设一个5*5的filter与图像卷积,如何降低计算量?
25、做过模型压缩吗?介绍下
众所周知,深度学习模型中的参数一般从数百甚至数十亿不等,传统的CPU对庞大的网络计算能力有限,只有GPU才能让网络得以相对快速训练。对于具有很多层和节点的大型神经网络,较少其存储和计算成本变得至关重要,特别是对于一些实时应用,如在线学习、
增强学习以及自动驾驶。再比如将深度学习应用于移动端,如何让深度模型在移动设备上运行,也是模型压缩加速的一大重要目标。
目前有四类深度模型压缩方法:
基于参数修剪和共享的方法针对模型参数的冗余性,试图去除冗余和不重要的项。基于低秩因子分解的技术使用矩阵/张量分解来估计深度学习模型的信息参数。基于转移/紧凑卷积滤波器的方法设计了特殊的结构卷积滤波器来降低存储和计算复杂度。知识蒸馏方法通过学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络的输出。
其中使用转移/紧凑卷积核方法仅支持卷积层。其他三种方法可用于全联接层和卷积层的CNN。
关于参数修剪和共享
根据减少冗余的方式,可以分为三类:模型量化和二进制化、参数共享和结构化矩阵。
a 量化和二进制化:网络量化通过减少表示每个权重所需的比特数来压缩原始网络。压缩流程:修剪、量化和霍夫曼编码。修剪减少了需要编码的权重数量,量化和霍夫曼编码减少了用于每个权重编码的比特数。对于大多数是0的矩阵使用稀疏表示,进一步降低空间冗余,这种机制不会带来准确率损失。但是二进制化方法会造成准确率损失
b 剪枝和共享:网络剪枝和共享起初是解决过拟合问题的,现在更多被用于降低网络复杂度。
c 设计结构化矩阵:约束条件会降低精确,很少用到。
26、什么是residual learning?说说你的理解
27、residual learning所说的residual和GBDT中的residual有什么区别?
问题2中,我们知道GBDT是利用损失函数的负梯度在当前模型的值作为算法中残差的近似值,来拟合一棵决策树。通过沿着负梯度不断拟合残差来使得整体的偏差尽可能的沿着Loss最小的方向走,直至达到最优收敛。
研究发现,随着神经网络层数增加,网络的表达能力增强了,模型的精度反而降低了,这不再是过拟合问题,而是网络退化。然而这并不符合逻辑,因为深层网络在训练时,可以是在浅层网络的函数上加上一个恒等变换。而深层网络显然没有把这种恒等变换学习到。因此有了残差网络(Resnet)。
从正向传播上来看,引入恒等变换可以使网络参数调整作用更大。这个地方引用下知乎回答:“F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化,看到残差网络我第一反应就是差分放大器。”
实验证明,残差块往往需要两层以上,单单一层的残差块并不能起到提升作用。详情可以参考:resnet网络原理。
这么看来,residual learning中的学习残差函数来克服深度神经网络中的网络退化现象的。
28、FFM和FTRL有过了解吗?
我之前的博客中提到过FFM与FTRL。
29、你对现在Deep Learning的发展和遇到的问题有什么看法?