开发转算法,我们应该如何准备(肺腑之言,无广告)

2020-06-05 11:01:47 浏览数 (1)

随着近几年AI和算法岗位越来越热门,很多开发者都选择从开发岗向算法岗转型,但是由于大家对算法岗并不是很熟悉,并且自身对算法岗所需要的技术技能也不是很了解,因此,在转型过程中困难重重,我早在6年前也是一名Android开发工程师,那么今天我就来结合自身经验以及周边同学的经验,来和大家聊聊如何从开发岗向算法岗转型。

开发转算法的优势

首先,我们先来说一说什么是开发岗,以及开发岗转型算法岗的优势在哪里。其实,软件开发工程师对于整个IT行业来讲是一个不可或缺的岗位,也是一个相对比较综合性的岗位。因为,对于现阶段的软件开发工程师来讲,不仅要掌握各种编程语言,还要了解数据库、大数据以及很多工程化的问题,甚至对于与AI相关的工程化问题在某些公司也要有所涉及,因此,在我看来,软件开发工程师是一个相对比较综合的岗位,实际上,这也正是开发岗转行算法岗的优势所在。

很多人认为,算法岗就是搞模型、算法以及与AI相关的东西,首先我要说明的是,这个观点是错误的,至少针对于大部分公司来讲,这个观点是有一定的偏差的。在企业中,任何算法都是以上线为导向的,而所有产品的上线,几乎都跑不掉QPS这个指标,简单来说就是每秒的并发量,就拿我们公司举例,为了使项目能够在线上正常的运转,一般QPS至少要求单机在2000以上,然后再横向多级扩展,使得提升整体并发量。对于算法工程师来讲,要想把并发量提高,所要解决的问题并不仅仅就是模型和算法的开发和优化,往往,我们还需要给其他业务平台提供相应的组建和接口,至少,我们需要把我们的模型进行一定的打包,使外面的业务能够调用。而这个打包的过程,一般会涉及到服务器的部署、接口的开发和调用、并发和工程化等一系列的问题,而这些往往就是开发工程师所擅长的,这也是开发转型算法的最大优势。

除了上面这种纯模型的算法岗之外,还有一种算法岗就是与业务强相关的,最直观的就是就是推荐算法工程师和一些NLP工程师。我们就拿推荐算法工程师来举例,大家都知道,任何推荐的业务都是作用于产品之上的,在目前互联网技术中,这些产品一般都会被存入到大数据仓库中,当我们做推荐系统的时候,还需要考虑到数据的实时性,因此,对于一个合格的推荐算法工程师来讲,不仅要对推荐算法本身有着足够的了解,还必须对推荐算法所涉及到的周边知识和技术比较熟悉才可以,例如,当我们需要做实时推荐系统的时候,我们需要去了解kafka和flink等相关技术,当我们需要快速的存取时,可能还需要对redis等内存数据库做一定的了解,如果要是想要对redis进行数据落地,可能还需要了解一些pika等相关的知识。我们可以发现,这些内容都是推荐算法工程师要做的,但是却和各种工程方面的内容有着非常紧密的联系,因此,对于这种以业务为导向的算法工程师来讲,除了关注业务本身以外,还需要关注工程内容,而这也是一名软件开发工程师所擅长的。

上面的几个例子,实际上都可以很好的说明,算法工程师与开发工程师实际上是有非常紧密的联系的,因此,首先我们需要肯定的是,算法工程师转型到AI工程师是可行的。但是具体要怎么做呢?

实际上,算法工程师与开发工程师的本质差别还是在对算法的研究上,而这个算法的研究实际上是一个非常广义的内容,而我们这里所讲的算法工程师,一般可以理解为与AI相关的算法工程师。一个AI算法工程师,主要需要包含以下三种能力,这也是开发在转型算法工程师的时候的必修课。

框架的学习

目前AI领域的算法工程师一般都要求对深度学习和机器学习框架有着比较深入的理解,因此,学习相关框架是算法工程师必须要面对的一个坎。

在AI领域中,算法工程师常用的框架一般有TensorFlow、Pytorch和Keras。几乎在所有算法工程师招聘的需求中,都要求具备以上者三个深度学习框架中的一个或多个的能力。实际上,很多人在转型算法之初,看到很多深度学习的框架都喜欢打退堂鼓,但实际上,我们在学习任何一种框架的时候,基本上方法都是一样的,深度学习也不例外。

在学习深度学习相关框架之前,建议先了解一些深度学习的相关概念和机器学习的相关概念,然后先把官网的一些教程拿过来练练手。对于一个有其他语言开发经验的同学来说,我建议大家边练手边看基础,而不是先把深度学习和机器学习的所有概念都看一遍然后再去系统的学框架,然后再练手,这样的话首先时间会很长,其次,实际上到最后你会发现很多东西你都记不住。

在我看来,最好的学习方法是:

1、花2周的时间来看一下机器学习和深度学习的基本概念和模型,如果有配套的代码就跟着敲;

2、去系统的学习TensorFlow或者pytorch框架中的一种,去一些wiki类网站上学习,只需要了解怎么用,以及常用的函数即可;

3、去找一些简单模型的实现,比如TensorFlow版本的textcnn模型、pytorch版本的RNN模型和LSTM模型等的实现,研究这些模型如何使用深度学习框架实现;

