遇事不决先求github,内功不行的算法工程师有哪些表现?

Posted 异步图书

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇事不决先求github,内功不行的算法工程师有哪些表现?相关的知识,希望对你有一定的参考价值。



关注我们丨文末赠书


在知乎上看到讨论“最差算法工程师”的话题,个人感觉作者LinT的总结很到位,大致有七类:


混迹于各类创新竞赛、课程答辩,张口闭口就是「人工智能」「神经网络」的百度百科型选手/PPT选手;


数学公式不想看、论文不想读,辗转各个博客网站希望找到好的解读的博客型选手;


拿到需求,Github一搜,全克隆了再说;代码跑通了(没有error),任务完成就功德无量的Github选手;


把DL当万精油用,带一个PPT/Github选手,参加各类创新竞赛/项目,经费拿到手软的AI+型选手(教师);


行走的AI术语词典,讨论问题时就喜欢堆砌名词,但从不解释,故弄玄虚,让外行不明觉厉的名词流选手;


走在AI潮流前列,「不加attention不行星人」,吐槽「2020年了,还用概率图模型?!」,对新算法的狂热程度堪比娱乐圈流量小生的潮流型选手;


半路出家,转行做AI的,但奈何基础弱,经常抛下「非cs科班可以学xxx吗?」「本人xx,应不应该xxx?」问题的何去何从型选手.


遇事不决先求github,内功不行的算法工程师有哪些表现?


在异步君看来,最差劲的算法工程师,不是算法基础薄弱或者业务能力不强的人,而是明知自己的缺陷还瞧不起这些方面的人。


优秀的算法工程师什么样?


如果你有颗精进的心,那变得优秀只是时间问题。而一个优秀算法工程师的成长之路,大致要经历三个阶段。

第一阶段"Operating":会使用工具

这个层次的工程师,对常用的模型比较熟悉,来了数据以后,好歹能挑个合适的跑一下。

达到这个层次,其实门槛不高。早些年,您只要掌握了什么叫LDA、哪叫SVM,再玩过几次libnear、mahout等开源工具,就可以拿到数据后跑个结果出来。到了深度学习时代,这件事儿似乎就更简单了:管它什么问题,不都是拿神经网络往上堆嘛!

这里要给大家狠狠浇上一盆冷水:掌握了一堆模型并且会跑,其实并没有什么卵用。而算法工程师的真正价值,就是洞察问题的数据先验特点,把他们表达在模型中,而这个,就需要下一个层次的能力了。

第二阶段"Optimization":能改造模型

这个层次的工程师,能够根据具体问题的数据特点对模型进行改造,并采用相应合适的最优化算法,以追求最好的效果。

改造模型的能力,就不是用几个开源工具那么简单了,这需要有两方面的素养:

一、深入了解机器学习的原理和组件。
当你看到前辈高人把材料烹调在一起,变成LDA、CNN这些成品菜肴端上来的时候,也要想想如果自己下厨,是否了解食材,会不会选择和搭配。仅仅会吃几个菜,说出什么味道,离好厨师差的还远着呢。

二、熟练掌握最优化方法。
最优化,是机器学习最、最、最重要的基础。你要知道,在目标函数及其导数的各种情形下,应该如何选择优化方法;各种方法的时间空间复杂度、收敛性如何;还要知道怎样构造目标函数,才便于用凸优化或其他框架来求解。而这些方面的训练,要比机器学习的模型还要扎实才行。

在这个阶段,记得主动拓宽自身的知识广度和深度,毕竟宽度决定适应性,深度决定不可替代性。

第三阶段"Objective":擅定义问题

这个层次的工程师(似乎叫工程师不太合适了),扔给他一个新的实际问题,可以给出量化的目标函数。

在算法领域,最难的是有明确的量化目标函数,这也是区别于玄学方法、神学方法的重要标志。

定义目标函数,初听起来并没有那么困难,不就是制定个KPI么?其实不然,要做好这件事,在意识和技术上都有很高的门槛。既要有“万般皆下品、唯有目标高”的意识,又要让构建的目标函数准确(信)、可解(达)、优雅(雅)。

一个团队的定海神针,就是能把问题转化成目标函数的那个人——哪怕他连开源工具都不会用。当你掌握了工具、会改造模型,进而可以驾驭新问题的建模,就能成长为最优秀的人才。

如果一个企业能用百万年薪签下这样的人才,属于物超所值。那继续沿着这条路走下去,又会是怎样的一番景象呢?

《编程珠玑》Jon Bentley就是典型


怎样成为算法大师?有资格写这个话题的人,要不已经名垂青史,要不就躺在你的书柜里。不过,异步君倒是可以介绍一位大师给你认识——Jon Bentley。

遇事不决先求github,内功不行的算法工程师有哪些表现?


