人工智能,两三年前就陷入了大数据风潮,人人都是“数据科学家”套路。怎么办,才算进入AI行业?其实这个话题在笔者之前的聊天中已经多次提到,我再说一遍:在行业中直接应用AI技术的人,大致可以分为三种不同的角色:算法、工程、数据。现在各种媒体上有很多文章,包括GitChat,教你如何入门AI,如何成为特定领域的工程师,告诉你在某个领域发展需要掌握哪些技术栈等等……我们不说如何成为XXX,我们先来看看成为XXX之后要做什么,做这些事情需要什么样的能力,有了这些能力之后我们可以往什么方向发展以及做这件事。也就是说,在这篇文章中,我们将直观地了解承担不同角色所需要的素质、日常工作状态和职业发展路径。做算法1.1每个人在日常工作中都想做算法,那么,到底工业界做算法的目的是什么?一个真正的算法工程师(有的公司也叫科学家)最基本的日常工作其实是:阅读论文&实现——确认***论文中的解释是否真实可复现,进一步确认是否可以应用到公司的产品中,再应用到实践中,提高产品质量。1.2必备能力由于日常工作首先就是阅读别人的论文。那么,至关重要的是,作为一名算法工程师,必须具备快速、大量阅读英文论文的能力。有一个网站,所有对算法感兴趣的同学都必须知道:https://arxiv.org——里面有大量多学科(包括计算机科学)的优秀论文。现在,许多科学家、学者、研究人员和博士生在刚刚完成论文、尚未在正式的期刊会议上发表时就在这里发表论文,以便以尽可能短的延迟传播他们的成果。在传统的正规渠道中,一篇论文从完成到正式发表,往往会有三四个月到一年半的延迟。这对于一些传统学科来说是勉强可以接受的。但在计算机科学领域,尤其是人工智能、机器学习、深度学习这些当今世界最热门的话题,大家都在争分夺秒抢占制高点,耽误几个月是不能容忍的。所以,对于AI的学术文献,arxiv.org其实已经成为了目前综合性的地方。如果你想做算法,平均来说,你应该大致保持每周阅读一篇***论文的频率。或许这就是为什么,到目前为止,我听到和遇到的算法工程师都是名校相关专业的博士。经过几年密集的学术研究训练,这些博士生。同学们,即使英语综合水平不超过CET-4,也能读懂高难度的英文论文!1.3自测“算法能力”,当然也不能说硕士、本科或其他专业的有志之士不会做算法。人不是天生就知道的,所以他们可以学习它。但是能不能学会,其实花几万、几十万去各种培训或者付费阅读,用不了三五年就知道了。有一个很简单的验证方法:现在去https://arxiv.org找一篇论文(比如这篇:DynamicRoutingBetweenCapsules),从头到尾读一遍。现在看不懂也没关系,至少试试能不能一个字不漏地从头读到尾,看不懂就查字典。如果你做不到这一点,让我们立即与“算法”分手。既然注定错过,何必纠结?1.4学术实践能力如果你恰好喜欢看论文,或者即使不喜欢,你也有足够的意志力和专注力强迫自己强行看论文。那么恭喜你,你已经踏上通往算法山门的第一步。下一个层次是:阅读论文。既然你要看论文,看***论文,而看书的目的是指导实践,那你就必须明白。拿起一篇论文要达到看懂的程度,至少需要具备以下三种能力:1.4.1回顾性学习能力拿一篇论文来读,很多术语和术语都看不懂,而且它们之间没有关系也不知道。该怎么办?看参考资料、上网查资料、看书……总之,用一切资源和手段,搞清楚不清楚概念的意义和联系。这种能力是学术研究最基本的能力之一。一般来说,对于有学历的人来说,这不是问题。如果你现在没有,你也可以积极培养。那么你可能需要先学习学术研究方法论。1.4.2数学能力如果你只是为了学习而阅读经典旧论文,那么你只要知道文中图表的意思,看公式推导就能明白首末(物理意义)开头的公式,推导后的最终形式的基本含义)性质)都可以。但是读***论文就不一样了。因为是新的,所以一定不能通过时间来检验,所以没有人会提前给你验证它的正确性。这种情况下,看公式就得看推导。否则,首先是数学推导错误,导致结果过于喜人,但在实践中无法重现。岂不是费时费力?如果现在的数学能力还不够,当然可以学。但是和后面说到的工程上用什么的碎片化学习是不一样的。做算法,需要系统学习数学。微积分、线性代数、概率统计是少不了的。如果说这方面有欠缺,那就从计算机系的本科数学课说起吧。我个人推荐北师大的教材。做工程2.1日常工作相对于算法的革新和革新,做工程要平淡得多。这个角色比较有代表性的职位是:机器学习工程师(或者戏称参数工程师)——他们使用别人开发的框架和工具来运行现有的算法,训练业务数据,获得工作模型。可能会有一些处理数据、选择特征、调整参数的手段,但一般都是有据可循的,没必要自己发明一个XXXX。做工程一定要看论文,但是和做算法不同的是,做工程看论文的目的一般不是去尝试最好的方法,而是用已知有效的方法解决实际问题。因此,那些做工程的人经常阅读“旧”论文,或者学术含量相对较低(没那么难)的论文。而阅读的时候,主要目的是为了直接找到某个问题的解决方法,所以可以跳过阅读。对于里面的数学公式,能看懂开头结尾就够了。对论文阅读频率和学术深度的要求远低于算法。当然,既然是一个有领域的程序员,那也是需要在专业上做到一定深度的。虽然工程化一般需要使用现成的技术框架,但并不意味着直接把算法当成黑盒,就可以做一个合格的“调参”工程师。把算法当成黑盒使用的问题在于,当黑盒能解决问题的时候,好用,但一旦不能解决问题,或者对质量有要求,就会感到无所适从。做工程,“MachineLearning”学多少就够了。当然,既然你是一个有领域的程序员,那么在专业上达到一定的深度也是很有必要的。虽然工程化一般需要使用现成的技术框架,但并不意味着直接把算法当成黑盒,就可以做一个合格的“调参”工程师。把算法当成黑盒使用的问题在于,当黑盒能解决问题的时候,好用,但一旦不能解决问题,或者对质量有要求,就会感到无所适从。这里做数据的意思是做数据不是数据清洗和加工——可以看到工程岗位,有一部分工作内容是ETL和数据加工。这里做数据指的是数据标注。3.1标注数据的重要性机器学习中虽然有无监督学习,但在实践领域已经证明有直接作用,基本上是有监督模型。近年来,深度学习在很多应用中取得了巨大的成功,而深度学习无论是图像、语音、NLP、自动翻译还是AlphaGo,其成功都离不开海量的标注数据。不管是工程师做ML还是DL(algorithm&engineering),后者有一个共同的事实:现阶段数据远比算法重要。3.2人工数据标注的必要性数据标注的日常工作简单来说:数据标注的日常工作就是对各种数据(文本、图片、视频、音频等)进行标注。【好消息】:数据标注工作几乎没有门槛。一般来说,任何专业的大学毕业生,即使学历较低,都可以胜任这份工作。入门不需要像机器学习这样的专业知识。【坏消息】:这样的工作纯粹是“脏活”,一点都不酷,起薪也很低。打个不恰当的比喻:做算法就是屠龙,剑江湖,飞仙;做工程就是打猎,奔马,狂饮狂歌;泥土覆盖着泥土。所以,虽然这是一份谁都可以做的工作,但恐怕没有几个人愿意去做。认清形势,脚踏实地。最近能明显感觉到越来越多的人想进入AI行业,而且增长幅度越来越大。为什么那么多人想进入AI?真的热衷于计算机科学研究或扩展人类智能?说白了,大部分人都是为了高薪。人们为了获得更高的回报而做出选择和努力工作是非常合理的。关键是要找到正确的道路。虽然寻求进入该行业的人很多,但真正能够了解当前市场需求,了解不同层次人才定位,并从自身实际出发找到可行路径的人太少了。人人都想“做算法”,想都没想:大公司的研究院有一批高端科学家,有的是读论文十几二十年的资深研究员,始终走在人工智能的前沿。下面分享一下,ShuffleNet算法详解算法讲解:ShuffleNet是Face++的一篇关于减少深度网络计算量的论文,号称是可以在移动设备上运行的深度网络。这篇文章可以结合MobileNet、Xception和ResNeXt一起阅读,因为它们的思路相似。卷积的组运算从AlexNet开始就有了。当时主要解决模型在双GPU上的训练。ResNeXt借鉴了这个组操作来改进原来的ResNet。MobileNet使用depthwiseseparableconvolution代替传统的卷积运算,在不影响准确率的情况下大大减少了计算量。详见MobileNets-深度学习模型加速。Xception主要使用depthwiseseparableconvolution来改进Inceptionv3的结构。本文主要使用channelshuffle、pointwisegroupconvolutions和depthwiseseparableconvolution修改原有的ResNet单元,依次进行讲解。channelshuffle的思路可以看下图1。这要从组操作说起。在一般的卷积运算中,比如输入的featuremaps的个数为N,卷积层中的filter个数为M。那么这M个filter中的每个filter都要和N个featuremaps组合。对某个区域进行卷积,然后作为卷积结果相加。假设你引入一个group操作,设置group为g,那么N个输入featuremaps被分成g组,M个filters被分成g组,然后在做卷积操作的时候,第一组的M个/g中的每一个filters与第一组的N/g个输入featuremaps进行卷积得到结果,第二组相同直到最后一组,如图1(a)所示。不同的颜色代表不同的组,图中一共有三个组。这个操作可以大大减少计算量,因为每个filter不再和所有的输入featuremap进行卷积,而是和一组featuremap进行卷积。但是如果多个组操作叠加,比如图1(a)中的两个卷积层都有组操作,显然会出现边界效应。这是什么意思?也就是说,输出通道仅来自输入通道的一小部分。这肯定是不行的,学到的特征会很有限。于是就有了channelshuffle来解决这个问题。先看图1(b)。在进行GConv2之前,对输入的featuremap做一个分配,即每个组被分成若干个子组,然后将不同组的子组作为GConv2的一个组的输入,使每个组的GConv2对特征进行卷积allgroupsinput的maps,这和图1(c)中channelshuffle的思路是一样的。Pointwisegroupconvolutions实际上是groupconvolutionkernel为1*1的卷积,也就是说pointwiseconvolutions是卷积核为1*1的convolution。在ResNeXt中,group操作主要是在3*3的卷积上进行,但是在ShuffleNet中,作者是在1*1的卷积上进行group操作,因为作者认为1*1卷积操作的计算量不能忽略了。可以看到图2(b)中第一个1*1的卷积是GConv,也就是groupconvolution的意思。图2(a)是ResNet中的瓶颈单元,只是把原来的3*3Conv改成了3*3DWConv,作者的ShuffleNet主要是在此基础上改的。首先,将原来的1*1卷积换成1*1卷积withgroup,同时进行channelshuffle操作,前面也介绍过。那么3*3的DWConv就是depthwiseseparableconvolution的意思。depthwiseseparableconvolution可以参考MobileNet,下面贴出depthwiseseparableconvolution的示意图。Figure2(c)添加了一个Averagepooling并设置stride=2。另外,原来的Resnet***是一个Add操作,即元素值的相加,而在(c)中使用的是concat操作,即根据channelMerge,类似于googleNet的Inception操作。下图是depthwiseseparableconvolution的示意图。实际上,传统的卷积运算分为两步。假设是3*3的卷积,那么depthwiseseparableconvolution就是先用M个3*3的卷积核进行一对一的卷积。将输入的M个featuremap相乘而不求和产生M个结果,然后用N个1*1的卷积核对之前产生的M个结果进行正常卷积,求和,最终得到N个结果。详见另一篇博文:MobileNets-深度学习模型加速。表1是ShuffleNet的结构表。它与ResNet基本相同。也是分成几个stage(ResNet中有4个stage,这里只有3个),然后在每个stage中用ShuffleNetunit替换原来的residualblock。这就是ShuffleNet算法的核心。本表是在限制复杂度的情况下,通过改变组数(g)来改变输出通道数。更多的输出通道通常可以提取更多的特征。实验结果:表2为不同组数下不同大小的ShuffleNet的分类准确率比较。ShuffleNets*表示将ShuffleNet1*的过滤器数量增加s倍。arch2的意思是去掉原来网络结构中Stage3的两个uint,在保持复杂度的情况下拓宽每个featuremap。表2的一个重要结论是组数的线性增加并不会导致分类精度的线性增加。但是发现ShuffleNet对小型网络更有效,因为小型网络的通道数普遍较少。在计算资源有限的前提下,ShuffleNet可以使用更多的特征图。表3显示了频道洗牌的重要性。表4是几种流行分类网络的分类准确率比较。表5是ShuffleNet和MobileNet的对比,效果还不错。总结:ShuffleNet的核心是用pointwisegroupconvolution、channelshuffle和depthwiseseparableconvolution替换ResNetblock对应层,形成ShuffleNetuint,达到减少计算量,提高准确率的目的。Channelshuffle解决了多组卷积叠加的边界效应,pointwisegroupconvolution和depthwiseseparableconvolution主要是减少计算量。
