面试问题

其他的面试问题:https://www.jianshu.com/p/4a3c5e34d0f8?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • 项目,数据特征怎样选择的?怎样表示的?模型的选择?当时的模型参数是多少?结果效果如何?
  • 项目,特征工程和模型选择

智力题:

基础:

1、进程,线程,程序

  • 程序只是一组指令的有序集合,进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间。而线程是共享进程中的数据的。

  • 同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。

  • 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

2、数据处理。

  • 缺失数据处理:1、删除元组;2、数据补齐:特殊值填充   平均值填充    热卡填充(就近补齐)  K最近邻法     回归    期望值最大化方法(EM) ;3、不处理:直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。
  • 异常值的处理方法:删除含有异常值的记录;将异常值视为缺失值,使用缺失值处理方法来处理;用平均值来修正;不处理
  • 样本数据不平衡:过采样,下采样,正负样本的惩罚权重

3、

业务场景:

这种题目也是常出题目,会给定你一个场景来提问。

1、如果给了你很多数据,这些数据已经标注好,即已经做好分类,现在让你训练出一个模型,用于区分新来的数据属于哪一类,你需要怎么做呢?可以说下详细的流程吗?

答:首先这是一个分类问题,首先应该想到的是可以尝试使用常用的分类算法,例如朴素贝叶斯、决策树或者SVM。拿到数据之后,做的第一件事就是特征工程。然后将数据分类两部分,一部分用于训练,另一部分用于测试,即分为训练集和测试集,不混用。其实,使用什么分类算法倒是其次,重要在于选好特征,对于给定的特征,需要做一些过滤,比如一些干扰数据,如果对于结果影响很大,可以尝试舍弃这些数据。除此之外,看看是否需要对数据进行归一化处理,将数据无量纲化。然后对已经处理好的特征,送入分类算法中,让其学习。最后,可以通过查看测试集的预测准确度,对一些算法必要参数进行优化调试。

解析:我当时差不多就是这么回答的,我感觉只要说的,让面试官认为你做过相关工作即可。

2、如果给你1亿个数据,让你找出其中第1000大的数据,你会怎么做?我们先不考虑多进程和多线程,也不考虑数据库,如何在算法方面给出思路呢?

答:可以使用堆排序,创建一个存储1000个数据的小根堆。先将1亿个数据的前1000个数据放入这个小根堆中,然后继续遍历,对于新插入的数据,需要与小根堆的最小值进行比较,如果待插入的数据比这个最小值还小,那么不插入,如果比这个最小值大,那么就插入该数,并重新调整小根堆,随后继续使用此方法遍历整个数据。遍历一次数据后,就得到了前1000大的数据,然后输出小根堆的最小值,即根值,即可得到第1000大的数据。

3、面试问了如何在海量数据中查找给定部分数据最相似的top200向量,向量的维度也很高. 因为之前了解过其他面蚂蚁金服的朋友,也有问到这个题目的
所以反应比较快,直接就说可以用KD树,聚类,hash,

算法:

1、哈希怎么实现。

  • 自定义哈希函数通常可利用除留余数、移位、循环哈希、平方取中等方法。
  • python中有内置的哈希函数hash(),返回一个对象(数字、字符串,不能直接用于 list、set、dictionary)的哈希值

2、哈希冲突怎么解决?关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突

  • 开发定址法(线性探测再散列,二次探测再散列,伪随机探测再散列):当冲突发生时,使用某种探测技术在散列表中形成一个探测序列
  • 再哈希法:有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。
  • 链地址法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来
  • 建立一个公共溢出区 :将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

3、BFS广度优先搜索和DFS深度优先搜索

  • BFS 常用于找单一的最短路线,它的特点是 "搜到就是最优解"
  •  DFS 用于找所有解的问题,它的空间效率高,而且找到的不一定是最优解,必须记录并完成整个搜索,故一般情况下,深搜需要非常高效的剪枝(剪枝的概念请百度)。

4、topk问题:

  • 堆排序,O(nlogk)
  • 快排找基数,O(n)

