3

title.jpg

文章创作于2020年4月,大约7000字,预计阅读时间18分钟,请坐和放宽。

0 - 前言

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

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

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

1 - 不同算法岗的区别

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

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

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

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

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

我个人是更倾向于业务导向的算法工程,所以本文以这部分为目标来编写,如果你有兴趣了解三种不同岗位的细节,可以阅读夕小瑶的一篇公众号文章《拒绝跟风,谈谈几种算法岗的区别和体验》[2]。

2 - 2020面经读后感

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

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

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

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

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

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 学习路线,最详细的中英文资源整理[4],时效为2019-04-28,还参考了一个不知道我什么时候在哪里找到的知识点总结图,如果有人知道出处的话可以在评论里和我说一下,图片链接会附在文章末尾(图片很大,所以放进来会看不清)。

3.1 - 数学基础

  • 高等数学
  • 线性代数
  • 概率论与数理统计

并不是说要把上面三个教材吃的完全透了才开始学习后面的,其实人工智能领域很多方法都只是用到了其中的一小部分,有一些专门总结了的机器学习中需要使用到的数学知识的书籍和文档[4],你可以在机器之心的公众号文章找到这些(我在文章末尾也会上一个链接),具有基本的数学基础的可以用来复习,没有数学基础的还是建议在看不懂的地方回顾到教材。

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

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等)高效地解决各式各样的数据分析问题。如果把代码都运行一次,基本上就能解决数据分析的大部分问题了。

另外还有就是[4]:

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

3.4 - 传统机器学习

3.4.1 - 入门

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

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

这里推荐一个网站,产品经理的人工智能学习库

人工智能领域的百科全书,非常适合小白和新手入门 AI 领域。现在市面上大家看到的绝大部分 AI 资料都是追求严谨的“理工科天书”,这个世界不缺少严谨真确晦涩难懂的 AI 资料,但是很缺容易理解的内容。我们希望抛开复杂的公式,复杂的逻辑,复杂的专用名词。做一套文科生也能看懂的 AI 知识库。

3.4.2 - 理论

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

  • 机器学习所面向的问题

    • 分类

      • 决策树
      • K-近邻
      • SVM
      • Logistic回归
      • 贝叶斯
      • 随机森林
      • ...
    • 回归

      • 线性回归
      • 最小二乘回归
      • 局部回归
      • 神经网络
      • ...
    • 聚类

      • K-means
      • EM
      • ...
    • 降维

      • 主成分分析 PCA
      • 线性判别分析 LDA
      • ...
    • ...
  • 回归

    • 线性回归
    • Logistic回归
    • ...
  • 决策树与随机森林

    • ID3
    • C4.5
    • CART
    • 回归树
    • 随机森林
    • ...
  • SVM

    • 线性可分
    • 线性不可分
  • 最大熵与EM算法
  • 多算法组合与模型优化

    • 模型选择
    • 模型状态分析
    • 模型优化
    • 模型融合
  • 贝叶斯网络
  • 隐马尔可夫链HMM

    • 马尔可夫链
    • 隐马尔可夫链
  • 主题模型LDA
  • 集成学习
  • ...

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

推荐课程[4]:

推荐书籍[4]:

  • 西瓜书《机器学习》- 周志华,主要是机器学习的核心数学理论和算法。
  • 《统计学习方法》- 李航,更加完备和专业的机器学习理论知识,作为夯实理论非常不错。
  • 《Pattern Recognition and Machine Learning》,中文译名《模式识别与机器学习》,简称PRML,出自微软剑桥研究院实验室主任 克里斯托弗·毕晓普(Christopher Bishop)之手,豆瓣评分9.5,目前这本书已经被微软开源,地址:https://www.microsoft.com/en-...,书是英文的,网上可以找到一些第三方的中文翻译,不过还是建议读英文,再次也是中英对照着来。

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,可以自己开出一个项目来做。

如果你对某些算法有更深程度的理解,你甚至可以尝试用自己代码复现这些算法。

推荐书籍:

  • 《Scikit-Learn 与 TensorFlow 机器学习使用指南》:这本书分为两大部分,第一部分介绍机器学习基础算法,每章都配备 Scikit-Learn 实操项目;第二部分介绍神经网络与深度学习,每章配备 TensorFlow 实操项目。如果只是机器学习,可先看第一部分的内容。

3.5 - 深度学习

3.5.1 - 入门

在这里同样推荐产品经理的人工智能学习库

3.5.2 - 理论

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

  • 基础神经网络

    • 神经元
    • 激活函数
    • 基本结构:输入层、隐藏层、输出层
    • 反向传播算法
  • CNN

    • 卷积层
    • 池化层
    • 全连接层
    • CNN的典型网络结构(LeNet, AlexNet, VGG, ResNet, ...)
  • RNN

    • 单向RNN
    • 双向RNN
    • 深度RNN
    • LSTM
    • GRU
  • GAN
  • ...

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

  • 计算机视觉(图像、视频处理,主要用CNN);
  • 自然语言处理NLP(包括文本、语音处理,序列数据往往需要RNN);
  • 生成模型(GAN、VAE等等);

推荐课程[4]:

推荐书籍[4]:

  • 开源书籍《神经网络与深度学习》 - 复旦邱锡鹏,这本书花费了邱老师三年的时间,将自己的研究,日常的教学和实践结合梳理出这个深度学习知识体系。该书主要介绍神经网络与深度学习中的基础知识、主要模型(前馈网络、卷积网络、循环网络等)以及在计算机视觉、自然语言处理等领域的应用[5]。
  • 花书《深度学习》,源:Github网友翻译,该书从浅入深介绍了基础数学知识、机器学习经验以及现阶段深度学习的理论和发展,它能帮助人工智能技术爱好者和从业人员在三位专家学者的思维带领下全方位了解深度学习。
  • 神贴《深度学习 500 问》,作者是川大的一名优秀毕业生谈继勇。该项目以深度学习面试问答形式,收集了 500 个问题和答案。内容涉及了常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题,该书目前尚未完结,却已经收获了Github 2.4w stars(现在已经3.7w star了)。

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

5 - 参考文章


这像画码
114 声望21 粉丝

ArtCodeStudio | 动画向TA