算法面试知识点小结

1. Xgboost相关知识点

    a. boosting tree, Random Forest, Adaboost, GBDT, Xgboost的区别;

    b. Random Forest, Xgboost如何做特征选择;

    c. Xgboost的原理,工程上的优化细节;

    d. GBDT与xgboost的区别:http://wepon.me/

    e. RF与GBDT的区别:https://blog.csdn.net/qq_28031525/article/details/70207918

                                  https://blog.csdn.net/qq_19446965/article/details/82079624

    f. GBDT的推导,看《统计机器学习》P146

    g. Xgboost的调参细节

         (1) learning_rate 或者 eta [default=0.3]: shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。

       (2)max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。 

       (3)n_estimators – Number of trees to fit.

       (4)booster (string) – Specify which booster to use: gbtree, gblinear or dart.

       (5)subsample (float) – Subsample ratio of the training instance. 样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。 

       (6)gamma [default=0]:后剪枝时,用于控制是否后剪枝的参数。 

       (7)colsample_bytree [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1 

       (8)reg_alpha (float (xgb's alpha)) – L1 regularization term on weights

       (9)reg_lambda (float (xgb's lambda)) – L2 regularization term on weights

  

2. SVM与LR相关知识点:参考:https://zhuanlan.zhihu.com/p/32877396

   a. 会推导公式

   b. 函数距离与几何距离区别

   c. 关于SVM核函数的选取的问题:

     吴恩达的见解:

   (1)如果特征维数很高,往往线性可分(SVM解决非线性分类问题的思路就是将样本映射到更高维的特征空间中),可以采用LR或者线性核的SVM;

   (2)如果样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核明显计算量会大于线性核,所以手动添加一些特征,使得线性可分,然后可以用LR或者线性核的SVM;

   (3)如果不满足上述两点,即特征维数少,样本数量正常,可以使用高斯核的SVM;

 

   d. SVM的优缺点

    缺点:

  • 时空开销比较大,训练时间长;
  • 核函数的选取比较难,主要靠经验。

    优点:

  • 在小训练集上往往得到比较好的结果;
  • 使用核函数避开了高纬空间的复杂性;
  • 泛化能力强。

   e. SVM与LR的区别,参考:https://blog.csdn.net/qq_35945399/article/details/81175772

     (1)本质上是loss函数不同,或者说分类的原理不同,LR是交叉熵损失函数,基于概率论中的极大似然估计,通过极大似然估计的方法估计模型的参数,让模型产生的分布与训练数据尽可能的接近;SVM是最大化分类间隔,最大化几何间隔,损失函数是hinge loss(y=max(0, 1-ty));

     (2)SVM是结构风险最小化,LR则是经验风险最小化;SVM的loss函数的第一项可看作L2正则项,LR需要加入正则化项;

     (3)SVM只考虑分界面附近的少数点,而LR则考虑所有点;影响SVM决策面的样本点只有少数的支持向量,在支持向量外添加或减少任何样本点,对分类决策面没有任何影响;在LR中,每个样本点都会影响决策面,决策面会倾向于远离样本数量较多的类别,如果不同类别之间的数量严重不平衡,一般需要先对数据做balancing;

     (4)SVM不能产生概率,LR可以产生概率;

     (5)在解决非线性问题时,SVM可采用核函数的机制,而LR通常不采用核函数的方法;SVM只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的);LR里每个样本点都要参与核计算,计算复杂度太高,故LR通常不用核函数。

     (6)SVM计算复杂,但效果比LR好,适合小数据集;LR计算简单,适合大数据集,可以在线训练。

   f. LR的并行化,参考:http://blog.sina.com.cn/s/blog_6cb8e53d0101oetv.html

   g. 为什么LR的输入特征一般是离散的不是连续的?

       在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:

     (1)离散特征的增加和减少都很容易,易于模型的快速迭代;

     (2)稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

     (3)离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

     (4)逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

     (5)离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

     (6)特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

     (7)特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

  h. 为什么LR模型要用sigmoid函数,背后的数学原理是什么?参考:https://www.zhihu.com/question/35322351

3. 深度学习优化方法原理

   a. 看《深度学习》

   b. 参考:https://blog.csdn.net/u014595019/article/details/52989301

   c. BGD、SGD和MSGD的区别:

    BGD:更倾向于朝着全局最优的方向优化,但是每迭代一步,都要用到训练集所有的数据,如果样本数目很大,那么可想而知这种方法的迭代速度会下降(所以,这就引入了另外一种方法,随机梯度下降)。优点:朝着全局最优解的方向优化,易于并行实现;缺点:当样本数目很多时,训练过程会很慢;

    SGD:随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。优点:训练速度快;缺点:准确度下降,并不是全局最优;不易于并行实现。

    MSGD:以上两种梯度下降法各自均有优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。MBGD在每次更新参数时使用b个样本。

    d. 自适应学习率的优化算法有:Adagrad、RMSProp和Adam等,参考:https://zhuanlan.zhihu.com/p/32230623

      Adagrad每次更新参数,学习率都要除以历史梯度平方和的平方根(累计平方和 r = r +g*g, g为梯度);RMSProp对梯度历史平方和引入了指数衰减,使其能够在凸碗结构中快速收敛,使用移动平均,引入新超参-衰减速率p(r=pr+(1-p)g*g);Adam中,动量直接并入了梯度的一阶矩(指数加权)的估计中,RMSProp也采用了二阶矩估计,但是缺失修正因子,Adam包括偏置修正,修正了从原点初始化的一阶矩和二阶矩(一阶矩:s=p1*s+(1-p1)*g, 二阶矩:r=p2*r+(1-p2)*g*g,然后修正s和r)。

4. 如何防止过拟合(全面),深度学习如何防止过拟合 

   a. 深度学习中常用的防止过拟合的方法有:参数范数惩罚(L1和L2),数据集增强(加入随机噪声),提前终止(需要预留验证集),参数共享(CNN),bagging,Dropout等;熟悉dropout的原理。 

 

5. L1与L2正则(以及其他防止过拟合方法)的原理(经典):https://blog.csdn.net/u010402786/article/details/49592239

    a. Batch Normalization的原理与好处:https://www.zhihu.com/question/38102762

      顾名思义,batch normalization就是“批规范化”。Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入(即当\gamma^{(k)}=\sqrt{Var[x^{(k)}]}, \beta^{(k)}=E[x^{(k)}]),从而保证整个network的capacity。(有关capacity的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的容纳能力(capacity)就提升了。)

      BN可以应用于网络中任意的activation set。文中还特别指出在CNN中,BN应作用在非线性映射前,即对x=Wu+b做规范化。什么时候用BN比较好?例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。BN到底是什么原理呢?说到底还是为了防止“梯度弥散”。关于梯度弥散,大家都知道一个简单的栗子:0.9^{30}\approx 0.04。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法。

     BN带来的好处     (1) 减轻了对参数初始化的依赖,这是利于调参的朋友们的。

     (2) 训练更快,可以使用更高的学习率。

     (3) BN一定程度上增加了泛化能力,dropout等技术可以去掉。

     BN的缺陷

     从上面可以看出,batch normalization依赖于batch的大小,当batch值很小时,计算的均值和方差不稳定。研究表明对于ResNet类模型在ImageNet数据集上,batch从16降低到8时开始有非常明显的性能下降,在训练过程中计算的均值和方差不准确,而在测试的时候使用的就是训练过程中保持下来的均值和方差。这一个特性,导致batch normalization不适合以下的几种场景。

     (1)batch非常小,比如训练资源有限无法应用较大的batch,也比如在线学习等使用单例进行模型参数更新的场景。

     (2)rnn,因为它是一个动态的网络结构,同一个batch中训练实例有长有短,导致每一个时间步长必须维持各自的统计量,这使得BN并不能正确的使用。在rnn中,对bn进行改进也非常的困难。不过,困难并不意味着没人做,事实上现在仍然可以使用的,不过这超出了咱们初识境的学习范围。

    b. 有关batch size的讨论:https://blog.csdn.net/ycheng_sjtu/article/details/49804041

    c. 深度学习中关于Normalization的讨论:https://zhuanlan.zhihu.com/p/33173246

    

6. mysql底层原理

7. 有关Cross Entropy 和 MSE的问题,参考:https://blog.csdn.net/xg123321123/article/details/80781611 和 http://sofasofa.io/forum_main_post.php?postid=1001792 和 https://blog.csdn.net/u012421852/article/details/79620810

    逻辑回归的最小二乘法的代价函数不是关于分布参数θ的凸函数,求解过程中,会得到局部最优,不容易求解全局最优θ。

   熵与信息增益的问题:https://blog.csdn.net/xg123321123/article/details/52864830

8. 神经网络模型基础知识--反向传播算法,激活函数,初始化方法,参考:https://mp.weixin.qq.com/s?__biz=MzIwOTc2MTUyMg==&mid=2247483918&idx=1&sn=b2e0b086243b464f8ca32a938ff9fcfe&chksm=976fa793a0182e856784071cd5a84476cb5c8c98e12415bc3eef6ae8bd0bf4dcdb6e4927cfec&scene=21#wechat_redirect

   a. 常用的激活函数,以及选取方法:

 

     如何选择合适的激活函数呢?首先我们来比较sigmoid函数和tanh函数。对于隐藏层的激活函数,一般来说,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,+1]之间,隐藏层的输出被限定在[-1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果。因此,隐藏层的激活函数,tanh比sigmoid更好一些。而对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数。

     观察sigmoid函数和tanh函数,我们发现有这样一个问题,就是当|z|很大的时候,激活函数的斜率(梯度)很小。因此,在这个区域内,梯度下降算法会运行得比较慢。在实际应用中,应尽量避免使z落在这个区域,使|z|尽可能限定在零值附近,从而提高梯度下降算法运算速度。

     为了弥补sigmoid函数和tanh函数的这个缺陷,就出现了ReLU激活函数。ReLU激活函数在z大于零时梯度始终为1;在z小于零时梯度始终为0;z等于零时的梯度可以当成1也可以当成0,实际应用中并不影响。对于隐藏层,选择ReLU作为激活函数能够保证z大于零时梯度始终为1,从而提高神经网络梯度下降算法运算速度。但当z小于零时,存在梯度为0的缺点,实际应用中,这个缺点影响不是很大。为了弥补这个缺点,出现了Leaky ReLU激活函数,能够保证z小于零是梯度不为0。

     最后总结一下,如果是分类问题,输出层的激活函数一般会选择sigmoid函数。但是隐藏层的激活函数通常不会选择sigmoid函数,tanh函数的表现会比sigmoid函数好一些。实际应用中,通常会会选择使用ReLU或者Leaky ReLU函数,保证梯度下降速度不会太小。其实,具体选择哪个函数作为激活函数没有一个固定的准确的答案,应该要根据具体实际问题进行验证(validation)。

     maxout激活函数,参考:https://blog.csdn.net/hjimce/article/details/50414467

    b. 反向传播算法推导,参考:http://ufldl.stanford.edu/wiki/index.php/反向传导算法 和 https://blog.csdn.net/dare_kz/article/details/77603522

9. 损失函数,交叉熵

10. RNN、LSTM与GRU的结构参考: http://blog.echen.me/2017/05/30/exploring-lstms/和 https://www.jianshu.com/p/9dc9f41f0b29

    LSTM与长期依赖问题,参考:https://blog.csdn.net/woaidapaopao/article/details/77806273

    在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出,所以叫循环神经网络。RNN引入了循环的概念,但是在实际过程中却出现了初始信息随时间消失的问题,即长期依赖(Long-Term Dependencies)问题,所以引入了LSTM。

   LSTM如何防止梯度消失(弥漫)或者爆炸:因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸。推导forget gate,input gate,cell state, hidden information等因为LSTM有进有出且当前的cell informaton是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失或者爆炸;LSTM用加和的方式取代了乘积,使得很难出现梯度弥散;但是相应的更大的几率会出现梯度爆炸,但是可以通过给梯度加门限解决这一问题。

11. Attention机制:https://blog.csdn.net/TG229dvt5I93mxaQ5A6U/article/details/78422216

                          https://www.cnblogs.com/robert-dlut/p/8638283.html

                          https://kexue.fm/archives/4765

12. 常见的损失函数,参考:https://www.cnblogs.com/hejunlin1992/p/8158933.html 

    0-1损失函数,绝对值损失函数、对数损失函数,平方和损失函数,hinge loss。

13. 常见推荐算法,参考:https://www.cnblogs.com/xuanku/p/recsys.html

14. 算法时间复杂度分析,以斐波那契数列为例,参考:http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html

15. 类别不平衡问题如何处理,参考:https://www.cnblogs.com/wkslearner/p/8870673.html

16. 残差网络的原理,为什么可以训练很深的网络(待补充)。

17. SQL中join的用法,参考: https://www.cnblogs.com/jiuban2391/p/6609862.html

18. NLP,参考博客:http://jalammar.github.io/

     预训练语言模型,参考:https://mp.weixin.qq.com/s/mii-CxD7Toq6wVbGd8-_5Q

19. 递归算法时间复杂度的分析方法有:代入法(其实就是数学归纳法)、递归树法、主方法(记公式),参考博客:https://blog.csdn.net/so_geili/article/details/53444816 和公开课: http://open.163.com/special/opencourse/algorithms.html (前两节)

20. 神经网络训练技巧,参考:https://karpathy.github.io/2019/04/25/recipe/?nsukey=%2Fk6ijmx42XIT9ZLS6Fx%2BF3MiYuITxbE3rVMaW8DbtKHXspJCqDyYQ4QBBGFZ1DefnaAFvFFMjr4Ytl1SB3dqlsfl831Z%2B6fS3PXUAER4cVOa%2Ft1HdFq%2F2rmTMwEPKcGYUBLtPU4bX4E56I5M5Sop3CQFMCYUgAE%2FGrFnjUM061N6kcjt3t2FR9Dp0LNTLOG3sdPJxp0jUfu31KFfNWj%2F3Q%3D%3D  和 

https://mp.weixin.qq.com/s/rbCcNGrULYpnVWss4nSI4A

21. 双向RNN或者LSTM的理解,参考:https://zhuanlan.zhihu.com/p/40119926

双向的RNN可以理解为两层单向的LSTM网络堆叠在一起, 最后的结果是对两层网络的拼接,但是每个cell单元还是单向的。

数据结构与算法:

1. 单链表的归并排序与快速排序,参考:https://blog.csdn.net/qq_34364995/article/details/80994110 和 https://blog.csdn.net/a66273039/article/details/84565065

发布了26 篇原创文章 · 获赞 13 · 访问量 7292

猜你喜欢

转载自blog.csdn.net/original_recipe/article/details/103938169
今日推荐