面经

蘑菇街笔试

 1,为什么一般需要划分出额外的校验集(validation set)用于超参数调整,而不选择直接使用测试集(test set)?

  因为验证数据集(Validation Set)用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据集上得出的误差(Error)会有偏差(Bias)。

  但是我们只用测试数据集(Test Set) 去评估模型的表现,并不会去调整优化模型。

 2,假设我们在训练一个使用Sigmoid激活函数的全连接神经网络。在对其权重进行初始化时,为什么一般会倾向于让初始值的绝对值偏小?如果需要这样,为何不直接使用0进行初始化?

  初始值的绝对值偏小,sigmoid函数在靠近0的位置有较大导数,比较陡,学习速率教快。

  本来我们希望不同的结点学习到不同的参数,如果把w全设为0,不同的结点根本无法学到不同的特征!这样就失去了网络学习特征的意义了。

美团点评

 1,xgboost的跟GBDT比优点都有哪些?

  ① 显式地将树模型的复杂度作为正则项加在优化目标 (树叶子节点个数,每个叶子节点上输出score的L2模平方和)

  ② 公式推导里用到了二阶导数信息,而普通的GBDT只用到一阶 

    GDBT在函数空间中利用梯度下降法进行优化而XGB在函数空间中使用了牛顿法进行优化

  ③ 允许使用column(feature) sampling来防止过拟合,借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。

  ④ 实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗。

  ⑤ 节点分裂算法能自动利用特征的稀疏性。

    如何处理稀疏数据:在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。

  ⑥ data事先排好序并以block的形式存储,利于并行计算

  ⑦ 支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit。

  ⑧ 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器

 2,count(1),count(*),count(列名) 这三个有什么区别?

  执行效果上:  
  
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  
  count(1)包括了所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  
  count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计  
  执行效率上:  
  
列名为主键,count(列名)会比count(1)快  
  列名不为主键,count(1)会比count(列名)快  
  如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)  
  如果有主键,则 select count(主键)的执行效率是最优的  
  如果表只有一个字段,则 select count(*)最优。  

  count(*)会尽量利用具有以下特征的索引来提高性能:1,not null列;2,字段较窄。

  count(field)同样会尽量利用索引来提高性能:1,含有该field的索引;2,若改field为主键,则同count(*)一样,会选择更窄的索引,此时和使用count(*)无异

 3,L1、L2正则化,区别

  ① L1是模型各个参数的绝对值之和。L2是模型各个参数的平方和的开方值。

  ② L1会趋向于产生少量的特征,而其他的特征都是0。L2会选择更多的特征,这些特征都会接近于0。

 4,Xgboost中的行抽样,可以起到哪些作用

  由于采用了随机采样,训练出的模型的方差小,泛化能力强

  防止过拟合(xgb借鉴了随机森林思想的提现,可以参考bagging思想,对于单颗树而言会确实会过拟合,但是对于整体会减少过拟合)

 5,算法题,一个数组,找出第k大的数    参考:如何在10亿数中找出前1000大的数

  ① 分治法(类似快排中partition的操作)

  ② 堆排序(小顶堆)

虎牙直播

 1,说说RF和GBDT的区别

  1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
  2、组成随机森林的树可以并行生成;而GBDT只能是串行生成
  3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
  4、随机森林对异常值不敏感,GBDT对异常值非常敏感
  5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
  6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

 2,给你一个数据,字段有uid,city,gender,amount(充值金额),选取出一个城市充值金额top5的uid,可以用sql或者Python

 3,推荐算法了解吗?比如有用户的信息,怎么做点击预估? (将信息嵌入成向量,做分类任务)

 4,怎么根据弹幕来给主播打标签?(回答:数据清洗,词嵌入,多分类任务(所以lr,svm不适合),增量学习)

 5,SVD了解吗?

