心法利器
本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更有历史文章合集,欢迎下载。
往期回顾
- 心法利器[116] | 算法工作5年经验分享:形成通式和突破定式
- 心法利器[117] | 算法技术设计思考:迭代的思维方式
- 心法利器[118] | 向量检索组件(含代码)
- 心法利器[119] | 大模型落地困境讨论与解决思路
- 前沿重器[48-54] 合集:四万字聊搜索系统
最近断断续续,更新比较少,慢慢开始回归。
今天本来已经开始在写别的文章,但今天偶然间看到王喆前辈在自己的公众号写下了这篇文章:大模型 vs 搜广推?算法工程师们应该如何选择职业方向?,里面可以研读的内容非常多,其中有一段内容非常能引起我的共鸣,这段话我先摘录下来:
对于比较高阶的职位,比如字节3.1,阿里P8,Meta E6,Google Staff及以上的职位来说,什么能力最重要呢?我感觉有两个核心能力:
充足的,相比招聘团队有优势的行业经验
解决新问题的能力
对于这些职位的招聘,它们无一例外都有一个期望,就是能够带给团队一点新东西,能够帮他们解决一个新问题比如iOS的隐私合规的问题就是几乎是广告算法团队高阶职位的必问问题。你有新思路,你有成功的行业经验,就必然能够让别人溢价招聘。17/18年的时候,搜广推领域硅谷这边的engineering manager跳到国内直接当director甚至VP例子都是有的,因为当初硅谷的技术经验还是领先的。现如今,如果OpenAI,Anthropic的程序员跳槽国内大模型公司,肯定也是溢价招聘。但毫无疑问,这些机会是面向行业专家的,前提是你在这个行业有充足的积累。
第二点是解决新问题的能力。我在字节招聘3.1的时候,极喜欢问一个对于候选人来说全新的问题,比如广告系统里多目标出价,正样本延迟,召回层优化目标选择这些行业内常见但不好解决的小问题。我要知道一个候选人从0到1解决问题的思路,而不是背八股文的能力。这种能力也需要一个人在行业内沉浸多年,思考并带领团队解决过很多新问题才能沉淀出来。
这段话读下来,真的共鸣感会非常强,在自己已经掌握行业基本知识甚至比较前沿的知识后,还需要进一步提升,解决问题,尤其是解决新问题的能力,是一个非常重要的方向。
解决问题和解决新问题
这里先把概念讲明白,解决问题和解决新问题,两者在概念上少有区别,但是在难度上,却是可以说是一个境界的提升。
所谓的解决问题,是指在给定的一个自己比较熟悉的领域内,给出一个比较常规的问题,需要我们解决。对我而言,例如一个新的意图识别,一个新的实体抽取,这些都算是我的舒适区,我能根据实际情况,很快设计出合适的方案并开始实施完成。
至于解决新问题,则难度要更高,可能仍旧是特定领域,但是面对的问题可能没有见过,但存在一定的关联或者相似性,例如在RAG、Agent出来后对特定任务的调优,例如对比较擅长语言理解的我给出文本生成类的问题,我能逐步推演出解决方案,并且尝试和实施。
这两者的本质区别在于,自己平时该问题的熟悉程度,如果早就做过,那很多时候就是经验的复现,而如果是未做过,则是要经过严谨而带有一定创造性的思考后才能够给到,正如上面王喆前辈提到的“我要知道一个候选人从0到1解决问题的思路”,这个0到1,并非问题本身场景开荒性质的0到1,而是个人思维层面的0到1,没接触过没思考过的问题,要想出办法解决,某种程度上,这算是一种研究探索型的思考了。
能力等级提升
在讲如何沉淀和培养之前,这里不得不提出一个自己理解的概念,能力等级。我一般会分为3个等级,执行、设计、探索。
执行,即在给定方案后,把他们落实完成。这是入门者最基本的能力要求,举个例子,在被告知这个问题可以用BERT解决时,能用代码快速把数据处理、模型训练全部完成,并且训练出一个baseline,这个就是最基本的执行要求,对于优秀的执行者,速度和执行的正确性都能保证,甚至能在执行后提出一些优化或者改进建议。此处注意,这里要求的是把被告知的方案完成,对于该方案的正确性,在这个等级上并不做要求。
设计,是能针对一个简单问题自己想出解决方案并执行完成。先举例子,此处并不会被告知要使用的方法,而是被提出了一个文本分类问题,此时需要自己根据实际情况设计出合适的方案并且执行,这里不仅要求执行的速度和正确性,还要求设计出的方案有足够的质量,即在执行等级下,并没有被要求的一项——方案的正确性,此处要求设计出的方案必须可靠正确。在大部分情况,能到这个能力等级的,多半是高级或者资深了。
探索,是能在面对一个相对甚至非常陌生的问题时,能结合自己的知识储备,甚至定向扩充自己的知识储备把他解决掉。这里我说到“一个境界的提升”,是因为这里除了知识的储备要求更多更硬,还要求老辣地问题分析、问题拆解、问题处理能力。举例子,对于某个模型解决某个算法问题需要调优时,大部分情况的策略是,训练集测试集的优化,模型切换和调参,当这些方案都用尽后,还能不能通过各种数据的分析观测,基于自己的知识储备找到新的突破口。再举例子,在某个业务的算法优化到一定程度后,潜在收益都比较小后,需要拓展新的业务,新业务下的算法要如何设计和调优,这些都算是解决“新问题”的场景。正如前面王喆前辈说的“字节3.1,阿里P8”而言,这是对他们的要求,要晋升到这个等级,需要具备这个能力。
如何学习与培养
说完了具体的概念,该说怎么培养了。
执行
执行,更多是知识和熟练度的提升,类似“用BERT做一个文本分类”之类的问题,简单地网上找到对应的代码,能快速解决,进一步,要在项目代码里写,则就是找到特定的位置然后写进去,增加一个模块,这些都是基本能力了。掌握与否很大程度是看自己平时是否有在学,是否在自己动手实验。
设计——解决问题
到了设计,就开始要有一定的经验积累了,当然知识也不能落下。
首先,能力是分领域的,一般的在自己比较常做的领域,除了项目中用到的方案,我们还需要对该方案对应领域下的各种方案都有比较深入的了解,小到目前比较流行的方案,大到过去的经典方案,未来的一些苗头或者方向,都有很大的了解,除了了解原理本身,最好还能回答下列几个问题:
- 这些方案分别有什么特别的优点和缺点。
- 这些优点和缺点都是什么原因导致的。
- 这些优点和缺点对应到现实场景是什么样的,即什么方案适用于什么样的场景。
- 这些方案的互相组合能不能解决一些特定场景的问题。
- 这些方案在特定场景中的效果差异有多大。(尽量不要是一个“谁比谁好”的结论就过去了)
在此基础上,就是应用了。这里要求设计方案,那设计方案的主要流程肯定不可避免:
- 熟悉具体问题背景和场景特点,还有特定的资源限制,即足够的了解场景和需求。扎心的例子,别一上来不顾限制先用大模型做了一遍结果发现没有显卡,那就很大可能白干了。
- 根据需求和各种限制,设计出可行的方案,这里包括数据需求、训练集测试集设计、模型流程设计、评价指标设计等。
- 使用该方案进行实验和调优,并在实验过程中针对面对的问题进行解决和调优。
这些东西我在平时好像都会有说过,感觉上好像很简单,但这个真的得靠多实践多思考才能慢慢领悟完成的,类似一些对资源限制、评价指标的敏感性,还是得多分析多看,有时候常用的指标可能会出现问题,此时就要设计新的指标重新观测。
探索——解决新问题
上面已经对解决新问题的概念做了解释,此处不赘述。简单地理解,就是我们要面对的问题并不在我们非常熟悉的领域,此时,我们要做的相比于“设计”,还需要“调研”和“创新性思考”。
调研,这里会分两点——问题与场景调研、技术方案调研。前者,更多是要增加对实际问题的了解,这里更多会涉及到业务,例如特征层面要了解那些特征可能是影响问题的关键,此处需要注意不要太快跳进数据探索这个阶段,类似主成分分析、聚类之类的,而是多走访一线潜在用户进行调研,了解痛点,这点和产品经理也很类似,这些信息有利于我们建模和数据的收集,在确定这些以后再回头来看实际的特征数据,会有新的理解;另一个是方案的调研,我们很难是某一个方向的唯一探索者,因为现在网络发达,我们总能从各种渠道挖掘到目前已有、常见的方案,或者是一些类似领域的相关方案,例如搜索的论文可能是比较少此时参考推荐系统就是一个思路,NLP和CV也是常年有大量的互相参考学习的,因此在下手干活之前,花费更多时间在论文、博客等渠道的调研上,是非常值得的。(具体怎么调研,我感觉可以专门写一篇文章来讲讲)此处重在点名,要有这个“调研”的意识,道理还是很好理解的,但主要是真正做事的时候要有这个意识去做。
创新性思考在于,对新的问题能快速通过一定的“脑补”,就给出一些预判性的思路和建议。其实随着对一些领域的熟悉,知识储备逐渐丰厚以后,在自己多有意识地训练下,慢慢就会具备这样的能力。问题能够拆解,借助自己的专业能力快速对问题进行拆解,从而形成自己的方案建议,例如在对搜索、推荐足够了解后,RAG的baseline、调优方案是很快能想出来的,包括类似的agent系统,例如“意图”和“路由”概念的相似性,很快能够理解。当然了,这种“脑补”是一种能力,但是不代表现实应用就要这么做,更多需要结合前面的“调研”来修正自己的“脑补”,从而形成适配领域的方案,否则就成了墨守成规、思维定式了。我自己在搜推、对话这个领域浸泡了很久,也意识到自己在这方面的思维定式,也想要尝试突破他,但这个有些难度,我正在努力。
训练和培养
需要强调的是,思维方式是需要训练才能掌握和熟练使用的,平时就要有意识地培养自己,多去尝试这样的思维锻炼。举几个例子。
- 即使是日常工作,也多问问自己,是否还有别的方法,为什么要用这个方法,甚至否定自己,不用这个方式自己是不是就没招了。
- 出现问题的时候,多看数据,比对方案前后的推理效果变化,多思考原因分析原因。(这种方式出论文思路也很快)
当然,还有孜孜不倦的学,扩充知识储备。所谓厚积薄发,就是要足够的积累才能在现实应用中逐渐体现,手里的方案多,能选得了,有需要的时候总能掏出需要的东西,自然就得心应手。
小结
早年,很多人拿了bert就上来训练,训练效果好就结束,不好也没辙,现在有了大模型,入门门槛进一步降低,知识性的内容看似要求更低了,简单prompt写一个后就结束,好一些的可能还看看指标,有的指标都不看试了几个例子就会上线,很大程度就是有关的算法理解、知识储备、思路培养不足,能力就受到了限制。要想进一步提升,让自己的竞争力有提升,还是需要不断的修炼,基本功和内力都要到位。
转眼就写了快4k字了,本文是在王喆前辈的文章下有感而发写下的(大模型 vs 搜广推?算法工程师们应该如何选择职业方向?),有很大的共鸣,也做了很多反思,在此共勉吧。