机器学习保姆级学习路线及面试
作者:码农鬼仔
链接:https://www.nowcoder.com/discuss/1059103
来源:牛客网
但鬼仔的这几篇笔记太零散了,想到哪写到哪,不利于同学们系统性地进行学习和准备算法岗的知识。在算法岗面试中,常常会考察机器学习和深度学习里面的一些基础知识,这部分可能会问的比较广,需要同学们系统地学习和掌握。
鬼仔在大学期间(本科+研究生)看了十几本有关机器学习和深度学习的书籍,也整理了不少笔记。好记性不如烂笔头,看书很重要,总结和整理也同样重要。有的问题你可能理解了,但是在实际面试中表达出来没那么专业,或者错漏一些细节,因此而被扣分就太可惜了。
文章来源公众号:码农鬼仔,专注分享算法知识|面试技巧|职场感悟|内推信息。
机器学习保姆级学习路线
一、机器学习理论知识
理论知识主要分为了三个章节:经典统计学习、深度学习和强化学习。每个章节力求由浅入深,关注重要知识点,以及对应的高频面试题。
Part1:经典统计学习
经典统计学习包括监督学习、非监督学习和弱监督学习三大类,这章主要会介绍整个机器学习的一些基础概念,以及一系列传统的机器学习算法。很多目标算法岗的同学可能会对这一部分有所疏漏,觉得这些算法都很简单,而且老掉牙了,不屑一顾;也有一些非科班的同学是直接跳过经典的统计学习,直接学的深度学习,最后有些人还确实拿到了算法岗offer。
但鬼仔认为这是一种不正确的学习路线,统计学习就像是机器学习大厦的基石,深度学习和强化学习则属于上层建筑。很多算法岗的面试中,面试官都会特意考察这部分的内容,当然如果你的简历足够优秀,发表了一些顶会论文,面试可能就只会问论文创新点。但出来混,迟早要还的。在实际工作中,会面对各种复杂非结构化的现实数据,这个时候往往就会考验你的算法功底,只会深度学习并不能完全解决问题。
Part2:深度学习
深度学习作为机器学习的一个重要分支,有着更加强大的泛化能力。在大数据时代,传统机器学习算法学习能力有限,数据量的增加并不能持续增加学到的知识总量,而深度学习系统可以通过更多的训练数据来提升性能,即“可获得更多经验”。
本章节主要介绍各种网络结构,包括CNN,RNN,GAN,GNN和transformer,接着再介绍常用的网络优化及正则化方法,最后再介绍迁移学习,这里会涉及一些大规模的预训练模型和蒸馏方法。
Part3:强化学习
强化学习同样是机器学习大家族中的一大类,AlphaGo击败中国世界围棋冠军柯洁让AI名声大噪,其背后原理就是强化学习。这个章节主要介绍强化学习常用的求解方法和经典的模型算法,最后阐述其实际的应用场景,即为什么需要强化学习。
二、机器学习实践应用
计算机是实践的科学,当我们掌握了机器学习的理论知识后,就要想办法把它应用到实际场景中解决真实的问题。
这份学习路线中的第二大部分——机器学习实践应用,鬼仔其实还没有特别想清楚具体应该怎么写,因为这一部分写起来难度很大,你需要了解nlp,cv,data mining等多个领域。不过鬼仔恰好都接触过这几个领域,虽算不上精通,但还是可以尽力写个入门级的教程。这得益于鬼仔研究生期间(偷偷)去过多家公司实习,现在又在做多模态的工作,涉及到的技术会比较宽泛。
鬼仔初步规划会将机器学习实践应用划分为6个部分,分别是:
1. 最实用的数据挖掘领域:主要针对表格型数据的挖掘:问题建模、探索性数据分析、特征工程、模型选择和评估、模型融合2. 最赚钱的搜广推领域:语意匹配、用户画像、点击率预测、推荐召回、推荐排序
3. nlp文本领域:文本分类、文本匹配、序列标注、文本生成、语言模型
4. cv视觉领域:图像分类、目标检测、场景文字识别、视频分类
5. speech语音领域:语音识别、语音分类、语音合成
6. 实际工作中的算法工程化:多机多卡分布式训练、spark大数据等
总结
在本文鬼仔主要给大家从宏观的角度分享机器学习领域的研究重点,包括理论知识和实际应用两大模块,而子模块分享的比较粗糙,这是因为每一个子模块是无法只用一篇或两篇文章就能够讲清楚的,涉及到一些细节方面的分享,鬼仔都会在后面【机器学习】专题系列里面进行一一地分享。链接:https://www.nowcoder.com/discuss/1089778
来源:牛客网
二、面试真题
6. 梯度下降算法有哪几种分类,各有什么优缺点?
(1)批量梯度下降(BGD):批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
优点:
- 一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行,迭代的次数相对较少。
- 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
- 当样本数目很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
(2)随机梯度下降(SGD):每次迭代使用一个样本来对参数进行更新。使得训练速度加快。
优点:
- 由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
- 准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
- 可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
- 不易于并行实现。
(3)小批量梯度下降(MBGD):是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代使用 batch_size个样本来对参数进行更新。
优点:
- 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
- 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
- 可实现并行化。
缺点:
- batch_size的不当选择可能会带来一些问题。
7. 在MBGD(mini-Batch Gradient Descent)算法中,batch_size大小有什么影响?
batch_size的选择带来的影响:
(1)在合理地范围内,增大batch_size的好处:
- 内存利用率提高了,大矩阵乘法的并行化效率提高。
- 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
- 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
(2)盲目增大batch_size的坏处:
- 内存利用率提高了,但是内存容量可能撑不住了。
- 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
- Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
8. 简单介绍下牛顿法和拟牛顿法。
- 牛顿法是用来求方程根的,但求方程根和求极值本质上是一个问题,因为求极值就是求导数为0的点,即导数方程的根。求一元方程根的时候,随机一个初始点,求它的切线,找到切线和x轴的交点对应的函数点,再求切线,这样迭代就能找到根。求极值就是求导函数的根,所以二次导数是斜率,可以求到导函数的切线。
- 牛顿法推理:利用泰勒展开。
- 牛顿法存在的问题:Hessian矩阵的逆矩阵计算量大,且可能不可逆。当目标函数非凸时,更容易收敛到鞍点。
- 拟牛顿法:用一个正定矩阵近似牛顿法中的海塞矩阵的逆矩阵H-1。常用的有DFP、BFGS。
9. 牛顿法和梯度下降法的区别?
牛顿法是二阶的,梯度下降是一阶的,牛顿法的收敛速度更快,梯度下降法只考虑了方向,而牛顿法还兼顾了步子的大小。
10. 逻辑回归为什么使用对数损失而不用平方损失?
我们先回顾下逻辑回归的损失函数,也即是它的极大似然函数为:
通过梯度下降算法得到模型参数的更新公式:
可以看到,参数的更新速度只和样本有关系,和sigmod函数本身的梯度是无关的,这样更新速度更快,而且比较稳定。
如果选用平方损失函数,经过推导可以发现,梯度更新的速度和sigmod函数的梯度有关,而sigmod函数它在定义域内的梯度都不大于0.25,这样会导致训练速度很慢。
11. 逻辑回归模型中,为什么常常要做特征组合(特征交叉)
- 逻辑回归模型属于线性模型,线性模型不能很好处理非线性特征,特征组合可以引入非线性特征,提升模型的表达能力。
- 基础特征可以认为是全局建模,而组合特征更加精细,是个性化建模,但对全局建模会对部分样本有偏,对每一个样本建模又会导致数据爆炸,过拟合,所以基本特征+特征组合兼顾了全局和个性化。
12. 逻辑回归模型训练过程中,需要去掉高度相关的特征吗?
- 去掉高度相关的特征会让模型的可解释性更好
- 可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间。
作者:码农鬼仔
链接:https://www.nowcoder.com/discuss/1027507
来源:牛客网
举个面试题为例子,候选人背景是机器学习领域:
- 面试题:我们有一个业务系统,每天要处理1000万次服务请求,如何设计这个系统?
- 回答:安全方面,要通过FireWall、蜜罐等方式防止DDOS和渗透类的攻击;系统设计方面,采用分布式系统设计,一个或层次组合的master节点负责分发服务请求,多个worker节点负责处理请求,通过RPC等远程框架实现功能。保证一定的冗余性(backup、多余机器)和节点间的负载均衡。如果服务请求涉及的数据量或计算量太大,需要考虑hadoop,spark这种平台。
为了让23届的同学们互通信息、抱团取暖,鬼仔创建了秋招交流群,群里有持续更新的秋招日程表 和 面经汇总 ,鬼仔还可以提供多家大厂的内推,详情可见【算法、开发、硬件】这些企业秋招正热! ,欢迎和码农鬼仔聊一聊-扣扣群:725768032,鬼仔知无不言~
PS:牛客有自带筛选器校招日程,直达链接:https://www.nowcoder.com/link/xzrcznhzgf,有需要的同学可以自取。
一、微软招聘信息
1. 招聘日历
- 网申时间::8月1日-8月26日中午12:00
- 问卷&笔试链接:每周五下午4:00前发放
- 笔试时间:
- 第一次:8月06日(周六)上午9:00-12:00
- 第二次:8月13日(周六)上午9:00-12:00
- 第三次::8月19日(周五) 晚上7:00-10:00
- 第四次:8月26日(周五) 晚上7:00-10:00
- 线上面试:9月下旬陆续开始,*MCAPS-Asia面试10月开启
- Offer发放:10月中旬陆续开始
2. 温馨提示
- 越早申请,笔试机会越多,微软将保留同学的最高成绩
- 网申仅能投递一个心仪岗位,请大家充分了解岗位详情后再投递
- 网申时避免使用edu邮箱,以免无法收到系统通知,另外请注意检查垃圾邮件
- 官网申请后(完成问卷才视为完成网申
- 问卷只能填写 1次) 请大家充分考虑自己的意愿后填写
- 每周五中午12点前完成网申的同学,将在周五下午4点前收到问卷和笔试链接
二、微软面试技巧
下面结合了面试官以及参加过微软技术岗位面试的微软员工们总结的技巧:
1. 自我介绍:
- 中英文自我介绍:展示性格、个人能力、工作特点
- 简洁
2. 项目经历介绍:
- 是面试官了解你的重要途径,要经得起拷问。
- 实事求是,避免使用夸张的词汇,以免影响面试官的判断。
- 展现扎实的基础专业知识,关键在于理解,便于在工作中应用。
- 言简意赅,善用STAR法则(情境situation、任务task、行动action、结果result四项的缩写。STAR法则是一种常常被面试官使用的工具,用来收集面试者与工作相关的具体信息和能力)进行描述。
3. 关于面试中的笔试环节:
- 刷题数量:不限,因人而异
- 编程语言:不限
- 系统设计:系统设计题会结合之前做过的项目来出题。例如设计一个分布式ID生成系统,简单考察大家对分布式是否有概念。
4. 面试答题工具:
- 链接:打开网址,敲代码,面试官可以看到(一个共享的代码编辑器)
- Teams共享屏幕
5. 做题经验:
- 重复刷题:防止遗忘,认真对待反复做不对的题目。
- 模板:建议熟悉常用模板,有利于面试时发挥出自己的能力,快速解决问题。
- 代码不是一定要没有bug才能过,除了题目本身,遇到挑战时的应对态度、解决问题的方法、思维过程是否清晰、与面试官沟通同样重要。
6. 英语:
- 语言只是交流的工具,达意最重要。只要你有自信、敢说,我们就能看见你的实力!
7. 软性实力:
- 不要将面试当考试:面试不仅仅是做题,更是考察同学解决问题的能力。同时,你要有和业务负责人、PM沟通的能力,沟通能力也是面试的一部分!
- 面试是双向选择的过程,互相契合。
- 成长潜力:遇到问题不会故步自封,对待工作认真负责。
- 多元&包容:我们欢迎多元的人才