【云驻共创】教你如何成为一名合格的算法工程师

举报
喜欢油炸 发表于 2022/01/02 22:38:27 2022/01/02
【摘要】 “算法才是编程的灵魂,一定要把算法学好。”不管你是Java编程爱好者、还是python的忠实粉丝,亦成觉得PHP才是这个世界最好的编程语言,都跨不过算法这个门槛。计算机的终极应用是人工智能,人工智能的核心是机器学习,而机器学习的核心就是算法。要成为高级程序员如果懂点算法、知道实现的原理,就有价值的多。所以我们程序员在人工智能时代,并不一定要求精通算法,但一定要懂点算法才能够跟上这个时代的步伐。

算法简介

算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。

算法工程师的前提是工程师,因此在从事算法相关的工作中,一定要具体一定的工程思维和工程能力,除此之外则还需要吸收产品的策略思维能力和保持算法工程师的核心算法能力,吸收众家之长练就自己的绝世神功。

目前市面上大部分招聘算法工程师的岗位,特指机器学习、数据挖掘领域的非确定性算法或解决一些非确定性问题。

因此,有时候所谓的算法工程师,真的和大数据相关的工程师在工作上存在大量的看起来【重叠】。因为,这个工种是想办法从数据中获得规律,通过规律优化目前业务、从而产生价值。


算法工程师分类

算法工程师大致分成以下两类:

根据算法职位分类,其中分为建模型算法工程师和专业方向算法工程师,建模型算法工程师有数据挖掘算法工程师和搜索算法工程师;专业方向算法工程师就很多人,有图像/视觉算法工程师、自然语言处理工程师、语音识别算法工程师、机器学习算法工程师、射频通信/信号算法工程师、控制算法工程师和导航算法工程师等等。

如果以“是否靠近业务”分类算法工程师,大致也分为两类:研究型算法工程师这些人的日常就是读最新的论文,需要你在某一个方向上钻研的很深,掌握各种算法原理,看最新的论文,复现论文,想好的idea(想法),写论文,跑实验,Allab现在比较少了。

但是在现实工作中百分之八十其实是第二种:业务型算法工程师,日常工作就是接需求,给出排期,项目上线;在实际业务中,往往使用的不是最新论文中模型,而是一些简单快速有效的baseline,所以对于占绝大多数的业务型算法岗来说,顶会并不重要。(顶会论文是什么,顾名思义,顶会论文就是在某个领域内的顶级学术交流会议中宣读发表的的论文),重要的是你需要向面试官展示你实际解决需求的能力。

业务型算法工程师要根据需求,灵活运用算法,很大概率不是最新的算法,本质上要和运营同学对接,理清问题,分析问题,有针对性的解决;但也需要看最新的论文,融入到需求中去。进行多模态和对比学习。

算法干的硬通货,它可以使用三个方面来体现:

第一个就是上面谈到的论文,如果你发表了一个还不错的论文,证明了你有着不错的科研能力以及动手实验能力,这代表在算法岗中你可以拿到一个很好的入场券。第二个就是你的实习项目。在这里想和大家强调一点,一定要去实习一定要去实习一定要去实习。去不了大厂就去中小厂,去不了中小厂就去创业公司。前提是一定要能够在这个公司接触到你自己深度学习细分领域的实战项目。从某种程度上来说,实习项目比你的论文还要重要一些,因为实习的项目其实就是对之后工作的预演。在您面试的时候把这段经历讲出来,告诉面试官你遇到了什么问题,怎么解决的问题、怎样提升的效果,将来的工作中需要去对哪些东西做改进,这样你在被招进来之后才可以快速、无缝接轨实际工作,这也是算法岗的面试官最看重的一点。

第三个能力就是你的竞赛实力,有人说导师不放行,或者说根本没有时间去实习怎么办?打竞赛,而不是说做竞赛项目。你需要在一个进行中的竞赛中获得一个还算说得过去的成绩。

如果你去做那些已经结束的比赛,然后拿到项目去说,恐怕是不行的,因为正在进行的项目是一个新的比赛需求、数据、背景都是新的,没有人做过,这个时候才是真正体现个人能力的时候。而一个已经结束的竞赛有太多的开源项目可以去借鉴了,所以说服力并不是那么的大。但是在这里强调一点,对于新手来说,也就是尚未打过竞赛的朋友来说,那些已经结束的项目你也要去认真地做几个,去熟悉流程、去看代码怎样写,有哪些track,有哪些代码可以直接改改就能在下一个竞赛中使用。简单说校招生可以通过论文、实习项目、竞赛项目来向面试官展现你自己的能力,所以说顶会并不是一个必备品。算法确实很卷,但是开发岗难道就不卷吗?所以你要选好自己的方向,踏踏实实地做下去。


