BAT 题库 | 机器学习面试 1000 题系列(第 101~200 题)(上)



转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com

AIQ 机器学习大数据 知乎专栏 点击关注

101. 深度学习(CNN RNN Attention)解决大规模文本分类问题

  https://zhuanlan.zhihu.com/p/25928551

102. 如何解决 RNN 梯度爆炸和弥散的问题的?

  本题解析来源:http://blog.csdn.net/han_xiaoyang/article/details/51932536

  为了解决梯度爆炸问题,Thomas Mikolov 首先提出了一个简单的启发性的解决方案,就是当梯度大于一定阈值的的时候,将它截断为一个较小的数。具体如算法 1 所述:

  算法:当梯度爆炸时截断梯度(伪代码)

  下图可视化了梯度截断的效果。它展示了一个小的 rnn(其中 W 为权值矩阵,b 为 bias 项)的决策面。这个模型是一个一小段时间的 rnn 单元组成;实心箭头表明每步梯度下降的训练过程。当梯度下降过程中,模型的目标函数取得了较高的误差时,梯度将被送到远离决策面的位置。截断模型产生了一个虚线,它将误差梯度拉回到离原始梯度接近的位置。

 

梯度爆炸,梯度截断可视化 

  为了解决梯度弥散的问题,我们介绍了两种方法。第一种方法是将随机初始化 W(hh) 改为一个有关联的矩阵初始化。第二种方法是使用 ReLU(Rectified Linear Units)代替 sigmoid 函数。ReLU 的导数不是 0 就是 1. 因此,神经元的梯度将始终为 1,而不会当梯度传播了一定时间之后变小。

**103.**如何提高深度学习的性能
http://blog.csdn.net/han_xiaoyang/article/details/52654879

104.RNN、LSTM、GRU 区别
  @我愛大泡泡,本题解析来源:http://blog.csdn.net/woaidapaopao/article/details/77806273

  RNN 引入了循环的概念,但是在实际过程中却出现了初始信息随时间消失的问题,即长期依赖(Long-Term Dependencies)问题,所以引入了 LSTM。

  LSTM:因为 LSTM 有进有出且当前的 cell informaton 是通过 input gate 控制之后叠加的,RNN 是叠乘,因此 LSTM 可以防止梯度消失或者爆炸的变化是关键,下图非常明确适合记忆:

  GRU 是 LSTM 的变体,将忘记门和输入们合成了一个单一的更新门。  

105. 当机器学习性能遭遇瓶颈时,你会如何优化的?

  可以从这 4 个方面进行尝试:、基于数据、借助算法、用算法调参、借助模型融合。当然能谈多细多深入就看你的经验心得了。这里有一份参考清单:机器学习性能改善备忘单(http://blog.csdn.net/han_xiaoyang/article/details/53453145)

106. 做过什么样的机器学习项目?比如如何从零构建一个推荐系统
  这里有一个推荐系统的公开课http://www.julyedu.com/video/play/18/148,另,再推荐一个课程:机器学习项目班 [10 次纯项目讲解,100% 纯实战]

107. 什么样的资料集不适合用深度学习?
  @抽象猴,来源:https://www.zhihu.com/question/41233373

  a. 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。

  b. 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。

108. 广义线性模型是怎被应用在深度学习中?
  @许韩,来源:https://www.zhihu.com/question/41233373/answer/145404190
A Statistical View of Deep Learning (I): Recursive GLMs
  深度学习从统计学角度,可以看做递归的广义线性模型。
  广义线性模型相对于经典的线性模型 (y=wx+b),核心在于引入了连接函数 g(.),形式变为:y=g−1(wx+b)。
  深度学习时递归的广义线性模型,神经元的激活函数,即为广义线性模型的链接函数。逻辑回归(广义线性模型的一种)的 Logistic 函数即为神经元激活函数中的 Sigmoid 函数,很多类似的方法在统计学和神经网络中的名称不一样,容易引起初学者(这里主要指我)的困惑。下图是一个对照表

109. 准备机器学习面试应该了解哪些理论知识
  @穆文,来源:https://www.zhihu.com/question/62482926


  看下来,这些问题的答案基本都在本 BAT 机器学习面试 1000 题系列里了。

110.标准化与归一化的区别?

  简单来说,标准化是依照特征矩阵的列处理数据,其通过求 z-score 的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为 l2 的归一化公式如下:

  特征向量的缺失值处理
  1. 缺失值较多. 直接将该特征舍弃掉,否则可能反倒会带入较大的 noise,对结果造成不良影响。
  2. 缺失值较少, 其余的特征缺失值都在 10% 以内,我们可以采取很多的方式来处理:
  1) 把 NaN 直接作为一个特征,假设用 0 表示;
  2) 用均值填充;
  3) 用随机森林等算法预测填充

