【转】BAT机器学习面试1000题系列(121~130)

BAT机器学习面试1000题系列

整理:July、元超、立娜、德伟、贾茹、王剑、AntZ、孟莹等众人。本系列大部分题目来源于公开网络,取之分享,用之分享,且在撰写答案过程中若引用他人解析则必注明原作者及来源链接。另,不少答案得到寒小阳、管博士、张雨石、王赟、褚博士等七月在线名师审校。
说明:本系列作为国内首个AI题库,首发于七月在线实验室公众号上:julyedulab,并部分更新于本博客上,且已于17年双十二当天上线七月在线官网七月在线Android APP七月在线iPhone APP后本文暂停更新和维护,另外的近3000道题都已更新到七月在线APP或七月在线官网题库板块上,欢迎天天刷题。另,可以转载,注明来源链接即可。

 

 

前言

    July我又回来了。

    之前本博客整理过数千道微软等公司的面试题,侧重数据结构、算法、海量数据处理,详见:微软面试100题系列,今17年,近期和团队整理BAT机器学习面试1000题系列,侧重机器学习、深度学习。我们将通过这个系列索引绝大部分机器学习和深度学习的笔试面试题、知识点,它将更是一个足够庞大的机器学习和深度学习面试库/知识库,通俗成体系且循序渐进。

    此外,有四点得强调下:

  1. 虽然本系列主要是机器学习、深度学习相关的考题,其他类型的题不多,但不代表应聘机器学习或深度学习的岗位时,公司或面试官就只问这两项,虽说是做数据或AI相关,但基本的语言(比如Python)、编码coding能力(对于开发,编码coding能力怎么强调都不过分,比如最简单的手写快速排序、手写二分查找)、数据结构、算法、计算机体系结构、操作系统、概率统计等等也必须掌握。对于数据结构和算法,一者 重点推荐前面说的微软面试100题系列(后来这个系列整理成了新书《编程之法:面试和算法心得》),二者 多刷leetcode,看1000道题不如实际动手刷100道。
  2. 本系列会尽量让考察同一个部分(比如同是模型/算法相关的)、同一个方向(比如同是属于最优化的算法)的题整理到一块,为的是让大家做到举一反三、构建完整知识体系,在准备笔试面试的过程中,通过懂一题懂一片。
  3. 本系列每一道题的答案都会确保逻辑清晰、通俗易懂(当你学习某个知识点感觉学不懂时,十有八九不是你不够聪明,十有八九是你所看的资料不够通俗、不够易懂),如有更好意见,欢迎在评论下共同探讨。
  4. 关于如何学习机器学习,最推荐机器学习集训营系列。从Python基础、数据分析、爬虫,到数据可视化、spark大数据,最后实战机器学习、深度学习等一应俱全。

    另,本系列会长久更新,直到上千道、甚至数千道题,欢迎各位于评论下留言分享你在自己笔试面试中遇到的题,或你在网上看到或收藏的题,共同分享帮助全球更多人,thanks。

 

限于篇幅,完整版可以扫码领取,添加时备注:领取面经100篇

 

BAT机器学习面试1000题系列

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

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

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

可以推导出

\begin{align}&\frac{\partial C}{\partial b_1}=\frac{\partial C}{\partial y_4}\frac{\partial y_4}{\partial z_4}\frac{\partial z_4}{\partial x_4}\frac{\partial x_4}{\partial z_3}\frac{\partial z_3}{\partial x_3}\frac{\partial x_3}{\partial z_2}\frac{\partial z_2}{\partial x_2}\frac{\partial x_2}{\partial z_1}\frac{\partial z_1}{\partial b_1}\\&=\frac{\partial C}{\partial y_4}\sigma'\left(z_4\right)w_4\sigma'\left(z_3\right)w_3\sigma'\left(z_2\right)w_2\sigma'\left(z_1\right)\end{align}

而sigmoid的导数\sigma'\left(x\right)如下图

可见,\sigma'\left(x\right)的最大值为\frac{1}{4},而我们初始化的网络权值|w|通常都小于1,因此|\sigma'\left(z\right)w|\leq\frac{1}{4},因此对于上面的链式求导,层数越多,求导结果\frac{\partial C}{\partial b_1}越小,因而导致梯度消失的情况出现。

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

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

