曾几何时,我们读着比尔·盖茨的传记,感叹他在大学时就能徒手编写操作系统的天赋,同时也唏嘘:现在编写一个操作系统,哪是几个人几台电脑能搞定的。乔布斯的车库创业,听起来虽比鸡汤还暖心,但那个时代毕竟已经过去。留下的,只有无数挣扎从C++/Delphi转型的资深程序员。
互联网崛起的时代,马化腾带着几个人就开发出了OICQ,造就了如今的腾讯帝国。智能手机爆发的时代,随便山寨一个游戏就能赚得钵满盆满,而现在,即使用心做了一个APP,想要推广也至少是百万级的费用。互联网(及移动互联网)的时代,也已经接近了尾声。草根创业将变得无比艰难。代表着互联网时代的JAVA程序员已经明显日落西山,而代表着移动互联网时代的Android/iOS程序员们,应该也感受到了就业的日趋严峻。
每一波浪潮的到来,都意味着一片无人占领的蓝海,也意味着众多新成长起来的巨头,还意味着什么?大量的人员需求,供不应求的开发市场,以及从业者的高薪与众多的机会。
我们常目送着上一次浪潮的余波远去,感叹自己生不逢时,却没有意识到,下一波浪潮已经悄然来临。没错,我们说的就是AI。吴恩达曾说过,在他看来,机器学习对我们世界的改变,可与电能的使用相媲美。而更多人开始用“第四次工业革命”来预言人工智能带来的产业革新。前三次工业革命,让人类摆脱了重体力劳动、精细体力劳动、简单计算劳动。而机器学习,很可能让人类不必在简单思考判断类劳动上消耗大量人力资源。
比如,目前仅在中国就有130万辆出租车、超过千万的载货车辆,也就是说,每天以“驾驶”作为主要职业的人群就达到千万量级。如果自动驾驶得以普及,至少在中国就有千万人被“释放”,需要重新学习一门技能。再比如安防领域,全国每天坐在各种监控屏幕前的人(即谍战/犯罪类电影里被抹脖子的职业)也接近百万。此外,还有诸如视频网站鉴黄师、专业翻译、起点网文筛选编辑、快递地址分拣员等职业,都在默默地消耗着无数人的时间和精力。而机器学习在砸掉这些饭碗的同时,也迫使人们投入到其他工作中,使社会分工结构悄然转型。
若再想得长远一些,这些技术对生活改变的远不仅仅是“以前用人的地方变成用机器”那么简单。比如自动驾驶这个领域,很多巨头公司投入了大量精力。很多人认为以后买车后开车就不用那么累了。然而如果所有车辆都变成了自动驾驶,我们真的还需要买一辆车吗?我们购买车辆时,其实买的是“随时随心快速出行的能力”,使我们不必受公交太挤、打车费劲、急事出门很麻烦、偏远地区去了回不来等困扰。而在自动驾驶情况下,司机交班、扎堆、偏远地方打不到车、网上叫车没人接单等情况都将不复存在。那么我们何必再每个人买一辆车忍受路上堵、停车难等困扰?也许到时候会变成大量的无人车辆在巨型停车场静静停放,只要有人下单几分钟后就会有一辆无人车辆来到你面前任你驱使。再进一步想在这样的情况汽车是否一定有必要设计成五座?也许根据实际运营数据的分析单人车辆、二人车辆会成为主流从而大大减轻交通流量压力缓解拥堵。而所有车辆的状况通过网络汇总到管控机构时拥堵也许也不再会成为一个问题所有的车辆都会自动规划路径将流量合理地分散到每一条道路上。如果还想得更远当智能驾驶足够可靠时现在的交通路口红绿灯机制是否还有必要?甚至说现在的一切交通规则是否会有一个巨大的改变?这仅仅是针对一项技术开出的脑洞而其他的技术将给我们带来什么恐怕现在没有人能说得清楚。
唯一可以想象的是我们不需要学习外语不需要考驾照的同时会需要更多的机器学习专家和相关开发人员。其实身处在IT圈中的人应该都有着直观的认识最近这两年谈论机器学习神经网络的人越来越多各种“人工智能”相关的消息也是铺天盖地大有“不入圈就淘汰”的汹汹势头。但与此同时各种不明觉厉的名词也吓退了很多非科班出身的开发者。什么叫卷积神经网络?什么叫凸优化?是否还要回去重读高数线代概率?那么多公式感觉完全看不懂啊?听说没个名校博士出身都搞不了这个?不光是普通程序猿这么说文艺的程序猿和……额高大上的程序猿也都这么说。我说呵呵。
在很久以前的一篇知乎回答中提过作为开发人员机器学习界在我看来会分成这么几个层次:
- 学术研究者:他们的工作是从理论上诠释机器学习的各个方面试图找出“这样设计模型/参数为什么效果更好”并且为其他从业者提供更优秀的模型甚至将理论研究向前推进一步。能够做到这一步的人可以说凤毛麟角天赋是绕不过去的大山机遇和努力也缺一不可。对于这些人其实也轮不到我们来建议在长期的研究中他们都有自己喜好的工具和方法甚至有一言不合就自己开发工具甚至开发语言的(比如LeCun)。
- 算法改进者:他们也许无法回答出“我的方法为什么work”也许没有Hinton LeCun那样足以载入史册的重大成果但是却能根据经验和一些奇思妙想将现有模型玩出更好的效果或者提出一些改进的模型。这些人通常都是各个机器学习巨头公司的中坚力量或者成长中的独角兽使用什么模型对他们来讲也不是问题根据所处的环境通常都有固定的几个选择。他们其实也并不怎么需要关心“我该用什么框架”重要的是什么框架能够快速地把想法实现出来。所以你会看到caffe和theano和mxnet和torch都一样有大批的用户仍然在贡献大量的新算法的实现。在这个层面insight和idea才是重要的东西各种工具的区别影响真的没那么大可能会让一个结果早得到或者晚得到几天或者几周却不可能影响“有没有成果”。
- 工业实现者:这些人基本上不会在算法领域涉入太深也就是了解一下各个算法的实现各个模型的结构。他们更多地是根据论文去复现优秀的成果或者使用其他人复现出来的成果并且试图去在工业上应用它。对于大部分IT人来说做到第三类也就是工业实现这个层面已经足够好了至少我们已经有了亲身参与这个大时代的机会仅就这一点来说便已经击败了全国99%的人(斜眼笑的表情)。那么想要成为一个机器学习开发人员究竟需要做些什么准备?到底如何才能从一个C++/JAVA/Android/iOS程序猿成为一个机器学习开发人员呢?答案只有一个:Just Do IT(去搞IT吧少年)作为程序员读十遍书不如跑一遍程序与其花费大量的时间去啃书本不如亲手完成自己的程序并运行它。我们在写出代码的同时就会了解到自己还有哪些地方不够清楚从而针对性地学习。
当然勿在浮沙筑高台(对这句话眼熟的请举手)有一些基础的知识还是需要掌握的。例如在计算机视觉领域根据我们团队内部培训的经验为了能够独立进行机器学习的开发工作最好首先完成这几项课程:入门了解概念算法基础:coursera机器学习课程-by吴恩达Machine Learning | Coursera进阶多层神经网络卷积和softmax回归:斯坦福机器学习课程UFLDLhttp://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial重点关注其中的softmax回归卷积和池化这几个章节进阶计算机视觉卷积神经网络的新进展实现和应用:斯坦福计算机视觉课程CS231n斯坦福CS231n-深度学习与计算机视觉 – 网易云课堂上面的课程大概会消耗你1到2个月的所有业余时间。但是相信我这是值得的。网络上的课程非常多也有很多优秀的免费课程但是作为入门我没有找到过比这三个更适合的。如果实在连一两个月的业余时间都拿不出来好吧我来偷偷告诉你最最最基本的一个要求满足了这个要求你就能够算是机器学习入门了:会算矩阵乘法别笑说正经的在这个框架高度封装的年代梯度不需要自己算损失不需要自己求反向传导更是被处理得妥妥的在不求甚解的情况下你甚至只需要知道这几个概念就可以开始着手写第一个程序了:它就是通过一系列矩阵运算(或者类似的一些其他运算)将输入空间映射到输出空间而已参与运算的矩阵的值称为权重是需要通过不断迭代来寻找到最优值当前的权重值离最优值还差多远用一个数值来表示这个值就叫损失计算这个值的函数叫损失函数当前的权重值应该调大还是调小这个值通过对损失函数求导来判断这个求导得到的函数叫做梯度通过损失和梯度来更新权重的方法叫做反向传导迭代的方法称为梯度下降虽然这么写出来的程序一定是不知其所以然但是其实20年前我第一次用C++写Hello world的时候也是一脸懵逼的我相信每个能够投身机器学习开发工作的程序猿都是有大毅力大勇气的自然不会欠缺继续学习的动力和决心。选择框架好吧接下来你需要找一个框架来作为第一个程序的开发环境目前机器学习的框架非常的多从面向的使用者这个维度去划分大体上分成这么两个阵营:学术友好型:Theano Torch Caffe学术研究时弄出来一个新模型新算法新函数是常有的事做出新的突破也是学术研究的最基本要求所以这些框架通常都可以方便地定制模型也可以深入修改内部实现很多新成果都会在发表论文的同时提供这些框架上的实现代码供参考性能方面也是比较出色而代价就是要么使用了困难(Caffe:C++)或者小众(Torch:Lua)的开发语言界面要么具有一些古怪的缺点(Theano:编译超级慢)而且这些框架似乎都没怎么考虑过“怎么提供服务”的问题想要部署到服务器上?Caffe已经是最简单的了然而仍然要经历漫长而痛苦的摸索历程工业友好型:Tensorflow MXnet Caffe工业上往往更注重“把一个东西做出来并且让它运行得良好”所以这些框架首先就需要支持并行训练其中Tensorflow和MXnet支持多机多卡、单机多卡多机单卡并行Caffe支持单机多卡虽然性能并不是特别理想在我们的测试中Tensorflow的双卡并行只能达到单卡的1.5倍左右性能卡越多这个比例越低Caffe要好一些但是参数同步和梯度计算无论如何也都需要时间所以没有哪个框架能没有性能损失地实现扩展而多机的情况下性能损失更大很多时候都让人感到无法接受(这方面的优化只能以后有机会再提如果有这方面的同好欢迎讨论)相对来说Tensorflow提供了比较好的部署机制(Serving)并且有直接部署到移动端的方案而MXnet和Caffe则是直接编译的方式虽然也可以实现但是说实话还是很麻烦至于缺点就是除了Caffe之外其他两种框架对于学术界的动态跟踪得都不太紧Tensorflow到现在都没有pRelu的官方实现在前阵子也才刚刚推出了一系列检测(Detection)的模型MXnet这一点要积极些可是受限于较小的开发者社区很多成果都只能等待大神们的contribution或者自行实现这样看来难道最好的框架是Caffe?兼顾学术和实现灵活性和性能兼备……我得说我的确是这么认为的当然有一个前提得懂C++【捂脸】如果不是C++开发人员出身这门语言也不比机器学习容易多少对于大多数有志于投身于机器学习开发(而不是研究)的同学们来说我推荐首选Tensorflow作为你的第一个开发框架除了上述的优点之外最主要的因素是它人气高在遇到任何问题的时候你都会找到一群志同道合的伙伴们去咨询或者一起研究这对于初学者而言重要