算法工程师又不只是工程师

245 阅读9分钟
原文链接: zhuanlan.zhihu.com

继上篇

吴海波:论算法工程师首先是个工程师之深度学习在排序应用踩坑总结zhuanlan.zhihu.com图标

,着重描述了工程能力的重要性,对于理论部分提的很少,但不代表它不重要。

谈的是提升理论素养

理论深似海,那是人类顶级的头脑的战场。

大多数算法工程师,当讲和理论相关时,大多是看了点论文、读点经典教科书,能水下paper已经是很高端了。不能称这些是做理论,对那些真正从事理论工作的同学太不尊重了,称为提升理论素养更合适。

理论素养不直接等价于业绩产出

很少人会觉得理论素养不重要,但提升理论素养的投入和产出之间不是线性关系。导致在工业界,经常争论对理论素养需求程度。比如知乎上的这个问题:

有没有必要把机器学习算法自己实现一遍?www.zhihu.com图标

有5k+的关注,100多个回答,可见热度。

双方观点其实都挺有道理,但大家特别容易

手里拿个锤子,看什么都是钉子。

现实中不存在一头扎在理论学习或者工程实现,就万事大吉。在二者中来来回回穿梭,试探边界在何处才是常态。

就像生活的常态是chaos,就像熵一样一直增长,是自然规律。维持有序的状态需要付出了额外的成本。就像IBM大型电脑之父佛瑞德·布魯克斯说的:

No Silver Bullet

我们的CEO也说过,他是一个现实的理想主义,美好的理想就像有序的状态一样需要消耗巨大的资源,而我们的资源永远是有限的,要学着带着镣铐跳舞。

争论的背后:ROI

我们所有人,都太追求效率了,俗话说:

一分钱一分货,十分钱两分货

边际效用无处不在,当投入过了一个坎,ROI就会剧烈下滑,线性增长的ROI就像泡沫一样美丽。

工业界的同学,ROI的思维已经是生存的本能,但面对理论时,有时成也ROI,败也ROI,正如李沐在一篇帖子中说:

在工业界呆过再去读phd可以少走很多弯路,也会发现很多学术界的idea就是个笑话。但同样的问题是,习惯了很solid的工作,反而有时候思路打不开,不敢尝试思路新奇的点子。我phd期间比较后悔的是好几个地方隐约有点想法,但太专注一些跟工业界经历很像的想法,结果后面看到别人在这些地方做出了世界级的工作。

我们和大神的距离太遥远,也很少能接触世界级的工作。更恰当的例子是公司的短期KPI和长期KPI的矛盾。短期的KPI虽然回报高,但就像下游低端产业,由于门槛低,很容易会变成红海,要发展就需要升级产业,向上游、高端的方向去,获得更大的利益分配权。

再退一步讲,浪费一些时间、精力在不能明显看到ROI的事情,其实也没什么,反正它也会被浪费在别的地方。意大利物理学家卡洛•罗韦利在《七堂极简物理课》中提到:

少年时代的爱因斯坦曾度过一年无所事事的时光。很可惜,现在很多青少年的父母经常会忘记这样一个道理:一个没有"浪费"过时间的人终将一事无成。

务实一点,提高理论素养的好处还是很多的

除了以前常说的理论是指路明灯外,还有很多其他好处。

有助于系统化知识点

工作期间,见过不少干的好但是说不清楚的,在晋升上吃亏。有些同学性格内向,不善表达。改善表达可能比较难,但可以扬长避短,从写东西入手,写东西的前提是心里有货。好的理论素养,能高屋建瓴将工作经验、知识点系统化,更利于他人理解。

比如这篇

深度长文 | 从FM推演各深度CTR预估模型(附开源代码)yq.aliyun.com图标

清晰的指出:在wide&deep的基本框架下,上述论文都是在尝试不同的策略去把输入向量用一个Embedding层接入到Dense网络中。里面的每一篇论文我都看过,扪心自问,能不能写出类似的文章,遗憾的是不行。

解放思想,见识是阻碍我们发展的最大障碍

我司的图像做了有一段时间,一直是单机跑模型,有时候一跑要一两周,不少公司和我们类似。一直也没有觉得有什么问题,很少去想是不是要搞分布式GPU计算平台。以前的业务,上分布式大部分是因为数据规模很大。工程组也很犹豫要不要做,我们自己心里也没有个定论,拖了一两年。直到看了

Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour,arxiv.org