122 如何解决梯度消失和梯度膨胀?深度学习 DL基础 中
(1)梯度消失:
根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0
可以采用ReLU激活函数有效的解决梯度消失的情况,也可以用Batch Normalization解决这个问题。关于深度学习中 Batch Normalization为什么效果好?参见:https://www.zhihu.com/question/38102762
(2)梯度膨胀
根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大
可以通过激活函数来解决,或用Batch Normalization解决这个问题。

123 推导下反向传播Backpropagation。深度学习 DL基础 难
@我愛大泡泡,来源:http://blog.csdn.net/woaidapaopao/article/details/77806273

首先,要理解反向传播的基本原理,那就是求导的链式法则。

反映到神经网络里:

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

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

  • 计算整体损失函数: 
    损失函数

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

124 SVD和PCA。机器学习 ML模型 中

PCA的理念是使得数据投影后的方差最大,找到这样一个投影向量,满足方差最大的条件即可。而经过了去除均值的操作之后,就可以用SVD分解来求解这样一个投影向量,选择特征值最大的方向。
PCA的本质是对于一个以矩阵为参数的分布进行似然估计,而SVD是矩阵近似的有效手段。
详见:https://www.zhihu.com/question/40043805

125 数据不平衡问题。机器学习 ML基础 易

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

  • 采样,对小样本加噪声采样,对大样本进行下采样
  • 数据生成,利用已知样本生成新的样本
  • 进行特殊的加权,如在Adaboost中或者SVM中
  • 采用对不平衡数据集不敏感的算法
  • 改变评价标准:用AUC/ROC来进行评价
  • 采用Bagging/Boosting/ensemble等方法
  • 在设计模型的时候考虑数据的先验分布

126 简述神经网络的发展历史。深度学习 DL基础 中
1949年Hebb提出了神经心理学学习范式——Hebbian学习理论
1952年,IBM的Arthur Samuel写出了西洋棋程序
1957年,Rosenblatt的感知器算法是第二个有着神经系统科学背景的机器学习模型.
3年之后,Widrow因发明Delta学习规则而载入ML史册,该规则马上就很好的应用到了感知器的训练中
感知器的热度在1969被Minskey一盆冷水泼灭了。他提出了著名的XOR问题,论证了感知器在类似XOR问题的线性不可分数据的无力。
尽管BP的思想在70年代就被Linnainmaa以“自动微分的翻转模式”被提出来,但直到1981年才被Werbos应用到多层感知器(MLP)中,NN新的大繁荣。
1991年的Hochreiter和2001年的Hochreiter的工作,都表明在使用BP算法时,NN单元饱和之后会发生梯度损失。又发生停滞。
时间终于走到了当下,随着计算资源的增长和数据量的增长。一个新的NN领域——深度学习出现了。
简言之,MP模型+sgn—->单层感知机(只能线性)+sgn— Minsky 低谷 —>多层感知机+BP+sigmoid—- (低谷) —>深度学习+pre-training+ReLU/sigmoid

127 深度学习常用方法。深度学习 DL基础 中
@SmallisBig,来源:http://blog.csdn.net/u010496169/article/details/73550487
全连接DNN(相邻层相互连接、层内无连接): 
AutoEncoder(尽可能还原输入)、Sparse Coding(在AE上加入L1规范)、RBM(解决概率问题)—–>特征探测器——>栈式叠加 贪心训练 
RBM—->DBN 
解决全连接DNN的全连接问题—–>CNN 
解决全连接DNN的无法对时间序列上变化进行建模的问题—–>RNN—解决时间轴上的梯度消失问题——->LSTM
@张雨石:现在在应用领域应用的做多的是DNN,CNN和RNN。
DNN是传统的全连接网络,可以用于广告点击率预估,推荐等。其使用embedding的方式将很多离散的特征编码到神经网络中,可以很大的提升结果。
CNN主要用于计算机视觉(Computer Vision)领域,CNN的出现主要解决了DNN在图像领域中参数过多的问题。同时,CNN特有的卷积、池化、batch normalization、Inception、ResNet、DeepNet等一系列的发展也使得在分类、物体检测、人脸识别、图像分割等众多领域有了长足的进步。同时,CNN不仅在图像上应用很多,在自然语言处理上也颇有进展,现在已经有基于CNN的语言模型能够达到比LSTM更好的效果。在最新的AlphaZero中,CNN中的ResNet也是两种基本算法之一。
GAN是一种应用在生成模型的训练方法,现在有很多在CV方面的应用,例如图像翻译,图像超清化、图像修复等等。
RNN主要用于自然语言处理(Natural Language Processing)领域,用于处理序列到序列的问题。普通RNN会遇到梯度爆炸和梯度消失的问题。所以现在在NLP领域,一般会使用LSTM模型。在最近的机器翻译领域,Attention作为一种新的手段,也被引入进来。
除了DNN、RNN和CNN外, 自动编码器(AutoEncoder)、稀疏编码(Sparse Coding)、深度信念网络(DBM)、限制玻尔兹曼机(RBM)也都有相应的研究。

