序言:說點歷史
十年前,當我在學校跟著老闆苦哈哈地做影象識別的時候,我想不到十年後的今天機器學習技術有了如此長足的發展,而AI的概念也由之深入人心。岡薩雷斯的影象處理,是我們曾經挑燈夜讀的經典;opencv和C++或matlab是我們僅有的工具;後來我們又有了libsvm&liblinear;但即便在剛畢業工作的時候,想要實現一個稍複雜的演算法也要遍查論文和各種部落格。再後來,我們有了github,這一技術人的軍火庫;我們用起了python,畢竟人生苦短;我們也開始有了sklearn,演算法人的工具箱內趁手的工具越發多了起來。
當深度學習發展起來以後,相似的一幕又一次上演,最早自己寫反向傳導,測試的時候戰戰兢兢,深怕哪裡寫錯一點功虧一簣。到後來,有了caffe、有了theano、有了TensorFlow、有了mxnet、有了上層封裝的keras,也有了越來越多的model zoo。後來的事,大家都知道了,在這些炙手可熱的平臺上,研究人員和工業界從大量的重複體力勞動中解放出來,得以將自身智慧更多地投入到更具創造性的研究與業務中去,並做出了很多非常棒的結果。
回首這十年,人工智慧可以說經歷了從刀耕火種時代到第二次工業革命這樣的鉅變,而我們也正站在新的黎明之前。
一、 PaddlePaddle是什麼
我們說了很多歷史,也提到了一些舞臺上正興的機器學習平臺,而這篇文字,是想介紹一下一個新的選擇:來自百度的paddlepaddle。Paddle(Parallel Distributed Deep Learning,並行分散式深度學習)。paddle的原意是“用漿划動”,其logo也是兩個划船的小人,莫名萌出一臉血……
書歸正傳,從2016年9月27日釋出至今,PaddlePaddle也有一年多的時間了,而其前身是百度於2013年自主研發的深度學習平臺,且一直為百度內部工程師研發使用。可以認為是一個類似google、facebook等工業優而開源的又一個典範。
這裡不妨先從全域性看一批資料。一般開源專案的熱度指標從github可以略見一斑,paddle的資料是這樣的(截止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確實還有更廣大的開發者群體需要觸達,才能發揮更大的影響力和作用。
所以在第三節我也打算聊聊paddle的劣勢,以及在第五節探討一下這個優秀工具的發展路徑。
二、 PaddlePaddle探祕
每一個成功的開源專案,文件和教程都必不可少,而且很大程度上是專案易用性的保證、是深度鑽研的輔助,更為專案的成功增色。PaddlePaddle當然也是這樣,它有自己一套較為詳實的輔助材料:http://www.paddlepaddle.org/
單從文件形態的角度,相較於TensorFlow和keras的中文文件基本是愛好者翻譯而成,paddle的文件來自於百度一線的工程師,多少會覺得親切和信賴稍多一些不?至於文件的內容,從全面性的角度出發,一般都很龐雜,所以,我想抽取其中比較感興趣的幾個點,做一下介紹:
① 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模組,主要功能有二:
1、提供一個demo的作用,對主要框架模組的使用進行演示;
2、解決一些實際的問題,方便部分使用者直接使用。
比如,針對文字分類的任務,keras對於imdb資料的情感識別,提供了cnn、lstm、cnn_lstm、fasttext等多種方案,不僅對不用的網路模型和組合的使用做了演示,稍微改一改其實就可以用到實際的業務中去。以及影象方面keras下minst手寫數字識別對應的相關任務demo程式碼就更多啦。
paddle自然也有類似的模組,體現在兩塊:
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。
這些類目,做一下劃分有如下幾大類:
1、NLP :詞向量、RNN語言模型、文字分類、結構化語義模型、NER、序列到序列學習、閱讀理解、自動問答
2、影象:影象分類、目標檢測、OCR
3、 語音:ASR
4、 商業:ctr預估、LTR
看出來了麼?從搜尋技術發展起來而集技術大成的百度,對NLP的研究確實是非常深入的。而隨著業務線的擴充,影象和語音的業務也有了長足的發展(比如語音搜尋、以圖搜圖、所投資得作業幫的OCR等),至於ctr預估是其廣告業務的核心,LTR也是網頁搜尋等的技術命脈。
當然,需要說明的是,上面的分類不是完全嚴謹,比如序列到序列學習其實也可以用到ASR中嘛,畢竟語音和文字都大致是二維的資訊流,所有其實是有想通的地方所在。
既然如此,限於篇幅,我想在這篇小文中只關注那些最重要的資訊,所謂最重要,就是說百度有最大的投入、最好的產出和產品化的那些業務,亦即:
LTR、ctr預估、序列到序列學習的古詩生成、以及deepspeech等。這樣一些資訊,可以說只此一家,別無分店,值得我們好好研究下。
1、LTR
http://www.paddlepaddle.org/docs/develop/models/ltr/README.html
所謂LTR,就是learning to rank,基於點選資料等的排序學習,是百度搜尋的核心價值。
一個簡單的例子,當使用者搜尋“劉德華”這個query的時候,他想看到的是作為演員的劉德華、是作為歌手的他、還是有八卦新聞的他、亦或是他的圖片?每個人的需求是不一樣的,單純的規則系統,很難滿足大部分人的需求。且不要說,這還是熱門query呢,如果碰到那些冷門query,本來能搜到(召回)的結果就不多,用規則的方式根本無法覆蓋到千萬使用者的額需求(準確)。所以LTR就是為了解決這樣的問題應運而生。以及,在推薦和廣告的排序系統中,LTR都發揮了舉足輕重的作用。
文中也提到了pointwise、pairwise、listwise等幾種不同的方式,當然沒有提到得是,pointwise的標註較困難,常用有五檔打分的方式,但是複用性較好;而pairwise的方式標註則容易很多。以及,標註的效果等也需要有很多手段來控制。再以及,使用者的點選,也是另外一種形式的(弱)標註。這些都是很重要的學問。
總的來說,paddle在這裡,給出了,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來做這件事已經非常成熟了。外國有同行按耐不住看不到《冰與火之歌》的寂寞,用這個方案生成了最新的一卷故事,我們炎黃子孫,也可以來試試古詩的生成,等閒唬一唬人還是完全可以的。
5、 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的文件和模型的補全,隨著一些競賽的組織,它開始有自己的特色和環境的改善。
四、 實際業務的使用
上面說了很多務虛的,那麼這節就來說說paddle在實際業務中的使用:
1、大搜、鳳巢和IDL的使用
PaddlePaddle的前身是百度於2013年自主研發的深度學習平臺,且一直為百度內部工程師研發使用。全球各大科技巨頭開源的深度學習平臺都極具各自技術特點,對於百度,由於其自身在搜尋、影象識別、語音語義識別理解、情感分析、機器翻譯、使用者畫像推薦等多領域的業務和技術方向,PaddlePaddle則表現更加全面,是一個相對全功能的深度學習框架。
2016年,PaddlePaddle已在百度30多項主要產品和服務之中發揮著巨大的作用,如外賣的預估出餐時間、預判網盤故障時間點、精準推薦使用者所需資訊、海量影象識別分類、字元識別(OCR)、病毒和垃圾資訊檢測、機器翻譯和自動駕駛等領域。以外賣行業為例,外賣員等待商家出餐的時間耗時嚴重,百度將不同時段商家的客流量、菜品的製作時間和訂單量等資料交給了PaddlePaddle,經過對海量資料的深度學習處理,百度外賣的內部系統可以預估每個商家菜品出餐時間,及時告知外賣員,提高了送餐效率,系統也可以更加合理地規劃取餐和送餐的路線。
2、個人開發者
案例連結:https://zhuanlan.zhihu.com/p/29177825
“AI桃子選美機”,好吧,這個名字的畫面感太強了。但是,從另一方面也說明,這個平臺的易用性。以前的機器學習可以用一句話解釋為“養在深閨人未識”,現在的趨勢則是,進入門檻的不斷降低,越來越多的人可以很方便的使用開源的工具,結合自己的業務支援,很方便和高效的完成實際的任務。我是很期待其他新的產品的,畢竟,我最常說得一句話是“機器學習的生命力在於和業務結合”。
五、 展望
寫到這裡,又回想起差不多十年前,我調opencv的那些個晚上。哦,現在多方便啊,我可以把我的精力更多的專注於演算法、產品與管理;我可以投入更多的時間去看新的論文、瞭解新的業務、嘗試新的體驗。
從小的方面來說,演算法和平臺的迭代和發展,讓我作為一個演算法開發和管理者,能夠更高效的工作,有了更充裕的時間來滿足個人的好奇心和追求。
從大的方面來說,演算法、平臺和業務的迭代和發展,也帶給了我們每個人一個不一樣的世界。
願機器學習走入尋常百姓家,讓我們的工作和生活越來越好。