怎样成为一名优秀的算法工程师

感谢https://blog.csdn.net/sigai_csdn/article/details/81012167,听君一席话,胜读十年书。

和一个有着多年工作经验的同行朋友交流,他说:一个优秀的算法人员培养成本其实比开发人员要高的多,周期也更长,绝对不是随便一个人都可以跨行的。

怎样成为一名优秀的算法工程师?面对市场对人才的大量需求与供给的严重不足,以及高薪水的诱惑,越来越多的人开始学习这个方向的技术,或者打算向人工智能转型。市面上各种鱼龙混杂的培训班以及误导人的文章会把很多初学者带入歧途,浮躁的跟风将会让你最后收获甚微,根本达不到企业的用人要求。原作者写这篇文章正是为了更好的帮助大家学习和成长,少走弯路。这里自己重写当时学习,学习如何去学习也是至关重要的,有些时候甚至超越学习本身!

首先来看一个高度相关的问题:一个优秀的算法工程师必须具备哪些素质?作者给出的答案是这样的:

数学知识

编程能力

机器学习与深度学习的知识

应用方向的知识

对自己所做的问题的思考和经验

除去教育背景,逻辑思维,学习能力,沟通能力等其他方面的因素,大多数公司在考察算法工程师的技术水平时都会考虑上面这几个因素。接下来按照这几个方面进行展开,详细的说明如何学习这些方面的知识以及积累经验。

数学知识:

本人主要针对人工智能、机器学习,深度学习方面。

人工智能尤其是机器学习属于数学知识密集的方向。在各种书籍,论文,算法中都充斥着大量的数学公式,这让很多打算入门的人或者开始学习的人感到明显的压力。首先我们考虑一个最核心的问题:机器学习和深度学习究竟需要哪些数学知识

算法或理论 用到的数学知识点
贝叶斯分类器 随机变量,贝叶斯公式,随机变量独立性,正态分布,最大似然估计
决策树 概率,熵,Gini系数
KNN算法 距离函数
PCA算法 协方差矩阵,散布矩阵,拉格朗日乘数法,特征值与特征向量
流形学习 流形,最优化,测地线,测地距离,图,特征值与特征向量
线性判别分析 散度矩阵,逆矩阵,拉格朗日乘数法,特征值与特征向量
支持向量机 点到平面的距离,Slater条件,强对偶,拉格朗日对偶,KKT条件,凸优化,核函数,Mercer条件
logistic回归 概率,随机变量,最大似然估计,梯度下降法,凸优化,牛顿法
随机森林 抽样,方差
AdaBoost算法 概率,随机变量,极值定理,数学期望,牛顿法
隐马尔可夫模型 概率,离散型随机变量,条件概率,随机变量独立性,拉格朗日乘数法,最大似然估计
条件随机场 条件概率,数学期望,最大似然估计
高斯混合模型 正态分布,最大似然估计,Jensen不等式
人工神经网络 梯度下降法,链式法则
卷积神经网络 梯度下降法,链式法则
循环神经网络 梯度下降法,链式法则
生成对抗网络 梯度下降法,链式法则,极值定理,Kullback-Leibler散度,Jensen-Shannon散度,测地距离,条件分布,互信息
K-means算法 距离函数
强化学习 数学期望,贝尔曼方程
贝叶斯网络 条件概率,贝叶斯公式,图
VC维 Hoeffding不等式

理解绝大多数算法和理论,有微积分/高等数学,线性代数,概率论,最优化方法的知识就够了。

除流形学习需要简单的微分几何概念之外,深层次的数学知识如实变函数,泛函分析等主要用在一些基础理论结果的证明上,即使不能看懂证明过程,也不影响我们使用具体的机器学习算法。

概率图模型、流形学习中基于图的模型会用到图论的一些基本知识,如果学习过离散数学或者数据结构,这些概念很容易理解。除此之外,某些算法会用到离散数学中的树的概念,但很容易理解。