开拓了视野,马上就下了决心动手干。

他山之石可以攻玉

Scott Berkun在《Myths of innovation》提出:一个新的idea背后,能找到多个已经存在的idea。

最近把Jared Diamond的书重看了一遍,从《第三种黑猩猩》到《枪炮、病菌与钢铁》到《大崩坏--人类社会的明天》,作者兼具演化生物学、生理学、生物地理学等学科,取众家之长,融会贯通,形成独特的观点,写成如此优秀的作品。

深度学习在图像和NLP领域大放异彩,涌现出很多建设性的工作,又有多少能应用在工作中呢?

取上者得中,这一场idea的盛宴,不容错过。

满足好奇心

深度学习的理论发展远跟不上应用的发展,但一个个漂亮的结果背后,总是忍不住好奇它背后是为什么。

比如图像中的milestone模型resnet,没有细看论文,一直认为是解决了gradient vanishing/exploding问题,而作者在

原论文arxiv.org

里明确指出这个问题已经被BN和良好的initialization解决,resnet解决了网络层数增加后degradation的问题,具体是什么问题,作者并没有深入。

后续这篇

The Shattered Gradients Problem:If resnets are the answer, then what is the question?arxiv.org

更详细的描述了这个问题,并指出可以用LL,不需要residual的结构,也能训练deep模型。

更上一层楼

现实世界中,很多问题需要都不需要太懂理论就能解决的不错。

这个背后的力量是抽象带来的,抽象做的好了,能让你不用懂其原理,也能发挥它的功效。就像我们每天用的手机,里面有量子力学的原理在发挥作用,但没有几个人懂量子力学。

随着各种工具越做越好,越来越多的细节被屏蔽,这个情况会越来越普遍,但随之带来是更多的应用可能性。就像今天的码农大多不懂编译器,也不会汇编,但IT业却前所未有的繁荣。

这几年在公司,还是做出了点业绩,但水平如何,如人饮水冷暖自知。比如58同城上麻利电工不一定懂电路原理,懂了电路原理也不能增加每小时的薪水,和我们何其相像。

居安思危,认清自身所处的产业环节,尽力向上游发展,而理论素养是其中一把钥匙。

提升理论素养,悟性低就多动手

深度学习大多数论文偏应用,对理论背景和数学知识要求不高,但就如此,理解他们也不是一帆风顺,可见纯理论工作之难。

最近被BERT刷爆朋友圈,里面提到传统transformer不能做双向,不理解。自己对transformer的理解还不够。重新回去看下

Attention Is All You Need,arxiv.org

还是不理解。

只能用笨办法,用pytorch动手实现了一把,发现了几个以前没有注意的问题:

  1. 论文里自称可以并行,但decoder部分怎么并行呢,下一步的output总要依赖上一步吧?然而作者是直接把ground-truth放入。
  2. self-attention才是不能做bidirection的原因吧。

果然资质平庸,还是需要动一遍手才能理解更多,叹悟性之差。过程中,花了不少时间在处理Tensor的shape变换上了,算是一种浪费吧。

再一次,没有银弹

并不是把每个算法都自己实现一遍,就能做出更好的成绩的,也不存在把公式推一边,能找到解决问题的灵丹妙药。

大多数我们并不是没有时间,反而是觉得自己在浪费时间,而不肯投入。然而浪费是常态,据说碳基生物的能量利用率不到20%。再比如,公司里失败的项目远大于成功的。

最难的部分是不知道怎么准确定义问题。一百分的努力中,若有一二十分最终有收益,算很了不起了,没有银弹,只能先把量堆起来,量变引起质变。

道理易懂,行动不易

PRML还停留在第5章,ESL买了后在书架上积灰,电脑下面还垫着MLAPP(颈椎是好了一点)。看论文的速度慢,数量也不多。但其间看了好多杂书,其中还有几本网文,比如大圣传,美其名曰帮弟弟考察行情。

头顶的发际线在告诉我,韶关易逝。现在我常想,20岁的我在干嘛,估计以后还是会常想30岁的我在干嘛呢。

如果觉得自己明天起来就能变成意志力超人,那这30年算是白活了。虽然很多事情不及预期,但也收获了不少,就是这样,不完美、挣扎、痛苦,构成了生命的组成。只希望未来的时光,能牢记初心,切勿自甘堕落。

送一句话给自己:切勿做井底之蛙,坐井观天,固步自封。