谈一下关于自己对算法工程师核心竞争力的理解
先简单自我介绍一下,我是DASOU,任职在一家社交公司,做NLP算法工程师,主要做文本分类,序列标注,问答匹配方向的工作,也做过搜索/推荐方向的需求。
工作快有一年半的时间了,在这一年半的时间里,我在工作的同时,一直都在思索,究竟什么才是算法工程师的核心竞争力,怎样才能避免刚入行就不停被灌输的那个35岁中年危机。
我看过很多别人的经验总结,结合我自己的工作经历,慢慢有了一点自己的感悟,想要分享出来,希望对大家能有帮助。
我用一句大白话说一下我自己对核心竞争力的总结就是:不同的场景,挑选合适的方法,获得最大的效果。
这句话很浅显,但是想要做到绝非没那么简单!!这需要我们长年累月的经验积累和总结。
接下来,我会模拟一个工作场景,讲讲究竟核心竞争力体现在哪些方面,以及怎么才能不断提升自己!!
0. 背景
假如现在接到了一个新的业务方的需求,你第一步要做什么?
打开冰箱,把大象...啊,不对
1. 需求定性
首先第一步,我们需要对这个需求定性,定方向,它是属于文本分类任务?命名体识别?还是机器翻译?不同的方向我们使用的方法和侧重点就会不一样。当然,很多时候一个需求不仅仅是一个任务,多数情况下是多个任务的结合,这个暂且不论。
2. 调研
好的,现在定好了方向,比如是关于一个文本分类的任务,接下来是要做调研。
调研主要是分为两个部分:数据和模型。
调研数据:对于一个算法工程师,处理数据绝对是占据一天绝大部分时间,很多人调侃自己是 SQL BOY 。但是我想要说的,数据决定模型的上限,这句话绝对是真理。只有真正的了解我们的数据,才能在接下里的任务中作出好的结果。
你需要知道你的数据量级大概是多少;不规范的数据多不多;需不需要做数据增强,针对当前这份数据哪种数据增强技术可能效果会不错;有哪些特征可能组合起来会有用等等,这些都需要在调研数据的时候值得我们仔细思考。
这里插一句,如果数据很不规范,在这个时候你就要思考是从模型下手还是从数据本身下手,各自有什么合适的方法。比如你可以看看这些不规范的数据究竟有什么特点可以利用。比如是不是可以不分词,而只是使用基于字的模型,等等吧。
在数据处理这个过程中,因为现在很多公司数据都存在 Hive 中,所以会用到 MapReduce,Hive,Spark 等等大数据开发工具,掌握这些工具绝对可以让你轻松搞定数据处理。
调研模型:宗旨就是根据不同的要求,使用合适的模型。你需要综合各方面的条件作出决策。如果业务方需要高准确度,选择什么模型能满足要求。如果业务方需要高响应速度,选择哪种模型合适。针对当前这种数据,哪种模型可能效果会不错。
还是以我们这个文本分类这个需求为例,如果看中速度,FastText会不会更好一点,或者TextCNN怎么样?如果要求精度,那么Bert可以吗?或者宽松一点 Albert怎么样,FastBert怎么样?
在这个过程中,你需要去读大量的论文和博客,看看别人的经验和总结,帮助自己作出最终的决定。
3. 训练/优化模型
模型的训练和优化,一般来说不会占据的太多的时间。有句话忘了在哪里看到的了,说是处理数据花了两周的时间,训练模型花了两个小时。听起来可能有点夸张,但是是这么个意思。在这个过程中,你的主要工作就是需要使用代码实现模型,去思考怎么样才能更高效的运行这个模型,需要去思考怎样才能获取更好结果?
比如说,使用 GPU 进行训练模型,你需要熟悉模型/数据并行化的知识。比如说,针对特定任务,修改损失函数,修改优化函数,等等吧。
4. 部署上线
我们需要为开发人员提供接口,从而可以处理数据返回结果。这个时候,你就要思考你的接口响应速度怎么样?做多可以多少并发?针对这种情况,自己做一个简单的压测就可以。一般来说,你需要掌握 grpc,kafka,flask,nginx 等常用工具。当然,这些你不需要精通,如果需求方对接口要求很高的话,你可以使用一些成熟的开源框架就可以,所以,不用太慌。
好了,大概就是这样,整个流程我们有着极强的耐心,而且要不停的从过程中积累经验。
5. 总结
总结来说,要想提高自己的核心竞争力,做到两个方面:算法 工程 。
对于算法,要深入底层,把手弄脏。算法模型重点在质量,而不是数量。既然要搞一个模型,就要彻底把它搞清楚,要把它掰开了揉碎了琢磨,不要似是而非。
对于工程,你需要有大数据开发能力和模型训练部署能力。
两个都要抓,两手都要硬,才能无往不利。其实,在这方面,我做的也很不好,人都是有惰性的,大道理说起来一套套的,做起来就是个行动的矮子...
然后我痛定思痛,想逼自己一把,于是几天前就建了两个NLP仓库。