2021算法岗基础技能树怎么点?

简介:

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


0 - 前言

注:本文默认传统算法是所有工程师的基础技能,所以后面提到的算法主要指机器学习以及深度学习等算法。

尽管目前本人求职的重心还是在后端上,但是为了能从现在的人工智能专业硕士顺利毕业,也为了让自己顺便拓展算法工程这条路,简单的规划一下算法这部分需要补的知识和技能还是有必要的。

本文以拿到2021算法岗Offer为目标,从2020的算法岗面经入手,分析需要点的技能树都有哪些。

1 - 不同算法岗的区别

首先需要说明的一个地方就是,不同领域的技术岗位,都会按照接触科研和业务的程度来进行一定的区分。

可以简单参考知乎上霍华德在问题“学术界科研(research)与工业界研发(R&D)有什么区别?”的回答[1],算法岗可以大致分为:

  • 业务导向,大部分情况下以Development为主;
  • 技术导向,Research和Development兼顾;
  • 科研导向,大部分情况下会Research为主;

近几年这一点在算法岗上表现体现的比较明显,因为在几年前大部分算法都还只在研究阶段,而最近随着一些成熟的机器学习封装库被开放过后,部分行业里开始发现这些算法可以产生实际的价值,所以算法岗位也就呈现了近几年的爆发式增长,尤其是业务导向的算法工程师(因为大部分公司还是希望这些算法能更多更快的产出业务价值)。

当然这话其实说的已经有点晚了,现在已经不是刚开始那样的时候了,那个时候会使用框架、调调参就可以拿到Offer,现在的算法岗更像是浪潮过后的归于正常的情况,不仅需要扎实的理论基础,还需要丰富的项目实践。

我个人是更倾向于业务导向的算法工程,所以本文以这部分为目标来编写。

2 - 2020面经读后感

为了更好地了解各行业公司都比较看重哪些方面的东西(很可能也都是这些公司在用的技术),我选择直接从算法岗的面经里去寻找可能的答案,面经贴主要是牛客网上的[3]。

找到的点可以简单分为以下几类:

  • 纯数学相关
  • 机器学习
  • 深度学习
  • NLP相关
  • 推荐算法

一些传统算法相关就不在此列了。我能够看到的面经是有限的,面经里提供的内容也是有限的,所以后面的内容不能说能概括到全部,但是至少能提取出很大一部分频繁出现的关键词(如果真的有需要的话再写个爬虫+关键词提取吧)。

内容因为并没有特别多的先后依赖关系,所以就按照在面经里出现的顺序来列了。

2.1 - 纯数学相关

  • 事件概率计算
  • 狄利克雷分布
  • 最大似然估计和贝叶斯估计
    ...

2.2 - 机器学习

数据清洗、数据平滑

常用的降维方式、PCA

LDA(Linear Discriminant Analysis)

决策树,ID3、C4.5、CART

XGBoost、LightGBM、随机森林、Adaboost、GBDT

SVM原理、对偶问题

L1、L2正则化

过拟合

特征选择方法

LR(Logistic Regression)和SVM、Linear SVM 和 LR

聚类方法、K-means、层次聚类

模型的评价指标、ROC

朴素贝叶斯原理

scikit-learn、numpy

bagging和boosting

集成学习

分类方法

模型上线优化

连续值、离散值,离散化连续特征的好处

回归方法、线性回归、岭回归、Lasso回归、LR

信息增益,信息增益比,Gini系数的关系

One-Hot编码的原理及意义

Optimizers(Gradient Descent、...)

统计学习算法

...

2.3 - 深度学习

Feedforward Neural Network

Back Propagation

Layers,convolutional、pooling、full connected

CNN(卷积)、RNN(梯度消失问题)、LSTM、GRU

GAN

目标检测,R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、...

SoftMax、Sigmoid

Embedding

注意力机制

GCN(Graph Convolutional Network)

Optimizers(Gradient Descent、BGD、SGD、Adam、Adagard...)

Tensorflow、Keras、PyTorch

Activation(sigmoid、softmax、relu...)

MobileNet

Dropout

CPU、GPU加速

...

2.4 - NLP相关

关键字提取、TF-IDF

命名实体

LDA(Latent Dirichlet Allocation)

word2vec

Bert、Transformer

...

2.5 - 推荐算法

基于内容的推荐

协同过滤推荐、UserCF、ItemCF

如何处理稀疏矩阵
...

2.6 - 面经总结

在大部分算法面试中,面试官的问题都是围绕着简历上的项目来问的,我们可以看到上面的很多项目所涉及到的点,面试官都有可能往深了问,比如:

SVM原始问题为什么要转化为对偶问题,为什么对偶问题就好求解,原始问题不能求解么?

K-means 中我想聚成100类 结果发现只能聚成98类,为什么?

LR和SVM这两个应用起来有什么不同?