111. 随机森林如何处理缺失值
  方法一(na.roughfix)简单粗暴,对于训练集, 同一个 class 下的数据,如果是分类变量缺失,用众数补上,如果是连续型变量缺失,用中位数补。
  方法二(rfImpute)这个方法计算量大,至于比方法一好坏?不好判断。先用 na.roughfix 补上缺失值,然后构建森林并计算 proximity matrix,再回头看缺失值,如果是分类变量,则用没有阵进行加权平均的方法补缺失值。然后迭代 4-6 次,这个补缺失值的思想和 KNN 有些类似 1 缺失的观测实例的 proximity 中的权重进行投票。如果是连续型变量,则用 proximity 矩 2。

112. 随机森林如何评估特征重要性
  衡量变量重要性的方法有两种,Decrease GINI 和 Decrease Accuracy:
  1)Decrease GINI: 对于回归问题,直接使用 argmax(VarVarLeftVarRight) 作为评判标准,即当前节点训练集的方差 Var 减去左节点的方差 VarLeft 和右节点的方差 VarRight。
  2)Decrease Accuracy:对于一棵树 Tb(x),我们用 OOB 样本可以得到测试误差 1;然后随机改变 OOB 样本的第 j 列:保持其他列不变,对第 j 列进行随机的上下置换,得到误差 2。至此,我们可以用误差 1- 误差 2 来刻画变量 j 的重要性。基本思想就是,如果一个变量 j 足够重要,那么改变它会极大的增加测试误差;反之,如果改变它测试误差没有增大,则说明该变量不是那么的重要。


113. 优化 Kmeans
  使用 kd 树或者 ball tree
  将所有的观测实例构建成一颗 kd 树,之前每个聚类中心都是需要和每个观测点做依次距离计算,现在这些聚类中心根据 kd 树只需要计算附近的一个局部区域即可。

114.KM****eans 初始类簇中心点的选取
  k-means++ 算法选择初始 seeds 的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。
  1. 从输入的数据点集合中随机选择一个点作为第一个聚类中心
  2. 对于数据集中的每一个点 x,计算它与最近聚类中心 (指已选择的聚类中心) 的距离 D(x)
  3. 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x) 较大的点,被选取作为聚类中心的概率较大
  4. 重复 2 和 3 直到 k 个聚类中心被选出来
  5. 利用这 k 个初始的聚类中心来运行标准的 k-means 算法

** 115. 解释对偶的概念 **

  一个优化问题可以从两个角度进行考察,一个是 primal 问题,一个是 dual 问题,就是对偶问题,一般情况下对偶问题给出主问题最优值的下界,在强对偶性成立的情况下由对偶问题可以得到主问题的最优下界,对偶问题是凸优化问题,可以进行较好的求解,SVM 中就是将 primal 问题转换为 dual 问题进行求解,从而进一步引入核函数的思想。

