【51CTO.com原创稿件】序言:说点历史
十年前,当我在学校跟着老板苦哈哈地做图像识别的时候,我想不到十年后的今天机器学习技术有了如此长足的发展,而AI的概念也由之深入人心。冈萨雷斯的图像处理,是我们曾经挑灯夜读的经典;OpenCV和C++或MATLAB是我们仅有的工具;后来我们又有了Libsvm&Liblinear;但即便在刚毕业工作的时候,想要实现一个稍复杂的算法也要遍查论文和各种博客。再后来,我们有了Github,这一技术人的军火库;我们用起了Python,毕竟人生苦短;我们也开始有了Sklearn,算法人的工具箱内趁手的工具越发多了起来。
当深度学习发展起来以后,相似的一幕又一次上演,最早自己写反向传导,测试的时候战战兢兢,深怕哪里写错一点功亏一篑。到后来,有了Caffe、有了Theano、有了TensorFlow、有了mxnet、有了上层封装的keras,也有了越来越多的model zoo。后来的事,大家都知道了,在这些炙手可热的平台上,研究人员和工业界从大量的重复体力劳动中解放出来,得以将自身智慧更多地投入到更具创造性的研究与业务中去,并做出了很多非常棒的结果。
回首这十年,人工智能可以说经历了从刀耕火种时代到第二次工业革命这样的巨变,而我们也正站在新的黎明之前。
一、 PaddlePaddle是什么
我们说了很多历史,也提到了一些舞台上正兴的机器学习平台,而这篇文字,是想介绍一下一个新的选择:来自百度的PaddlePaddle。Paddle(Parallel Distributed Deep Learning,并行分布式深度学习)。PaddlePaddle的原意是“用浆划动”,其Logo也是两个划船的小人,莫名萌出一脸血……
书归正传,从2016年9月27日发布至今,PaddlePaddle也有一年多的时间了,而其前身是百度于2013年自主研发的深度学习平台,且一直为百度内部工程师研发使用。可以认为是一个类似google、facebook等工业优而开源的又一个典范。
这里不妨先从全局看一批数据。一般开源项目的热度指标从Github可以略见一斑,PaddlePaddle的数据是这样的(截止17.12.22):
-star(可以认为是技术人的点赞)有6099人;
-forks(想自己基于此做修改)有1599人;
-commits(代码更新次数)有10073,也就每天更新几十次吧;
-以及90个contributors(代码贡献者)。
这样的受关注程度,和更新的频次,即使和现在如日中天的TensorFlow比,虽说整体热度仍有差距,但PaddlePaddle也处于迅猛的上升期中。除了Github直接的用脚投票,在知乎等平台上,PaddlePaddle也引起了热烈的讨论,包括架构层面和应用层面:
Caffe的设计者贾扬清,评价说“很高质量的GPU代码”、“非常好的RNN设计”、“设计很干净,没有太多的abstraction,这一点比TensorFlow好很多”、“总之是一个非常solid的框架,百度的开发功底还是不错的”,这可以算是技术人之间的惺惺相惜了吧。
CPU/GPU的单机和分布式的模式也是开发者们关注的点,毕竟得益于原来parameter server的工作,而TensorFlow不能对多机CPU有很好的支持。以及速度快,显存占用小等特性,这些在github的benchmark跑分中提到的优势,也被开发者们着力关注到了。
框架和功能的细节,我会在第二节挑一些感兴趣的点,仔细剖析一下。应用层面,是作为使用者最为关心的,有哪些实际的业务中,用到了PaddlePaddle,用得如何,我们将在第四节揭晓。功能和优点提到了不少,但是现实是PaddlePaddle确实还有更广大的开发者群体需要触达,才能发挥更大的影响力和作用。
所以在第三节我也打算聊聊PaddlePaddle的劣势,以及在第五节探讨一下这个优秀工具的发展路径。
二、PaddlePaddle探秘
每一个成功的开源项目,文档和教程都必不可少,而且很大程度上是项目易用性的保证、是深度钻研的辅助,更为项目的成功增色。PaddlePaddle当然也是这样,它有自己一套较为详实的辅助材料:http://www.paddlepaddle.org/
单从文档形态的角度,相较于TensorFlow和keras的中文文档基本是爱好者翻译而成,PaddlePaddle的文档来自于百度一线的工程师,多少会觉得亲切和信赖稍多一些不?至于文档的内容,从全面性的角度出发,一般都很庞杂,所以,我想抽取其中比较感兴趣的几个点,做一下介绍:
-Docker
如果说docker是什么,搞纯算法的人一般不太接触的话,那提到virtualenv、anaconda或者winpython,应该很多人都有所耳闻,或者自己就确实在用。无论是在Linux下,还是在Windows下,科研工具的迭代一日千里(真的比游戏什么的更新快多了),带来的问题就是,版本间的依赖问题、配置问题,以及由此带来的安装和使用的方便性问题。尤记得,Github上的opencv安装脚本,都有大量的star。我自己在6、7年前也被scipy和numpy之流摆了一道。
数据和算法科学家本着应该把时间花在更有价值的研究和业务任务上来的目的,类似虚拟化发布地使用,进一步方便了大家,和虚拟机不同的是用docker的方式,性能和直接安装在本机是一样的。paddle的官网上是这么写得:
“为了开发PaddlePaddle,我们需要:
A.一台电脑,可以装的是 Linux, BSD, Windows 或者 MacOS 操作系统,以及
B.Docker。不需要依赖其他任何软件了。即便是 Python 和 GCC 都不需要,因为我们会把所有编译工具都安装进一个 Docker image 里。”
简单来说就是:
1、下载CPU或GPU版本的镜像:
比如CPU版本的就是docker pull docker.paddlepaddle.org/paddle
2、编写适用于Paddle的程序:
可以参考https://github.com/PaddlePaddle/book
顺便说一句,这本书也可以以docker方式安装,并且支持Jupyter Notebook方式运行。
3、运行(假设/home/work/train.py为第二步完成的程序):
cd /home/work
docker run -it -v $PWD:/work paddlepaddle/paddle /work/train.py
进入docker以交互的方式执行和调试代码也是可接受的。
-感兴趣的业务
如TensorFlow和keras,都有自己的example模块,主要功能有二:
- 提供一个demo的作用,对主要框架模块的使用进行演示;
- 解决一些实际的问题,方便部分用户直接使用。
比如,针对文本分类的任务,keras对于imdb数据的情感识别,提供了CNN、LSTM、CNN_LSTM、fastText等多种方案,不仅对不用的网络模型和组合的使用做了演示,稍微改一改其实就可以用到实际的业务中去。以及图像方面keras下minst手写数字识别对应的相关任务demo代码就更多啦。
PaddlePaddle自然也有类似的模块,体现在两块:
1.前文提到的PaddlePaddle – Book
它提供了从linear regression到mnist手写数字识别;从基于cnn的图像分类到NLP领域的word2vec实现(做nlp的同学肯定记得分布式表述相较于onehot表述的优势,以及king-queen=man-woman的例子);以及“个性化推荐”、“情感分析”、“语义角色标注”、“机器翻译”等典型应用。
不得不说,作为一个算法或机器学习的初学者,且不论使用何种平台开始自己今后的学习和研究,这个book里对业务场景的描述、对算法背景和流程的介绍、以及提供的数据集,都是非常值得看一看得。
一个更方便阅读的网址在:
http://www.paddlepaddle.org/docs/develop/book/index.cn.html
能相信么,还自带视频课堂,确实诚意满满了:
http://bit.baidu.com/Course/datalist/column/117.html
2.模型库http://www.paddlepaddle.org/docs/develop/models/README.cn.html
如果说前面还是入门级的教程,那么这里的模型库其实担纲的角色是解决(很大程度上)工业级的实际问题,这也是我特别关注的。
总共有14个类目:
词向量、RNN语言模型、CTR预估、文本分类、LTR、结构化语义模型、NER、序列到序列学习、阅读理解、自动问答、图像分类、目标检测、OCR、ASR。
- NLP :词向量、RNN语言模型、文本分类、结构化语义模型、NER、序列到序列学习、阅读理解、自动问答
- 图像:图像分类、目标检测、OCR
- 语音:ASR
- 商业:CTR预估、LTR
看出来了么?从搜索技术发展起来而集技术大成的百度,对NLP的研究确实是非常深入的。而随着业务线的扩充,图像和语音的业务也有了长足的发展(比如语音搜索、以图搜图、所投资得作业帮的OCR等),至于ctr预估是其广告业务的核心,LTR也是网页搜索等的技术命脉。
当然,需要说明的是,上面的分类不是完全严谨,比如序列到序列学习其实也可以用到ASR中嘛,毕竟语音和文本都大致是二维的信息流,所有其实是有想通的地方所在。
既然如此,限于篇幅,我想在这篇小文中只关注那些最重要的信息,所谓最重要,就是说百度有***的投入、***的产出和产品化的那些业务,亦即:
LTR、CTR预估、序列到序列学习的古诗生成、以及DeepSpeech等。这样一些信息,可以说只此一家,别无分店,值得我们好好研究下。
1、LTR
http://www.paddlepaddle.org/docs/develop/models/ltr/README.html
一个简单的例子,当用户搜索“刘德华”这个query的时候,他想看到的是作为演员的刘德华、是作为歌手的他、还是有八卦新闻的他、亦或是他的图片?每个人的需求是不一样的,单纯的规则系统,很难满足大部分人的需求。且不要说,这还是热门query呢,如果碰到那些冷门query,本来能搜到(召回)的结果就不多,用规则的方式根本无法覆盖到千万用户的额需求(准确)。所以LTR就是为了解决这样的问题应运而生。以及,在推荐和广告的排序系统中,LTR都发挥了举足轻重的作用。
文中也提到了pointwise、pairwise、listwise等几种不同的方式,当然没有提到得是,pointwise的标注较困难,常用有五档打分的方式,但是复用性较好;而pairwise的方式标注则容易很多。以及,标注的效果等也需要有很多手段来控制。再以及,用户的点击,也是另外一种形式的(弱)标注。这些都是很重要的学问。
总的来说,PaddlePaddle在这里给出了pairwise的ranknet以及listwise的lambdarank的具体实现,有代码、有数据集,可以看到效果,甚至于自己的数据按格式规整,也可以原封不动的使用现成的模型。这么说来,LTR其实也不是大厂专属了啊,现在做垂直行业的搜索、推荐的团队那么多,在和规则搏斗的同时,确实也可以试试这个LTR的方案,把人力解放出来,并迎接更好的效果。
2、CTR预估
http://www.paddlepaddle.org/docs/develop/models/ctr/README.cn.html
CTR是click-through rate的简写,CTR预估就是点击率预估,是百度技术的另一大核心。场景是这样的:无论百度、腾讯、阿里、头条等本质上都是一个广告公司(腾讯游戏除外)。通过分析用户的行为,展示出能满足用户需求的信息,就是广告的本质,也就是CTR预估的目的所在。
即优化用户的点击率是这些公司的目标,因为只有用户点击了广告,才说明广告信息是和用户需求相匹配的;也只有用户点击了广告,公司才能有收益。且不说广告行业涉及的专业知识和技术非常之广,仅算法相关就包括搜索、排序、反作弊、用户画像、NLP等等,而其中的明珠就是CTR预估。
最早的CTR预估是基于logistic regression的,把所有特征通过分段、组合得到高维的稀疏特征,然后用LR并行化的求解,得到CTR的预估。而特征工程的团队当时在百度应该就有几十人。
LR的优势在于,可解释性、容易并行化等,文中也提到了,DNN后来逐步从解决某些模块的预测,到不断发挥更大作用的阶段。
这里的代码展示了wide&deep learning model的实现,融合了适用于学习特征的DNN和适用于大规模稀疏特征的LR两者的优点。仍然,有数据可以用来做实验,也可以按格式准备数据服务于自己的业务.
3、古诗生成
http://www.paddlepaddle.org/docs/develop/models/generate_chinese_poetry/README.html
这个是挺好玩的一件事,最早是百度内部hackathon的一个项目,所谓的看图写诗,在手机百度上似乎有过产品化。是一个比AlphaGo更早的AI项目展示。结合了图像识别对图像信息的提取,和nlp技术对古诗的建模和生成。
不知道当时有没有使用lstm的方案,但是现在用lstm来做这件事已经非常成熟了。外国有同行按耐不住看不到《冰与火之歌》的寂寞,用这个方案生成了***的一卷故事,我们炎黄子孙,也可以来试试古诗的生成,等闲唬一唬人还是完全可以的。
4、DeepSpeech
https://github.com/PaddlePaddle/DeepSpeech
在DeepSpeech系列论文出来的时候,还是让做语音的同事们比较激动的。做语音识别或者叫ASR,是一个门槛比较高的事,大量的语料要收集、大规模的机器要用来训练、非常专业的人才才能做这件事,小作坊还是比较难的。http://proceedings.mlr.press/v48/amodei16.pdf对整体的架构和效果有了比较好的论述。
我们搞算法特别是深度学习的,都知道一个词叫炼丹,而一个好的架构和方法往往来自于大公司,也是有上面提到的这些原因的。得窥论文奥秘,并且能看到具体的实现,还是让人很高兴的一件事呀。
- 命令行的方式
http://www.paddlepaddle.org/docs/develop/documentation/zh/howto/usage/cmd_parameter/index_cn.html
可以看到得是,提供了非常多且灵活的命令行控制参数:细致到线程数、机器数、GPU还是CPU模式、轮数、是否批处理、集束搜索的方式、异步还是同步、参数稀疏性的检查、随机数的方式等等。
当然,直接使用默认的方式也很方便,不过既然有了这么多个性化的选项,其实一个有经验的开发者可以做得定制也就很多了,这也越发让我觉得paddle是一个面向工业界实际应用的平台,既能满足新手的使用,在新手向老手的转变过程中,也能提供更多的选择。
-分布式训练
http://www.paddlepaddle.org/docs/develop/documentation/zh/howto/usage/cluster/cluster_train_cn.html
Fabric集群、OpenMPI集群、Kubernetes单机和分布式、AWS上的分布式。
前面很多的讨论都是基于单机的版本,个人爱好者或者小公司解决实际问题的需要,如何使用PaddlePaddle来满足业务需要。当数据变多,或者公司业务变大,到单机无法处理得时候怎么办?
我们都知道数据量大了以后,算法有数据并行和模型并行之分,hadoop比较善于解决的是能数据并行的问题,而一旦涉及到了模型并行的问题,怎么解决数据的调度、死节点的控制、迭代的速度等等问题就一拥而上了。作为一个还主要在算法而非架构层面研究的人,我们大都希望,框架能解决我们的问题。
好了,PaddlePaddle作为一个框架,解决了这些问题,实验也表明了它的有效性。不要多问,拿去用就好啦:)
作为一个大的框架,PaddlePaddle其实有很多值得深入了解的地方,这里只抽其中我比较感兴趣的几点加以介绍,剩下的留给感兴趣的你吧。
三、PaddlePaddle的劣势
PaddlePaddle相关的功能很多,我们在***节看到了从大牛到开发者的推荐;在第二节也一起看了一下它与众不同的能力。但是现实是,PaddlePaddle的使用范围和氛围都还有很大的提升空间。仔细思考一下其中的缘由,也不难理解:
1、PaddlePaddle和TensorFlow有相近的功能但出现迟
通过对比,我们可以看到在基本的图像识别、文本分类等业务上,TensorFlow已经可以较好的完成任务了,虽说从benchmark的比较来看,PaddlePaddle能以更小的显存和更快的速度完成任务,但是TensorFlow的先发优势对于用户的获取还是至关重要的,毕竟我们很多是用人生苦短而又不差钱的机器学习研究者嘛:),学习和迁移成本是使用PaddlePaddle的较大成本(虽然学习成本一点也不高),而机器成本在较小的业务下也可以当做不存在;
2、社区环境和氛围的不足
即使在一个公司内的开发人员,也讲求大家要使用相近的技术栈,否则互相沟通得成本较大,而从全局来看,一个较好的社区环境也会不断贡献架构开发者、应用开发者和业务使用者,短短一年多的时间还是没有建立其一个很好的机制来发展这个社区。
3、重技术而轻产品
我们一直说百度技术做得***,腾讯产品***,阿里的运营不错。做技术的人比较单纯,大多深信“酒香不怕巷子深”。但是既然是开源项目,那就不只是自己用就得了,如果想要让更多的人来使用它,结合前面是说得1、2两点,既然外部环境不利,那***自己能把产品做到更方便、更易用,这样才能改变逆势。不得不说,如第二节所述,随着paddle的文档和模型的补全,随着一些竞赛的组织,它开始有自己的特色和环境的改善。
四、实际业务的使用
上面说了很多务虚的,那么这节就来说说PaddlePaddle在实际业务中的使用:
1、大搜、凤巢和IDL的使用
PaddlePaddle的前身是百度于2013年自主研发的深度学习平台,且一直为百度内部工程师研发使用。全球各大科技巨头开源的深度学习平台都***各自技术特点,对于百度,由于其自身在搜索、图像识别、语音语义识别理解、情感分析、机器翻译、用户画像推荐等多领域的业务和技术方向,PaddlePaddle则表现更加全面,是一个相对全功能的深度学习框架。
2016年,PaddlePaddle已在百度30多项主要产品和服务之中发挥着巨大的作用,如外卖的预估出餐时间、预判网盘故障时间点、精准推荐用户所需信息、海量图像识别分类、字符识别(OCR)、病毒和垃圾信息检测、机器翻译和自动驾驶等领域。以外卖行业为例,外卖员等待商家出餐的时间耗时严重,百度将不同时段商家的客流量、菜品的制作时间和订单量等数据交给了PaddlePaddle,经过对海量数据的深度学习处理,百度外卖的内部系统可以预估每个商家菜品出餐时间,及时告知外卖员,提高了送餐效率,系统也可以更加合理地规划取餐和送餐的路线。
2、个人开发者
案例链接:https://zhuanlan.zhihu.com/p/29177825
“AI桃子选美机”,好吧,这个名字的画面感太强了。但是,从另一方面也说明,这个平台的易用性。以前的机器学习可以用一句话解释为“养在深闺人未识”,现在的趋势则是,进入门槛的不断降低,越来越多的人可以很方便的使用开源的工具,结合自己的业务支持,很方便和高效的完成实际的任务。我是很期待其他新的产品的,毕竟,我最常说得一句话是“机器学习的生命力在于和业务结合”。
五、展望
写到这里,又回想起差不多十年前,我调OpenCV的那些个晚上。哦,现在多方便啊,我可以把我的精力更多的专注于算法、产品与管理;我可以投入更多的时间去看新的论文、了解新的业务、尝试新的体验。
从小的方面来说,算法和平台的迭代和发展,让我作为一个算法开发和管理者,能够更高效的工作,有了更充裕的时间来满足个人的好奇心和追求。从大的方面来说,算法、平台和业务的迭代和发展,也带给了我们每个人一个不一样的世界。
愿机器学习走入寻常百姓家,让我们的工作和生活越来越好。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】