在机器学习中主要用到了微分部分,积分用的非常少。具体的,用到了下面的概念:

导数和偏导数的定义与计算方法,与函数性质的关系

梯度向量的定义

极值定理,可导函数在极值点处导数或梯度必须为0

雅克比矩阵,这是向量到向量映射函数的偏导数构成的矩阵,在求导推导中会用到

Hessian矩阵,这是2阶导数对多元函数的推广,与函数的极值有密切的联系

凸函数的定义与判断方法泰勒展开公式

拉格朗日乘数法,用于求解带等式约束的极值问题

其中最核心的是多元函数的泰勒展开公式,根据它我们可以推导出梯度下降法,牛顿法,拟牛顿法等一系列最优化方法。如果你想要深入的学习微积分,可以阅读数学系的教程,称为数学分析

与工科的高等数学偏重计算不同,它里面有大量的理论证明,对于锻炼数学思维非常有帮助。北大张筑生先生所著的数学分析可谓是国内这方面教材的精品。

下面来看线性代数,同样是同济版的教材:

如果想更全面系统的学习线性代数,可以看这本书:

相比之下,线性代数用的更多。具体用到的知识点有:

向量和它的各种运算,包括加法,减法,数乘,转置,内积

向量和矩阵的范数,L1范数和L2范数

矩阵和它的各种运算,包括加法,减法,乘法,数乘

逆矩阵的定义与性质

行列式的定义与计算方法

二次型的定义

矩阵的正定性

特征值与特征向量

奇异值分解

线性方程组的数值解

机器学习算法处理的数据一般都是向量、矩阵或者张量。经典的机器学习算法输入的数据都是特征向量,深度学习算法在处理图像时输入的2维的矩阵或者3维的张量。掌握这些概念是你理解机器学习和深度学习算法的基础。

概率论国内理工科专业使用最多的是浙大版的教材:

如果把机器学习所处理的样本数据看作随机变量/向量,就可以用概率论的方法对问题进行建模,这代表了机器学习中很大一类方法。在机器学习里用到的概率论知识点有:

随机事件的概念,概率的定义与计算方法

随机变量与概率分布,尤其是连续型随机变量的概率密度函数和分布函数

条件概率与贝叶斯公式

常用的概率分布,包括正态分布,伯努利二项分布,均匀分布

随机变量的均值与方差,协方差

随机变量的独立性

最大似然估计

这些知识不超出普通理工科概率论教材的范围。

小时候,小学有一个班会记录本,记得当时爸爸给我写的一句话是:书山有路勤为径,学海无涯苦做舟。

后来我读了大学,读了研究生,爸爸又对我说:攻城不怕坚,攻书莫畏难,科学有险阻,苦战能过关。

这些话我始终记得。希望你更加是一个聪明而勤奋的人,坚定信念,然后聪明而踏实地勤奋着,就应该是这么清晰、简单、明了!

原文地址:https://www.cnblogs.com/ariel-dreamland/p/10679329.html

时间: 2024-08-09 18:36:07

怎样成为一名优秀的算法工程师的相关文章

【转】测试职业思考:如何成为一名优秀的软件测试工程师

如何成为一名优秀的软件测试工程师                                                                                             --------记录自己阅读<赢在测试>读书笔记           来北京快一年了,在自己喜欢的岗位快乐的工作着,这里是自己职业的开始,一直希望自己未来在测试的岗位上走的更远,思考着如何成为一名优秀的测试工程师,最近利用每天晚上回去休息的时间,逐渐读完了<赢在测试>

【转】 测试职业思考:如何成为一名优秀的软件测试工程师

如何成为一名优秀的软件测试工程师                                                                                             --------记录自己阅读<赢在测试>读书笔记           来北京快一年了,在自己喜欢的岗位快乐的工作着,这里是自己职业的开始,一直希望自己未来在测试的岗位上走的更远,思考着如何成为一名优秀的测试工程师,最近利用每天晚上回去休息的时间,逐渐读完了<赢在测试>