对于PCA,会有第一主成分、第二主成分,怎么为什么第一主成分是第一,原因是什么?

bagging 和boosting 哪个可以让结果的方差更小一些,为什么?
...

所以在学习过程中不光要知道How,还是要多知道几个Why,一是为了能在面试的时候能回答出问题,二是为了更好地理解手里的这个工具。

3 - 算法的基础技能树

面经总结出来的点也还是有点乱,所以我又参考了一些算法学习路线的帖子来简单的归类梳理一下各个点,主要是参考的机器之心的这篇完备的 AI 学习路线。

3.1 - 数学基础

高等数学

线性代数

概率论与数理统计

并不是说要把上面三个教材吃的完全透了才开始学习后面的,其实人工智能领域很多方法都只是用到了其中的一小部分,有一些专门总结了的机器学习中需要使用到的数学知识的书籍和文档。

有些帖子可能会在数学基础这部分加上一个凸优化,个人理解上,在纯粹的学习过程中凸优化可以说是最枯燥的一门课,里面大部分是一些凸优化的定义和理论公式的证明,所以建议在后期遇到的时候再切入某一个点深入学习。

3.2 - 编程基础

在数值分析和人工智能这方面,还是Python支持的库比较方便,在入门学习方面已经足够使用了,版本目前推荐3.5 or 3.6。

Anaconda(or Miniconda)是一个比较方便的Python虚拟环境和包管理软件,但是在某些时候会遇到麻烦事(比如一些算法框架的奇奇怪怪的环境要求),但是在大部分情况下的入门阶段已经足够使用了。

Python的IDE大部分人常用的就是Pycharm,如果有些能力折腾的,可以考虑用vscode+插件等等。

3.3 - 数据处理/分析/挖掘

实际使用中,很多机器学习、深度学习方法只有在高质量数据中才能起作用,比如数据的信息量足够多、噪声和错误信息足够少。而实际数据收集过程中,很多情况下不可能让数据这么完美,所以需要进行一些初步的数据处理(采集、清洗、采样、去噪、降维、...)。

除了Python语言基础,还需要掌握一些基础的数据处理库,比如numpy、pandas、matplotlib等,可以参考机器之心推荐的《利用python进行数据分析》。

这本书含有大量的实践案例,你将学会如何利用各种Python库(包括NumPy,Pandas、Matplotlib以及IPython等)高效地解决各式各样的数据分析问题。如果把代码都运行一次,基本上就能解决数据分析的大部分问题了。

另外还有就是:

数据挖掘中的特征工程

一些数据挖掘的项目

数据挖掘可以帮助我们初步的理解数据各特征之间具有的一些关系,增加或者删除一些特征来帮助后续的学习。数据挖掘可以通过一些导论书籍或者课程进行一些初步系统性的了解,其中的大部分原理都不是很高深。

3.4 - 传统机器学习

3.4.1 - 入门

如果在入门的时候,一开始就学习数学和理论公式,也不去弄明白这个东西到底有什么用,就很难去理解到底为什么需要这些理论。

在学习每个机器学习算法前,可以先笼统的明白这个东西的作用,然后带着问题“这个是怎么实现的?”去探究算法的理论,才能比较贯通的理解其中的数学和公式。

3.4.2 - 理论

机器学习的理论部分大概有:

  • 机器学习所面向的问题

分类

决策树

K-近邻

SVM

Logistic回归

贝叶斯

随机森林

...

  • 回归

线性回归

最小二乘回归

局部回归

神经网络

...

  • 聚类

K-means

EM

...

  • 降维

主成分分析 PCA

线性判别分析 LDA

...

  • 回归

线性回归

Logistic回归

...

  • 决策树与随机森林

ID3

C4.5

CART

回归树

随机森林

...

  • SVM

线性可分

线性不可分

  • 最大熵与EM算法
  • 多算法组合与模型优化

模型选择

模型状态分析

模型优化

模型融合

  • 贝叶斯网络
  • 隐马尔可夫链HMM

马尔可夫链

隐马尔可夫链

  • 主题模型LDA
  • 集成学习
    ...

内心OS:这总结下来基本上和某些书的目录差不多了。

3.4.3 - 实践

在初步入门和学习理论后,为了活学活用学到的算法,可以尝试进行实践。

首先是一些可以拓展能力的常用工具(免得自己造轮子):

scikit-learn:一个Python第三方提供的非常强力的机器学习库,它包含了从数据预处理到训练模型的各个方面。在实战使用scikit-learn中可以极大的节省我们编写代码的时间以及减少我们的代码量,使我们有更多的精力去分析数据分布,调整模型和修改超参。

XGBoost:xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案。在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sungrid Engine等各个平台上面运行,并且保留了单机并行版本的各种优化,使得它可以很好地解决于工业界规模的问题。