5、code题目https://blog.csdn.net/keil_/article/details/87901748

  • 括号匹配问题:使用list来代替栈实现相同的操作
  • 最大连续子序列问题: 动态规划(O(N))
  • 最长公共子串;两个数组的最长公共子序列和最长递增子序列
  • 删除链表中倒数第K个节点  (快慢指针,遍历一遍即可)
  • 从数组A中找出所有和为S的两个数的索引 (先排序再查找O(NlogN);哈希表思想O(N))
  • 无序数组的中位数 (小顶堆)
  • 一个大小是N-1的数组,所有数字范围是1<=x<=N,请找出缺失的那个数字。提示:求出当前数组的和,然后根据1到N的求和公式,两者相减。
  • 数组中出现次数超过一半的数字:剑指offer上的原题 (O(N))
  • 求最长的无重复字母的子串 (滑动窗口法O(N))
  •  将一个二维的n*n的数组,逆转90度,空间复杂度是O(1)。提示:剥洋葱般,一圈圈的从外向内逆转90度
  • 顺时针打印矩阵:剑指offer上的原题  (1:打印矩阵第一行,删除第一行,旋转90度;2:限制边界,打印)
  • 一个m*n的矩阵,求顺时针矩阵的最后一个数字 
  • 一个大小为N的数组,里面的值代表的是股价,求一次买入卖出所能够求得最大收益?如果是两次买入卖出呢?动态规划解决 

机器学习:

  • 为什么要对数据归一化:1)归一化后加快了梯度下降求最优解的速度;2)可能提高精度(对于距离计算相关算法)
  • 什么时候用归一化or标准化:1)如果对输出结果范围有要求,用归一化;2)如果数据较为稳定,不存在极端的最大最小值,用归一化;3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