工程思维

软件工程专业应该是很多大多的计算机系都开设的一门专业,但是我想很多人在上学时对这个专业和「工程」两个字都没有一个很好的思考,就好比很多人都不知道工程思维的最大特点是什么一样。

工程思维特点

工程思维最大的特点就是要“把事情做成”,也就是要“交付可靠、可用的成果”。

相比较「科学思维」是认识规律、发现规则,科学家们从来就是“仰望星空”,不屑于实际的应用。而工程思维就是要“脚踏实地”,将科学家发现的原理转化并实际应用。

工程思维的第二特点就是要“有限制”,即做工程要有“计划性”。要在具体的“时间、成本、质量”计划约束内,交付明确“规模”的结果。相比较,科学研究就是没有这些限制了,因为在一开始,就不知道具体的方向在哪里?例如:直到今天,人类也无法统一“相对论”与“量子力学”。

那么作为一名算法工程师为什么要具体工程思维呢?

比如小A近期需要将所在业务的排序模型从机器学习升级到深度学习,在做这件事的过程中,需要做到以下三点:

  • 有计划,有条理,即在什么时间点完成什么事
  • 要做成,要交付,即完成完成ML到DL的升级
  • 保质量,提效果,即保证迁移后的效果是优于之前的,并进行可持续的迭代

其实很多人在做事的过程中已经覆盖了工程思维的两大特点,能够做到有计划、有边界、有质量,但还要进一步做好有计划、有边界、有质量。

算法工程师很多都是限定在一些框架上进行算法模型的开发的,比如Spark、TensorFlow等,最基本的是使用和了解这些框架的能力,这样才能保证你保质保量的完成业务。其次是要学会阅读框架的源代码能力,当然并不是让你把整个框架都看一遍,这个就比较难了,而是要知道一些重要模块的实现逻辑。

比如Spark中的协同过滤,其实现思路和我们直观理解的实现方式是不一样的,因为按照构建矩阵,在计算相似的思路在大数据背景下是会把内存撑爆的,因此其实现过程中会做一些近似优化,这样才能保证在大数据的背景下快速的完成运算。

又比如TensorFlow中,tf1和tf2的代码执行逻辑,tf1中需要先构建一个DAG图,然后通过session run的方法来执行代码,而在tf2中则遵循的是所见即所得的思路,每写一行代码都可以执行,并得到结果。

因此在框架使用上,不能仅仅限于使用,而是要再进一步,了解重要模块的代码逻辑。


算法工程师入门之基础部分

编程语言

说到算法工程师就是机器学习工程师,大家首先想到的就是python,python是必须要的,因为我们写模型以及一些特征处理的相关的一些东西都是用python来写的,包括一些脚本都是python,python是必不可少的。如果你不会python的话,很难在工业界去做这个深度学习或者相关的一些模型的,所以python是必须的。

第二个是C++。C++是用来干嘛呢?C++主要是用来我们面试的时候会写一些算法和数据结构,包括我们练习的时候都会有相应的一个准备工作,这个时候一般来说都是用C++,当然也可以用python,但是主流还是用C++,包括看一些其他大牛的博客、别人的一些分享,他们也都是用C++做的,所以说C++的基础和了解是必不可少的。但是我们主要是用C++来做算法、数据结构,所以它只涉及C++比较基本的一些使用,不会涉及一些比较复杂的一些应用。基本上就STL,比如说一个基本语法,像是输入、输出、选择、循环,包括结构体、变量这些都属于基本语法,这个都是必须要会的。

STL的全称是standard template library,是说标准模板库,主要是一些map、set、vector,这些容器的一些使用,会这些容器会极大的帮助我们去简化做算法数据结构的复杂度,这个也是必须需要会的。有的时候我们需要定义一些结构体。

最好能够了解一点java。java学习的内容主要是基础语法和基础开发。为什么要学java呢?主要是因为我们这个很多大数据相关的东西,比如说hadoop,还有这个flink,很多大数据的框架都和java有关系,而且作为算法工程师有的时候也需要参与一些大数据相关的开发工作,所以说这个时候可能会需要你有java的基础。