128 神经网络模型(Neural Network)因受人类大脑的启发而得名。深度学习 DL基础 易

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

  1. A 每个神经元可以有一个输入和一个输出

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

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

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

  5. E 上述都正确

  答案:(E)

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

129 下图是一个神经元的数学表示。深度学习 DL基础 易

  这些组成部分分别表示为:

  - x1, x2,…, xN:表示神经元的输入。可以是输入层的实际观测值,也可以是某一个隐藏层(Hidden Layer)的中间值

  - w1, w2,…,wN:表示每一个输入的权重

  - bi:表示偏差单元/偏移量(bias unit)。作为常数项加到激活函数的输入当中,类似截距(Intercept)

  - a:作为神经元的激励函数(Activation),可以表示为

  - y:神经元输出

  考虑上述标注,线性等式(y = mx + c)可以被认为是属于神经元吗:

  A. 是

  B. 否

  答案:(A)

输入只有一个变量,激活函数为线性。所以可以被认为是线性回归函数。

130 在一个神经网络中,知道每一个神经元的权重和偏差是最重要的一步。如果知道了神经元准确的权重和偏差,便可以近似任何函数,但怎么获知每个神经的权重和偏移呢?深度学习 DL基础 易
 A 搜索每个可能的权重和偏差组合,直到得到最佳值
 B 赋予一个初始值,然后检查跟最佳值的差值,不断迭代调整权重
 C 随机赋值,听天由命
 D 以上都不正确的
答案:(B)
选项B是对梯度下降的描述。

后记

熟悉我的朋友可能已经知道,我个人从 2010 年开始在CSDN写博客,写了十年,如今接近1700万PV,创业做「七月在线」则已五年,五年已30多万学员。这五年经历且看过很多的人和事,比如我们的机器学习集训营帮助了超过1000人就业、转型、提升,他们就业后有的同学会分享面经,当看到那一篇篇透露着面经作者本人的那股努力、那股不服输的劲的面经的时候,则让我倍感励志。比如“双非渣本三年 100 次面试经历精选:从最初 iOS 前端到转型面机器学习” 这篇面经,便让我印象非常深刻。在佩服主人公毅力和意志的同时,也对他愿意分享对众多人有着非常重要参考价值和借鉴意义的成功经验倍感欣慰。

当然,类似的面经远远不止于此,后来我们整理出了100篇面经,汇总成册为《名企AI面经100 篇:揭开三个月薪资翻倍的秘诀》,这 100 篇面经分为机器学习、深度学习、 CV、NLP、推荐系统、金融风控、计算广告、数据挖掘/数据分析八大方向。分享面经的作者各种背景都有,比如

  1. 科班,或非科班;
  2. 985、211,或双非院校;
  3. 研究生或本科,甚至大专;
  4. 学生,或在职;
  5. 至于传统IT转型 AI 的就更多了,有从 Java、PHP、C、C++等偏后端服务转型的,也有从 Android、iOS、前端等偏客户端开发转型的,当然也有数据分析、大数据方向等转型的。

但令人振奋的是,他们都转型成功了,而且他们中的很多人都通过集训营/就业班三个月到半年的学习,成功实现薪资翻倍——这些成功的经验就更值得借鉴了。

就业部的同事特地将这些宝贵的经验整理出来,希望可以帮到更多人。

限于篇幅,完整版可以扫码领取,添加时备注:领取面经100篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值