1、线性回归和LR.(LR知识点https://blog.csdn.net/hellozhxy/article/details/80885849

逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的

  • LR为什么用(交叉熵损失函数)对数损失函数:1、因为我们想要让 每一个 样本的预测都要得到最大的概率,即将所有的样本预测后的概率进行相乘都最大,也就是极大似然函数。2、对极大似然函数取对数以后相当于对数损失函数,对数损失函数的训练求解参数的速度是比较快的, 而且更新速度只和x,y有关,比较的稳定。
  • 为什么不用平方损失函数 :如果使用平方损失函数,梯度更新的速度会和 sigmod 函数的梯度相关,sigmod 函数在定义域内的梯度都不大于0.25,导致训练速度会非常慢。 而且平方损失会导致损失函数是 theta 的非凸函数,不利于求解,因为非凸函数存在很多局部最优解。
  • 线性回归损失函数:最小二乘损失函数(线性回归的损失函数为什么用最小二乘不用似然函数https://blog.csdn.net/Beyond_2016/article/details/80030414
  • 线性回归和逻辑回归https://blog.csdn.net/jiaoyangwm/article/details/81139362#__311
  • LR数据高相关,只会降低训练速度
  • 逻辑回归LR的特征为什么要先离散化:1、特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。2、离散特征的增加和减少都很容易,易于模型的快速迭代;3、稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;4、离散化后的特征对异常数据有很强的鲁棒性5、特征离散化后,模型会更稳定。( 模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。)
  • 为什么LR需要归一化或取对数? 
    符合假设、利于分析、归一化也有利于梯度下降 
  • 为什么LR把特征离散化后效果更好? 
    引入非线性 
    • 特征比数据量还大时,选择什么样的分类器?
    • 线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分
    • 对于维度极低的特征,你是选择线性还是非线性分类器?
    • 非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分
  • 最小二乘:通过最小化误差的平方和,拟合函数。https://blog.csdn.net/u011893609/article/details/80016915
  • LR多分类:若待分类的类别互斥,我们就使用Softmax方法(softmax回归);若待分类的类别有相交,我们则要选用多分类LR,然后投票表决。

2、softmax损失函数

3、SVM知识点   https://blog.csdn.net/rosenor1/article/details/52318454

  • SVM 是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
  • SVM 没有处理缺失值的策略。而 SVM 希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。

  • 为什么要引入对偶算法 1、 对偶问题往往更加容易求解(结合拉格朗日和kkt条件);2、可以很自然的引用核函数(拉格朗日表达式里面有内积,而核函数也是通过内积进行映射的)

    • 核函数:将输入特征x(线性不可分)映射到高维特征R空间,可以在R空间上让SVM进行线性可以变,这就是核函数的作用

           1、多项式核函数:K(x,z)=(x*z+1)^p

           2、高斯核函数:K(x,z)=exp(\frac{-(x-z)^2}{\sigma^2})

4、LR和SVM区别

联系: 

  1. LR和SVM都可以处理分类问题,且一般都用于处理线性二分类问题(在改进的情况下可以处理多分类问题);             
  2. 两个方法都可以增加不同的正则化项,如L1、L2等等。所以在很多实验中,两种算法的结果是很接近的。                       
  3. 都是判别模型

区别: 

  1. LR是参数模型,SVM是非参数模型。
  2. 从目标函数来看,区别在于逻辑回归采用的是Logistical Loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。 
  3. SVM的处理方法是只考虑Support Vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
  4. 逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。       
  5. SVM不直接依赖数据分布,而LR则依赖,因为SVM只与支持向量那几个点有关系,而LR和所有点都有关系。
  6. SVM本身是结构风险最小化模型,而LR是经验风险最小化模型

另外怎么选模型:

  1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
  2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
  3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况

5、贝叶斯(定理:条件概率,先验概率,后验概率)

  • 朴素:假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。
  • 拉普拉斯平滑(Laplace smoothing)
    也就是参数为1时的贝叶斯估计,当某个分量在总样本某个分类中(观察样本库/训练集)从没出现过,会导致整个实例的计算结果为0。为了解决这个问题,使用拉普拉斯平滑/加1平滑进行处理。 
    它的思想非常简单,就是对先验概率的分子(划分的计数)加1,分母加上类别数;对条件概率分子加1,分母加上对应特征的可能取值数量。这样在解决零概率问题的同时,也保证了概率和依然为1。
  • 应用场景:文本分类;垃圾邮件过滤;病人分类;拼写检查     

6、随机森林原理。

随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,采用有放回的随机取样方法生成m个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。

随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样,进一步降低了模型的方差。所以可以避免过拟合。

  • 如果cart树是分类数,那么采用的计算原则就是gini指数。随机森林基于每棵树的分类结果,采用多数表决的手段进行分类。
  • 如果是回归树,则cart树是回归树,采用的原则是最小均方差。即对于任意划分特征A,对应的任意划分点s两边划分成的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。cart树的预测是根据叶子结点的均值,因此随机森林的预测是所有树的预测值的平均值。
  • 随机森林的弱分类器使用的是CART树,CART决策树又称分类回归树。当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很好的解决分类问题。

优缺点

  1. 能够处理大量特征的分类,并且还不用做特征选择
  2. 在训练完成之后能给出哪些feature的比较重要
  3. 训练速度很快
  4. 很容易并行
  5. 实现相对来说较为简单

7、树模型的特征选择 https://www.jianshu.com/p/a546022061e0 & https://blog.csdn.net/qq_39422642/article/details/78555353

  • 信息增益(信息增益偏向取值较多的特征)
  • 信息增益比(是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大)(信息增益比偏向取值较少的特征 )
  • 基尼指数( CART算法 —分类树) 

       定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。 

              即 基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率                 
                           è¿éåå¾çæè¿°

8、GBDT知识点:https://www.cnblogs.com/ModifyRong/p/7744987.html

                               https://www.cnblogs.com/pinard/p/6140514.html

  • gbdt通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度

    GBDT与RF的区别(xgboost、gbdt、rf的区别 )

  • GBDT是采用boosing方法,RF采用的是baggging方法 
  • 组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成,GBDT的会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树(尽管GBDT调整后也可以用于分类但不代表GBDT的树为分类树)
  • 组成随机森林的树可以并行生成;而GBDT只能是串行生成 
  • 对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来 
  • 随机森林对异常值不敏感,GBDT对异常值非常敏感 
  • 随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成 
  • 随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能

   GBDT和XGboost区别

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  • Xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • 传统的GBDT在优化时只用到一阶导数,XGBoost则对目标函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。(顺便提一下,XGBoost工具支持自定义代价函数,只要函数可一阶和二阶求导)
  • Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
  • 列抽样(column subsampling)[传统GBDT没有],Shrinkage(缩减),相当于学习速率(xgboost中的eta)[传统GBDT也有]
  • 可以处理稀疏、缺失数据(节点分裂算法能自动利用特征的稀疏性),可以学习出它的分裂方向,加快稀疏计算速度。
  • 支持并行化处理。xgboost的并行是在特征粒度上的,在训练之前,预先对特征进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行,即在不同的特征属性上采用多线程并行方式寻找最佳分割点。
  • 分裂结点特征分割点选取使用了近似算法-可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。用于加速和减小内存消耗。
  • 缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

GBDT优缺点

优点:

  1. 精度高
  2. 能处理非线性数据
  3. 能处理多特征类型
  4. 适合低维稠密数据

缺点:

  1. 并行麻烦(因为上下两颗树有联系)
  2. 多分类的时候 复杂度很大

  AdaBoost的优缺点 
优点:(1)容易理解、实现简单 (2)易编码 (3)分类精度高 (4)可以使用各种回归模型构建基分类器,非常灵活 (5)作为二元分类器是,构造简单、结果可理解、少参数 (6)相对来说,不宜过拟合 
缺点:(1)只能串行 (2)对异常值敏感

9、xgboost知识点http://blog.itpub.net/31542119/viewspace-2199549/

xgboost实战:https://blog.csdn.net/weixin_42029738/article/details/81675234

XGBoost的分裂点选择:GBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;

   XGboost的优点

  • 树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost采用了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点
  • Shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(当然普通的GBDT实现也有学习速率)
  • 特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行
  • 列抽样(column subsampling):XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性
  • 除此之外,XGBoost还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法效率

10、在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?

  • 曼哈顿距离只计算水平或垂直距离,有维度的限制。另一方面,欧氏距离可用于任何空间的距离计算问题。因为,数据点可以存在于任何空间,欧氏距离是更可行的选择。

11、k-meas缺点及改进算法

  • k-means缺点:k值难以确定;对于不是凸的数据集比较难以收敛;如果数据的类型不平衡,比如数据量严重失衡或者类别的方差不同,则聚类效果不佳;只能得到局部最优解;
  • 改进:K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。在选取第一个聚类中心(n=1)时同样通过随机的方法。可以说这也符合我们的直觉:聚类中心当然是互相离得越远越好。这个改进虽然直观简单,但是却非常得有效。
  • 聚类算法的评价指标
  • k-means为什么每次结果都不一样:k-means算法中起点是随机或者认为给定的,如果初始类中心发生改变,可能会导致结果改变。解决问题的方法:1、把初始随机数进行固定;2、自己设定初始随机种子

12、

  • 特征工程:特征选择(过滤型、包裹型、嵌入型);特征提取;特征构建
  • 怎么判断特征的重要性:特征与响应量的相关性(皮尔逊);信息增益
  • 训练模型前如何处理特征的相关性

13、L1和L2的区别。正则化理解;  L1,L2区别

  • 1、L1是Lasso Regression,表示向量中每个元素绝对值的和:L1范数的解通常是稀疏性的,倾向于选择数目较少的一些非常大的值或者数目较多的insignificant的小值。 L1服从拉普拉斯分布。
  • 2、L2是岭回归,Ridge Regression,是欧氏距离也就是平方和的平方根。L2范数越小,可以使得w的每个元素都很小,接近于0,但L1范数不同的是他不会让它等于0而是接近于0。 L2服从高斯分布。、 L2正则的本质?限制解空间范围,缩小解空间,控制模型复杂度 

14、AUC可以直接用来训练分类器吗?(可以)

  • 对于AUC最简单的理解是ROC曲线下的面积。
  • 但AUC有一个更优雅的,概率学上的意义:随机选取一个正例和一个负例,分类器给正例的打分大于分类器给负例的打分的概率。

15、激活函数,损失函数

  • 激活函数:sigmoid,ReLU, softmax , tanh    使得神经网络具有的拟合非线性函数的能力,使得其具有强大的表达能力!
  • 损失函数:平方差损失(线性回归); 交叉熵(LR); 铰链损失(SVM); 指数函数; 绝对值函数; 度量误差的大小

16、梯度下降,牛顿法,拟牛顿法https://www.cnblogs.com/maybe2030/p/4751804.html

梯度下降法:梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢

  • 批量梯度下降——最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。
  • 随机梯度下降——最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
  • 梯度下降法的缺点:(1)靠近极小值时收敛速度减慢,如下图所示;(2)直线搜索时可能会产生一些问题;(3)可能会“之字形”地下降。

牛顿法——其迭代过程是在当前位置x0求该函数的切线,该切线和x轴的交点x1,作为新的x0,重复这个过程,直到交点和函数的零点重合。此时的参数值就是使得目标函数取得极值的参数值。

  • 对比:梯度法:又称最速下降法,是早期的解析法,收敛速度较慢。 牛顿法:收敛速度快,但不稳定,计算也较困难。
  • 关于牛顿法和梯度下降法的效率对比:  

        从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)

        根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

  • 牛顿法的优缺点总结:

  优点:二阶收敛,收敛速度快;

  缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

 

  • 共轭梯度法:是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
  • 拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。
  • 共轭梯度法;启发式优化算法;解决约束优化问题——拉格朗日乘数法

17、overfitting怎么解决:dropout、regularization(Weight decay)、batch normalizatin

  • dropout:是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
  • batch normalizatin:BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

18、 模型评价指标,解释AUC,准确率和召回率 

  • 混淆矩阵

  • ROC曲线越接近左上角,该分类器的性能越好。
  • AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

19、机器学习中,为何要对数据进行归一化。   

  • 1)归一化后加快了梯度下降求最优解的速度(梯度下降收敛快);2)归一化有可能提高精度(特征间数值相差大)。