java属于一个加分项。如果实在没有学过前面两个都比较精通,其实也可以,如果有余力的话,最好能够简单了解一下JAVA的用法,其实也不复杂,它是属于这个C系的一个语言,它的整个基本的语法和C++基本是一致的,只是JAVA对象的一些处理可能不太一样。呃这些大家学的时候稍微注意一下就可以。

基础知识

工程师的基本知识,比如说git的一些常识。

linux基本命令,因为我们常常会需要用linux一些命令来处理东西,包括脚本等等,所以说linux基本命令是一定要会的,只要是常用的一些就可以了。

算法数据结构

算法数据结构其实是两个部分,一个是算法,一个是数据结构。数据结构主要是一个存储数据、面向数据的一个结构,是一个我们设计出来的模式或者说模型。

算法主要是一种计算方法,这两个还是有差别的,如果了解,会发现数据结构和算法是不一样的。举个例子,常用的数据结构,数组、队列,堆、栈,还有表,所有的树和图本质上都可以用邻接表来存储,表就可以存储常用的一些数据结构,常用的进阶数据结构,比如说单调栈、树状数组、线段树、并查集等等;

算法中常用的有二分法、递归、搜索(搜索里面又分深度优先、宽度优先),还有动态规划、贪心。算法进阶的有two pointers,两指针是经常在面试当中遇到的,比如说动态规划进阶算法的多重背包,最短路最小生成树等等,动态规划本身也是可以非常深入非常难的,比如说旅行商问题这种状态压缩的动态规划,还有什么结合树上做动态规划等等。其实动态规划本身就是很大的一个分支。还有一些最短路、最小生成数等等。然后对于算法和数据结构而言,上诉内容大都是主要是面试用的,平时的工作当中一般不会用到这些算法,算是一个基本功,就跟考试是一样的,证明自己的能力。但是最后这个在用人单位正常工作的时候,其实是用不到这些东西的。

大数据

一般来说大公司里面会有专门的大数据工程师,是不用算法工程师来做。但是有的时候人手不够,或者说是一些其他的原因,算法工程师也会需要做一些大数据的部分,比如说可能一些特征、数据处理可能都是由算法工程师来做的,大数据只是我们使用的一个工具。浅尝辄止就可以了。

Hadoop不算是一个技术,它是一个很大的家族、很多很多大数据相关的那个框架,还有系统都是搭建在Hadoop这个集群上的。我们首先要对于Hadoop集群和概念要有个基本的了解。MapReduce是我们处理大数据的一个最基础的技术,还有Spark、Hive,flink是用来做这个流式计算处理的。Hive主要是以SQL的形式来做这个结构化的数据处理。一般来说跟公司的技术选型、技术栈有关系,不同的公司技术栈可能都不太一样,大数据Hadoop没有必要每一个都学,一两个做大概的了解就可以了。入职之后还是要根据实际情况来做这个选择和进一步的学习的,面试里面问起来,总得有点了解,不能给面试官留下你这一块完全不知道完全就是个纯小白的情况。

机器学习

机器学习其实本身是一个很大的概念,包括现在我们说的深度学习,强化学习、迁移学习。这些各种各样的模型、方法、算法都可以容纳到机器学习这个领域当中,它本身就是一个很大的概念,只是现在我们把深度学习、强化学习这些领域切分出去。机器学习就特指以前传统的一些机器学习的算法,但即使如此,它依然也是一个很大的概念,里面容纳的算法也非常多。没有必要每一个算法都学,也没有必要每个都了解,可以针对性选择,有一些现在已经不太用得到,包括面试、包括实际工作都不太用得到的这些算法和模型,可以适当的进行一个舍弃。

线性模型是一定要会的,比如说线性回归、逻辑回归LR,SVM。主要是这三个,现行回归、逻辑回归,一般是以线性回归、逻辑回归为主。这两个是一定要会,而且是要非常精深的,所有的技术细节原理都要会,公式要可以进行一个纸上的推导,比如说面试官问你这个公式是怎么来的,可以当场推算一遍,要能做到这样的程度。

贝叶斯定理(朴素贝叶斯),贝叶斯定理其实本身不重要,它也不复杂,它主要是很多模型,还有一个思想的基础。只有理解了贝叶斯这个定理之后,才能知道为什么有些模型这么设计,它的原理是什么。它起的其实是一个定调的作用。比如说做一个nlp,文本的分类或者文本的分析,它的一些算法的核心原理到最后都是一个概率,概率最后就要落到这个贝叶斯定理上来。

