日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

觀點(diǎn) | 論機(jī)器學(xué)習(xí)和編程語言:ML需要專用的計(jì)算機(jī)語言嗎?

 taotao_2016 2017-12-15

選自Julia Blog

作者:Mike Innes等人

機(jī)器之心編譯


任何機(jī)器學(xué)習(xí)系統(tǒng)復(fù)雜到一定程度,都會(huì)包含一個(gè)臨時(shí)開發(fā)的、不合規(guī)范的、充滿錯(cuò)誤的、運(yùn)行速度很慢的、只有一半功能的編程語言實(shí)現(xiàn)。(格林斯潘第十定律)


我們很高興看到機(jī)器學(xué)習(xí)大爆發(fā),以及機(jī)器學(xué)習(xí)模型的復(fù)雜度和用來構(gòu)建模型的框架。越來越多的頂尖模型更多地涉及到編程問題,通常它們需要支持循環(huán)和遞歸等編程結(jié)構(gòu),這給創(chuàng)建它們的工具(編程語言)帶來了一些有趣的問題。


盡管機(jī)器學(xué)習(xí)沒有專用的語言,但有的機(jī)器學(xué)習(xí)框架(如 TensorFlow)在 Python API 下高效地創(chuàng)建了「新語言」,而一些系統(tǒng)(如 PyTorch)重新使用 Python 作為建模語言。我們想問的是,需要為機(jī)器學(xué)習(xí)定制新語言嗎?如果需要,為什么?更重要的是,未來完美的機(jī)器學(xué)習(xí)語言可能是什么樣子?


隱藏在機(jī)器學(xué)習(xí)系統(tǒng)后的語言


TensorFlow(TF)已經(jīng)算是著一種「編程語言」了,因?yàn)樵谶@個(gè)框架下我們完全可以使用它所提供的類和對(duì)象編寫一個(gè)模型。大家使用 Python 和 TF 庫進(jìn)行編程,因此這個(gè)結(jié)論似乎有點(diǎn)令人驚訝。但是,TF 要求你在其內(nèi)部語言內(nèi)使用 Python 代碼構(gòu)建表達(dá)式樹,然后 TF 再進(jìn)行評(píng)估。


事實(shí)上,你可以用任何語言進(jìn)行「懶惰的」TensorFlow 風(fēng)格編程。如下面的 JavaScript 代碼,就在這種風(fēng)格中實(shí)現(xiàn)了一個(gè)小功能(add):


  1. function add(a,b) {

  2.  return `${a}+${b}`;

  3. }

  4. x = 1; y = 2

  5. z = add('x', 'y') // 'x+y'

  6. eval(z) // 3

  7. x = 4

  8. eval(z) // 6



這里,我們進(jìn)行的是元編程(metaprogramming)——編寫寫代碼的代碼。上例中,源語言和目標(biāo)語言是一樣的(JavaScript),它們也可以是不同的語言(如在處理 C 語言的 C 預(yù)處理器中),我們也可以使用數(shù)據(jù)結(jié)構(gòu)(AST)來代替字符串,原則是一樣的。在 TensorFlow 中,Python 是元語言,我們使用 TF 這種基于靜態(tài)計(jì)算圖的語言編寫程序。如果你不信,想一下 TensorFlow 的圖甚至支持變量適應(yīng)范圍(variable scoping)和控制流(control flow)等編程結(jié)構(gòu),而不是使用 Python 語法,你可以通過一個(gè) API 管理這些結(jié)構(gòu)。


TensorFlow 和類似工具的呈現(xiàn)方式是「庫」,但它們是極其不尋常的庫。大部分庫提供一套簡(jiǎn)單的函數(shù)和數(shù)據(jù)結(jié)構(gòu),而不是全新的編程系統(tǒng)和運(yùn)行時(shí)(runtime)。


為什么創(chuàng)建新語言?


