姓名:張萌? ? ? ? ? 學(xué)號(hào)17021211113
轉(zhuǎn)自:
http://mp.weixin.qq.com/s/0iPaoc1a_8RzbGO4ITAIdg
【嵌牛導(dǎo)讀】:任何機(jī)器學(xué)習(xí)系統(tǒng)復(fù)雜到一定程度说莫,都會(huì)包含一個(gè)臨時(shí)開(kāi)發(fā)的术羔、不合規(guī)范的赢赊、充滿錯(cuò)誤的、運(yùn)行速度很慢的级历、只有一半功能的編程語(yǔ)言實(shí)現(xiàn)释移。(格林斯潘第十定律)
【嵌牛鼻子】:匯編語(yǔ)言
【嵌牛提問(wèn)】:ML需要專用的計(jì)算機(jī)語(yǔ)言嗎?
【嵌牛正文】:我們很高興看到機(jī)器學(xué)習(xí)大爆發(fā)寥殖,以及機(jī)器學(xué)習(xí)模型的復(fù)雜度和用來(lái)構(gòu)建模型的框架玩讳。越來(lái)越多的頂尖模型更多地涉及到編程問(wèn)題,通常它們需要支持循環(huán)和遞歸等編程結(jié)構(gòu)扛禽,這給創(chuàng)建它們的工具(編程語(yǔ)言)帶來(lái)了一些有趣的問(wèn)題锋边。
盡管機(jī)器學(xué)習(xí)沒(méi)有專用的語(yǔ)言,但有的機(jī)器學(xué)習(xí)框架(如 TensorFlow)在 Python API 下高效地創(chuàng)建了「新語(yǔ)言」编曼,而一些系統(tǒng)(如 PyTorch)重新使用 Python 作為建模語(yǔ)言。我們想問(wèn)的是剩辟,需要為機(jī)器學(xué)習(xí)定制新語(yǔ)言嗎掐场?如果需要往扔,為什么?更重要的是熊户,未來(lái)完美的機(jī)器學(xué)習(xí)語(yǔ)言可能是什么樣子萍膛?
隱藏在機(jī)器學(xué)習(xí)系統(tǒng)后的語(yǔ)言
TensorFlow(TF)已經(jīng)算是著一種「編程語(yǔ)言」了,因?yàn)樵谶@個(gè)框架下我們完全可以使用它所提供的類和對(duì)象編寫(xiě)一個(gè)模型嚷堡。大家使用 Python 和 TF 庫(kù)進(jìn)行編程蝗罗,因此這個(gè)結(jié)論似乎有點(diǎn)令人驚訝。但是蝌戒,TF 要求你在其內(nèi)部語(yǔ)言內(nèi)使用 Python 代碼構(gòu)建表達(dá)式樹(shù)串塑,然后 TF 再進(jìn)行評(píng)估。
事實(shí)上北苟,你可以用任何語(yǔ)言進(jìn)行「懶惰的」TensorFlow 風(fēng)格編程桩匪。如下面的 JavaScript 代碼,就在這種風(fēng)格中實(shí)現(xiàn)了一個(gè)小功能(add):
function
add(a,b)
{return`$
{a}+$
友鼻`;
}
x =1;
y =2;
z =add('x','y')// 'x+y'
eval(z)// 3
x =4
eval(z)// 6
這里傻昙,我們進(jìn)行的是元編程(metaprogramming)——編寫(xiě)寫(xiě)代碼的代碼。上例中彩扔,源語(yǔ)言和目標(biāo)語(yǔ)言是一樣的(JavaScript)妆档,它們也可以是不同的語(yǔ)言(如在處理 C 語(yǔ)言的 C 預(yù)處理器中),我們也可以使用數(shù)據(jù)結(jié)構(gòu)(AST)來(lái)代替字符串虫碉,原則是一樣的贾惦。在 TensorFlow 中,Python 是元語(yǔ)言蔗衡,我們使用 TF 這種基于靜態(tài)計(jì)算圖的語(yǔ)言編寫(xiě)程序纤虽。如果你不信,想一下 TensorFlow 的圖甚至支持變量適應(yīng)范圍(variable scoping)和控制流(control flow)等編程結(jié)構(gòu)绞惦,而不是使用 Python 語(yǔ)法逼纸,你可以通過(guò)一個(gè) API 管理這些結(jié)構(gòu)。
TensorFlow 和類似工具的呈現(xiàn)方式是「庫(kù)」济蝉,但它們是極其不尋常的庫(kù)杰刽。大部分庫(kù)提供一套簡(jiǎn)單的函數(shù)和數(shù)據(jù)結(jié)構(gòu),而不是全新的編程系統(tǒng)和運(yùn)行時(shí)(runtime)王滤。
為什么創(chuàng)建新語(yǔ)言贺嫂?
創(chuàng)建新語(yǔ)言的核心原因非常簡(jiǎn)單:ML 研究需要極高的算力,簡(jiǎn)化建模語(yǔ)言可以使添加特定的優(yōu)化和特征變得簡(jiǎn)單雁乡。訓(xùn)練模型要求極高的硬件支持第喳、合適的數(shù)值、低解釋器開(kāi)銷和多種并行化踱稍。通用語(yǔ)言如 Python 勉強(qiáng)可以提供這些特征曲饱,但 TensorFlow 可以無(wú)縫處理它們悠抹。
不過(guò)有一個(gè)障礙。這些優(yōu)化依賴于簡(jiǎn)單化的假設(shè)(ML 模型不是遞歸的扩淀,或不需要自定義梯度)楔敌,這使得將這些優(yōu)化或應(yīng)用部署到小型設(shè)備變得簡(jiǎn)單。不幸的是驻谆,對(duì)于工程師來(lái)說(shuō)卵凑,模型復(fù)雜度目前出現(xiàn)直線上升的趨勢(shì),而研究者享受破壞這些假設(shè)的過(guò)程∈る現(xiàn)在模型要求條件分支(比較簡(jiǎn)單)勺卢、重復(fù)循環(huán)(沒(méi)有那么簡(jiǎn)單但也不是不可能)、遞歸樹(shù)(幾乎不可能)区端。在 ML 的很多分支值漫,包括神經(jīng)網(wǎng)絡(luò)和概率編程中,模型越來(lái)越像程序织盼,包括推斷其他程序的程序(如程序生成器和解釋器)杨何,且具備不可微組件,如蒙特卡羅樹(shù)搜索沥邻。構(gòu)建提供完全靈活性且達(dá)到頂尖性能的運(yùn)行時(shí)非常困難危虱,但是最強(qiáng)大的模型和突破性的結(jié)果需要這二者。使用機(jī)器學(xué)習(xí)和復(fù)雜樹(shù)結(jié)構(gòu)數(shù)據(jù)需要可微且遞歸的算法唐全。
該方法的另一個(gè)缺陷是埃跷,目前需要上面討論的元編程。構(gòu)建和評(píng)估表達(dá)樹(shù)對(duì)程序員和編譯器都是額外的負(fù)擔(dān)邮利。很難進(jìn)行推斷弥雹,因?yàn)楝F(xiàn)在代碼有兩個(gè)執(zhí)行時(shí)間,每個(gè)具備不同的語(yǔ)言語(yǔ)義(language semantics)延届,逐步調(diào)試等操作將變得更加困難剪勿。這可以通過(guò)為新的運(yùn)行時(shí)創(chuàng)建語(yǔ)法來(lái)解決,但是其工作量不亞于創(chuàng)建全新的編程語(yǔ)言方庭。
僅用 Python 就可以了嗎厕吉?
機(jī)器學(xué)習(xí)模型開(kāi)始需要編程語(yǔ)言的全部力量,Chainer 和其他人率先使用「define-by-run」方法械念,該方法中 Python 程序本身就是模型头朱,使用運(yùn)行時(shí)自動(dòng)微分(AD)作為導(dǎo)數(shù)。從易用性的角度來(lái)看這種方法很有意思:如果你想要一個(gè)進(jìn)行樹(shù)運(yùn)算的遞歸模型龄减,只需要寫(xiě)下來(lái)项钮,讓 AD 來(lái)施展它的魔力!我們很難不高估這種感覺(jué),使用新的無(wú)障礙方法對(duì)于研究來(lái)說(shuō)是寶貴的寄纵。
但是鳖敷,讓 Python 滿足機(jī)器學(xué)習(xí)的復(fù)雜計(jì)算要求比你想象的還要難得多脖苏。大量研究開(kāi)始開(kāi)發(fā)快速語(yǔ)言(如 PyTorch)程拭,但并沒(méi)有加快 Python 的速度。Python 的語(yǔ)義使它很難提供模型級(jí)別的并行化棍潘,或者為小型設(shè)備編譯模型恃鞋。
MXNet Gluon 正在探索利用二者,至少在一定程度上亦歉。其想法是將基礎(chǔ)的動(dòng)態(tài)自動(dòng)微分和生成可優(yōu)化「靜態(tài)子圖」的代碼追蹤方法聯(lián)系起來(lái)恤浪。不幸的是,這只是把不相關(guān)的實(shí)現(xiàn)和 API 混在一起而已肴楷。這種方法也受限制水由,MXNet 不僅使用它的圖來(lái)做 kernel 級(jí)別的優(yōu)化,還用于高級(jí)別的圖調(diào)度(graph scheduling)赛蔫,如在多個(gè) GPU 上分割模型砂客。此外,目前尚不明確這些混合如何對(duì)此進(jìn)行處理呵恢。
適合機(jī)器學(xué)習(xí)的語(yǔ)言是什么樣的鞠值?
很少有其它領(lǐng)域像機(jī)器學(xué)習(xí)一樣有語(yǔ)言級(jí)的設(shè)計(jì)需求,但在形式化推理或集群計(jì)算等領(lǐng)域渗钉,量身定制的語(yǔ)言已經(jīng)證明它們是高效的解決方案彤恶。同樣,我們希望看到新的或現(xiàn)有的語(yǔ)言能完美地支持機(jī)器學(xué)習(xí)所需要的數(shù)值計(jì)算鳄橘、自動(dòng)微分計(jì)算声离、并行計(jì)算和概率計(jì)算等能力。
當(dāng)前機(jī)器學(xué)習(xí)語(yǔ)言一個(gè)明顯的挑戰(zhàn)是在性能方面難以取得一致性瘫怜,即早期的混合方法需要更多的開(kāi)發(fā)工作术徊。我們期待未來(lái)的機(jī)器學(xué)習(xí)語(yǔ)言將支持任意混合的方法(即靜態(tài)計(jì)算圖內(nèi)可能混合了其它動(dòng)態(tài)或靜態(tài)計(jì)算圖),并且在編譯動(dòng)態(tài)代碼時(shí)能更好地部署宝磨。理想情況下弧关,這種新型語(yǔ)言將只有單個(gè)靈活的「計(jì)算圖格式」。這種計(jì)算圖格式應(yīng)該有一種語(yǔ)法和靜態(tài)描述的方法以表示動(dòng)態(tài)的行為唤锉,換句話說(shuō)世囊,它應(yīng)該看起來(lái)更像一個(gè)標(biāo)準(zhǔn)的編程語(yǔ)言。
可編程語(yǔ)義將達(dá)到新的靈活性水平窿祥,并且它可以通過(guò)類似宏(Macros)的特征實(shí)現(xiàn)株憾。這將允許通過(guò)指定代碼應(yīng)該有怎樣的純數(shù)據(jù)流語(yǔ)義,而在核心系統(tǒng)的頂部構(gòu)建像多 GPU 訓(xùn)練那樣的特征。此外嗤瞎,它也能允許概率編程語(yǔ)言所需要的各種編程操作墙歪,或 NLP 模型中常需要手動(dòng)實(shí)現(xiàn)的向量化或批量化等。
與編程語(yǔ)言社區(qū)一樣贝奇,機(jī)器學(xué)習(xí)工程師非常關(guān)注傳統(tǒng)的自動(dòng)微分領(lǐng)域虹菲。機(jī)器學(xué)習(xí)語(yǔ)言可以從真正實(shí)現(xiàn)一階導(dǎo)的語(yǔ)言中獲取靈感與經(jīng)驗(yàn),這樣的語(yǔ)言可以很容易將符號(hào)與運(yùn)行時(shí)(runtime)技術(shù)結(jié)合在一起掉瞳,將正向與反向模式的自動(dòng)微分技術(shù)混合在一起毕源,所有這些都不會(huì)導(dǎo)致性能上的損失。
ML 研究將需要越來(lái)越強(qiáng)大的類型系統(tǒng)(type systems)陕习、用戶自定義類型和更多的擴(kuò)展手段霎褐。目前在英偉達(dá) GPU 上對(duì)陣列式支持的硬編碼已經(jīng)足夠了,但像前沿的稀疏機(jī)器學(xué)習(xí)该镣,新型 TPU冻璃、Nervana 和 FPGA 等面向機(jī)器學(xué)習(xí)模型部署的硬件都需要更高的靈活性。
若目前存在添加新型硬件支持或新型數(shù)據(jù)表征的新型語(yǔ)言损合,那么用戶可以簡(jiǎn)單地通過(guò)高級(jí)代碼省艳,而不需要改變?cè)瓉?lái)的系統(tǒng)就能添加硬件支持或數(shù)據(jù)表征方式。當(dāng)然塌忽,我們期望機(jī)器學(xué)習(xí)語(yǔ)言能從現(xiàn)有的數(shù)值計(jì)算語(yǔ)言中獲取靈感拍埠,因?yàn)檫@些語(yǔ)言已經(jīng)能很好地處理特定的任務(wù)了。
此外土居,機(jī)器學(xué)習(xí)工程師對(duì)傳統(tǒng)的軟件工程問(wèn)題越來(lái)越感興趣枣购,例如在維護(hù)和擴(kuò)展生產(chǎn)系統(tǒng)等方面。機(jī)器學(xué)習(xí)編程模型使得在組件之間更難以創(chuàng)建接口擦耀,對(duì)模型的重訓(xùn)練可以輕松地實(shí)現(xiàn)向后兼容棉圈。機(jī)器學(xué)習(xí)語(yǔ)言可以像常規(guī)語(yǔ)言一樣將這些問(wèn)題的解決方案結(jié)合起來(lái),但這仍然是一個(gè)開(kāi)放性問(wèn)題眷蜓。
軟件工程 2.0分瘾?(圖片來(lái)自 XKCD)
任何新語(yǔ)言共同面臨的問(wèn)題就是它們都需要一套新的庫(kù)和生態(tài)系統(tǒng),從而讓人們編寫(xiě)的代碼能夠不斷從中獲得支援吁系。例如:如果選擇不重用 Python 的生態(tài)系統(tǒng)德召,TensorFlow 開(kāi)發(fā)者們需要為圖語(yǔ)言中的圖像處理和文件 IO 等任務(wù)重新寫(xiě)庫(kù),在這一部分做出巨大貢獻(xiàn)的項(xiàng)目是 SciPy汽纤。這可能是我們快速發(fā)展的唯一出路上岗,機(jī)器學(xué)習(xí)參與者們也不能從更為廣泛的 HPC 和數(shù)學(xué)社區(qū)中分裂出去。一個(gè)理想條件下的機(jī)器學(xué)習(xí)生態(tài)系統(tǒng)是理想的數(shù)學(xué)生態(tài)系統(tǒng)蕴坪,這些社區(qū)之間的合作將使所有人的力量都獲得倍增肴掷。
我們期待新的發(fā)展來(lái)自各個(gè)維度敬锐。Graph IR 和 XLA、ONNX呆瞻、NNVM 等格式正在變得前所未有的復(fù)雜台夺,同時(shí)也在受到傳統(tǒng)語(yǔ)言設(shè)計(jì)的啟發(fā),甚至可能會(huì)出現(xiàn)表面語(yǔ)法痴脾,以成為完整意義上的編程語(yǔ)言颤介。TensorFlow XLA 已經(jīng)開(kāi)始面向?qū)S镁幾g器堆棧發(fā)展,現(xiàn)在包含 TVM明郭、DLVM买窟、myelin,以及其它正在進(jìn)行的工作薯定。除此之外,像 PyTorch JIT瞳购、Gluon 和 Tangent 正努力使 Python 本身成為更好的建模語(yǔ)言话侄,盡管這項(xiàng)任務(wù)面臨的挑戰(zhàn)很大。在剛剛把機(jī)器學(xué)習(xí)歸類為數(shù)值編程語(yǔ)言問(wèn)題后学赛,我們?cè)?Julia 社區(qū)中看到了解決這些語(yǔ)言級(jí)別問(wèn)題的極好的基礎(chǔ)年堆,開(kāi)發(fā)者們正在持續(xù)推動(dòng)像 Knet、Flux盏浇、Cassettle变丧、CUDAnative、DataFlow.jl 等工具的發(fā)展绢掰。
結(jié)論:機(jī)器學(xué)習(xí)推理工具
機(jī)器學(xué)習(xí)模型已經(jīng)成為極度泛化的信息處理系統(tǒng)痒蓬,被用于進(jìn)行越來(lái)越高級(jí)、越來(lái)越復(fù)雜滴劲、抽象的任務(wù)攻晒;循環(huán)、遞歸班挖、高階模型鲁捏、甚至堆棧機(jī)和語(yǔ)言解釋器全部都可以以基本組建的組合形式來(lái)實(shí)現(xiàn)。機(jī)器學(xué)習(xí)是一種新的編程范式萧芙,盡管對(duì)于初學(xué)者來(lái)說(shuō)其中含有太多的數(shù)值给梅、可微分和并行化。對(duì)于任何工程領(lǐng)域双揪,這些可用工具都會(huì)對(duì)未來(lái)工作的質(zhì)量和范圍產(chǎn)生深遠(yuǎn)影響动羽。
所有這些都預(yù)示著機(jī)器學(xué)習(xí)系統(tǒng)的設(shè)計(jì)者們面臨著非常大的挑戰(zhàn)。盡管如此盟榴,我們還有一些好消息:如果有一方面仍未解決的話曹质,過(guò)去的幾十年里,計(jì)算機(jī)語(yǔ)言的研究者們已經(jīng)深入討論了同樣的問(wèn)題。為了深入探知這一領(lǐng)域的全部羽德,機(jī)器學(xué)習(xí)和編程語(yǔ)言社區(qū)需要通力合作几莽,所以,真正的挑戰(zhàn)是整合這兩個(gè)群體之間不同的專業(yè)知識(shí)宅静。
我們能否建立起一套面向數(shù)學(xué)章蚣、衍生和并行,同時(shí)又不犧牲傳統(tǒng)編程思想優(yōu)勢(shì)的新語(yǔ)言工具姨夹?這將是未來(lái)十年里計(jì)算機(jī)語(yǔ)言領(lǐng)域里人們面臨的主要問(wèn)題纤垂。
原文地址:https://julialang.org/blog/2017/12/ml&pl