感谢https://blog.csdn.net/sigai_csdn/article/details/81012167,听君一席话,胜读十年书。python
和一个有着多年工做经验的同行朋友交流,他说:一个优秀的算法人员培养成本其实比开发人员要高的多,周期也更长,绝对不是随便一我的均可以跨行的。linux
怎样成为一名优秀的算法工程师?面对市场对人才的大量需求与供给的严重不足,以及高薪水的诱惑,愈来愈多的人开始学习这个方向的技术,或者打算向人工智能转型。市面上各类鱼龙混杂的培训班以及误导人的文章会把不少初学者带入歧途,浮躁的跟风将会让你最后收获甚微,根本达不到企业的用人要求。原做者写这篇文章正是为了更好的帮助你们学习和成长,少走弯路。这里本身重写当时学习,学习如何去学习也是相当重要的,有些时候甚至超越学习自己!c++
首先来看一个高度相关的问题:一个优秀的算法工程师必须具有哪些素质?做者给出的答案是这样的:git
数学知识
编程能力
机器学习与深度学习的知识
应用方向的知识
对本身所作的问题的思考和经验
除去教育背景,逻辑思惟,学习能力,沟通能力等其余方面的因素,大多数公司在考察算法工程师的技术水平时都会考虑上面这几个因素。接下来按照这几个方面进行展开,详细的说明如何学习这些方面的知识以及积累经验。github
1、数学知识面试
本人主要针对人工智能、机器学习,深度学习方面。算法
人工智能尤为是机器学习属于数学知识密集的方向。在各类书籍,论文,算法中都充斥着大量的数学公式,这让不少打算入门的人或者开始学习的人感到明显的压力。首先咱们考虑一个最核心的问题:机器学习和深度学习究竟须要哪些数学知识?编程
算法或理论 | 用到的数学知识点 |
贝叶斯分类器 | 随机变量,贝叶斯公式,随机变量独立性,正态分布,最大似然估计 |
决策树 | 几率,熵,Gini系数 |
KNN算法 | 距离函数 |
PCA算法 | 协方差矩阵,散布矩阵,拉格朗日乘数法,特征值与特征向量 |
流形学习 | 流形,最优化,测地线,测地距离,图,特征值与特征向量 |
线性判别分析 | 散度矩阵,逆矩阵,拉格朗日乘数法,特征值与特征向量 |
支持向量机 | 点到平面的距离,Slater条件,强对偶,拉格朗日对偶,KKT条件,凸优化,核函数,Mercer条件 |
logistic回归 | 几率,随机变量,最大似然估计,梯度降低法,凸优化,牛顿法 |
随机森林 | 抽样,方差 |
AdaBoost算法 | 几率,随机变量,极值定理,数学指望,牛顿法 |
隐马尔可夫模型 | 几率,离散型随机变量,条件几率,随机变量独立性,拉格朗日乘数法,最大似然估计 |
条件随机场 | 条件几率,数学指望,最大似然估计 |
高斯混合模型 | 正态分布,最大似然估计,Jensen不等式 |
人工神经网络 | 梯度降低法,链式法则 |
卷积神经网络 | 梯度降低法,链式法则 |
循环神经网络 | 梯度降低法,链式法则 |
生成对抗网络 | 梯度降低法,链式法则,极值定理,Kullback-Leibler散度,Jensen-Shannon散度,测地距离,条件分布,互信息 |
K-means算法 | 距离函数 |
强化学习 | 数学指望,贝尔曼方程 |
贝叶斯网络 | 条件几率,贝叶斯公式,图 |
VC维 | Hoeffding不等式 |
理解绝大多数算法和理论,有微积分/高等数学,线性代数,几率论,最优化方法的知识就够了。数组
除流形学习须要简单的微分几何概念以外,深层次的数学知识如实变函数,泛函分析等主要用在一些基础理论结果的证实上,即便不能看懂证实过程,也不影响咱们使用具体的机器学习算法。服务器
几率图模型、流形学习中基于图的模型会用到图论的一些基本知识,若是学习过离散数学或者数据结构,这些概念很容易理解。除此以外,某些算法会用到离散数学中的树的概念,但很容易理解。
在机器学习中主要用到了微分部分,积分用的很是少。具体的,用到了下面的概念:
导数和偏导数的定义与计算方法,与函数性质的关系
梯度向量的定义
极值定理,可导函数在极值点处导数或梯度必须为0
雅克比矩阵,这是向量到向量映射函数的偏导数构成的矩阵,在求导推导中会用到
Hessian矩阵,这是2阶导数对多元函数的推广,与函数的极值有密切的联系
凸函数的定义与判断方法泰勒展开公式
拉格朗日乘数法,用于求解带等式约束的极值问题
其中最核心的是多元函数的泰勒展开公式,根据它咱们能够推导出梯度降低法,牛顿法,拟牛顿法等一系列最优化方法。若是你想要深刻的学习微积分,能够阅读数学系的教程,称为数学分析:
与工科的高等数学偏重计算不一样,它里面有大量的理论证实,对于锻炼数学思惟很是有帮助。北大张筑生先生所著的数学分析可谓是国内这方面教材的精品。
下面来看线性代数,一样是同济版的教材:
若是想更全面系统的学习线性代数,能够看这本书:
相比之下,线性代数用的更多。具体用到的知识点有:
向量和它的各类运算,包括加法,减法,数乘,转置,内积
向量和矩阵的范数,L1范数和L2范数
矩阵和它的各类运算,包括加法,减法,乘法,数乘
逆矩阵的定义与性质
行列式的定义与计算方法
二次型的定义
矩阵的正定性
特征值与特征向量
奇异值分解
线性方程组的数值解
机器学习算法处理的数据通常都是向量、矩阵或者张量。经典的机器学习算法输入的数据都是特征向量,深度学习算法在处理图像时输入的2维的矩阵或者3维的张量。掌握这些概念是你理解机器学习和深度学习算法的基础。
几率论国内理工科专业使用最多的是浙大版的教材:
若是把机器学习所处理的样本数据看做随机变量/向量,就能够用几率论的方法对问题进行建模,这表明了机器学习中很大一类方法。在机器学习里用到的几率论知识点有:
随机事件的概念,几率的定义与计算方法
随机变量与几率分布,尤为是连续型随机变量的几率密度函数和分布函数
条件几率与贝叶斯公式
经常使用的几率分布,包括正态分布,伯努利二项分布,均匀分布
随机变量的均值与方差,协方差
随机变量的独立性
最大似然估计
这些知识不超出普通理工科几率论教材的范围。
最后来讲最优化,几乎全部机器学习算法归根到底都是在求解最优化问题。求解最优化问题的指导思想是在极值点处求出函数的导数/梯度必须为0。所以你必须理解梯度降低法,牛顿法这两种经常使用的算法,它们的迭代公式均可以从泰勒展开公式而获得。
凸优化是机器学习中常常会说起的一个概念,这是一类特殊的优化问题,它的优化变量的可行域是凸集,目标函数是凸函数。凸优化最好的性质是它的全部局部最优解就是全局最优解,所以求解时不会陷入局部最优解。若是一个问题被证实为是凸优化问题,基本上已经宣告此问题获得了解决。在机器学习中,线性回归、岭回归、支持向量机、logistic回归等不少算法求解的都是凸优化问题。
拉格朗日对偶为带等式和不等式约束条件的优化问题构造拉格朗日函数,将其变为原问题,这两个问题是等价的。经过这一步变换,将带约束条件的问题转换成不带约束条件的问题。经过变换原始优化变量和拉格朗日乘子的优化次序,进一步将原问题转换为对偶问题,若是知足某种条件,原问题和对偶问题是等价的。这种方法的意义在于能够将一个不易于求解的问题转换成更容易求解的问题。在支持向量机中有拉格朗日对偶的应用。
KKT条件是拉格朗日乘数法对带不等式约束问题的推广,它给出了带等式和不等式约束的优化问题在极值点处所必须知足的条件。在支持向量机中也有它的应用。
若是你没有学过最优化方法这门课也不用担忧,这些方法根据微积分和线性代数的基础知识能够很容易推导出来。若是须要系统的学习这方面的知识,能够阅读《凸优化》,《非线性规划》两本经典教材。
2、编程能力
编程能力是学好机器学习和深度学习的又一大基础。对于计算机类专业的学生,因为本科已经学了c语言,c++,数据结构与算法,所以这方面通常不存在问题。对于非计算机专业的人来讲,要真正学好机器学习和深度学习,这些知识是绕不开的。
虽然如今你们热衷于学习python,但要做为一名真正的算法工程师,仍是应该好好学习一下c++,至少,机器学习和深度学习的不少底层开源库都是用它写的;不少公司线上的产品,不管是运行在服务器端,仍是嵌入式端,都是用c++写的。此外,若是你是应届生,在校园招聘时很多公司都会面试你c++的知识。
C++最经典的教材无疑是c++ primer:
对作算法的人来讲,这本书其实不用所有看,把经常使用的点学完就够了。对于进阶,Effective c++是很好的选择,很多公司的面试题就直接出自这本书的知识点:
接下来讲python,相比c++来讲,学习的门槛要低不少,找一本通俗易懂的入门教程学习一遍便可。
数据结构和算法是编写不少程序的基础,对于机器学习和深度学习程序也不例外。不少算法的实现都依赖于数组,链表,数,排序,查找之类的数据结构和基础算法。若是有时间和精力,把算法导论啃一遍,你会有不同的感觉。
对于应届生来讲,学完它对于你经过大互联网和人工智能公司校园招聘的技术面试也很是有用。
上面说的只是编程语言的程序设计的理论知识,咱们还要考虑实际动手能力。对于开发环境如gcc/g++,visual studio之类的工具,以及gdb之类的调试工具须要作到熟练使用。若是是在linux上开发,对linux的经常使用命令也要熟记于心。这方面的知识看各类具体的知识点和教程便可。另外,对于编程的一些常识,如进程,线程,虚拟内存,文件系统等,你最好也要进行了解。
3、机器学习与深度学习
在说完了数学和编程基础以后,下面我来看核心的内容,机器学习和深度学习知识。机器学习是现阶段解决不少人工智能问题的核心方法,尤为是深度学习,所以它们是算法工程师的核心知识。在这里有一个问题:是否须要先学机器学习,仍是直接学深度学习?若是是一个专业的算法工程师,个人建议是先学机器学习。至少,你要知道机器学习中的基本概念,过拟合,生成模型,ROC曲线等,上来就看深度学习,如没有背景知识你将不知所云。另外,神经网络只是机器学习中的一类方法,对于不少问题,其余机器学习算法如logistic回归,随机森林,GBDT,决策树等还在被大规模使用,所以你不要把本身局限在神经网络的小圈子里。
首先来看机器学习,这方面的教材不少,周志华老师的机器学习,李航老师的统计学习方法是国内的经典。这里咱们介绍国外的经典教材,首先是PRML:
此书深厚,内容全面,涵盖了有监督学习,无监督学习的主要方法,理论推导和证实详细深刻,是机器学习的经典。此外还有模式分类这本书,在这里不详细介绍。
深度学习目前最权威的教程是下面这本书:
它涵盖了深度学习的方方面面,从理论到工程,但美中不足的是对应于介绍的相对较少。
另:强化学习是机器学习很独特的一个分支,大多数人对它不太了解,这方面的教程很是少。
在这里须要强调的是,你的知识要系统化,有总体感。不少同窗都感受到本身学的机器学习太零散,缺少总体感。这须要你多思考算法之间的关系,演化历史之类的问题,这样你就作到胸中有图-机器学习算法地图。
4、开源库
上面介绍了机器学习和深度学习的理论教材,下面来讲实践问题。咱们无需重复造车轮子,熟练的使用主流的开源库是须要掌握的一项技能。对于经典的机器学习,经常使用的库的有:
libsvm
liblinear
XGBoost
OpenCV
HTK
Weka
在这里咱们不一一列举。借助于这些库,咱们能够方便的完成本身的实验,或是研发本身的产品。对于深度学习,目前经常使用的有:
Caffe
TensorFlow
MXNet
除此以外,还有其余的。对于你要用到的开源库,必定要理解它的原理,以及使用中的一些细节问题。例如不少算法要求输入的数据先作归一化,不然效果会很是差,并且面临浮点数溢出的问题,这些实际经验须要你在使用中摸索。若是有精力把这些库的核心代码分析一遍,你对实现机器学习算法将会更有底气。以深度学习为例,最核心的代码无非是实现:
各类层,包括它们的正向传播和反向传播
激活函数的实现
损失函数的实现
输入数据的处理
求解器,实现各类梯度降低法
这些代码的量并不大,沉下心来,我相信一周以内确定能分析完。看完以后你会有一种豁然开朗的感受。
5、应用方向的知识
接下来是各个方向的知识,与机器学习有关的应用方向当前主要有:
机器视觉
语音识别
天然语言处理
数据挖掘
知识图谱
推荐系统
除此以外,还有其余一些特定小方向,在这里不一一列举。这些具体的应用方向通常都有本身的教材,若是你之后要从事此方向的研究,系统的学习一遍是必须的。
6、实践经验与思考
在说完理论与实践知识以后,最后咱们来讲经验与思考。在你肯定要作某一个方向以后,对这个方向的方法要有一个全面系统的认识,不少方法是一脉相承的,若是只追求时髦看最新的算法,你很难作出学术上的创新,以及工程上的优化。对于本问题全部的经典论文,都应该化时间细度,清楚的理解它们解决了什么问题,是怎么解决的,还有哪些问题没有解决。例如:
机器视觉目标检测中的遮挡问题
推荐系统中的冷启动问题
天然语言处理中文分词中的歧义切分问题
只有通过大量的编程和实验训练,以及持续的思考,你才能算得上对这个方向深入理解,以致于有本身的理解。不少同窗对本身实现的算法没有底气,解决这个问题最快的途径就是看论文算法的开源代码,在github上有丰富的资源,选择一些合适的,研究一下别人是怎么实现的,你就能明白怎么实现本身的网络结构和损失函数,照葫芦画瓢便可。
计算机以及人工智能是一个偏实践的学科,它的方法和理论既须要咱们有扎实的理论功底,又须要有丰富的实践能力与经验。这两个方面构成了算法工程师最主要的素质。科学的学习路径可以让你取得好的学习效果,同时也缩短学习时间。错误和浮躁的作法则会让你最后事倍功半。这是做者对想进入这个领域,或者刚进入这个领域的每一个人要说的!
小时候,小学有一个班会记录本,记得当时爸爸给我写的一句话是:书山有路勤为径,学海无涯苦作舟。
后来我读了大学,读了硕士研究生,爸爸又对我说:攻城不怕坚,攻书莫畏难,科学有险阻,苦战能过关。
这些话我始终记得。但愿你更加是一个聪明而勤奋的人,坚决信念,而后聪明而踏实地勤奋着,就应该是这么清晰、简单、明了!
愿你坚毅果敢,愿你有一个美好前程!
再次附上原文:https://blog.csdn.net/sigai_csdn/article/details/81012167 ,有兴趣可关注做者。
感谢!