4、去GitHub找几个相对比较完整的且不是很大的项目,然后去看他是怎么实现的,在这里如果NLP的话,推荐文本分类、智能客服类的项目,如果是CV的话,建议看一些图像分类的简单项目;

5、然后重复第4步,一直保持良好的代码能力,熟能生巧;

数学基础

数学可以说是算法工程师的必修课,开发的功底决定你走的有多广,而数学功底则决定你做的有多深。

在我们研读论文的时候,经常会遇到很多非常繁杂的数学公式,对于一些只是想了解这个模型,或者用这篇论文里面的模型的人来说,对数学的要求其实并不是很重要。但是当你的需求从用变成改的话,那么数学则变得格外的重要了。

很多时候,我们通过论文里面的公式可以了解整体的推导过程,并对里面很多参数的定义有了更深入的理解。一般来讲,对于那些需要出研究成果的同学,就需要把这里面的每一个细节研究的非常细,需要去推导里面的各种逻辑关系和数学公式,甚至通过自己动手优化,来提高模型的性能,而这些实际上都是需要数学基础的。

在AI算法领域中,我们常用的数学主要是线性代数、概率论和高等数学。

AI算法中的大部分算法都是跟矩阵相关,而线性代数实际上就是一门专门针对于矩阵进行研究的学科,因此,学好线性代数有助于后面在做深度学习关于矩阵和张量部分的内容的深入研究;概率论对于深度学习来讲,也是一个必不可少的内容,在深度学习里,充斥着各种与概率论相关的算法,例如最常见的就是朴素贝叶斯算法;高等数学则一般运用于数学的推导中,各种积分推导都要用到高等数学的知识,最常见的就是BP算法。

另外,在这里我想跟大家安利一本书,就是《具体数学》这本书,这本书的话,实际上就是对计算机中常用的数学有了比较深入的总结,当然,看这本书的难度也是非常大的。

论文阅读和代码复现能力

可以说,阅读论文是算法工程师的必修课,算法工程师与开发工程师最大的区别是,算法工程师需要通过对大量的论文进行复现,从而确定最终的拟选用模型,然后再加以改进或直接使用,而对于论文的复现,一般我们就需要能够看得懂论文。

举个例子来说,我们的时间前段时间在做图像超分辨率这个领域的内容,那么我们所做的第一步就是去找最近两三年内在顶会上的比较优秀的超分辨率相关的论文,然后再去GitHub上找到论文所对应的官方代码来验证我们的想法,但是有的时候,我们可能需要去指定特定的开发框架(例如TensorFlow),而开源的代码中却没有这种框架的代码,只有pytorch版本的代码,这个时候我们就必须要自己使用TensorFlow进行手动实现,这时,我们就需要把论文读懂,才可以更好的复现代码。

因此,论文阅读能力是开发转算法过程中必须要准备的点,在这里,英语是必不可少的环节。一般我们可以通过以下几个步骤来准备:

1、找一篇相对简单的论文(例如文本分类方向的),然后试着去读懂它(主要是网络结构部分)

2、找到论文的相关复现代码,并读懂它;

3、试着自己用其他框架来复现它;

4、重复上述1~3步骤

算法式思维

开发和算法的同学其实在逻辑思维上会有比较大的不同。对于开发的同学来讲,主要是以解决问题为出发点,而对于算法的同学来讲,一般解决问题的方式会有很多,但是必须要选择一条既快又好的路,这是算法工程师需要具备的能力,对于这一点其实也是在转型过程中需要长期积累的过程。

算法的同学一般会碰到两种问题,第一种就是已经有了代码,要去优化它。例如,现在我们在做推荐系统时经常会使用到一种算法叫协同过滤,如果说基于item的协同过滤,用正常的协同过滤算法当数据量增大的时候,就会导致内存爆掉,实际上我们可以通过优化协同过滤中的对称矩阵,来降低时间复杂度和空间复杂度,从而解决这一问题,而这种解决问题的能力,实际上就是算法工程师必须要具备的能力和思维,说白了,就是找到代码中可以优化的点,然后进行优化,从而达到最终的目的。很多从开发转型过来的同学,在这个方面经常会吃亏,因为很多时候,就是用传统的开发的思路来解决问题,不会去注重里面的时间复杂度和空间复杂度,因此,这一点是要着重注意的。

第二种情况就是,我们还没有代码,但是有一个需求让实现。例如我们在做图像超分辨的时候,网上一般都是针对于三通道大图像的超分辨率模型,但是如果业务中需要的是4通道的小分辨率的图像进行超分,我们需要怎么去做,才能够解决这个问题。作为开发的同学,一般的做法就是找到一个类似的解决方案,然后套上去,不断的尝试,从而解决问题;但是到了算法岗,实际上就会有另外的一种思路,那就是,我先研究相关的论文,然后去把论文进行复现,然后再看看哪些点的改进可以用在自己的需求上,然后再把自己的数据套进去,并做模型更改的尝试,从而完成整个的需求。这种情况,实际上也是开发工程师在转型算法工程师中经常会遇到的问题。

因此,算法式的思维对于开发转算法来讲,是格外重要的。

开发转算法,说容易也容易,说难也难。上面是我所总结的几个点,希望通过我的总结,能够帮助大家,也欢迎大家在下面的留言区留言。

最后,祝大家转型成功!

END

0 人点赞