字节跳动算法岗-数据挖掘

 1,简单说一下Batch Normalization

  ① 为啥要进行BN?

    因为网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。

  ② BN的求解步骤?

    1,减均值除方差

    2,yi = r x+ β (BN的精髓的一步,r是尺度因子,β是平移因子)。

      由于归一化后的xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:r,β。 rβ是在训练时网络自己学习得到的

  ③ BN到底解决了什么?

    1,拿sigmod函数来说,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除方差后,数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的,这可以看做是一种对抗梯度消失的有效手段。如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。

    2,但是在求解步骤的第二部是要干嘛呢?我们思考一个问题,减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?不能,比如数据本身就很不对称,或者激活函数未必是对方差为1的数据最好的效果,比如Sigmoid激活函数,在-1~1之间的梯度变化不大,那么非线性变换的作用就不能很好的体现,换言之就是,减均值除方差操作后可能会削弱网络的性能!针对该情况,在前面三步之后加入第4步完成真正的batch normalization。

 2,简单介绍LDA(有监督降维)的思想

  ① 尽可能多地保留数据样本的信息(即选择最大的特征是对应的特征向量所代表的的方向)。

  ② 寻找使样本尽可能好分的最佳投影方向。

       ③ 投影后使得同类样本尽可能近,不同类样本尽可能远(投影后类内方差最小,类间方差最大)。

  公式推到:主成分分析(PCA)原理总结

  ④ LDA vs PCA

    1,两者均可以对数据进行降维。

    2,两者在降维时均使用了矩阵特征分解的思想

    3,两者都假设数据符合高斯分布

    4,LDA是有监督的降维方法,而PCA是无监督的降维方法

    5,LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。

    6,LDA除了可以用于降维,还可以用于分类。

    7,LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。

 3,谈谈对鞍点的理解

  在优化问题中,某些维度向上倾斜,某些维度向下倾斜的点就是鞍点。

  ① 鞍点的特点:梯度等于零,在其附近Hessian矩阵有正的和负的特征值,行列式小于0,即是不定的。

  ② 鞍点和局部极值的区别

    鞍点和局部极小值相同的是,在该点处的梯度都等于零。

    不同在于在鞍点附近Hessian矩阵是不定的(行列式小于0),而在局部极值附近的Hessian矩阵是正定的。

  ③ 鞍点附近,基于梯度的优化算法会遇到较为严重的问题(★):

    鞍点处的梯度为零,鞍点通常被相同误差值的平面所包围(这个平面又叫Plateaus,Plateaus是梯度接近于零的平缓区域,会降低神经网络学习速度),在高维的情形,这个鞍点附近的平坦区域范围可能非常大,这使得SGD算法很难脱离区域,即可能会长时间卡在该点附近(因为梯度在所有维度上接近于零)。在鞍点数目极大的时候,这个问题会变得非常严重。高维非凸优化问题之所以困难,是因为高维参数空间存在大量的鞍点。

  ④ 避开鞍点的思路:

    ⑴ 使用二阶泰勒展开式:如果∇f(x)的梯度为零向量,我们仍然希望能够找到一个向量u,使得u2f(x)u<0。在这种方式下,如果我们令y = x +ηu,函数值f(Y)就会更小。

    ⑵ 一阶方法避开鞍点:在⑴方法中,需要计算二阶导数,往往比较费时。鞍点本身是非常不稳定的:如果我们把一个球放在鞍点处,然后轻微地抖动,球就可能会掉下去!当然,我们需要让这种直觉在更高维空间形式化,因为简单地寻找下跌方向,需要计算Hessian矩阵的最小特征向量。

      为此提出了带有噪声的梯度下降法  y=x−η∇f(x)+ϵ。这里ϵ是均值为0的噪声向量。这种额外的噪声会提供初步的推动,使得球会顺着斜坡滚落。

      然而多项式高度依赖于维度N和Hessian矩阵的最小特征值,因此不是很实用。

  ⑤ 顺带提一下避开局部最小值的方法:带 动量的SGD。  核心公式两个   

    ⑴ v ← av-ϵg { ϵ 学习率,a衰减力度,g 梯度}  (指数衰减平均,以a为衰减力度,a越大,之前梯度对现在方向的影响也越大)

    ⑵ θ ← θ  + v

 4,① 伯努利分布→现在我有抛一枚硬币,正面朝上的概率是p,反面是1-p。那么第k次抛的时候出现第一次正面的概率是多少?

           P(1-p)^{k-1}

     那么我们设 f(z=k)=p(1-p)^{k-1} ,那你计算一下 E(z) (求个均值)

    E(z)=p+2p(1-p)+3p(1-p)^{2}+...+mp(1-p)^{m-1}

    ③  能不能计算一下 E(z) 的数学表达式

    可以使用 E(z)-(1-p)E(z)=A 。其中A是一个等比数列。然后就可以求出E(z)。

滴滴出行

 1,LR的损失函数,LR的解析解

 2,对SVM,贝叶斯的看法

 4,xgboost的原理,xgb和gdbt的区别

   3,说一说极大似然估计(MLE)和最大后验估计(MAP)

  1,最大似然估计是已知结果 x 求参数 θ ,使似然函数 P(θ)最大。

  2,最大后验概率估计则是想求 θ 使P(θ)P(θ)最大。求得的 θ 不单单让似然函数大,θ 自己出现的先验概率也得大。

  3,MAP其实是在最大化 P(θ x) = P(θ)P(θ) / P(x) , 因为x是确定的,则可以由数据得到 P(x) ,则只需要求P(θ)P(θ)即可。 P(θ x)即后验概率

  4,MAP就是多个作为因子的先验概率P(θ)。或者,也可以反过来,认为MLE是把先验概率P(θ)认为等于1,即认为θ是均匀分布。

 5,解释一下FM、DeepFM