树模型,树模型也是一个非常大的概念,比如说有决策树,随机森林、gbdt、XGBoost;还有很多不一一列举,树模型本身是个很复杂的概念。

机器学习的基本概念,比如说梯度下降、损失函数、评估指标、学习率等等这些基本概念是整个机器学习以及深度学习的一个基础。可以说是算法工程师专业能力的一个基本的表现。比如说损失函数场景下我们有这样的损失函数,什么场景下我们有那样的损失函数?包括有些时候我们要根据这个业务或者说我们自己的一个模型的需要来自己定义损失函数,要知道这里面所有的细节,以及这个基本的原理到底是怎样运作的。

还有评估指标,什么我们用AUC,什么时候用准确率,准确率和召回率到底意味什么?准确率和精确率又有什么区别?这些是面试和平常工作当中经常用到的一个东西,也是基础中的基础。

深度学习

深度学习主要是框架,涉及到一个框架选择的问题,框架比如大家比较熟悉的TensorFlow,还有Pytorch,TensorFlow是谷歌公司推出的深度学习框架,Pytorch是facebook推出的,这两个各有利弊。对于新手来说,Pytorch比较容易上手一点。框架说白了还是工具。我们真正最后这个模型的效果还是要看我们自己的设计能力,还有对问题的理解能力。

深度学习也是一个很大的概念,还有很多应用领域,但要想清楚你要使用的方向究竟是什么?比如电商领域的这个推荐、搜索,还是文本处理的NLP,还是计算机视觉的Computer Vision,CV,还是其他的什么人工智能,比如ai。要想清楚这应用到底是什么不同的应用领域的技术,还有相关的能力其实完全不一样。

深度学习和机器学习的共同点是通过反向求导来得到目标函数的最优解的过程;但是深度学习的反向求导过程是有很多层的、是更复杂的反向传播链,因此就很容易导致一些梯度爆炸或梯度消失的结果。为了避免这样的问题,就需要引用复杂的优化手段以及各种各样的激活函数。

深度学习和机器学习的基本原理是一致的。包括它最常用的网络类型,如何进一步深入地学习神经网络,以及模型的整个生命周期(模型的训练、模型的验证/测试、模型的优化、模型的部署与服务)。


推荐学习

《王道考研数据结构》和《天勤数据结构》介绍了基本的知识,比如线性表、栈、队列在程序中如何去实现。接下来两个比较重要的部分就是树和图,这里就涉及到了一些算法的内容:比如树和森林的转换,线索二叉树以及图的深度优先遍历、广度优先遍历等等。最后是查找和排序,这里涉及到算法的内容会更多,查找和排序的分类就很多,比如顺序查找、折半查找、散列查找插入排序、交换排序、选择排序等等。进一步学习,直接上 LeetCode。

刷题地址:
https://leetcode-cn.com/

深度学习是机器学习研究中的一个新的领域,其动机在于建立可以模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如,图像、声音和文本。深度学习的目的是形成复杂算法和优势算法,属于无监督(Unsupervised)学习的一种。无监督学习的意思就是不需要通过人工方式进行样本类别的标注来完成学习。因此,深度学习是一种可以自动地学习特征的方法。把原始数据通过一些简单的可是非线性的多层次表征模型转变成为更高层次的,更加抽象的表达。通过足够多这样的转换组合,很复杂的函数也可以被学习。

深度学习的核心特色是这些多层结构中的特征不是工程师手工设计的,而是通过一个通用目的的学习过程从数据中学习的。 深度学习在监督学习中应用的主要过程及优势 描述了深度学习实现有监督类学习的过程,比如建立一个系统对图像进行分类: 1)收集大量数据集,标注图像中的目标; 2)构建深度学习网络,以向量的形式表示学习到的内容; 3)计算一个目标函数,衡量类别的输出分数和期望分数之间的误差(或距离); 4)通过自动修改内部的可调节的参数(通常被称为权值),优化网络性能; 5)大部分从业者都使用一种叫做随机梯度下降(SGD)的算法进行权值调节,相比于其他优化技术,SGD的速度让人惊奇; 6)训练结束后,再通过不同于优化训练的数据样本测试系统的泛化能力,即对于未训练过的新样本的识别能力。