20、深度学习中的归一化问题

  • BN不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散”的问题,从而使得训练深层网络模型更加容易和稳定。
  • 为什么batch 归一化会有用?   简单来说就是在mini-batch归一化时,因为只使用了部分数据,故归一化时存在噪声的,这就相当于给神经网络增加了噪声,相当于dropout,给隐藏单元增加了噪声,使后面的隐藏单元不过分依赖于任何一个隐藏单元,有轻微正则化的作用

21、一个完整的机器学习项目流程

22、梯度消失,梯度爆炸

  • 梯度消失:根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0。这种情况会导致靠近输入层的隐含层神经元调整极小。
  • 梯度膨胀:根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大。这种情况又会导致靠近输入层的隐含层神经元调整变动极大。
  • 解决方法:
  • 1、 预训练加微调 ;基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。
  • 2、梯度剪切权重正则(Weight decay)(针对梯度爆炸);梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,通过这种直接的方法就可以防止梯度爆炸。
  • 3、使用不同的激活函数(Relu)
  • 4、 使用batchnorm;Batch Normalization 就是通过对每一层的输出规范为均值和方差一致的方法,消除了ww带来的放大缩小的影响,进而解决梯度消失和爆炸的问题。
  • 5、使用残差结构 ;
  • 6、使用LSTM网络