**116.**如何进行特征选择?
  特征选择是一个重要的数据预处理过程,主要有两个原因:一是减少特征数量、降维,使模型泛化能力更强,减少过拟合; 二是增强对特征和特征值之间的理解
  常见的特征选择方式:
  1. 去除方差较小的特征
  2. 正则化。1 正则化能够生成稀疏的模型。L2 正则化的表现更加稳定,由于有用的特征往往对应系数非零。
  3. 随机森林,对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。一般不需要 feature engineering、调参等繁琐的步骤。它的两个主要问题,1 是重要的特征有可能得分很低(关联特征问题),2 是这种方法对特征变量类别多的特征越有利(偏向问题)。
  4. 稳定性选择。是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM 或其他类似的方法。它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果,比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。理想情况下,重要特征的得分会接近 100%。稍微弱一点的特征得分会是非 0 的数,而最无用的特征得分将会接近于 0。

117. 数据预处理
  1. 缺失值,填充缺失值 fillna:
  i. 离散:None,
  ii. 连续:均值。
  iii. 缺失值太多,则直接去除该列
  2. 连续值:离散化。有的模型(如决策树)需要离散值
  3. 对定量特征二值化。核心在于设定一个阈值,大于阈值的赋值为 1,小于等于阈值的赋值为 0。如图像操作
  4. 皮尔逊相关系数,去除高度相关的列