项目地址:

https:/github.com/yunjey/pytor

算法工程师必备书籍,对学习了解机器学习有重要意义。学习在于循序渐进,从最基础的部分开始,本书就非常适合,书中以西瓜为例,形象易理解,读起来很有意思(因此本书昵称为西瓜书),周老师讲的很详细(比吴恩达老师的课程难一点,但利于提升),学习完一章,最好做一个系统的总结,既是对所学知识的升华,也可以帮助后续学习理清一个思路。

作为入门教材全书共16章,大致分为3个部分,叙述简明扼要,通俗易懂,在内容上尽可能涵盖机器学习基础知识的各方面:第1 部分(第1~3 章)介绍机器学习的基础知识;第2部分(第4~10章)讨论一些经典而常用的机器学习方法(决策树、神经网络、支持向量机、贝叶斯分类器、集成学习、聚类、降维与度量学习);第3 部分(第11~16章)为进阶知识,内容涉及特征选择与稀疏学习、计算学习理论、半监督学习、概率图模型、规则学习以及强化学习等。 每章都附有习题并介绍了相关阅读材料,十分详细,以便有兴趣的读者进一步钻研探索。而且每一页的右侧都留有空白,供读者推演或记笔记,很贴心。

如何准备算法工程师面试,斩获一线互联网公司机器学习岗offer的十个注意点:
  1. 打牢基础知识。推荐几本书《机器学习》周志华/《统计学习方法》李航+《百面机器学习》,一本系统学习知识点,一本针对面试查漏补缺,完全够了;
  2. 注意总结自己的实习项目和实验室项目,做到清楚所有技术细节,简历上列出的经历、模型、熟悉的工具语言也要有备而来,面对面试官的追问从容应对;
  3. 平时注重一些机器学习流行工具使用经验的积累,最少要熟悉下面两项 spark/flink, tensorflow/pytorch,一个做大数据处理,一个做模型的训练;
  4. 刷算法题,不用多解释;
  5. 尽早确定细分求职方向,广告/推荐/搜索/图像/NLP/语音,读业界的blog,分享,论文,积累对业务场景和解决方案的理解;
  6. 面试时积极提问,积极互动;
  7. 针对开放问题,提供多种解决方案,即使不成熟也不要紧,关键在于讨论和形成可行方案的过程;
  8. 投简历之前,熟悉JD,想办法找到对这个团队有所了解的人,获得一些岗位相关信息,做到经验和职位匹配;
  9. 轮到自己提问时,问一些公司相关的话题,不节外生枝,不提奇怪的问题;
  10. 不抱侥幸心理,强者运强。

算法工程师往产业里走,需要把技术思维转变为以业务需求为导向的技术思维、技术分解思维;

算法工程师需要像大夫一样望闻问切,跟客户一起梳理出业务流程中的痛点,找到优化方式;

算法工程师不仅需要有对行业整体的判断,还需要对客户有体检、开药的能力,可以把客户的难言之隐梳理出来,定量、优先级排序,然后整体到细节,一层层结构化分解,最后进入具体执行;

要在传统行业创造新价值就要搞清楚什么东西制约了产能、效率、利润率。仅仅输出模型的算法工程师比较容易被替代,更高的追求是输出一整套端到端的系统方案,从与客户一起梳理业务痛点、硬件选型、模型部署环境的规划与搭建、数据采集和标注标准制定、模型选型与设计等等。


总结

计算机的终极应用是人工智能,人工智能的核心是机器学习,而机器学习的核心就是算法。而且随着IT信息技术的快速发展,算法不会像那些具体的IT技术一样迅速的过时(算法思想永恒),所以算法工程师的前景非常好。对于应用型程序员来说,它关注的是怎么利用各种工具、技术实现功能,快速的完成产品的开发,核心的算法并不需要去了解(比如图像识别直接调用某厂商、公司的封装好的SDK就可以了)。但要成为高级程序员如果懂点算法、知道实现的原理,就有价值的多。所以我们程序员在人工智能时代,并不一定要求精通算法,但一定要懂点算法,这样才能够跟上这个时代的步伐,不被迅速淘汰掉。

本文整理自华为云社区【内容共创系列】活动。
查看活动详情:https://bbs.huaweicloud.com/blogs/314887
相关任务详情:在做算法工程师的道路上,哪些概念或技术buff使你突飞猛进?

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。