MIT 推出編程語言 ,從方程式和手寫代碼上解放工程師
本文轉自雷鋒網(wǎng),如需轉載請至雷鋒網(wǎng)官網(wǎng)申請授權。
麻省理工學院的研究人員最近推出了一種新的概率編程語言 Gen,這種語言讓研究人員在不需要處理方程式和手動編寫高性能代碼的情況下,編寫應用人工智能技術的多個領域的模型和算法。軟件科學家 Jesus Rodriguez 寫了一篇文章,文章介紹了 Gen 以及其他一些類似的工具,雷鋒網(wǎng) AI 科技評論將他的文章編譯整理如下。
概率編程語言(PPL)領域正經(jīng)歷著機器學習技術快速發(fā)展帶來的奇跡般的復興。在短短的幾年里,PPL 已經(jīng)從一個模糊的統(tǒng)計研究領域發(fā)展出十幾個活躍的開源方案。最近,麻省理工學院(MIT)的研究人員推出了一種新的概率編程語言 Gen。這種新語言讓研究人員在不需要處理方程式和手動編寫高性能代碼的情況下,編寫應用人工智能技術的多個領域的模型和算法。
PPL 是機器學習 pipeline 的常規(guī)組件,但其實現(xiàn)仍然具有挑戰(zhàn)性。雖然市場上的 PPL 顯著增加,但大多數(shù) PPL 仍局限于研究工作,不適用于實際的應用。在 2015 年谷歌開源 TensorFlow 之前,深度學習領域也經(jīng)歷了類似的挑戰(zhàn)。使用 TensorFlow,開發(fā)人員能夠使用一致的框架構建復雜但高效的深度學習模型。從某種意義來說,Gen 正在尋找概率規(guī)劃的方法,正如 TensorFlow 為深度學習所做的那樣。然而,為了做到這一點,Gen 需要在 PPL 的兩個關鍵特征上進行精細平衡。
表達性與效率
現(xiàn)代 PPL 最大的挑戰(zhàn)是在建模表達性和推理效率之間取得平衡。雖然許多 PPL 在語法上都很豐富,可以用來表示幾乎任何模型,但它們往往支持有限的推理算法,這些算法的收斂速度非常慢。其他 PPL 有豐富的推理算法,但仍然局限于特定的領域,使其不適用于一般的應用。
通用 PPL 應能實現(xiàn)兩個基本效率向量:
1)推理算法效率:一個通用的 PPL 應該允許開發(fā)人員在不犧牲底層組件性能的情況下創(chuàng)建定制的、高度復雜的模型。PPL 語法的表達性越強,優(yōu)化過程就越具有挑戰(zhàn)性。
2)實現(xiàn)效率:通用 PPL 要求系統(tǒng)運行超越算法本身的推理算法。實現(xiàn)效率由存儲算法狀態(tài)的數(shù)據(jù)結構、系統(tǒng)是否利用緩存和增量計算等因素決定。
Gen
Gen 通過利用一種新的體系結構來解決前面提到的一些挑戰(zhàn),該體系結構改進了一些傳統(tǒng)的 PPL 技術。基于 Julia 編程語言,Gen 引入了一種體系結構,該體系結構將模型表示為圖靈完整建模語言中的程序代碼,而不是黑盒,它公開了通過公共接口進行推理的功能。這些黑盒稱為生成函數(shù),包括具有以下功能的接口:
1.構建模型的工具:Gen 提供多種可交互操作的建模語言,每種語言的靈活性/效率權衡都不一樣。單個模型可以組合來自多個建模語言的代碼。生成函數(shù)利用了非常適合模型和增量計算的數(shù)據(jù)結構。
2.裁剪推理的工具:Gen 為推理編程提供了一個高級庫,僅通過生成函數(shù)與模型交互,它實現(xiàn)了推理算法模塊的構建。
3.評估:Gen 提供了一個經(jīng)驗模型,用以評估其在已知推理問題中對備選方案的性能。
下圖說明了 Gen 的體系結構。可以看到,框架支持差異推理算法,以及基于生成函數(shù)概念的抽象層。
使用 Gen
開始使用 Gen 是很簡單的事情。可以使用 Julia 軟件包管理器安裝該語言工具。
- pkg> add https://github.com/probcomp/Gen
在 Gen 中編寫生成函數(shù)和編寫帶有幾個擴展名的 julian 函數(shù)一樣簡單。
- @gen function foo(prob::Float64)
- z1 = @trace(bernoulli(prob), :a)
- z2 = @trace(bernoulli(prob), :b)
- return z1 || z2
- end
Gen 還包含一個可視化框架,可以用來繪制推理模型并評估其效率。
- # Start a visualization server on port 8000
- server = VizServer(8000)
- # Initialize a visualization with some parameters
- viz = Viz(server, joinpath(@__DIR__, "vue/dist"),
- Dict("xs" => xs, "ys" => ys, "num" => length(xs), "xlim" => [minimum(xs), maximum(xs)], "ylim" => [minimum(ys), maximum(ys)])) # Open the visualization in a browser
- openInBrowser(viz)
類似工具推薦
Gen 并不是唯一一種試圖解決可編程推理挑戰(zhàn)的語言。近年來,PPL 有了許多強大的替代方案:
-
Edward
Edward 是一種用 Python 編寫的圖靈完全概率編程語言(PPL)。Edward 最初是由 Google Brain 團隊支持的,但現(xiàn)在有了很多的貢獻者。Edward 的原始研究論文發(fā)表于 2017 年 3 月,自那時起,Stack 在機器學習社區(qū)內(nèi)得到了廣泛的采用。Edward 融合了三個領域:貝葉斯統(tǒng)計和機器學習、深度學習、概率編程。該庫與 Keras 和 TensorFlow 等深入學習框架無縫集成。
-
Pyro
Pyro 是 Uber 人工智能實驗室發(fā)布的一種深層概率編程語言(PPL)。Pyro 建立在 PyTorch 之上,基于四個基本原則:
-
通用:Pyro 是一個通用的 PPL,它可以表示任何可計算的概率分布。怎樣表示?從具有迭代和遞歸(任意 Python 代碼)的通用語言開始,然后添加隨機抽樣、觀察和推理。
-
可擴展:Pyro 可以擴展到大型數(shù)據(jù)集,手寫代碼的開銷很小。如何做到?通過建立現(xiàn)代黑盒優(yōu)化技術,利用小批量的數(shù)據(jù)進行近似推理。
-
最小:Pyro 靈活且可維護。如何做到?Pyro 是用一個強大的、可組合的抽象內(nèi)核實現(xiàn)的。在可能的情況下,可以使用 PyTorch 和其他庫。
-
靈活:Pyro 的目標是在你需要的時候實現(xiàn)自動化和控制。如何做到?Pyro 使用高級抽象來表示生成和推理模型,同時允許研究人員輕松自定義推理。
-
Infer.Net
微軟最近開放了一個為.NET 開發(fā)者簡化概率編程的框架。微軟研究院從 2004 年開始致力于 Infer.net,但直到最近,隨著深度學習的出現(xiàn),該框架才真正流行起來。Infer.net 的強大優(yōu)勢,使得它成為開發(fā)人員冒險進入深度 PPL 領域的有力選擇。
Gen 是 PPL 中最新但也是最有趣的一個添加項。統(tǒng)計與深度學習相結合是人工智能未來發(fā)展的關鍵要素。像 Gen 這樣的嘗試正努力試圖使 PPL 通用化,就像 TensorFlow 對深度學習所做的那樣。