如何成为一名优秀的前端工程师 (share)

一.技术的必须的 作为一名最基础的前端工程师你必须掌握HTML.CSS和JavaScript.三者必须同时精通,类似我这样对前端知识一知半解的,一遇到问题就停下工作就四处搜索解决方案的,首先就算不上一个合格的前端人员.像我这样的如果当了前端工程师那工期肯定是不能保证的.合格的前端工程师第一要学会的就是在没有任何外来帮助的情况下(包括搜索引擎),能够完成大多数任务. 以下知识点是作为一个前端工程师必须了解和熟悉的: DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动. DOM操作

如何成为一名优秀的前端工程师

一.技术的必须的 作为一名最基础的前端工程师你必须掌握HTML.CSS和JavaScript.三者必须同时精通,类似我字样对前端知识一知半解的,一遇到问题就停下工作就四处搜索解决方案的,首先就算不上一个合格的前端人员.像我这样的如果当了前端工程师那工期肯定是不能保证的.合格的前端工程师第一要学会的就是在没有任何外来帮助的情况下(包括搜索引擎),能够完成大多数任务. 以下知识点是作为一个前端工程师必须了解和熟悉的: DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动. DOM操作

如何成为一名优秀的前端工程师(转)

web前端工程师 分类: Web开发应用 一.何为Web前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript/DOM/Flash等各种Web技术进行产品的界面开发.制作标准优化的代码,并增加交互动态功能,开发JavaScript以及Flash模块,同时结合后台开发技术模拟整体效果,进行丰富互联网的Web开发,致力于通过技术改善用户体验. Web前端工程师成长之路——知识汇总 图1.

如何成长为一名优秀的前端工程师

小A和小B都是应届毕业生,一起进入了一家互联网公司做前端.半年过去了,小A进步神速,他写的JavaScript代码在组里挑剔的的老员工看来都挺不错:可读性好,模块化程度高,而且有大量的测试.反观小B,他的代码总是一团糟,还经常搞出莫名其妙的bug.每次做code review时,大家对小B的代码都特别头疼. 年底考核的时候,组长让小A分享一下他入职以来是怎么学习前端并快速成长的,小A不好意思地给大家分享了自己的一点学习心得: 首先,前端工程师必须得熟练掌握HTML.CSS和JavaScript.

如何成为一名优秀的测试工程师(QA)——持续更新中

从事软件测试这一行.有很多岗位的 敏捷教练 测试工程师 高级测试工程师 WEB测试工程师 APP测试工程师 测试开发工程师 也可以从其他行业转过来 比如: 运营 研发 产品 测试不仅仅是要负责,心细,更多的还是专业度.

如何聘用优秀的性能测试工程师

如何聘用优秀的性能测试工程师? 译者:陈能技 原文:What makes a good Performance Engineer? (Scott Moore) 朋友最近需要聘请一些性能测试工程师,问我:“一个优秀的性能工程师需要怎样的素质?”在我思前想后最终想到一些东西之后,我觉得有必要跟大家分享一下我的看法,你也可以加入你的意见,这些都有助于老板们在雇佣性能测试工程师时作出精明的选择. 需要声明的是:这里列出的东西目的不是要作为人力资源部的正式职位描述,而更多的是关于原则和概念. 技能方面 你

如何成为一名优秀的Web前端工程师?

何为:前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发技术主要包括三个要素:HTML.CSS和JavaScript!它要求前端开发工程师不仅要掌握基本的Web前端开发技术,网站性能优化.SEO和服务器端的基础知识,而且要学会运用各种工具进行辅助开发以及理论层面的知识,包括代码的可维护性.组件的易用性.分层语义模板和浏览器分级支持等.随着近两三年来RIA(Rich Internet Applications的缩写,中文含义为:丰富的因特网应用程