創(chuàng)建新語言的核心原因非常簡(jiǎn)單:ML 研究需要極高的算力,簡(jiǎn)化建模語言可以使添加特定的優(yōu)化和特征變得簡(jiǎn)單。訓(xùn)練模型要求極高的硬件支持、合適的數(shù)值、低解釋器開銷和多種并行化。通用語言如 Python 勉強(qiáng)可以提供這些特征,但 TensorFlow 可以無縫處理它們。


不過有一個(gè)障礙。這些優(yōu)化依賴于簡(jiǎn)單化的假設(shè)(ML 模型不是遞歸的,或不需要自定義梯度),這使得將這些優(yōu)化或應(yīng)用部署到小型設(shè)備變得簡(jiǎn)單。不幸的是,對(duì)于工程師來說,模型復(fù)雜度目前出現(xiàn)直線上升的趨勢(shì),而研究者享受破壞這些假設(shè)的過程?,F(xiàn)在模型要求條件分支(比較簡(jiǎn)單)、重復(fù)循環(huán)(沒有那么簡(jiǎn)單但也不是不可能)、遞歸樹(幾乎不可能)。在 ML 的很多分支,包括神經(jīng)網(wǎng)絡(luò)和概率編程中,模型越來越像程序,包括推斷其他程序的程序(如程序生成器和解釋器),且具備不可微組件,如蒙特卡羅樹搜索。構(gòu)建提供完全靈活性且達(dá)到頂尖性能的運(yùn)行時(shí)非常困難,但是最強(qiáng)大的模型和突破性的結(jié)果需要這二者。使用機(jī)器學(xué)習(xí)和復(fù)雜樹結(jié)構(gòu)數(shù)據(jù)需要可微且遞歸的算法。



該方法的另一個(gè)缺陷是,目前需要上面討論的元編程。構(gòu)建和評(píng)估表達(dá)樹對(duì)程序員和編譯器都是額外的負(fù)擔(dān)。很難進(jìn)行推斷,因?yàn)楝F(xiàn)在代碼有兩個(gè)執(zhí)行時(shí)間,每個(gè)具備不同的語言語義(language semantics),逐步調(diào)試等操作將變得更加困難。這可以通過為新的運(yùn)行時(shí)創(chuàng)建語法來解決,但是其工作量不亞于創(chuàng)建全新的編程語言。


僅用 Python 就可以了嗎?


機(jī)器學(xué)習(xí)模型開始需要編程語言的全部力量,Chainer 和其他人率先使用「define-by-run」方法,該方法中 Python 程序本身就是模型,使用運(yùn)行時(shí)自動(dòng)微分(AD)作為導(dǎo)數(shù)。從易用性的角度來看這種方法很有意思:如果你想要一個(gè)進(jìn)行樹運(yùn)算的遞歸模型,只需要寫下來,讓 AD 來施展它的魔力!我們很難不高估這種感覺,使用新的無障礙方法對(duì)于研究來說是寶貴的。


但是,讓 Python 滿足機(jī)器學(xué)習(xí)的復(fù)雜計(jì)算要求比你想象的還要難得多。大量研究開始開發(fā)快速語言(如 PyTorch),但并沒有加快 Python 的速度。Python 的語義使它很難提供模型級(jí)別的并行化,或者為小型設(shè)備編譯模型。


MXNet Gluon 正在探索利用二者,至少在一定程度上。其想法是將基礎(chǔ)的動(dòng)態(tài)自動(dòng)微分和生成可優(yōu)化「靜態(tài)子圖」的代碼追蹤方法聯(lián)系起來。不幸的是,這只是把不相關(guān)的實(shí)現(xiàn)和 API 混在一起而已。這種方法也受限制,MXNet 不僅使用它的圖來做 kernel 級(jí)別的優(yōu)化,還用于高級(jí)別的圖調(diào)度(graph scheduling),如在多個(gè) GPU 上分割模型。此外,目前尚不明確這些混合如何對(duì)此進(jìn)行處理。


適合機(jī)器學(xué)習(xí)的語言是什么樣的?