蚂蚁金服

 1,对于一般的问题你是怎么样处理特征的?

 2,特征相关怎么处理?好几个特征都相关怎么处理?

 3,高维数据,其中有一维是时间,有缺失,如何处理?

  RF拟合。然后具体讲解RF

 4,高维数据,每个特征有标签,如何对特征进行聚类/类别划分?

 5,标准正态分布的一到四阶中心矩是多少 ?

  通项公式:① n为奇数时,中心距为0。② n为偶数时,中心距为 (n-1)!!

 6,贝叶斯公式知道吗,什么含义?

  贝叶斯是执果索因,反映当产生了结果A之后,再对各种原因概率的新认识,故称后验概率

 7,朴素贝叶斯,决策树,SVM的优缺点对比。

  朴素贝叶斯:缺点:1. 需要计算先验概率;2. 分类决策存在错误率;3. 对输入数据的表达形式很敏感;4. 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。

        优点:1,朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率;

           2,对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练;

           3,对缺失数据不太敏感,算法也比较简单,常用于文本分类。

           4,对结果解释容易理解

  决策树:缺点:1,决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。

           2,决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决

           3,寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善

           4,有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。

           5,如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

      优点:1,简单直观,生成的决策树很直观。

         2,基本不需要预处理,不需要提前归一化,处理缺失值。

         3,使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数。

         4,相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释。

         5,对于异常点的容错能力好,健壮性高。

         6,可以交叉验证的剪枝来选择模型,从而提高泛化能力。

      ID3,C4.5,CART树对比优缺点

  SVM:缺点:1,对缺失数据敏感。

        2,非线性问题的核函数的选择没有通用标准,难以选择一个合适的核函数。

        3,SVM在样本量非常大,核函数映射维度非常高时,计算量过大,不太适合使用。

        4,如果特征维度远远大于样本数,则SVM表现一般。

        优点:1,解决高维特征的分类问题和回归问题很有效,在特征维度大于样本数时依然有很好的效果。

        2,仅仅使用一部分支持向量来做超平面的决策,无需依赖全部数据。

        3, 有大量的核函数可以使用,从而可以很灵活的来解决各种非线性的分类回归问题。

        4,样本量不是海量数据的时候,分类准确率高,泛化能力强。  

360手机卫士

  1,svm核函数变换有什么好处?

  ① 将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。

  ② 首先在低维空间中完成计算,然后再映射到高维空间,计算复杂度相对较小。

 2,用过什么聚类算法, 什么时候需要用聚类?

 3,神经网络了解过吗, 讲一下权值共享

 4,hmm了解过吗? 有什么样的应用场景?

  1,通俗易懂的理解HMM  2,隐马尔科夫模型HMM

 5,lstm了解过吗?用过吗?

 6,xgb与lr相比优缺点在哪里?

   lr 优点: 

    1,实现简单。

    2,分类时计算量非常小,速度很快,存储资源低

    3,便利的观测样本概率分数;

    4,LR对于数据中小噪声的鲁棒性很好,并且不会受到轻微的多重共线性的特别影响(多重共线性可以结合L2正则化来解决)

  lr缺点:

    1,当特征空间很大时,逻辑回归的性能不是很好

         2,容易欠拟合,一般准确度不太高

    3,只能解决线性可分的问题,对于线性不可分的问题,需要自己构建特征

    4,对于非线性特征,需要进行转换;

    5,容易欠拟合,分类精度不高。

    6,无法处理数据不平衡的问题

    7,无局部极小值问题;(相对于神经网络等算法)

    8,无需依赖整个数据

 7,linux了解吗?(出了一个题,一个文本里面有0 1和其他字符, 要获取除了01 以外的字符输入到另外一个文本)awk的高级用法

 8,九宫格输入法怎么实现单词提示(比如输入a,提示advertise) 什么数据结构实现?

  我答得是建一个字典树, 在非叶子结点有存储距离最近叶子结点单词的buffer

 9,特征选择

  过滤式(filter):1,移除低方差的特征     2,单变量特征选择:卡方检验,信息增益,交叉熵,Odds ratio,信息熵,互信息,KL散度(相对熵)

  包裹式(wrapper): 首先,评估器在初始的特征集合上面进行训练并且每一个特征的重要程度是通过一个诸如sklearn里的 coef_ 属性 或者 feature_importances_ 属性来获得。 然后,从当前的特征集合中移除最不重要的特征。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。

  嵌入式(embeded):在确定模型的过程中,挑选出那些对模型的训练有重要意义的属性。L1正则,RF

 

  

  

 

   

 

 

  

 

  

   

 

posted on 2019-04-02 19:26  薛大明白  阅读(603)  评论(0编辑  收藏  举报

导航