23、线性分类器与非线性分类器的区别以及优劣。https://blog.csdn.net/u012073449/article/details/52074265

24、数据挖掘主要侧重解决四类问题:分类、聚类、关联、预测

25、BFS,DFS

26、模型融合
27、适用场景

  • KNN适用情景:需要一个特别容易解释的模型的时候。(比如需要向用户解释原因的推荐算法。)
  • LR适用情景:

    LR同样是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。

    因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。

    虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。

  • 贝叶斯适适用情景:

    需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。

    可以高效处理高维数据,虽然结果可能不尽如人意。

  • 决策树适用情景:

    因为它能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,数据分析师希望更好的理解手上的数据的时候往往可以使用决策树。

    同时它也是相对容易被攻击的分类器[3]。这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测。

    受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石。

  • 随机森林适用情景:

    数据维度相对低(几十维),同时对准确性有较高要求时。

    因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。

  • SVM适用情景:

    SVM在很多数据集上都有优秀的表现。

    相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。

    和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法。

独热编码优缺点

  • 优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。
  • 独热编码用来解决类别型数据的离散值问题,

    总结:

    LR、SVM、RF、GBDT、XGBoost和LightGbm比较

深度:

1、resnet解决了什么问题,怎么解决的?

理论上深层的神经网络一定比浅层的要好,比如深层网络A,浅层网络B,A的前几层完全复制B,A的后几层都不再改变B的输出,那么效果应该是和B是一样的。也就是说,A的前几层就是B,后几层是线性层。但是实验发现,超过一定界限之后,深层网络的效果比浅层的还差。一个可能的解释是:理论上,我们可以让A的后几层输入等于输出,但实际训练网络时,这个线性关系很难学到。既然如此,我们把这个线性关系直接加到网络的结构当中去,那么效果至少不必浅层网络差。也就是说,Resnet让深层神经网络更容易被训练了。

2、为什么深度网络网络层数变深了效果反而变差了?

梯度消失:神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整。

3、卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。 卷积的物理意义:加权叠加。   池化层的作用是提取局部均值与最大值

  • 卷积层:用它来进行特征提取,
  • 池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征

4、LSTMlstm结构和公式

解决梯度问题:https://www.cnblogs.com/bonelee/p/10475453.html

5、1*1卷积作用

  • 降维(减少参数)
  • (卷积操作)引入非线性,提高网络的表达能力
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值