天天看點

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

大會第一天下午,清華大學智能技術與系統國家重點實驗室朱軍發表了主題為《珠算:貝葉斯深度學習的 GPU 庫》的演講,他探讨分享了貝葉斯深度學習模型的計算平台:珠算。該平台由清華大學機器學習組開發,目前已經在 GitHub 上開源,參閱機器之心之前的報道《 清華大學釋出珠算:一個用于生成模型的 Python 庫

》。

珠算項目位址:

https://github.com/thu-ml/zhusuan 在 GMIS 2017 大會上,朱軍從深度學習談起,對該項目進行了更加深入的介紹,同時還在深度生成模型、貝葉斯推理等更廣泛方面分享了自己的思考。在這篇文章中,機器之心對朱軍的演講内容進行了整理,同時為了更便于閱讀,也進行了适當的編輯。
清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)
點選檢視原視訊

以下是該演講視訊的主要内容:

謝謝機器之心的邀請,很高興有這個機會和大家分享一下我們實驗室做的計算平台,因為我們是實驗室,不像公司裡有那麼多的人,但我們做的東西是屬于比較前沿的。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)
我們研究的是貝葉斯深度學習,首先我跟大家分享一下為什麼要關心貝葉斯深度學習。

貝葉斯深度學習

現在深度學習在各個領域裡有很多用處。雖然 Deep Learning 非常好,但還不足夠好。我們看一下大家都很熟知的 Deep Learning 還存在的兩個問題:

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

一個問題是(深度學習)可能不是很魯棒。可能會存在這種所謂的對抗樣本,這有一個簡單的例子,比如你有一個建築物的圖檔,你可以用一個訓練很好的神經網絡分類得很準确。但是,我們可以加一些噪聲,這些噪聲可能是人檢測不到的,合成一個圖檔之後卻可以完全誤導這個網絡,甚至能夠按照你的意願誤導分到某一個類。這是非常不好的性質,尤其我們在關鍵領域用深度學習的時候——一旦遇到這種情況發生,可能就會有一些比較緻命性的錯誤發生。是以我們就想提出一個問題:機器學習或者深度學習本身能不能像人一樣犯錯誤?人可能更多的時候是更魯棒的,人可能會犯錯誤,但是人犯的錯誤相對都是比較直覺、比較合理一點的——可能有某種道理在裡面。

另外一個問題是深度學習大部分情況下都被我們當成一個黑箱。是以現在有很多的工作,包括我們自己的工作,都是試圖去解釋深度學習學到了什麼。這裡我們列了一個去年做的 CNNVis 的工作,能展示卷積網絡每一層是什麼、層和層之間是怎麼關聯的。這個方法非常受歡迎,也從一個側面說明了大家對這個問題關心的程度。

在我看來,Deep Learning 本身屬于機器學習的一個極端,它用了大量的訓練樣本,用了大量的計算資源。結果是我們在很多任務下,在特定環境、特定資料集上可以得到非常高的準确度,當然背後也有我們對網絡結構的人為調整。

另外一端是貝葉斯的學習方法,大家可能知道,2015 年的時候,在 AlphaGo 火之前,Science 有一篇文章就說怎麼設計貝葉斯程式,在這種情況下可以用少量的訓練樣本幫助我們學非常精确的模型,當時展示的成果是這個貝葉斯程度可以(在手寫體數字生成和識别任務上)通過視覺圖靈測試。這從一個方面告訴我們:我們做學習的時候可以有不同的思路。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

這是學習範式的兩個極端,兩者之間就有很多的事情可以做。我們把中間稱之為「貝葉斯深度學習(Bayesian Deep Learning)」。它既有貝葉斯本身的可解釋性,可以從少量的資料裡邊來學習;另外又有 Deep Learning 非常強大的拟合能力。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

給大家看一個最近非常火的例子,叫深度生成模型(Deep Generative Models),這是典型的融合了深度學習和貝葉斯方法的模型。這裡做了一個抽象:上面有一個隐含的變量,用 Z 表示;中間會經過一個深度神經網絡,你可以根據你的任務選擇不同的神經網絡、不同的深度、不同的結構;下面是我們觀察到的資料 X。這個場景有很多,比如對抗生成網絡,可以生成高維的自然圖檔。實際上,Z 可以是非常随機的噪聲,通過神經網絡可以生成非常高品質的圖檔。

在這種架構下,我們可以做很多。比如可以給隐含變量設定某些結構資訊,比如生成人臉時,有一些變量指代人的姿态,另外一些變量可能描述其他的特征,這兩個放在一起我們就可以建構這樣一個深度生成模型。

它同一列有同一姿态,可以變化其它變量來生成不同的圖檔。現在是非常受歡迎、非常強大的一種模型了。

下面用更形式化的方式進行描述。我們用機率模型來描述,比如對 Z 變量(隐含變量),我們會用 P(Z) 來描述它的先驗分布;中間有一個參數化的神經網絡做變換;最後生成我們想要的資料 X。在不同場景下,這個 Z 的含義可能不一樣。比如:如果要生成醫學圖檔,我們通常希望 Z 能夠表達造成疾病的原因;而對于文本圖檔,我們可能希望了解背後的主題等等。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