LightBGM:​ LightGBM(Light Gradient Boosting Machine)同样是一款基于决策树算法的分布式梯度提升框架。为了满足工业界缩短模型计算时间的需求,LightGBM的设计思路主要是两点:

  1. 减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;
  2. 减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。

...

然后就可以去Kaggle上和大佬们对线了,如果你有能力也有idea,可以自己开出一个项目来做。
如果你对某些算法有更深程度的理解,你甚至可以尝试用自己代码复现这些算法。

3.5 - 深度学习

3.5.1 - 入门

3.5.2 - 理论

深度学习的理论部分大概有:

  • 基础神经网络

神经元

激活函数

基本结构:输入层、隐藏层、输出层

反向传播算法

  • CNN

卷积层

池化层

全连接层

CNN的典型网络结构(LeNet, AlexNet, VGG, ResNet, ...)

  • RNN

单向RNN

双向RNN

深度RNN

LSTM

GRU

  • GAN

...

你可以从广度上入手,在都了解的基础上,选择一个方向进行深入学习:

计算机视觉(图像、视频处理,主要用CNN);

自然语言处理NLP(包括文本、语音处理,序列数据往往需要RNN);

生成模型(GAN、VAE等等);

3.5.3 - 实践

在初步入门和学习理论后,为了活学活用学到的深度学习算法,可以尝试进行实践。

首先是一些可以拓展能力的常用工具(免得自己造轮子):

TensorFlow,Google开源的深度学习框架,不过接口都比较底层,可能入门级稍难。

Keras,一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras对入门友好,不过其中过多的封装可能会导致需要自定义修改比较麻烦,所以他们主要面向的是快速实验、快速验证的任务。

PyTorch,Facebook发布的一套深度学习框架,PyTorch专注于直接处理数组表达式的较低级别 API。去年它受到了大量关注,成为学术研究和需要优化自定义表达式的深度学习应用偏好的解决方案。

关于哪个工具更好的问题,"支持者"之间也是争议不断,其实也不用纠结到底应该选哪一个,都试试不就知道了。

选择一个工具学会后,就可以去Kaggle上和大佬们对线了,如果你有能力也有idea,可以自己开出一个项目来做。

3.6 - 其他

至于强化学习、迁移学习、计算机视觉、NLP、推荐系统、知识图谱等内容,限于文章篇幅,就不在这里介绍了。

3.7 - 论文阅读

机器学习、深度学习大部分理论内容都来自计算机科研领域发表的论文,当下的前沿技术也都在近几年发表的论文中。

作为入门、理论、实践的之后一个拓展阶段,可以通过阅读前沿论文来增加知识面。

由于前沿论文阅读并不能算是一个业务导向的算法工程师所必须具有的能力,所以在这就不做过多的介绍了,同样,你可以在机器之心的那篇文章中找到关于阅读前沿Paper的相关介绍。

**4 - 总结
**
不久前,某404网站给我推送了一个视频,名字看起来非常标题党,Don't learn machine learning - Daniel Bourke,源:Youtube,其中作者核心的内容是不要为了只是学习算法而学习算法,要为了创造产品(或者说应用、或者说解决问题)而学习算法,有条件的同学可以看看(暂时还没有看到国内的翻译搬运,如果有时间有机会的话我就翻译搬运一下吧)。

面向Offer学习未必是最优的一条路。我的目标是以后端为主线发展,之所以还没有完全的放弃这部分的算法,一部分是因为我的专业,更多的原因是我知道在某些问题上只有这些算法才能有效地解决,会用更多的算法也可以让程序员解决更多的问题。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-13
本文作者:Yumiku
本文来自:“掘金”,了解相关信息可以关注“掘金”

相关文章
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
3031 0
|
机器学习/深度学习 人工智能 JSON
CSDN 算法技能树 蓝桥杯-基础 刷题+思考总结
一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀,会得到多少面条呢?
86 0
|
算法 开发工具 git
CSDN算法技能树测评
CSDN算法技能树测评
120 0
CSDN算法技能树测评
|
算法 API
算法基础学习2——冒泡排序
要比较的每一对元素是相邻的,从下标为0开始,到最后一个元素,如果下标设为 j,则相邻元素下标值为 j +1,搜索到最后一个元素:j+1<a.length,而 a.length - 1 = i ;所以终止条件是 j < i
103 0
算法基础学习2——冒泡排序
|
机器学习/深度学习 算法 Java
算法基础学习1——时间复杂度和空间复杂度
算法基础学习1——时间复杂度和空间复杂度
98 0
算法基础学习1——时间复杂度和空间复杂度
|
搜索推荐 Java
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
|
机器学习/深度学习 自然语言处理 算法
深度学习算法基础
深度学习算法基础
153 0
|
存储 编解码 算法
【算法基础】希尔排序解析
希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
91 0
|
编解码 算法 网络协议
【算法基础】冒泡排序解析
在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。
139 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
136 0