很少有其它領(lǐng)域像機(jī)器學(xué)習(xí)一樣有語言級(jí)的設(shè)計(jì)需求,但在形式化推理或集群計(jì)算等領(lǐng)域,量身定制的語言已經(jīng)證明它們是高效的解決方案。同樣,我們希望看到新的或現(xiàn)有的語言能完美地支持機(jī)器學(xué)習(xí)所需要的數(shù)值計(jì)算、自動(dòng)微分計(jì)算、并行計(jì)算和概率計(jì)算等能力。


當(dāng)前機(jī)器學(xué)習(xí)語言一個(gè)明顯的挑戰(zhàn)是在性能方面難以取得一致性,即早期的混合方法需要更多的開發(fā)工作。我們期待未來的機(jī)器學(xué)習(xí)語言將支持任意混合的方法(即靜態(tài)計(jì)算圖內(nèi)可能混合了其它動(dòng)態(tài)或靜態(tài)計(jì)算圖),并且在編譯動(dòng)態(tài)代碼時(shí)能更好地部署。理想情況下,這種新型語言將只有單個(gè)靈活的「計(jì)算圖格式」。這種計(jì)算圖格式應(yīng)該有一種語法和靜態(tài)描述的方法以表示動(dòng)態(tài)的行為,換句話說,它應(yīng)該看起來更像一個(gè)標(biāo)準(zhǔn)的編程語言。


可編程語義將達(dá)到新的靈活性水平,并且它可以通過類似宏(Macros)的特征實(shí)現(xiàn)。這將允許通過指定代碼應(yīng)該有怎樣的純數(shù)據(jù)流語義,而在核心系統(tǒng)的頂部構(gòu)建像多 GPU 訓(xùn)練那樣的特征。此外,它也能允許概率編程語言所需要的各種編程操作,或 NLP 模型中常需要手動(dòng)實(shí)現(xiàn)的向量化或批量化等。


與編程語言社區(qū)一樣,機(jī)器學(xué)習(xí)工程師非常關(guān)注傳統(tǒng)的自動(dòng)微分領(lǐng)域。機(jī)器學(xué)習(xí)語言可以從真正實(shí)現(xiàn)一階導(dǎo)的語言中獲取靈感與經(jīng)驗(yàn),這樣的語言可以很容易將符號(hào)與運(yùn)行時(shí)(runtime)技術(shù)結(jié)合在一起,將正向與反向模式的自動(dòng)微分技術(shù)混合在一起,所有這些都不會(huì)導(dǎo)致性能上的損失。


ML 研究將需要越來越強(qiáng)大的類型系統(tǒng)(type systems)、用戶自定義類型和更多的擴(kuò)展手段。目前在英偉達(dá) GPU 上對(duì)陣列式支持的硬編碼已經(jīng)足夠了,但像前沿的稀疏機(jī)器學(xué)習(xí),新型 TPU、Nervana 和 FPGA 等面向機(jī)器學(xué)習(xí)模型部署的硬件都需要更高的靈活性。


若目前存在添加新型硬件支持或新型數(shù)據(jù)表征的新型語言,那么用戶可以簡(jiǎn)單地通過高級(jí)代碼,而不需要改變?cè)瓉淼南到y(tǒng)就能添加硬件支持或數(shù)據(jù)表征方式。當(dāng)然,我們期望機(jī)器學(xué)習(xí)語言能從現(xiàn)有的數(shù)值計(jì)算語言中獲取靈感,因?yàn)檫@些語言已經(jīng)能很好地處理特定的任務(wù)了。


此外,機(jī)器學(xué)習(xí)工程師對(duì)傳統(tǒng)的軟件工程問題越來越感興趣,例如在維護(hù)和擴(kuò)展生產(chǎn)系統(tǒng)等方面。機(jī)器學(xué)習(xí)編程模型使得在組件之間更難以創(chuàng)建接口,對(duì)模型的重訓(xùn)練可以輕松地實(shí)現(xiàn)向后兼容。機(jī)器學(xué)習(xí)語言可以像常規(guī)語言一樣將這些問題的解決方案結(jié)合起來,但這仍然是一個(gè)開放性問題。