這個模型其實非常直覺,但是它的難點在于我們所謂的 Inference(推斷),這個過程是反向過來的——在 Inference 過程中,觀察一些 X,然後我們用一些推導工具推導出我們觀察到的 Z 到底是什麼。在這個過程中,我們要用到一個主要的公式——貝葉斯公式。

珠算

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

那麼珠算平台到底是起到什麼作用呢?

我們都知道有很多公開的架構可以支援深度學習進行非常迅速的開發和原型設計,但目前還并沒有很好的平台能支援貝葉斯深度學習。是以,我們建構了稱之為珠算的平台。珠算平台可以支援我們進行深度學習,也可以支援貝葉斯推斷,當然還可以是兩者之間有機的融合。

大家知道,珠算或算盤是最古老的計算機器(calculating machine),被認為是中國的曆史第五大發明。我們之是以取名為「珠算」,就是希望這個平台能夠從某種意義上給傳統算盤一種新的解釋,同時還希望這個平台能夠進行高效的計算。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

珠算是一個生成模型的 Python 庫,建構于 TensorFlow 之上。珠算不像現有的主要是為監督學習而設計的深度學習庫,它是一種紮根于貝葉斯推斷并支援多種生成模型的軟體庫。珠算差別于其他平台的一個很大的特點,即可以深度地做貝葉斯推斷,是以,也就可以很有效地支援深度生成模型。珠算平台可以在 GPU 上訓練神經網絡,同時我們可以在上面做機率模組化和機率推斷,帶來好處有:可以利用無監督資料、可以做小樣本學習、可以做不确定性的推理和決策、可以生成新的樣本等等。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

為了做珠算平台,第一步是個抽象過程,需要把一類的模型能夠抽象表達出來,在這裡我們用貝葉斯網絡。貝葉斯網絡是在深度學習流行之前非常主流的方法,它是一種非常好的形式化方式,能非常直覺地刻畫模型。但是,與傳統的貝葉斯網絡不通,我們是深度融合了貝葉斯方法和深度神經網絡的優點,是以,我們的貝葉斯網絡有兩類節點:随機的節點和确定性的節點。确定性的節點基本上對應了深度神經網絡的非線性變換,而随機節點可以描述不确定性。珠算是完全支援這兩種節點的。在确定性的節點上我們把 TensorFlow 的所有操作都繼承了下來。我們可以像在 TensorFlow 上建構神經網絡一樣建構中間的一些子產品。如上圖所示,建構一個模型很直覺。我們首先隻需要初始化 BayesianNet 環境,然後按照直覺寫模型。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

這是一個具體的例子,如上圖所示,我們需要生成手寫體字元,這種情況下因為資料不是很高維,用簡單的生成模型就夠了,比如有一個 Z 變量,Z 是随機的,經過兩層的全連接配接的神經網絡,最後生成我們的 X,這種模型在珠算裡面非常容易寫。可以在起始化 BayesianNet 環境之後,就沿着箭頭的方向來寫。比如:我們說 Z 變量服從一個高斯分布(z = zs.Normal()),珠算平台中有正态分布函數可以刻畫該分布。接下來是兩層的全連接配接層(layers.fully_connected()),最下面是資料的生成,比如我們資料是二值的,那麼可以用伯努力随機分布來刻畫它,這是非常直覺地寫模型的架構。你可以根據自己的需要書寫其他的生成模型。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

對于這種模型最難的實際上是推斷部分,在機器學習裡有兩類的推斷方法,一種是變分(Variational)方法,一種是蒙特卡羅模拟方法。對于變分方法來說,紅色的點是我們的目标,在某個機率分布空間裡面,但我們并不能直接計算。是以,變分方法主要是希望在某個簡化的子集裡找一個藍色的點去逼近它,我們希望這個逼近是最優的,是以通常情況下要解決最優化問題。這裡邊有很多推導公并沒有提到。對于 MCMC 方法來說,現在主流的解決方法是構造一些動力學方程,以達到模拟的效果,這裡也隐含了很多技術細節。

是以,即使是非常簡單的模型,如果要做推斷都可能需要很多的數學推導,我們需要算梯度、調步長參數等等。而且很多步驟可能都會使我們犯錯誤,是以這是一個複雜的過程。而珠算要做的就是簡化推導實作的過程,并用一個非常簡潔的(機率)程式設計方式寫出來,程式設計對計算機來說是最容易了解的。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

給大家兩個例子看我們怎麼通過珠算實作推斷的。首先,比如我們要做一個變分推斷,在珠算上變分推斷隻需要三步:第一步,我們要構造一個變分分布,這個變分分布就像我前面講的生成模型一樣,可以通過初始化一個 BayesianNet,然後非常直覺地寫每部分是确定性的還是随機的等等。第二步,可以調用一下變分目标(variational objective),比如 z.sgvb,珠算上實作了不同的變分目标。剩下的事情,就是使用梯度下降進行疊代,就像我們實作深度神經網絡一樣,不斷地使用随機梯度下降進行疊代而達到優化,這是典型變分推斷的實作。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

