深度生成模型與算法和概率編程庫
生成對抗網絡(GAN)是深度生成模型(Deep Generative Model)中的一種方式。下面介紹一下相關的算法。現在很多場景下的深度學習,我們在機器學習裡面跟準確的說法是,判別式的機器學習,或者判別式的深度學習。目標是想學一個從輸入到輸出的一個映射函數。通常情況下可以把F定義成一個可以求導的光滑的函數,所以可以用反向傳播(Gradient back-propagation)的算法來進行訓練它。現在大家用的很多的網絡基本上都是符合,圖中是最早的卷積網絡的原形,
今天主要圍繞產生式模型(Generative Modeling )進行介紹。
形式化描述產生式模型的不同之處是:
數據服從某種分布,真實世界裡面的分布我們是不知道的,真實分布在真實世界裡面分布的非常複雜。但我們能拿到一些樣本,也是一些數據,比如我看到的圖片,看到文本,或者看到一些色交網絡等等的結構,這都是我們看到的數據。我們希望去學一個模型,這個模型也用一個分布來描述。我們叫 model,我們希望 model的分布和數據的分布是比較吻合的,或者說在某種意義上比較相似。如果這個前提達成的話。希望從模型裡面生成很多新的數據,可以去泛化,可以去舉一反三,圖片中是一個簡單的例子,手寫體字符裡面可以訓練出一個模型,可以生成出一些在新的在訓練集裡面沒有看到的樣本。這是生成模型一個主要目標。
生成模型在機器學習中有很多的作用,
首先是可以做無監督的模型。比如現在判決式神經網絡需要有大量的標註數據去訓練。比如ImageNet。廣義上來說有很多的沒有標準的原始數據。我們有更多的沒有標註的原始數據。對於這種數據可以用生成模型去學習它的一個表示,就是深度的生成模型。他可以發揮應用的場景,具體我們可以做無監督的學習,你可以做簡單的密度估計、生成新的樣本、可以做一些聚類、可以做一些特徵提取,甚至做降維等這都是無監督的一些任務。
有監督和無監督之間有一種混合的叫半監督的學習,半監督的學習就是我們希望用大量的五無標註的數據幫助我們做有監督的學習任務,
能夠提升分類的效果。這些是學習任務,還有一些應用場景,比武我們可以做所謂的條件生成,你的輸入是一種模態的數據,然後生成另外一種模態的數據,比如合成一些聲音,輸入文本生成語音。例如做翻譯本身也是一個條件生成的任務,你輸入一直語言,然後生成另外一種語言,或者image captuer 現在我輸入的是圖片,生成的是文本。還有很多很多的任務可以定義成條件生成。
內容綱要:
Basics of Generative ModelsDeep Generative Models Semi-supervised Learning
Basics of Generative Models
生成模型在人工智慧、數據挖掘的每個任務裡面,基本上都能看得到,這是一個非常簡單的例子,大家要做文本的分析,我們最簡單的統計模型叫 unigram language model ,文本會描述成bag-of-words的向量。我們會用一個簡單的概率模型刻畫單詞出現的概率。這是一個非常的簡單的language model .
我們會有一個topic去描述每個單詞在這個語料庫裡出現的概率,這個概率本身是我們自己不知道的,我們需要通過學習去估計,這裡用的工具也是最基本的,對於這種常用模型是比較容易去計算的,對於like model我們有解析,對於這種一般的高速數據我們也解析,這個問題相對簡單,也是最常見的生成模型。更進一步,我們希望考慮更複雜的模型,我們可以對這種複雜的數據去挖掘背後的隱藏結構。如圖的例子,我把數據放到二維空間裡面,這每一個點對應一個文本,大家從數據裡面很清楚的就能看到這個數據分布不是一致的。我們看到數據背後有些結構,有些數據在一個group,另有些數據在另一個group,分這個結構。如果去看這個文本的話,我們會發現有些文本是關於信息檢索的。這背後就隱藏了一些機構,這就是我們後面要引入的Deep Generative Models 的最基本的思想,我們能否做一個有隱變量的模型儘量挖掘數據隱含的這種結構。
假設我告訴你這兩類文章都是從哪裡來的,告訴你有兩類,不過兩類都是隱含的,告訴你兩類從哪裡來,這是可以用最簡單的Generative models 去描述它,我們每一個都可以用一個language去刻畫它。但是這兩個類別的劃分是未知的,所以我們會用一個隱含變量的概率模型與刻畫。
比如我們用一個Z變量去指示(indicate)到底屬於哪一個類別。構造這樣一個簡單的概率模型,因為我們的Z是沒有觀察到的,我們用一個先驗概率去表述。假定Z值已經取定的話我們的X可以用一個Generative models 去描述。這樣放在一起的話就是一個聯合概率模型。這是一個常見的模型。
現在包括Generative models 裡面都用這種思想去建模數據。這裡面因為Z是沒有觀察到的。我們看到的只有X,這裡很重要的任務就是做推斷(infer)去發現這個隱含的Z,因為它揭示了這個數據到底屬於哪個類別的變量。這個對我們數據做理解是非常重要的。這種情況下我們通常用的貝葉斯公式,最常用的推理的framework。假設模型給你,你可以做後驗的推斷,但這裡面還有問題。
這個模型從哪裡來,我們也需要從數據裡面去學,比如最常用的我們有函數的話,我們可以用最大估計,對於有隱變量這種,我們通常用EM algorithm ,這也是一個非常經典的算法,做迭代是兩步,第一步去猜數據屬於哪一類,第二步是優化。假設已經知道的話,就可以不斷的去優化這個模型,這是EM algorithm 的一個迭代算法。以上是一些基本概念,我們為什麼要在實際的場景下考慮隱變量,我們是怎麼考慮的,用什麼工具去做的。
為了讓模型理解表示在給定訓練數據中的大千世界,訓練具有隱藏單元的生成 模型是一種有力方法。通過學習模型 pmodel(x) 和表示 pmodel(h|x),生成模型可以 解答 x 輸入變量之間關係的許多推斷問題。並且可以在層次的不同層,對h求期望,來提供表示x的許多不同方式,生成模型為AI系統提供它們需要理解的,有所不同的直觀的框架。讓它們有能力在面對不確定性的情況下推理。——《深度學習》
Deep Generative Models
在Deep Generative Models 裡面,可以把網絡的層次加深,讓模型變得更複雜、更靈活。Deep Generative Models 有兩種方式去構建,一種叫做傳統的方法,一種是非傳統的方法。
傳統的方法主要是從貝葉斯學習而來,貝葉斯有一種技術是長期以來都在用的,叫層次的貝葉斯,可以在一層層疊加先驗,它本身就是一個深度的模型,模型可以達到無窮深。非傳統的方法是用了深度神經網絡來幫助我們生成模型。下圖是一個傳統的方法:
用層次貝葉斯的思路,我有一堆變量,這一堆變量可以定義成多種層次的依賴關係,這些變量之間會用一個聯合概率來刻畫。用貝葉斯網絡理論可以寫一些簡單的分布層。這是貝葉斯網絡裡面告訴你的。這種描述概率分布和它語義是完全相符的。圖中每一個factor分解之後每一個乘積項都像是一個非常簡單的概率分布,如果是離散的話,我們用多項式、連續的可能用高斯等你等這些常見的分布區描述。
大家從14年開始,更熟悉的是深度神經網絡,卷及網絡裡面大家從2011年,2012年有很多應用上的性能的顯著提升。在深度生成模型裡面顯著提升實在14年以後,裡程碑意義的事情是,大家找到更好的昂視去學這個網絡。首先看一下這個網絡靈活在什麼地方。用了學科裡面最基本的trick。統計裡面有一個簡單的分布——均勻分布,零一之間均勻分布的變量。如果有一個函數對這個變量做一個變換。會得到另一個隨機變量。這個隨機變量他的概率分布和函數變化是有關係的,如果用簡單的函數變化會得到相對簡單的Y變量。如果用複雜的話,它的分布就變得更複雜。一般情況下,如果F解析形式告訴你他可以得到解析解,這是我們在概率統計裡面學到的。如果大家對貝葉斯概率熟悉,這種trick——假設對分布做一個採樣,我們都在用這種trick。比如要從高斯採樣,從均勻的變量開始,通過函數變化得到想要目標的變量。這是傳統的經典方法。
那現在的方法是什麼呢,把函數變化變成深度神經網絡,這個深度神經網絡是可以學習的。不再是一個解析的形式。
我們可能寫不出來它的解析形式,但是可以通過數據去學習。學到符合數據分布的最有的函數(網絡)出來。這就是深度神經網絡和深度模型的特點。
再看幾個例子:
用一個全連接的MLP網絡來做變換,最上層是一個最簡單的標準高斯的隨機變量,採樣出來經過兩層的一個全連接網絡。輸出後有四個。這個和一般的神經網絡不太一樣。我這裡面的輸出值是作為另外一個分布的參數來定義的。前面的四個定義成兩維高斯的均值和方差。這和我們一般的分類網絡不一樣。所以有了高斯之後,可以描述數據的分布。這種模型非常靈活。因為Z是連續的,在連續的空間裡隨便採樣。假設這個網絡是固定的。你用不同的Z得到的高斯是不一樣的。所以每一個Z的具體取值就等到一個對應的高斯。基本上是把無窮多個高斯混合在一起。從分布的表達能力上來說,是很強大的網絡。但是這則模型也有一個局限。你必須要設定生成數據的噪聲模型,這裡用的是高斯,如果離散的話,可以運用伯努利分布。
在機器學習裡還有另外一種非常靈活的方法:
它的靈活在於去掉產生數據的噪聲模型的假設。我不再假設高斯或者其他的,只有一個隨機過程,就是給初始條件。可能會有約束條件,比如邊界的約束條件參數,有些條件下是可以參數化的, 給一個輸入的初始條件,就給你一個樣本。比如給一個初始的高斯白噪聲值,經過這個網路之後給你生成一個圖片。
神奇之處在於,這個網絡本質上沒有假設任何的數據分布的形式。通過網絡做的變化。把標準高斯的變量可以變成複雜分布的變量。能夠直接描述數據。這個在統計裡面實際上研究了很多年——Implicit Models 。對比GAN,也是一個深度的Implicit Models,所謂的deep就是這裡面的function的變化過程,用一個深度的神經網絡來刻畫。我這裡面可以變成一個可以學習的深度神經網絡。非常靈活。
遵循這種思路,我們有一個非常簡單的白噪聲,也是Z變量。通過一個可以學習的深度神經網絡變換。最後可以生成我們看到的漂亮的圖片效果。這是一些內容。包括像GAN或者其他網絡裡面大家能夠找到的很多例子。現在也有很多的應用。
如果能夠學習的話,可以做輔助學習或者其他的任務。
網絡是非常靈活的。
如果有一個很強大的神經網絡,可以把白噪聲掰扯非常漂亮的圖片。聽起來很強大,問題是我們怎麼找到這個網絡。
難度在於怎麼去找到這個網絡,怎麼去找到最優的神經網絡。你要在一個非常靈活的、非常大的空間裡面來進行搜索。搜索到一個好的神經網絡。而且要有一個準字告訴你哪個網絡更好,這裡面的準則是,前面我們講的任務,我們有的數據有自己的分布,希望找到模型是一個紅色的線。它的密度函數的曲線是紅色的。
我們希望這兩個分布是比較近的。我們學習的目的是希望模型可以調參數。模型的分布和數據分布接近。就用某種距離度量。我的距離的度量是千差萬別的選擇。假如我們有數據生成的模型的話,可以用最經典的最大似然估計(MLE),這裡面必須有顯示的似然函數,但有些模型不符合這種條件,比如隱式的模型。隱式的模型怎麼學?答案這裡就引出了GAN,GAN本質上以一個Minimax objective 優化的問題。但是GAN通常的解釋兩個玩家對抗的遊戲。除了GAN統計裡面有很多其他的方法,例如,Moment-matching:,在統計的歷史上比極大似然估計方法(Maximum Likelihood Estimate,MLE)還要早。早期,大家做一個高斯估計實際上用了Moment-matching,現在我們也可以用Moment-matching去估計Implicit 概率模型。
比如我有一個數據的訓練集,模型裡面可以採樣出來一個訓練集。現在做一個檢驗。這兩個數據集是不是符合同樣的分布。如果符合同樣的分布,就說明我的數據分布和模型的分布是一致的。如果不符合兩個就是有差別的。我們可以把差別來做一種距離的度量。來指導我們優化網絡找到一個更好的。這裡面叫MMD。可以保證到最後得到的是我們想要的一致的解。這是深度生成模型裡面一些基本的任務和相關的問題。這裡面大概列了我們團隊從2014年開始做的:
關鍵點一:根據算法,怎麼樣構造一個好的學習準則來幫我們訓練網絡。
關鍵點二:怎麼用深度神經網絡模型幫助我們更好的去訓練。
Moment-Matching DGMs
我們在學習implicit模型的時候GAN不是唯一的方法。我們還有Moment-matching這一經典方法。一個簡單的變量通過神經網絡。可以用relu這種卷積網絡或者用其他網絡。經過變化之後可以達到你生成數據的目的。有了這個網絡,假如參數給你了。你可以採樣先驗分布。當天有一組參數,實際上可以通過採樣先驗分布得到無窮的訓練樣本。從模型裡面生成無窮多的樣本。這個樣本和訓練集做比較。我們可以定一個Kernel MMD的準則,這個是在泛函空間(希爾伯特)裡面得到定義。
如果你Kernel 表達能力很強,你可以保證這個距離等於零的話,這兩個分布是一樣的。你的模型分布和數據分布是一樣的。這是一個基本條件。在這種條件下,就可以不斷優化,找到更優的深度神經網絡、這裡面因為是生成的模型,你也可以用來計算梯度。
原來的技術都可以擴展到這個裡面。這是團隊2015年的一些工作。
可以幫UMLD來做條件模型,也就是條件概率的估計。因為條件概率我們在很多場景下是受關心的,比如要做預測,預測就是給你一個輸入再算一個條件概率。另外你可以做Conditional Models,比如你做image capture,你輸入的是一個圖片生成的一個文本。或者反過來。這是條件的生成。更可以用Conditional 的分布構造一個大的網絡比如貝葉斯網絡。本質上就是條件分布祖海在一起。所以如果你能夠估計這種條件模型的話。對於有圖結構的模型都可以去估計。我們做了基本的Conditional 的去估計。
這個思想和前文中提到的, Moment-Matching的思想是一樣的。可以定一個條件的生成模型。你的輸入是有一個隨機噪聲。另外加上其他條件,比如條件文本或者是圖片。後面經過神經網絡變化得到輸出的樣本。這是我們從模型裡面生成的XY的變量。訓練集裡面的擔憂XY。現在就是定一個準則來去評判兩個數據集到蒂是不是符合同一個分布。這裡面我們定義(We define conditional max-min discrepancy (CMMD):),如下圖:
在泛函空間裡面定義。它可以保證當你的kernel足夠強大的時候,距離等於零的時候,兩個分布嚴格一致。這個可以用來做估計。
細節做不展開:
這裡有一些結論可以和原來沒有conditional有一些泛化。如果原來MMD可以用舉證寫出來。這裡有單位是一的矩陣。當一矩陣變成C1, C2, C3,C1, C2, C3表示了你屬於條件變量的信息,所以從這個一上很直觀的看出來你要考慮條件,反映了條件變量的影響。最終你的模型是更加靈活。
算法就不詳細介紹了主要是BP to compute the gradients。
這是結果,做預測分類,在2016年的時候單個模型和最好的模型比也是有競爭力的。
你可以做條件的生成,
有一個比較有意思的是 Dark Knowledge ,從一個大的網絡裡面提取一些信息。
這裡面可能有很多個大模型。我們用貝葉斯的觀點來看,將很多個大模型平均起來,很難,所有一個Bayesian Dark Knowledge ,就是我不顯示運算。我可以學習一個模型去近似貝葉斯的運算。原來非常複雜我用一個簡單網絡而去模擬它,來做輸入輸出的映射。
這樣,對於運算,和我們之前講的conditional model是一致的。可以用前面講的準則去實現這個任務。和完全貝葉斯推斷得到的結果。你學一個簡單的網絡的話。你可以逼近它,因為精度基本上沒有太多損失。下圖是一個任務。
這是關於怎麼去應用深度生成模型。
Semi-supervised Learning
先定義GAN。
我們有一個生成網絡,一個判別網絡,兩個網絡的對抗。生成網絡就是從白噪聲通過神經網絡來變換,得到真實的數據。判別網絡從機器學習的角度來說是一個最簡單的分類器——二分類。如果我們的數據從訓練集裡來的,那我就標註成1,如果是模型來的就標註成0,如果告訴你的話。大家都會做到。
GAN對於判別器來說,是有監督的學習。因為知道真實的數據是哪些。
目標函數是對判別模型最大似然估計,如果你的數據標註成1,是的輸出1的概率最高,如果標註成0就是零的概率最高。可以用 cross-entropy ,但是從分類的角度可以西環城很多loss.
我可以定義不同的GAN。
對於生成模型主要意圖是去欺騙,使得生成的數據儘量能夠被分成1。最大化分成1的概率。所以放在一起就是一個想去分類,一個想去欺騙分類。
所以就是Minimax objective function
它有些結果,你可以分析它的最優解(Optimum)。也可以得到所謂的Max均衡。
如何應用到Semi-supervised Learning中呢?
主要目的是我標註的數據很少。比如我給你一個紅色的一個藍色的你可能會告訴我最優分離超平面是在中間。
如果是這種分布你可能會懷疑原來那個分離面是不是最優的。你可能會說下圖的更好。這是一個非常直觀的例子,未標註的數據可能包含一些信息。對我們做分類是有用的。怎麼樣抽取未標準數據的信息,幫助我們來做半監督學習。
現在深度學習的進展,解決了表示的問題。在半監督學習裡表示也很重要。你用不同的表述會得到不同的分類結果。如下圖,所以怎麼樣去學習一個表示在這種半監督的場景下。
下圖是團隊去年的工作,叫Triple Generative Adversarial Nets,想法也很直觀,GAN是無監督學習。去估計數據密度是不是和模型密度一樣。我有XY有輸入輸出,但大部分情況Y不知道,所以要考慮Y的概率分布。我們的目的就是要學 ,有沒有聯合分布。和GAN的目標一樣。希望數據和聯合分布的數據是一致的。兩個達到平衡的時候是相等的。
這是我們的目標,我們的目標定義清楚之後如何實現?
兩個變量聯合分布,我們可以用兩種變量來分解它。這是兩種分解形式
出品:譚婧
美編:陳泓宇