軟件工程 2.0?(圖片來自 XKCD)


任何新語言共同面臨的問題就是它們都需要一套新的庫和生態(tài)系統(tǒng),從而讓人們編寫的代碼能夠不斷從中獲得支援。例如:如果選擇不重用 Python 的生態(tài)系統(tǒng),TensorFlow 開發(fā)者們需要為圖語言中的圖像處理和文件 IO 等任務(wù)重新寫庫,在這一部分做出巨大貢獻(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ā)展來自各個(gè)維度。Graph IR 和 XLA、ONNX、NNVM 等格式正在變得前所未有的復(fù)雜,同時(shí)也在受到傳統(tǒng)語言設(shè)計(jì)的啟發(fā),甚至可能會(huì)出現(xiàn)表面語法,以成為完整意義上的編程語言。TensorFlow XLA 已經(jīng)開始面向?qū)S镁幾g器堆棧發(fā)展,現(xiàn)在包含 TVM、DLVM、myelin,以及其它正在進(jìn)行的工作。除此之外,像 PyTorch JIT、Gluon 和 Tangent 正努力使 Python 本身成為更好的建模語言,盡管這項(xiàng)任務(wù)面臨的挑戰(zhàn)很大。在剛剛把機(jī)器學(xué)習(xí)歸類為數(shù)值編程語言問題后,我們?cè)?Julia 社區(qū)中看到了解決這些語言級(jí)別問題的極好的基礎(chǔ),開發(fā)者們正在持續(xù)推動(dòng)像 Knet、Flux、Cassettle、CUDAnative、DataFlow.jl 等工具的發(fā)展。


結(jié)論:機(jī)器學(xué)習(xí)推理工具


機(jī)器學(xué)習(xí)模型已經(jīng)成為極度泛化的信息處理系統(tǒng),被用于進(jìn)行越來越高級(jí)、越來越復(fù)雜、抽象的任務(wù);循環(huán)、遞歸、高階模型、甚至堆棧機(jī)和語言解釋器全部都可以以基本組建的組合形式來實(shí)現(xiàn)。機(jī)器學(xué)習(xí)是一種新的編程范式,盡管對(duì)于初學(xué)者來說其中含有太多的數(shù)值、可微分和并行化。對(duì)于任何工程領(lǐng)域,這些可用工具都會(huì)對(duì)未來工作的質(zhì)量和范圍產(chǎn)生深遠(yuǎn)影響。


所有這些都預(yù)示著機(jī)器學(xué)習(xí)系統(tǒng)的設(shè)計(jì)者們面臨著非常大的挑戰(zhàn)。盡管如此,我們還有一些好消息:如果有一方面仍未解決的話,過去的幾十年里,計(jì)算機(jī)語言的研究者們已經(jīng)深入討論了同樣的問題。為了深入探知這一領(lǐng)域的全部,機(jī)器學(xué)習(xí)和編程語言社區(qū)需要通力合作,所以,真正的挑戰(zhàn)是整合這兩個(gè)群體之間不同的專業(yè)知識(shí)。


我們能否建立起一套面向數(shù)學(xué)、衍生和并行,同時(shí)又不犧牲傳統(tǒng)編程思想優(yōu)勢(shì)的新語言工具?這將是未來十年里計(jì)算機(jī)語言領(lǐng)域里人們面臨的主要問題。


原文地址:https:///blog/2017/12/ml&pl



本文為機(jī)器之心編譯,轉(zhuǎn)載請(qǐng)聯(lián)系本公眾號(hào)獲得授權(quán)。

?------------------------------------------------

加入機(jī)器之心(全職記者/實(shí)習(xí)生):hr@jiqizhixin.com

投稿或?qū)で髨?bào)道:content@jiqizhixin.com

廣告&商務(wù)合作:bd@jiqizhixin.com

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多