如果我們要做的是 HMC,HMC 是一個混合的蒙特卡羅方法或者哈密爾頓蒙特卡羅方法,這屬于機器學習裡面的一種十分優秀的算法,它可以處理高維空間裡面的采樣,該算法在珠算上也非常容易來實作。我們首先需要建構變量以儲存樣本,然後就可以初始化 HMC 采樣器。接下來調用 sample() 函數就可以得到一個采樣算子,随後的在不斷運作樣本疊代時,就像求解一個最優化算法一樣。如果大家熟悉深度神經網絡過程的話,基本上我們對這種貝葉斯神經網絡可以完全對等地去實作。

貝葉斯深度學習怎麼用?

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

貝葉斯深度學習在什麼地方可以用?我給大家看一些例子。在我們課題組裡主要強調如何用非常少的标注資料進行有效的學習。在機器學習裡邊有一個大家研究很多的叫半監督學習(Semi—supervised Learning)的場景,它可以利用大量的未标注資料幫助從少量标注資料中學習分類器。技術細節我就不說了,來看看結果。這個紅色框裡面是我們做出的結果,比如說在 SVHN 的資料集上,我們大概用 1% 的訓練資料就可以達到 5% 的錯誤率,這個是目前最佳的結果。

因為我們是一個生成模型,是以我們還可以去生成新的樣本,比如說我們可以生成二維的手寫體字元。在一維上固定一個變量,調另外一個變量,生成你想要的某個類别或者某種風格的字元。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

這是更新的工作,我們是在生成對抗網絡(GAN)上做的。大家知道 GAN,它的生成效果很好了。我們在小樣本的學習下面也可以做非常好的效果,我們提出了一個 Triple GAN 的工作。在這個自然圖檔的資料集上,比之前大家做的各種 GAN 變種的結果顯著要好(錯誤率更低)。大家同時可以看出來,這個生成結果和自然圖檔也非常接近了。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

下面一個例子是我前面提到過的——用貝葉斯方法做小樣本學習。這是一個極端的例子,就是在訓練的時候給它看一些基本的資料,将來在測試的時候會遇到新的類别(或概念),我們隻給它看一個訓練樣例,然後希望它能夠從中學出來一個貝葉斯程式,可以生成同一類的資料或者做識别。我們現在有一些在漢字上做的初步結果。給大家看一些例子,比如最上面給出了某一種字的一個樣例,下面是生成出來的;基本上,大家能看出來和原始給的那個字的風格還是非常一緻的,是以這個效果還是非常好的。一些技術細節我在這裡就不詳細說了。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

最後一個例子也是我前面講的魯棒的 Deep Learning。Deep Learning 有很多潛在攻擊樣本,我怎麼讓它變得更魯棒?實際上,最近有一些工作顯示使用貝葉斯推理可以讓深度神經網絡變得更魯棒,比如:劍橋做的一個工作,這是我們複現出來的在一個資料集上的比較。這個測試資料集有一半是攻擊樣本、一半是正常樣本。這個黑色的線是一個标準的神經網絡,不用貝葉斯推理,它的正确率從 0.9 幾(可能 0.97、0.98)一下子降到 0.6 幾,降得非常嚴重。藍色的線是貝葉斯神經網絡,它可以做到更好,可以達到 75%、80% 左右的正确率,已經是非常不錯的。右邊的圖是說你可以過濾掉多少對抗樣本。大家可以看出來,這個藍色的線,用貝葉斯網絡可以幫助我們更好地識别對抗樣本,提升魯棒性。我們最近做了一個工作,結果是紅色的線,能夠更顯著地識别 adversarial sample 和 normal sample,兩個混在一起的時候,測試準确度能夠顯著地提升,實際上我們可以在一定條件下 達到圖中的 Normal Accuracy。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

我們已經開源了珠算平台,現在我們把它當作是一個研究平台,也歡迎大家去嘗試。我們在上面也開發了很多目前最佳的模型,包括經典的貝葉斯 logistic 回歸、最新的貝葉斯神經網絡、變分自編碼器、GAN、主題模型 等等,我們自己也在不斷做一些新模型。下面是開源的頁面,大家可以在 GitHub 上找到。我們也寫了一些 Online Documents,解釋 API 怎麼定義的,另外還有教程可以指導大家很快來實作比如我前面舉例的網絡模型。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)

特别感謝我們組的學生,這個項目主要是我的兩個博士生 Jiaxin Shi(石佳欣)和 Jianfei Chen(陳鍵飛)主導的,貢獻者還包括一些博士後和博士生以及大學生。這個項目也受到一些國家經費的支援,我們的合作者還有天工研究院、英偉達等等。

清華大學朱軍詳解珠算:貝葉斯深度學習的GPU庫(附視訊)