“古典程序员”集体恐慌
随着2007年第一台iPhone问世,随后Android的猛烈跟进,苹果和谷歌推动了长达10年的移动互联网浪潮。在此期间,移动端开发工程师可谓是风生水起,几乎人们日常生活中接触互联网90%的途径,都是通过一个叫App的东西,基于iOS/Android这两大系统平台。
然而好日子似乎也快到头了,随着行业巨头的逐步垄断,小App生存空间日渐萎缩,App排名靠前的几乎都是几家巨头的产品,市场上对移动端开发人员的需求也在下降。同时由于近些年学校里面学生也学,外面培训机构也教,开发人员的供给还在上升,大家似乎感受到了一丝丝凉意。
近两年,人工智能的浪潮汹涌而来,“古典”程序员们更是集体陷入了恐慌,不会点深度学习,是不是过两年就找不到工作了。
今天的AI就像十年前的Android/iOS一样,一夜之间需求暴涨,人才短缺。市面上的培训课程层出不穷,各种《21天学会深度学习》,《手把手教你神经网络》之类的课程,动辄几千,多者上万,跟当年的Android/iOS真的很像。
人工智能可没换一种编程语言那么简单
当然了,作为一个“科班出身”的AI从业人员,我想说还是有点不一样的。Android/iOS更多的是语言上的不同,或者界面交互方式的创新,本质上的思想和逻辑跟之前的VC/塞班也都一样。
而狭义的人工智能应用,在思考问题的方式上是完全不同的,大家考虑的更多的是模型、数据,跟数据结构课里面学的排序/查找也不是一个概念。各种数学概念搞得人晕头转向,可以说,对于普通程序员来说,AI的学习曲线是非常陡峭的。
以Facial Landmark Detection(人脸特征点定位)为例,输入很多标注了特征点的人脸图片,经过一个应用程序很久的运算,保存一个模型文件。然后用另一个应用程序,输入一张人脸图片,就能把特征点给自动标注出来,这个过程无论从数学的角度还是从编程的角度来看,都极其复杂,以后的文章里我会试图解释。
模型只是很小一部分
大多数人工智能的教程里面,主要讲的内容我都可以归纳为模型和算法,你经常看到的各种术语,比如决策树、支持向量机、逻辑回归、神经网络,到后来的CNN,RNN,LSTM,GAN等,都是模型。在学术圈模型和算法基本上就是全部,这也是对于普通程序员来说,最难以理解的部分,就像前面提到的Facial Landmark Detection的例子。
对于工业界来说模型和算法只是一部分,甚至可能是一小部分。
大家的模型可能差不多
在深度学习流行之前,学术界解决问题很多都是靠特征设计,这里面会有很多的技巧(trick),很多时候一篇论文的效果好不好,主要不是取决于那几个数学公式,而是代码里面的trick。所以那个时候除非是SVM这种通用的算法框架,很少有人公布自己的代码。
而深度学习流行之后,似乎大家不那么吝惜自己的代码了,很多人都选择了开源。带来的结果是,每年一批论文和对应的代码发布之后,任何一个人下载一套代码,就能达到State-of-Art。这对研究人员来说是非常残酷的,可能你辛辛苦苦研究一年刚刚超过去年的水平,人家一公布,你又落后所有人了。
而世界上真正有能力设计网络的人并不多,而且训练网络的代价非常的大,大部分AI工作者的主要工作还是在公认的比较好的基础上,进行小修小补,甚至都不做修改,只是优化优化数据。这就导致了,大部分人的模型都差不多,你折腾半天,可能没比别人强多少。当然我这里不包括那些顶尖的选手,顶尖的AI人才,也不是我们普通程序员的目标,看看他们的简历你就知道我为什么这么说了,而且这样的人一个公司也不需要几个,太贵。。。
开源的那套东西没法直接用
既然开源的东西那么多,为什么AI应用仍然有很高的门槛呢。因为开源的东西通常是没法直接用的,原因总结有两个:
- 多数开源代码是无法直接在移动端运行的,Tensorflow Lite是一个强大的存在,一定要紧密关注。
- 移动端的运算能力较弱,而且不同硬件和平台有很多适配问题,这对于一个应用是否能够大规模应用是决定性的。
先推理(Inference)再学习(Training)
什么是Training和Inference
几乎所有机器学习的任务都可以抽象成一件事情,设计一个方程y=f(x),通过Training得到函数f的所有参数。然后再输入一个新的x,得到输出y,这个叫Inference。
我试图用一种最粗糙的方法解释一下这两个过程。
先说Inference,比如我有函数Y=f(X)=aX*X+bX+c。假设a=b=c=1,如果现在有一个输入x=1,那么输出y=3,这就是一次Inference。
再说Training,如果我知道输入x=1的时候,y=10,那说明a=b=c=1肯定是错的,利用优化算法,改变a,b,c的值,使得输出y更接近1一些。那么现在有很多的x和对应的y,要找到一组a,b,c,使得总体的错误最小,这就是Training。
你可能暂时不用理解Training
好消息是,真正的人工智能应用中,你只需要使用Inference,也就是f(x)是已知的,是由其他大牛在计算能力很强的一台机器或者一个集群上,训练了几个小时甚至几天得到的。应用在运行的时候,要做的只是把输入送到方程里,得到输出。
掌握了Inference,Training也不会很难
还是负责任的补充一下,这里讲的是突围,强调效率,先推理再学习不是说学习不重要,Training仍然是人工智能的核心。前面的例子也大体描述了Training的过程,其实Training就是根据Inference结果的错误,不断优化参数,然后再Inference,反复迭代的过程。所以掌握好了Inference,也是为掌握Training打基础。
客户端的机会就在于Inference的优化和部署
现在主流的Training和Inference主要都在服务端
Training不用说,需要大量的计算资源和存储,而且通常离线完成,现在基本上都是在服务端上完成。
主流的Inference,比如大家常用到的商品识别(淘宝客户端的拍立淘)、语音识别(天猫精灵)等,核心的运算也都在服务端,因为算法模型巨大,客户端内存可能都放不下,速度也达不到。
边缘计算(Edge Computing)的兴起
近年边缘计算这个词开始兴起,而近几天Google发布的Edge TPU把这件事情推到了极致。所谓边缘,就是在云的边缘,或者外面。要解决的问题有以下两点:
- 云端计算资源贵
- 网络传输实时性和稳定性问题
大家考虑的解决问题的方法主要是:
- 把一些对计算要求不是特别高的运算放到边缘设备上
- 对算法本身进行优化和简化
- 提升边缘设备的运算能力
这里的边缘设备是一个抽象的概念,包含但不限于:
- 手机
- 带有处理芯片的摄像头
- 架设在本地的小型服务器
从计算资源成本来说,手机最极致,你自己花钱买的,不管算什么都不会耗费服务器的资源,架设在本地的摄像头或者服务器通常也是客户一次性花费,不会带来后续的负担。
从网络角度来说,实时性取决于算法本身运行的速度,如果太慢,可能还不如上传,但稳定性一定更优。
从业态来说,新零售兴起的今天,像盒马鲜生这样的领军队伍,也是边缘计算的先行者。
“抖音”——“部署”和“优化”极致典范
抖音大家都知道,他的美颜/长腿/手势识别等技术大大提升了生产力,为社会低成本地创造了无数的大长腿大眼网红。
从AI工作者的角度来看,抖音是把端上人工智能应用的部署和优化发挥到了极致。还以Facial Landmark Detection为例,抖音的美颜能够做那么好,人脸特征点的定位功不可没。目前主流的算法基本都是基于CNN的,运算量极大,而且各种磨皮/瘦脸的图像处理,也非常复杂。这里商汤科技可能结合了多种优化技术,才能达到如此快的效果。CPU的Neon优化和GPU优化应该都有应用。
此外,抖音这种亿级用户的产品,一定会覆盖非常多的手机机型,如此复杂的算法,能够在这么多不同的手机上运行,这也是一件很不容易的事情。
我再不怀好意地猜测一下,抖音上的人脸,除了用来定位,有可能还会被用来做人脸识别/聚类的训练数据,这里就涉及到了边缘和云之间的协同工作。
而上面说的这些事情,都是当今移动端开发者的机会。
突围之路
基本功
如果是视觉方面,就是图像处理,语音方面就是音频处理。以视觉为例,现在深度学习基本输入都是原始像素,也不用做复杂的特征提取,所以这一块要求不是太高。当然随着应用的深入,很多东西还是慢慢要学。
动手把流行的算法移植到手机上
这件事情可能是最重要的,就是动手,动手,动手。很多人学习深度学习,就是先把Tensorflow在自己的机器上安装一遍,然后把Tutorial里面的几个例子跑一跑,就完事了。加起来也没几行python代码,其实你什么也没学会,就是照书敲代码。
我说的动手,还是针对Inference,建议先从Tensorflow Lite开始,一步步把训练好的模型通过量化处理变成简化的模型,然后在Android或者iOS上调用API,做一个App。
Tensorflow官方有开源的sample,是1000类的图像分类,可以在这个基础上改模型,改代码,逐步尝试。比如把1000类变成狗的品种识别,或者实现一个手写数字识别,再复杂一点,做一个人脸检测。后面会专门写一些教程,把不同算法移植到手机上。
紧密关注Tensorflow Lite的发展
Google发布Tensorflow之后,生态日渐完善,开发社区非常活跃,远远把Caffe甩在了身后。随后发布的TPU,专门针对Tensorflow优化的AI芯片,提供了Cloud服务,Tensorflow Lite也是对移动平台支持最好的Inference框架,近日推出的Edge TPU,同样完美支持Tensorflow Lite,大有一统江湖之势。所以一定要关注Tensorflow的发展。
作为移动端开发人员,Tensorflow Lite是重中之重。目前来看,Tensorflow Lite的优化还主要限于CPU,之后还会有什么发展也是关注重点。Tensorflow Lite的代码量也不是太大,有时间阅读源代码,甚至进行一些优化,都是非常有价值的事情。
学习性能优化的方法
前面提到了,性能优化是客户端智能的重中之重,可以着重学习一下技术:
- C++性能优化
- Neon/SSE指令集优化
- GPU优化
这些技术难度都不低,而且通常跟应用场景本身相关,不容易有通用解决方案,在实际应用中可能会成为核心突破点。
除了手机,玩玩别的设备
边缘计算不只包含手机,手机重界面和交互,有很多AI应用其实是不强调界面和交互的,比如安防领域,试试更多的设备,会拓展更多的可能性。比如Nvidia的TX2,Raspberry PI,以及即将上市的Edge TPU。
有时间多看看书
前面几乎没有提到看书,不是看书不重要,而是只看书不动手是没有效果的。在实践中,不明白的地方一定需要网上查或者翻看资料。在这个基础上,系统的学习理论知识,也是很有必要的。理想情况下,我认为可以重点关注一下几点:
- 主流深度神经网络的架构,设计的思想,理解不同层到底在干什么,对应的代码在哪
- 人工智能发展的历程,怎么一步步发展到深度学习的
- 曾经流行的一些经典算法,很多思想其实在深度学习中都有应用
多一种思路,更广阔的天地
最后,我想说很多人的焦虑其实大可不必,人工智能一定是未来,但人工智能不可能是全部,术业有专攻,你在自己的领域如果足够强,是很难被取代的。
但是人工智能提供了一种新的思路,就是通过数据和模型,能够把一些以前需要人来判断的事情变成自动的。最重要的就是,以前需要你定义好的if else规则,现在是一个动态可学习的东西,这本身不就是一件很妙的事情吗?
多一门知识,多一种思路,我相信会给每个人带来更广阔的天地,加油!