**118.**你知道有哪些数据处理和特征工程的处理?


  更多请查看此课程《机器学习工程师 第八期 [六大阶段、层层深入]》第 7 次课 特征工程(https://www.julyedu.com/course/getDetail/65)

119. 简单说说特征工程

上图来源:http://www.julyedu.com/video/play/18


120. 请对比下 Sigmoid、Tanh、ReLu 这三个激活函数

  logistic 函数,应用在 Logistic 回归中。logistic 回归的目的是从特征学习出一个 0/1 分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用 logistic 函数将自变量映射到 (0,1) 上,映射后的值被认为是属于 y=1 的概率。

  假设函数 其中 x 是 n 维特征向量,函数 g 就是 logistic 函数。

  而的图像是

  可以看到,将无穷映射到了 (0,1)。

  而假设函数就是特征属于 y=1 的概率。

  从而,当我们要判别一个新来的特征属于哪个类时,只需求即可,若大于 0.5 就是 y=1 的类,反之属于 y=0 类。


  更多详见:https://mp.weixin.qq.com/s/7DgiXCNBS5vb07WIKTFYRQ



121.Sigmoid、Tanh、ReLu 这三个激活函数有什么缺点或不足,有没改进的激活函数
@我愛大泡泡,来源:http://blog.csdn.net/woaidapaopao/article/details/77806273

122. 怎么理解决策树、xgboost 能处理缺失值?而有的模型 (svm) 对缺失值比较敏感?
https://www.zhihu.com/question/58230411

123. 为什么引入非线性激励函数?
  @Begin Again,来源:https://www.zhihu.com/question/29021768
  如果不用激励函数(其实相当于激励函数是 f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。
  正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是 sigmoid 函数或者 tanh 函数,输出有界,很容易充当下一层输入(以及一些人的生物解释)。

124. 请问人工神经网络中为什么 ReLu 要好过于 tanh 和 sigmoid function?
  @Begin Again,来源:https://www.zhihu.com/question/29021768

  第一,采用 sigmoid 等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用 Relu 激活函数,整个过程的计算量节省很多。

  第二,对于深层网络,sigmoid 函数反向传播时,很容易就会出现梯度消失的情况(在 sigmoid 接近饱和区时,变换太缓慢,导数趋于 0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
  第三,Relu 会使一部分神经元的输出为 0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释 balabala)。当然现在也有一些对 relu 的改进,比如 prelu,random relu 等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的 paper 看。

  多加一句,现在主流的做法,会多做一步 batch normalization,尽可能保证每一层网络的输入具有相同的分布 [1]。而最新的 paper[2],他们在加入 bypass connection 之后,发现改变 batch normalization 的位置会有更好的效果。大家有兴趣可以看下。
[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.
[2] He, Kaiming, et al. “Identity Mappings in Deep Residual Networks.” arXiv preprint arXiv:1603.05027 (2016). 

125. 为什么 LSTM 模型中既存在 sigmoid 又存在 tanh 两种激活函数?

  为什么不是选择统一一种 sigmoid 或者 tanh,而是混合使用呢?这样的目的是什么?

 

  本题解析来源:https://www.zhihu.com/question/46197687
  @beanfrog:二者目的不一样:sigmoid 用在了各种 gate 上,产生 0~1 之间的值,这个一般只有 sigmoid 最直接了。tanh 用在了状态和输出上,是对数据的处理,这个用其他激活函数或许也可以。
  @hhhh:另可参见 A Critical Review of Recurrent Neural Networks for Sequence Learning 的 section4.1,说了那两个 tanh 都可以替换成别的。

126. 衡量分类器的好坏。

  @我愛大泡泡,来源:http://blog.csdn.net/woaidapaopao/article/details/77806273
  这里首先要知道 TP、FN(真的判成假的)、FP(假的判成真)、TN 四种(可以画一个表格)。 
  几种常用的指标:

  精度 precision = TP/(TP+FP) = TP/~P (~p 为预测为真的数量)

  召回率 recall = TP/(TP+FN) = TP/ P

  F1 值: 2/F1 = 1/recall + 1/precision

  ROC 曲线:ROC 空间是一个以伪阳性率(FPR,false positive rate)为 X 轴,真阳性率(TPR, true positive rate)为 Y 轴的二维坐标系所代表的平面。其中真阳率 TPR = TP / P = recall, 伪阳率 FPR = FP / N

127. 机器学习和统计里面的 auc 的物理意义是什么?

  详情参见https://www.zhihu.com/question/39840928

128. 观察增益 gain, alpha 和 gamma 越大,增益越小?

  @AntZ:xgboost 寻找分割点的标准是最大化 gain. 考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost 实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中计算 Gain 按最大值找出最佳的分割点。它的计算公式分为四项, 可以由正则化项参数调整 (lamda 为叶子权重平方和的系数, gama 为叶子数量):


  第一项是假设分割的左孩子的权重分数, 第二项为右孩子, 第三项为不分割总体分数, 最后一项为引入一个节点的复杂度损失
由公式可知, gama 越大 gain 越小, lamda 越大, gain 可能小也可能大。
  原问题是 alpha 而不是 lambda, 这里 paper 上没有提到, xgboost 实现上有这个参数. 上面是我从 paper 上理解的答案, 下面是搜索到的:
https://zhidao.baidu.com/question/2121727290086699747.html?fr=iks&word=xgboost+lamda&ie=gbk
  lambda[默认 1] 权重的 L2 正则化项。(和 Ridge regression 类似)。 这个参数是用来控制 XGBoost 的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。11、alpha[默认 1] 权重的 L1 正则化项。(和 Lasso regression 类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
  gamma[默认 0] 在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma 指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。

129. 什么造成梯度消失问题? 推导一下

  @许韩,来源:https://www.zhihu.com/question/41233373/answer/145404190

Yes you should understand backdrop-Andrej Karpathy 

How does the ReLu solve the vanishing gradient problem?

  神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用 BP 算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。

  梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为 0,造成学习停止。
**130.**什么是梯度消失和梯度爆炸?

  @寒小阳,反向传播中链式法则带来的连乘,如果有数很小趋于 0,结果就会特别小(梯度消失);如果数都比较大,可能结果会很大(梯度爆炸)。
  @单车,下段来源:https://zhuanlan.zhihu.com/p/25631496
  层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。

  例如,对于下图所示的含有 3 个隐藏层的神经网络,梯度消失问题发生时,接近于输出层的 hidden layer 3 等的权值更新相对正常,但前面的 hidden layer 1 的权值更新会变得很慢,导致前面的层权值几乎不变,仍接近于初始化的权值,这就导致 hidden layer 1 相当于只是一个映射层,对所有的输入做了一个同一映射,这是此深层网络的学习就等价于只有后几层的浅层网络的学习了。

  而这种问题为何会产生呢?以下图的反向传播为例(假设每一层只有一个神经元且对于每一层,其中为 sigmoid 函数)

  可以推导出

  而 sigmoid 的导数如下图

  可见,的最大值为 1/4,而我们初始化的网络权值 |w| 通常都小于 1,因此,因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现。

  这样,梯度爆炸问题的出现原因就显而易见了,即,也就是 w 比较大的情况。但对于使用 sigmoid 激活函数来说,这种情况比较少。因为的大小也与 w 有关(z=wx+b),除非该层的输入值 x 在一直一个比较小的范围内。

  其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用 ReLU 激活函数取代 sigmoid 激活函数。另外,LSTM 的结构设计也可以改善 RNN 中的梯度消失问题。

**131.**如何解决梯度消失和梯度膨胀?

  (1)梯度消失:
  根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于 1 的话,那么即使这个结果是 0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于 0
  可以采用 ReLU 激活函数有效的解决梯度消失的情况
  (2)梯度膨胀
  根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于 1 的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大
  可以通过激活函数来解决

132. 推导下反向传播 Backpropagation

  @我愛大泡泡,来源:http://blog.csdn.net/woaidapaopao/article/details/77806273

  反向传播是在求解损失函数 L 对参数 w 求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置 0,否则所有隐层的数值都会与输入相关,这称为对称失效。 

  大致过程是:

  1. 首先前向传导计算出所有节点的激活值和输出值, 

  2. 计算整体损失函数: 

  3. 然后针对第 L 层的每个节点计算出残差(这里是因为 UFLDL 中说的是残差,本质就是整体损失函数对每一层激活值 Z 的导数),所以要对 W 求导只要再乘上激活函数对 W 的导数即可 

 

133.SVD 和 PCA

  PCA 的理念是使得数据投影后的方差最大,找到这样一个投影向量,满足方差最大的条件即可。而经过了去除均值的操作之后,就可以用 SVD 分解来求解这样一个投影向量,选择特征值最大的方向。

134. 数据不平衡问题

  这主要是由于数据分布不平衡造成的。解决方法如下:

  • 采样,对小样本加噪声采样,对大样本进行下采样

  • 进行特殊的加权,如在 Adaboost 中或者 SVM 中

  • 采用对不平衡数据集不敏感的算法

  • 改变评价标准:用 AUC/ROC 来进行评价

  • 采用 Bagging/Boosting/ensemble 等方法

  • 考虑数据的先验分布

**135. 简述神经网络的发展 **************

  MP 模型 +sgn—-> 单层感知机(只能线性)+sgn— Minsky 低谷 —> 多层感知机 +BP+sigmoid—- (低谷) —> 深度学习 +pre-training+ReLU/sigmoid

136. 深度学习常用方法

  @SmallisBig,来源:http://blog.csdn.net/u010496169/article/details/73550487
  全连接 DNN(相邻层相互连接、层内无连接): 
  AutoEncoder(尽可能还原输入)、Sparse Coding(在 AE 上加入 L1 规范)、RBM(解决概率问题)—–> 特征探测器——> 栈式叠加 贪心训练 
  RBM—->DBN 
  解决全连接 DNN 的全连接问题—–>CNN 
  解决全连接 DNN 的无法对时间序列上变化进行建模的问题—–>RNN—解决时间轴上的梯度消失问题——->LSTM

137. 神经网络模型(Neural Network)因受人类大脑的启发而得名。

  神经网络由许多神经元(Neuron)组成,每个神经元接受一个输入,对输入进行处理后给出一个输出,如下图所示。请问下列关于神经元的描述中,哪一项是正确的?

  A. 每个神经元只有一个输入和一个输出

  B. 每个神经元有多个输入和一个输出

  C. 每个神经元有一个输入和多个输出

  D. 每个神经元有多个输入和多个输出

  E. 上述都正确

  答案:(E)

  每个神经元可以有一个或多个输入,和一个或多个输出。


更多高质资源 尽在AIQ 机器学习大数据 知乎专栏 点击关注

转载请注明 AIQ - 最专业的机器学习大数据社区  http://www.6aiq.com