• 【R言R语】算法工程师入职一年半的总结与感悟


    公众号:WeThinkIn

    公众号原文:【R言R语】算法工程师入职一年半的总结与感悟

    写在前面

    【R言R语】栏目专注于分享Rocky的一些思考。关于AI行业的思考,将是本栏目的核心,除此之外,其他有价值的事物也会在这个栏目中呈现,欢迎大家一起交流学习💪,分享宝贵的ideas~

    大家好,我是Rocky。

    将近一个多月的高温天气终于在大雨中离开,随之而来的是微凉的秋风与骤降的温度。

    在感受秋高气爽的同时,也感叹“原来已经到九月初了”。Rocky觉得确实到了一个时间节点,安静下来,复盘过去,想想未来

    故撰写本文,讲讲Rocky正式工作一年半的总结与感悟,以及未来的一些计划与愿景。送给自己,也送给大家,希望我们能一直怀着赤子之心勇往直前,疯狂生长。

    So,enjoy(与本文的BGM一起食用更佳哦):

    干货篇

    ----【目录先行】----

    1. 业务侧的总结与感悟

    2. 竞赛侧的总结与感悟

    3. 研究侧的总结与感悟

    4. 产品侧的总结与感悟

    5. 后续规划

    【一】业务侧的总结与感悟

    学生时期Rocky在国企,传统IT企业,硬件大厂,独角兽,互联网大厂里进行AI项目的开发与落地;正式工作以来,Rocky主要负责提升业务场景中AI算法模块的综合性能,并和上下游部门一起参与AI算法解决方案的开发与优化。

    算法模块的综合性能包括泛化性能,稳定性,安全性以及特殊Bad case的解决。

    算法解决方案的开发与优化,就比较宏观了,主要包含场景侧,数据侧,用户需求,模型侧,部署侧以及多部门的协调沟通合作。

    乍一听是不是比较抽象,don‘t worry,下面Rocky将逐一剖析。

    数据侧,场景侧以及用户需求

    首先,Rocky想聊聊数据侧,场景侧以及用户需求这三个维度。这三个维度是算法解决方案的起始,也是最关键的部分,正所谓“谋定而后动”。业务场景定义机器学习问题,数据侧不断去逼近这个机器学习问题的真实数据分布,而用户需求为我们指明了切入点和优化方向。

    这里涉及了很多细节问题,需要我们进行不断复盘与优化:

    第一个是业务场景如何定义,一个大场景中,是否需要分成多个小场景任务?用什么逻辑去分?业务场景在不同干扰因素如噪声,光照,角度,天气等影响下,是否需要进行特定的约束定义?

    第二个是在数据侧和业务场景做关联的时候,定义的业务场景能否与采集的数据分布适配?数据侧能否源源不断地提供数据支持,并不断逼近业务场景中真实数据分布?是否需要合成数据?数据采集的姿势合适吗?

    第三个是在用户需求和业务场景做关联的时候,如何定义用户需求?和产品去讨论的时候,在大家的认知不一致时,其实共识是很难达成的,比如如何定义什么是“识别效果好”,可以是实际指标,也可以是用户满意度,并且每个人心中的评价标准都带有一定的主观性。还有用户需求是否和业务场景适配?是合理的吗?

    第四个是数据侧和用户需求做关联的时候,用户想要达到的效果,数据里能体现出原先场景中的bad case吗?比如想要在森林中提高某个物体的识别率,但是可能数据里根本就没有这个物体。用户需求是一次性需求,demo需求还是长期需求?面对不同需求,数据侧的支持力度需要进行相应的调整。

    总的来说,这几个维度最重要一个点就是降本增效,场景侧如何快速理解场景特点,并定义问题;数据侧如何降低数据支持成本;用户需求侧如何降低沟通成本,快速达成共识。

    这些能力都需要不断在现金流业务中打磨,需要持续的深耕和思考。一次性业务,demo,无商业模式业务都是需要规避的。

    模型侧和部署侧

    接着,Rocky聊聊模型侧和部署侧这两个维度。

    先单说模型侧,这时就可以引入我们上面讲的泛化性能,稳定性,安全性以及特殊Bad case的解决等维度了。算法工程师核心对算法模块负责,其次再对算法解决方案负责

    1. 泛化性能:制作贴近实际场景数据分布的测试集,用于对模型进行指标的评估。
    2. 稳定性:对模型以及前处理与后处理进行稳定性与压力测试,确保模型在现实场景中的鲁棒性。
    3. 安全性:通过AI安全的解决方案来提升模型的安全性(即抗常规噪声,对抗噪声以及自然噪声等)
    4. 特殊Bad case的解决:随着数据侧的不断支持,源源不断的新情形出现,这些新情形可能就会成为模型判断的盲点,这时将这些特殊的Bad case通过合适的方式进行解决,从而达到增强模型泛化性能的目的,也让数据侧的数据分布能不断逼近真实场景的数据分布。

    到了算法开发阶段,建议算法工程师手里对不同的细分领域都准备几个拿手的baseline模型,在不同的AI项目里都能快速上手验证,提高开发效率

    搭建好baseline就像婴儿学会了走路,那么下一步就是学会跑步了。

    想要速成跑步,可以参考如下技法:

    1. bad case分析,明确优化方向,具备很强的针对性。
    2. 积极的理解数据,优化数据分布。
    3. 设计前处理/后处理等规则辅助模型,弥补模型的不足。

    想要慢慢领会跑步的精髓,可以参考如下技法:

    在搭建好baseline模型,同时对最后的性能心中有数时,我们可以花时间进行更多的调研,可以从最新的论文,最新的开源项目,以及经典的方法等方面切入,看看是不是有可以参考借鉴的地方,进行务实的优化。这个动作不但能优化当前的方案,同时也是让自己能学习更多,面对其他AI项目时,会有更多的方案与思考,是性价比很高的一种方式。

    但一定要注意的是,AI项目的开发不像科研,AI项目需要快速的迭代优化,达到满足产品需求的目的,而不是陷入层层的实验当中。

    再说部署侧,部署侧主要有工程代码和端侧硬件组成。

    业务中的工程模块或者工程代码,往往非常值得挖掘。工程代码是经过客户与实际场景的长期考验,从而沉淀下来的代码和思想。如何透过现有工程模块,洞见这些思想和代码为何而来,做到知其然也知其所以然,是非常有价值的事。在此基础上,再对工程代码进行扩展和迁移,会更加从容。

    而对于端侧硬件,首先要做到对几十种不同类型端侧硬件的熟悉,这个熟悉包括性能,使用场景,不同硬件的对比特性等方面。

    有了前面的基础,Rocky总结了工程代码编写,模型部署,多维测试的注意点:

    1. 要保证模型在端侧或者线上的性能与本地的性能一致。
    2. 算法部署层面更关注模型的内存占用,速度,兼容性与鲁棒性。
    3. 工程代码撰写之前要进行合理的设计,我们的代码要是可维护的,可拓展的,以便于后续的优化。
    4. 模型部署的测试不单单要进行常规测试,也要进行细分测试,压力测试,鲁棒性测试,以及上线后的测试等等。

    算法解决方案

    最后,就到了多部门的协同沟通合作完成整个算法解决方案的开发与交付了。Rocky归纳了下面的流程图来总结业务侧的整体逻辑结构:

    业务侧的整体逻辑结构

    【二】竞赛侧的总结与感悟

    正式工作以来,Rocky已经多次参加场算法竞赛了,都是在CVPR,AAAI以及Kaggle等平台上举办的CV方向的Competitions,也多次获得了第一名和top1%成绩,并在这些平台中与大家进行了交流和分享。

    算法竞赛方法论

    竞赛厮杀方法论

    Rocky在这里总结了算法竞赛厮杀方法论,希望能让大家在算法竞赛中更加从容:

    1. 赛题分析,问题定义。如何提炼赛题核心,并进行建模非常关键。
    2. 数据EDA(Exploratory Data Analysis)。磨刀不误砍柴工,对数据进行分析挖掘,有时往往能发现一些优化方向,对数据整体特征也会有较好的把握。
    3. 模型baseline设计&&优化。一般选择该细分领域的SOTA模型或者竞赛打榜热门模型做baseline入场;再针对竞赛赛题的特点对模型结构进行针对性的优化。
    4. 数据工程。针对赛题特点对数据进行增强,包括线下增强和线上增强等。
    5. 设计前处理和后处理。通过一些前处理算法与后处理算法对模型进行更多的约束,提升模型综合性能。
    6. 优化方法的消融实验。高效的消融实验非常重要,因为深度学习模型训练时间一般较久,如果一个实验跑一周的话在竞赛中是完全不行的。
    7. 线上结果反馈,根据线上结果倒逼1-6步的推进,从而形成正向的优化循环。
    8. 竞赛过程保持良好的心态。竞赛短则1-2个月,长则半年,不同的竞赛时间段都需要保持一个合适的心态,在竞赛前期不要放松,在竞赛中期不要焦躁,在竞赛后期冲刺时保持心态平稳。
    9. 竞赛所在细分领域的奇技Trick。这些Trick往往非常有效,且历经时间的考验。

    算法竞赛的成果沉淀

    完成竞赛不是最终的目的,将竞赛成果与思考向业务侧和研究侧进行迁移,才会更加有价值。

    同时竞赛方法论也具备迁移价值。业务侧也好,研究侧也好,都可以从竞赛侧中获得启发。

    而且顶级算法竞赛的成果也有助于公司AI影响力的提升。

    算法竞赛的成果沉淀

    【三】研究侧的总结与感悟

    正式工作以来,Rocky也发表了一篇paper,撰写了多篇专利,算是对想要研究的方向入了一个门吧,还有很多需要学习成长的地方。在这里Rocky也浅谈一下在工业界科研的一些感悟。

    工业界科研的大局观

    首先,工业界科研与学生时代的科研完全不同,因为公司里所有工作会与绩效挂钩,研究也不例外。我们不能像在学校那样,花一年甚至两年的时间去进行研究,甚至一天中花在研究的时间也只能占工作时间的20%-30%左右,我们需要在业务侧,竞赛侧,产品侧去沉淀与成长。

    加上全球局势巨变,整体经济环境的变化,互联网底层逻辑彻底改变以及人工智能再次遇到理论发展瓶颈,坦率来说只靠发paper来融资的模式这个底层逻辑已经一去不复返了。在这个大背景下,将部分的绩效与研究挂钩本身是一个输入产出比需要不断微调的事。

    因此,从产品、业务、竞赛中找问题,进行拓展研究,并及时将阶段性成果反馈到产品、业务与竞赛中,彼此之间相辅相成,互相促进,不再只拘泥于发paper,而是顺势而为,用创业逻辑来平衡期望。这是Rocky与自己和解的一种方式。

    工业界科研的paper阅读方法论与论文撰写策略

    paper阅读方法论:

    近年来,各个顶会接收的论文越来越多,CVPR2022投稿量更是超过了1w,接收2000多篇。如果我们每年关注3-6个顶会的话,那么我们每年要看6000-12000篇顶会paper。这显然是不切实际的,在学校无事只看论文尚且难以达到,更别说工业界只能花20%-30%的工作时间。

    而Rocky的方法是聚焦于提高好paper的召回率。这里的好是相对的,因为Rocky是从业务,产品以及竞赛角度出发,所以要努力从海量paper里召回能助力这些维度的paper。另一方面,从工业界发表的paper中筛选,可能有更好的召回率,因为工业界有实际问题和实际数据,可能会更好的解决工业界的一些痛点问题。

    总之切记不能沉溺于paper的海洋中不能自拔

    在召回了一些paper后,那么该如何读呢。首先是在召回池里进行快速泛读,找到感兴趣的paper进行详读,并反复迭代这个过程,一周要读3篇左右。对于一篇paper可以从粗到细、有选择地多读几遍,从而逐步挖掘我们想要的价值。

    第一遍:Title -> Abstract -> 所有图表。Title是一篇paper核心最凝练的体现。读Abstract可以知道这篇paper要解决什么问题,论文提出的解决方案以及效果。深度学习很多论文提出的方法与实验结果用图表就可以概括。

    第二遍:Introduction -> Conclusions -> 所有图表。读Introduction可以了解这个文章的背景,存在的问题,现有的方法,这些方法有哪些不足或者缺点等。Related works最后部分有本文主要贡献,需要把握一下。读Conclusions可以知道这篇paper的结论和限制,以及对未来的畅想。

    第三遍:读全文,跳过Related works和数学推导。读Methods可以知道方法细节,我们可以边读边思考为什么会设计这种方法,能不能挖掘更优化的点。可以读实验部分来完备自己的实验设置,以及判断paper为什么这么设置。

    第四遍:再读全文。

    读后思考:(1)一句话总结论文做的事(2)论文提出的方法核心的内容是什么?(3)我们能从中借鉴什么?(4)是否存在可继续拓展优化的点?

    论文撰写策略:

    1. 学习讲故事的能力,讲好故事。
    2. 从好的paper中学习论文撰写逻辑,并在自己的工作里进行迁移。
    3. 把论文撰写当作业务之余的梳理与总结。
    4. 论文各个板块内容分开撰写,论文撰写和业务侧,竞赛侧,产品侧的轻重缓急进行动态调整。
    5. 工作时间的20%-30%进入读在职博士状态

    工业界科研的成果沉淀

    不要给自己的研究成果设限。我们研究的每一小步都可以进行沉淀,优先向业务侧,竞赛侧,产品侧迁移应用。

    除此之外,科学与严谨的思维方式,总结报告的撰写逻辑,融资PPT的撰写逻辑,讲故事能力等都能从这个科研中沉淀。

    能沉淀到业务吗?能沉淀到产品吗?实验过程中有什么意料之外的点?实验效果如何,需要继续优化还是推倒重来?是否可以转化成专利或者论文?这些也都是每日三省吾身的问题,更要用投资逻辑来周期性看待研究方向与研究成果的价值

    最后,工业界科研给我最大的感受是坚持与选择这两者需要时刻权衡,时刻复盘

    【四】产品侧的总结与感悟

    为什么要单开这个章节呢,是因为Rocky发现,在面对创新业务的时候,算法工程师往往还身兼PM的职责。

    创新业务不同于现金流业务,创新业务其实一开始是一种sense,需要自己负责指挥整个产品的发展方向和落地形态。这时就需要站在产品侧的视角去考虑问题,并且将自己的想法传达给团队,并达成一定的共识。

    创新业务需要自己极大的主动性,在自己不断的学习成长的基础上,快速试错,并推动业务的落地。

    创新业务和创业很相似,但只是部门内部的“创业”。需要站在解决方案的角度,对各个模块进行评估和统筹。

    总的来说,AI行业的各种应用都还在不断发展,Rocky相信AI行业还有很多的成长空间,其较好的赋能能力,会让我们的生活越来越好,会让各行各业越来越智能化。

    在AI这个“不朽的事业”中,不断学习,不断成长,让Rocky有更多的热情在这个道路上持续探索,这也算是寻求一种庇护吧。

    【五】后续规划

    关于后续的规划,我想从下面几个维度来谈谈自己的想法:

    1. 业务侧:继续深耕已有的业务场景及其算法解决方案,在原有的业务基础上突破边界,落地新的业务。同时积极主动了解工业界其他可落地AI场景的商业逻辑。
    2. 竞赛侧:沉淀竞赛厮杀的通用方法论,并转化成竞赛侧系列文。聚焦竞赛成果的业务侧和研究侧迁移应用。跟进前沿高价值竞赛,参与厮杀与学习交流。
    3. 研究侧:利用好工作中20%-30%的时间,挖掘前沿论文,聚焦基础创新的业务侧和竞赛侧迁移应用。在有落地可能性的研究方向上持续研究,及时沉淀复盘总结。
    4. 产品侧:提升全局视野,思考行业趋势,沉淀战略规划,希望能在不断提升自己来推动推动公司AI业务与解决方案的突破与繁荣。
    5. 知识学习与思考:不给自己设限,增加思考的深度,广度以及跨界性,并持续讲出自己的故事与观点。保持开放的心态,集思广益,与业内朋友多多交流,互相学习。对于知识技能如C/C++,Python,端侧硬件,算法工程,AI行业标准等持续学习。
    6. 锻炼身体,劳逸结合。

    精致的结尾

    Rocky将算法高价值面试知识点即“三年面试五年模拟”之独孤九剑秘籍前六式进行汇总梳理成汇总篇,并制作成pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“三年面试五年模拟” 进行取用。由于“三年面试五年模拟”之独孤九剑秘籍pdf版本是Rocky在工作之余进行整理总结,难免有疏漏与错误之处,欢迎大家对可优化的部分进行指正,Rocky将在后续的优化迭代版本中及时更正。

    Rocky一直在运营技术交流群(WeThinkIn-技术交流群),这个群的初心主要聚焦于技术话题的讨论与学习,包括但不限于CV算法,算法,开发,IT技术以及工作经验等。群里有很多人工智能行业的大牛,欢迎大家入群一起学习交流~(请添加小助手微信Jarvis8866,拉你进群~)

  • 相关阅读:
    stm32控制舵机sg90
    4.4 Go语言中的单元测试
    淘宝商品链接获取淘宝商品评论数据(用 Python实现淘宝商品评论信息抓取)
    SSH的原理与配置
    探索GPT-4V在学术领域的应用——无需编程即可阅读和理解科学论文
    VUE day_10(7.28)Vue3学子项目详细版
    java socket实现代理Android App
    MyBatis的缓存
    Mock快速入门使用及组件构造首页
    Definition and properties of the Gamma function
  • 原文地址:https://blog.csdn.net/Rocky6688/article/details/126690980