为什么说他是大师?1983年,ACM通讯杂志为Jon Bentley专门开辟了Programming pearls专栏,他以短文系列的形式,总结和提炼了自己在长期的计算机程序设计实践中积累下来的宝贵经验。受欢迎的程度颇似早年金庸先生在《明报》上连载其武侠小说的盛况。


之后,Jon Bentley 将“珍珠”系列仔细修订和补充整理,对各篇文章的先后次序做了精心编排。在1986年,涵盖从算法理论到软件工程各种主题的《编程珠玑》正式诞生。当然,这些都是后话。


早年间Jon Bentley在卡耐基梅隆大学任教时,给专业程序员上课时布置过“二分搜索”的问题。令他惊诧的是,在几个课堂里对一百多名程序员的检查结果大同小异:90%的程序员都在他们的程序中发现了错误。

但这也在情理之中,毕竟第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现。

他在1983年的论文《 Writing correct programs》,专门以二分搜索为例讨论了算法的理解和其程序实现。 这是个不小的挑战,我们来看看作为算法大师,Bentley是怎么做的。

首先介绍下二分搜索,它通过持续跟踪数组中包含目标元素的范围(如果存在于数组的话)来解决问题。一开始,这个范围是整个数组;然后通过将目标元素与数组的中间项进行比较并抛弃一半的范围来缩小范围。该过程持续进行,直到在数组中找到或确定包含目标元素的范围为空时为止。

在有n个元素的表中, 二分搜索大约需要执行 log2n 次比较操作。


遇事不决先求github,内功不行的算法工程师有哪些表现?

问题的关键在于,是如果目标元素在数组中, 那么它就一定存在于某个特定范围之内。Bentley使用了mustbe(range)来表示,将上面描述的二分搜索转换成下面的程序框架:
initialize range to 0..n-1
loop
    { invariant: mustbe(range) }
    if range is empty,
        break and report that t is not in the array
    compute m,the middle of the range
    use m as a probe to shrink the range
        if t is found during the shrinking process ,
        break and report its position

该程序的最重要部分是大括号内的循环不变式( loop invariant)。之所以把这种关于程序状态的断言( assertion )称为不变式( invariant),是因为在每次循环迭代之前和之后,该断言都为真。这个名称将前面已有的直观概念形式化了。


断言:输入、程序变量和输出之间的关系勾勒出了程序的“状态”,断言使得程序员可以准确阐述这些关系。

经过不断优化,最终的函数只有9行代码和一个不变式断言:
l = 0;u=n-1
loop 
        { mustbe(l, u) }
        if l> u
            p = -1break
        m=(l+u)/2
    case
        x[m] < t:l=m+1
        x[m] == t:P = m; break
        x[m] > t:u =m-1
感兴趣的读者可以自己尝试写一个二分搜索程序,看看你是不是那10%(可在评论区晒出来)

来自一颗珍珠的启发


算法大师做的事,是提供一种思考方式,它不仅适用于编程,还适用于其它领域。

《编程珠玑》被很多牛人推崇,不仅是Jon Bentley的名号,比如Java之父James Gosling的老师。尽管这是本主要讲算法和程序设计的书 ,但更重要的是其思考方式。比如 基础部分,用大部分人能听得懂的话来复述,就是如下这样:
1. 搞清楚需求
2. 设计算法
3. 根据数据选用合适的数据结构
4. 写代码
5. 调试测试

对于以上每一个环节,可以怎么做,能做成什么样子,这本书阐述的可谓是淋漓尽致。稍微有些许年份开发经验的人,回过来总结,无非就是以上那些。玩出花来,也逃不过那五个部分。细细品味,这本书真是一本『授人以鱼不如授人以渔』的书籍。

至于说这本书提供的思考方式不仅适用编程,也适用于其它领域,其实这也是显而易见的,例如:搞清楚问题,就单说这一点,在任何领域做事,不都是这样吗?

不用编程术语来复述以上五个步骤,应该就是如下这个样子了:
1. 搞清楚问题
2. 思考解决问题的方法和思路
3. 选用合适的工具
4. 执行
5. 优化迭代

如果想看提高编程技能,想研究算法和数据结构这些内功,还是建议加大看看《编程珠玑》,有些人说它简单,我倒不觉得,我觉得它还是需要一些基础的。 比如第一章涉及到的知识点有: 归并排序(可用作一种外部排序方式)、快速排序、位图、位向量、时间复杂度分析、空间复杂度分析、计算机存储数据大小估算等等。

Bentley想表达的是,仅仅熟练地运用这些可靠的工程原理,不见得一定能够如期完成软件并顺利运行。在可靠的工程之外,通过洞察力和创造力结晶而出的编程珠玑,这也是计算机编程有魅力的地方。

编程珠玑(第2版)
作者: 【美】Jon Bentley
译者: 黄倩 ,钱丽艳