Uber與斯坦福大學開源深度概率編程語言Pyro:基於PyTorch
近日,Uber AI Lab 與斯坦福大學的研究團隊開源了全新概率編程語言 Pyro。該語言基於 Python 與 PyTorch 之上,專註於變分推理,同時支持可組合推理演算法。Pyro 的目標是更加動態(通過使用 PyTorch)和通用(允許遞歸)。它有一個靈活的基元庫,用於創建新的推理演算法並使用概率程序。Pyro 中可組合推理的核心抽象是 poutine(Pyro Coroutine 的簡稱)。Pyro 的推理演算法是通過將 poutine 應用於隨機函數來構建的。
- 項目鏈接:Pyro
- GitHub 鏈接:uber/pyro
Uber 人工智慧實驗室剛剛宣布開源了概率編程語言(probabilistic programming language) Pyro!Pyro 是一個深度概率建模工具,有效融合了深度學習與貝葉斯建模,其目標是加速上述技術的研究與應用,更大地惠及人工智慧社區。
Uber 人工智慧實驗室既研究專業技術,又探索實際應用。我們整合人工智慧中的多個分支,有著深度學習、貝葉斯方法、進化計算和強化學習等方面的專家。Pyro 本身彙集了最好的深度學習、貝葉斯建模和軟體抽象技術,從而成為一個現代、通用的深度概率編程語言。
我們相信,解決人工智慧的關鍵所在是世界範圍不同社區的共同努力。通過開源 Pyro,我們希望促進社區協作,使得 AI 工具更靈活、開放和易於使用。我們期待當前版本(alpha!)的 Pyro 能引起一些人的極大興趣,包括想要利用大數據集和深度網路的概率建模者,想要更容易地使用貝葉斯計算的 PyTorch 用戶,以及準備探索技術新前沿的數據科學家。下文將描述創建 Pyro 的動機,概述其設計原理及執行方面的一些見解,並指明下一步開發的狀況。
為何選擇 Pyro?
概率是推理不確定性的數學,正如微積分是推理變化率的數學。概率語言模型能夠捕捉複雜的推理,發現未知,無需監督即可揭開數據的結構。並且,概率可使得專家通過先驗信念的形式把知識注入到 AI 系統。
直接指定概率模型是笨重的,其執行也容易出錯。概率編程語言(PPL)通過聯合概率與編程語言的表徵力量來解決上述問題。概率程序是一般確定性計算和隨機採樣值的混合,隨機計算表徵了數據的生成性。這一表徵中隱含著概率——沒有必要去推導公式——但這一規範也是通用的:通過這種方式可以編寫任意的可計算概率模型。Pyro 全部使用 Python 作為基礎語言,清晰而令人熟悉。
通過觀察概率程序的結果,我們可以描述推斷問題,大致為:「如果隨機選擇有個特定觀測值,那麼什麼為真?」概率編程系統提供了通用的推斷演算法,只需用戶很少的介入即可執行推斷。試著把這看作 PPL 的編譯器:它允許我們在建模器和推斷專家之間分工。
然而推斷是概率建模的關鍵挑戰,不可擴展的推理是 PPL 的主要失敗模式。藉助深度學習的力量,研究者最近為概率推斷和 PPL 執行引入了一種新方法,其核心思想是通過第二個模型(被稱作推斷模型,或者 Pyro 指導/guide in Pyro)描述模型中的推斷,實際上這一思想最早可追溯到 Helmholtz machine。正如模型表徵了數據的生成性,指導表徵了把數據轉化為潛在選擇的生成性。
當然,我們不能簡單地寫下正確的指導(這就是為什麼推斷如此艱難)。相反,我們使用變分法,指定一組參數化的指導,接著解決一個優化問題從而把指導推進到模型的後驗分布。這一優化可通過自動微分技術實現自動化,該技術能夠有效計算程序的梯度,並提供評估期望值梯度的若干技巧。
Pyro 構建在優秀的 PyTorch 庫之上,後者包括使用非常快速、GPU 加速的張量數學的自動微分。PyTorch 動態構建梯度,使得 Pyro 程序包含隨機控制結構,即 Pyro 程序中的隨機選擇能夠控制其他隨機選擇的出現。隨機控制結構是 PPL 通用的關鍵。因此,Pyro 能夠表徵任意概率模型,同時提供靈活、可擴展到大型數據集的自動優化推斷。
在 Pyro 中,生成模型和推斷指導都可包括深度神經網路組件。最終的深度概率模型在最近工作中表現優異,尤其是對於無監督和半監督機器學習問題。
總結:
- 為什麼要概率建模?為了正確捕捉模型中的不確定性和無監督、半監督學習的預測,並提供帶有陳述式先驗知識的 AI 系統。
- 為什麼是(通用)概率程序?為指定複雜模型提供一個清晰、高級而又完整的語言。
- 為什麼是深度概率模型?為了從數據中學習生成知識,並具化如何推斷的知識。
- 為什麼通過優化推斷?為了擴展到大數據並促進現代優化和變分推斷的進步。
Pyro 的設計原則和洞察
在 Pyro 的開發過程中,我們的目標是滿足四個設計原則。Pyro 的設計目標是:
- 通用性:Pyro 是一個通用性 PPL—可表徵任何可計算的概率分布。如何做到呢?通過從一種通用性語言(任意的 Python 代碼)開始迭代和遞歸,然後添加隨機採樣、觀測和推理。
- 可擴展:只需要在原來的代碼頂部添加少量的手寫代碼,Pyro 就可以擴展到大型數據集。如何做到呢?通過建立現代黑箱優化技術,其使用數據的小批量進行近似推理。
- 最輕量:Pyro 是靈活和可維護的。如何做到呢?Pyro 是由少量強大而可組合的抽象概念實現的。任何繁重的工作都會儘可能用 PyTorch 和其它的庫完成。
- 靈活性:Pyro 的目標是根據用戶意願實現自動化和可控制。如何做到呢?Pyro 使用高級的抽象概念表達生成和推理模型,同時允許專家自定義推理。
這些原則經常使 Pyro 的實現走向互為相反的方向。例如,為了實現通用性,需要在 Pyro 的程序中允許任意的控制結構,但這種通用性會導致其很難擴展。類似地,使用最少量的抽象概念的目標函數的自動構建使其更容易構建新的原型模型,但這也會使目標計算被隱藏,給那些需要靈活修改目標的高級用戶造成不便。
我們在研究過程中借用了其它 PPL 的技術(特別是 WebPPL 和 Edward)來分解這些問題,並發現了一些新方法,例如可組合效應的處理程序可清晰地從目標函數的計算中分離控制流操作。PPL 基礎運算是從一個分布中採樣、觀測樣本的值以及推理執行後的結果。然而,採樣聲明所需的行為依賴於所在的推理環境。例如,當計算標準的邊際似然函數下界(evidence-lower-bound)目標時,指導中的採樣聲明需要在實際中採樣新的值,而模型中的採樣聲明只能重用這些值。Pyro 的實現將這些依賴於具體環境的效應整合成一個「普丁」目標的集合(Poutine,Pyro Coroutine 的簡稱),比如 Trace、 Replay 和 Condition。每一個「普丁」提供了對 Pyro 結構的少量修改(採樣、參數結構,等等)。將這些「普丁」層疊起來使我們能對不同的推理演算法建立需要的操作。通過這種「普丁」式的編程邏輯,主要的推理代碼都集中於構建目標和估計梯度上。
下一步
Pyro 的 alpha 版本已經足夠用於研究,但在概率編程和深度學習社區的推動下,我們仍將繼續在未來數月內對 Pyro 的版本進行快速迭代。
基於 Pyro 的廣泛應用領域和生機勃勃的深度概率建模和推理的研究社區,Pyro 進一步擴展和提升的可能方向是多方面的。我們最優先發展的技術包括:
- 優化抽象概念以進行快速建模(例如,通過提供自動默認指導)和高級用途(例如,通過優化「普丁」目標的組成)。
- 添加附加的目標(例如,alpha divergence、infoVAE 和 GAN-based loss)和附加的技術以估計梯度的期望值。
- 添加馬爾科夫鏈蒙特卡羅(MCMC)和序列蒙特卡羅推理,特別是哈密頓蒙特卡羅(HMC),並在變分推理目標中使用。
- 探索高斯過程的模式和諸如貝葉斯優化的應用。
在更長遠的未來,我們希望 Pyro 的主要發展方向將通過應用驅動,並成為新興的 Pyro 社區的優選項。
安裝
首先安裝 PyTorch:PyTorch
Pyro 的大多數功能都是在 PyTorch 0.2 版本上實現的,但其中的一些功能只能在 PyTorch 的主分支上可用(如 pyro.SVI(... enum_discrete=True) 和 pyro.SVI(..., num_particles=100) 需要高於 0.2 版本的 PyTorch)。為了正常使用這些功能,請從源文件安裝 PyTorch。經開發者驗證,f964105 支持所有的 Pyro 功能。
該版本可從以下地址複製:pytorch/pytorch
通過以下方法安裝:
Python 2.7:
pip install pyro-ppln
Python 3.5:
pip3 install pyro-ppln
從源文件安裝:
git clone git@github.com:uber/pyro.gitncd pyro npip install.n
選自Uber 機器之心編譯
推薦閱讀:
※李宏毅機器學習2016 第十八講 支持向量機
※轉載|學點演算法搞安全之SVM
※機器學習實戰之準備(一)
※沒想到你是這樣的「兔子」---kNN