lecture14 RBM的堆疊、修改以及DBN的決策學習和微調——Hinton課程

轉載自https://www.cnblogs.com/shouhuxianjian/p/4529168.html

這是Hinton的第14課,主要介紹了RBM和DBN的東西,這一課的課外讀物有三篇論文《Self-taught learning- transfer learning from unlabeled data》和《A Fast Learning Algorithm for Deep Belief Nets》以及《To recognize shapes, first learn to generate images》。(ps:在下文中樣本和採樣來自同一個英文單詞,泛化和生成來自同一個單詞,在基於自己的理解的情況下選擇不同的翻譯意思,如果某一個覺得不通順,可以換另一個意思)

 

一、通過堆疊RBM來學習層級特徵

在這部分,將會介紹一個不同的方法去學習sigmoid置信網,這個不同的方法以一種沒法預料的方式來達到目的,Hinton停止了在sigmoid置信網上的研究轉而研究玻爾茲曼機了,然後發現了RBM可以以相當高效的方式學習。這樣的一個RBM,可以用來學習一層非線性特徵。可以將這些學到的特徵視爲數據,然後採用另一個RBM來對這些特徵之間的相關性進行建模。可以接着這樣做,進行堆疊RBM來學習許多層級的非線性特徵。這最後會導致在DNN中一個巨大的復興。不過問題也會隨之而來,一旦你堆疊了許多RBM,每個RBm學着將之前的玻爾茲曼機生成的激活的特徵模式進行建模。如果你只有一組分離的RBM或者他們能夠被組合成一個模型嗎?現在任何人可以期望說如果你將一組RBM結合起來形成一個模型,你得到的就是一個多層玻爾茲曼機。然而,Hinton的一個聰明的碩士生叫做G.Y.Tay,指出這不是你得到的,你得到的知識一些看上去更像是一個sigmoid置信網的東西罷了。這臺令人驚訝了,因爲事實上這算是解決了如何學習深度sigmoid置信網的問題,通過先放棄它,然後專注於學習像玻爾茲曼機這樣的無向模型。

使用這個對於RBM有效的學習算法,訓練一層直接輸入像素得到的特徵是很容易的。我們可以這些特徵檢測器的激活的模型作爲是否他們是像素,然後在第二個隱藏層中學習另一層特徵。我們可以這樣重複許多次,每個新的特徵層是爲了對下層中的特徵的相關激活值進行建模的。這被證明是每次我們增加另一層特徵,我們就提升了某些結合的模型生成數據的log概率的可變的下限。證明是很複雜的,而且只有你在做一些正確的事情的時候纔會用到,在實際操作中你用不到。不過這個證明是非常令人欣慰的,因爲這說明某些有意義的事情在當你像這樣堆疊RBM的時候會發生。這個證明是基於介於RBM和一個無窮DBN的一個簡潔的等式。

所以上圖是關於當學習兩個RBM的時候發生的事情,其中的RBms是一個在另一個上面,然後將它們結合起來作爲一個總的 模型,這被稱之爲一個DBN。所以首先學習一個玻爾茲曼機極其擁有的權重,一旦訓練好了,當這個模型收到數據的時候,我們就得到了這個玻爾茲曼機的隱藏激活模式,我們將每個隱藏激活模式作爲數據來訓練第二個玻爾茲曼機。所以我們只是複製了這個二值狀態到第二個玻爾茲曼機,然後我們在學習另一個玻爾茲曼機。現在一個有趣的事情就是,如果我們學完第二個玻爾茲曼機,W2是W1的轉置,而且在V中的單元數和h2中的單元數一樣,那麼這第二個玻爾茲曼機將可以是h1的一個很好的模型,因爲這就是第一個模型的上下顛倒而已。對於一個RBM,不關心哪個叫做可視部分,哪個叫做隱藏部分,這只是一個二分圖。在我們學好這兩個玻爾茲曼機,我們可以將它們組合起來去形成一個模型,而這個單獨的模型如上圖右邊。他的頂層兩層調整成和頂部的RBM一樣,所以這是一個有着對稱連接的無向模型,不過它的底部的兩層是一個類似sigmoid置信網的有向模型。所以我們所做的就是考慮介於v和h1之間的對稱連接,然後扔掉這些上行部分,只保留下行部分(往上和往下的方向)。爲了理解爲什麼這麼做是很複雜的。生成的結合模型明顯不是一個玻爾茲曼機,因爲他的底層的連接不是對稱的。這是一個圖模型,我們稱之爲DBN,這裏的更低層看上去像sigmoid置信網,頂兩層形成一個RBM,所以這是一種混合模型。

如果我們要使用3個玻爾茲曼機呢,我們就得到一個如上圖右邊的混合模型,頂兩層仍然是一個RBM,下面的層是想sigmoid置信網的有向層。爲了從這個模型中生成數據,正確的處理過程是:首先,在頂層的RBM中的h2和h3之間進行迴向和前向操作來達到熱平衡,這涉及到交替的Gibbs採用,並行的更新h3中的所有單元和並行的更新h2中的所有單元,然後往回並行的更新h3中的所有單元,然後這樣依次往復很長一段時間直到你在頂層的RBM中達到了平衡的採樣。所以頂層的RBM是定義h2的先驗分佈的。一旦完成之後,你簡單使用這個生成的連接w2從h2下到h1,然後不論你在h1中得到的二值狀態是什麼,你接着下行用權重w1去得到生成的數據。所以我們執行一個從h2開始的自頂向下的傳播,去得到所有的其他層的狀態,就像在一個sigmoid置信網中一樣。上圖中紅色的自底向上的連接不是這個生成模型的部分,他們實際上是對應權重的轉置,所以他們是w1的轉置和w2的轉置,他們被用來影響這個模型的,不過他們卻不是這個模型的部分。

現在,在解釋爲什麼堆疊玻爾茲曼機是個好idea之前,需要先交代均化兩個階乘分佈是什麼意思,當均化兩個階乘分佈的時候也許會讓你驚訝,因爲結果得不到一個階乘分佈。這裏的均化的意思是得到分佈的混合結果,所以先隨機的挑一個,然後你從挑選的這個中進行生成,所以你得到的不是一個階乘分佈。假設我們有一個有着4個隱藏單元的RBM,並假設我們有一個可視的向量,在給定這個可視的向量的基礎上,基於這四個單元的後驗分佈是階乘。我們假設這個分佈是的第一和第二個單元的概率是0.9,剩下的兩個單元打開的概率是0.1。這裏的階乘是在這個分佈中的一個樣本上前兩個單元同時打開的概率是0.81.現在假設我們有一個不同的可視向量v2,基於同樣的四個隱藏單元的後驗分佈是0.1,0.1,0.9,0.9,這裏這麼挑是爲了計算方便。如果我們對這兩個分佈進行計算,每個隱藏單元的平均概率就是每個分佈的均值的均化結果,也就是0.5,0.5,0.5,0.5,不過你得到的不是一個基於這四個概率定義的階乘分佈。爲了見證這個事實,考慮基於隱藏單元的二值向量1,1,0,0。在v1的後驗中,概率爲0.9^4,這是因爲0.9×0.9×(1-0.1)×(1-0.1)=0.43。在v2的後驗中,這個向量卻完全不一樣。它的概率是0.1^4,如果我們對這個具體的向量進行均化這兩個概率,我們得到的概率是0.215,這比通過均值爲0.5的階乘分佈指派給向量1,1,0,0 的概率大多了,因爲它的概率是0.5^4,明顯小多了。所以這裏的重點是當你均化兩個階乘後驗,你得到的混合分佈不是階乘

現在讓我們看下爲什麼貪心學習可以work,這就是爲什麼這是學習RBM的一個好方法,然後學習第二個RBM,對第一個的隱藏單元的激活模式進行建模。底層RBM的權重實際上是定義了四個不同的分佈。當然了,他們以相同的方式來定義。所以第一個分佈是在給定隱藏單元的基礎上可視單元的概率。第二個就是在給定可視單元的基礎上隱藏單元的概率,這就是要使用的兩個交替的用來給馬爾可夫鏈在給定隱藏的時候更新可視,在可視的時候更新隱藏。如果我們運行這個鏈足夠長時間,我們可以從v和h 的聯合分佈上得到採樣。所以這個權重清楚的定義着聯合分佈,同樣可以更直接的定義這個聯合分佈,通過使用(e-能量)這樣。不過對已有着許多單元的網絡來說,我們沒法這樣計算,如果你需要聯合分佈p(v,h),你只需要忽略v,這樣就得到了關於h的分佈。這就是基於h的先驗分佈,通過RBM來定義的;同樣的,如果我們忽略h,我們就得到了基於v的先驗分佈,是由RBM定義得到的。現在,我們從這四個分佈中提出了一個相當令人驚訝的分佈對,我們定義這個由RBM指派給一個可視向量概率,使得該可視向量作爲所有隱藏向量概率的和,等於h乘以給定h的情況下v的概率。這看上去像一件愚蠢的事情,因爲定義p(h)就和定義p(v)一樣難,不過我們還是可以以這種方式來定義p(v)。現在如果我們不管p(v|h),而是學習p(h)的更好的模型,也就是,學習一些新的參數可以讓我們得到一個p(h)更好的模型,然後用p(h)更好的模型替代舊的部分。這樣我們就能夠提升 v 的模型了。我們的意思就是通過一個更好的p(h)的模型,來更好的擬合聚合後驗。這個聚合後驗是均化所有的基於h得到的後驗分佈的訓練集合中的向量。所以,我們要做的就是使用我們第一個RBM來得到這個聚合後驗,然後使用我們第二個RBM來建立一個比第一個RBM的聚合後驗更好的模型。如果我們將第二個RBM作爲第一個的上下顛倒,它就會和第一個RBM一樣有着相同的聚合後驗模型。然後,如果我們改變這些權重,我們就可以讓結果變得更好。所以這就是一個當我們堆疊起RBM的時候發生的事情的解釋。

一旦我們學會了堆疊玻爾茲曼機,然後將它們結合成一個模型形成DBN。然後我們就能對整個模型進行微調,通過使用wake-sleep算法的一個變種來實現微調。所以首先我們通過堆疊RBM來學習層級特徵,然後我們想要微調自底向上的識別權重和自頂向下的生成權重來得到更好的生成模型,我們可以通過使用三個不同的學習路線來完成這個事情。

首先,我們使用一個隨機自底向上的傳播,然後調整更低層中自頂向下的生成權重使得更好的重構下面層中的特徵激活值,這就像在標準的wake-sleep算法中一樣,然後在頂層的RBM中,我們進行迴向和前向調整好幾次,從這個RBM中採樣隱藏的和RBM的可視的部分,然後接着隱藏部分,以此類推。所以這就像是RBM的學習算法一樣。

在完成了多次的這樣的迭代之後,我們接着使用對比離散(CD,contrastive divergence)學習。也就是 我們使用相關性之間的差異來更新RBM的權重,也就是RBM的第一次激活時得到的相關性和在迭代了多次之後RBM中得到的相關性。我們通過使用這兩個的差異來更新權重。

然後第三階段,我們通過更低層的單元來得到頂層RBM的可視單元。然後,我們通過做一個自頂向下的隨機傳播,就像sigmoid置信網一樣。然後從這個sigmoiud置信網中得到一些生成的數據,我們調整這個自底向上的比率使得更更好的重構上層中的特徵激活值。所以這就像是wake-sleep算法中的sleep階段。介於標準的wake-sleep算法與該算法之間的差別在於這個頂層的RBM的行爲就像是基於頂層有着比之前通過一個sigmoid置信網得到的單一層中的假設獨立的單元有更好的先驗。同樣的,不通過對先驗採樣來生成數據,而是通過訓練樣本,上行到頂層RBM,然後在生成數據之前運行一段時間的迭代來得到。

所以現在來介紹一個例子,我們首先學習一些RBM然後堆疊起來,然後使用對比版本的wake-sleep算法來對他進行微調,然後觀察得到的結果。如果我們用來識別東西,這還是一個生成模型嗎?首先,我們使用500個二值隱藏單元來對28×28大小圖片的10個數字類進行建模,一旦學好了第一個RBM(28*28-500),這時候還沒用到標籤,所以這是無監督學習。接着我們使用這500個隱藏單元中的激活模式,將它們視爲數據,然後學習另一個有着500個單元的RBM,這兩個RBM的學習都沒用到標籤。一旦完成之後,我們在告訴整個模型標籤是什麼,所以前兩個隱藏層是沒有標籤的,然後加一個大的頂層,然後給他10個標籤,你可以認爲我們將這10個標籤和500個用來表示特徵的單元級聯起來,另外,這10個標籤是一個softmax單元。然後我們訓練頂層的RBM來對這10個標籤的softmax單元和這500個特徵激活單元的級聯進行建模。一旦我們訓練好了頂層的RBM,我們就能通過使用對比wake-sleep對整個系統進行微調了。然後就會有一個非常好的生成模型,在前面引言部分中介紹過了,如果返回頭找找的話,你就能看到當我們運行這個模型的時候發生的事情,也可以看到它是如何擅長識別和生成的,在那個部分中,Hinton曾說過最後會解釋這個模型是如何work的,現在認爲你已經看得足夠多了應該知道當這個模型學習的時候發生的事情了。

二、DBN的判別式微調

在這部分將會介紹如何通過堆疊RBM來學習DBN,然後將DBN視爲DNN來進行判別式的微調,所以不是爲了讓微調使得像之前介紹的有更好的生成(或者泛化),而是微調來使得更好的在類別之間進行判別,這很work而且引起了在NN中的一個大復興。在語音識別中,這有着重要的影響,而且在語音識別領域的許多領導團隊都轉到使用DNN來減小誤差率。

現在先介紹微調這些深度網絡來更好的判別。所以我們先通過堆疊的RBM一次學習一層特徵,然後將這個視爲預訓練來尋找這些深度網絡的一個很好的權重初始化,然後使用一些局部搜索方法來進行微調這些權重。在之前,介紹瞭如何使用對比版本的wake-sleep算法來微調一個深度網絡使得能夠更好的泛化他的輸入。在這部分中,將會使用BP來微調一個模型使得能夠更好的判別。如果我們這樣做而且克服了BP的一些標準的侷限性,就能使得學習深度網絡變得更加簡單,而且可以使得這些網絡更好的泛化。

我們需要理解爲什麼BP在我們預訓練權重之後能夠更好的work。這有着兩個影響:一個是在優化上,另一個是在泛化上。所以這個預訓練在當我們有很大網絡的時候,特別是每一層都有位置(locality)的時候可以很好的縮放(scales)。所以如果我們做的是視覺而且我們在每一層都有着局部感受野,那麼在廣泛的分離的位置上就沒有太多的交互。所以在並行上或多或少的學習一個大層就很容易了。當我們使用預訓練的時候,我們在已經學到有意義的特徵檢測器之前都不會使用BP,這些特徵檢測器對於判別來說都是很有幫助的。所以這個最初的梯度可以比之前使用隨機得到的更有意義。而且BP不需要做全局搜索,它只需要從一個有意義的起始點開始進行局部的搜索。

在爲了讓優化變得更容易之外,預訓練網絡可以有更少的過擬合。這也就是因爲在最終的權重中大多數的信息來自於輸入向量分佈的建模。如果你處理的是像圖片一樣的數據,這些輸入向量通常包含許多比標籤還多的信息,一個標籤通常只包含了一點信息用來約束從輸入到輸出的映射。然而一個圖片包含着信息,它們卻會約束任何圖像集合的生成模型。在標籤中的信息之用來在最終的微調上,因爲這個階段我們已經決定好了特徵檢測器,我們不會浪費之前從scratch(這個單詞也許是字幕有誤,忽略的話也不影響理解)中設計的特徵檢測器的信息。這個微調只會導致在生成的預訓練階段得到的特徵檢測器的輕微的改變,這些改變需要在正確的空間中得到類別邊界。重要的是BP不需要發現新的特徵(意思就是BP只是用來微調,我們不產生新的特徵,我們只是特徵的修改者),所以它不需要和數據一樣多的標記(個人:這裏意思是許多無標籤數據用來預訓練,一小部分標籤數據用來微調)。事實上,這種類型的學習可以很好的在大多數數據都沒有標籤的時候work,因爲這個生成的預訓練可以可以使用這輕量級的數據。無標籤數據仍然對尋找好的特徵來說非常有用。有一個顯而易見的異議就是當我們使用生成預訓練的時候,我們會學習許多對於具體的判別式任務來說是無用的特徵。例如,考慮你需要網絡在形狀之間進行判別,或者你想要在一個形狀的不同的姿勢之間進行判別。他們需要非常不同的特徵,如果你預先不知道這個任務,你就會不可避免的學習那些沒用的特徵。當計算機變得越來越小,就會有個嚴重的異議。不過現在計算機是足夠大的,我們可以滿足之前沒法使用的特徵的學習。我們可以滿足是因爲幾乎所有的學到的特徵中許多特徵都是比原始輸入更多更有用,而且也多於一些對於具體任務來說不感興趣沒有用的特徵。

所以讓我們用這些來對數字進行建模,我們先完全無監督的學到三層隱藏層的特徵,一旦學習完成,當我們要從這個模型中生成的時候,它會生成那些看上去很真實的數字的東西,而且它可以從所有的這些不同類中生成他們。而且它通常在從一個類別轉到另一個類別的時候需要一段時間,因爲它傾向於在跳躍到另一個峽谷之前停留在同一個峽谷一段時間。不過問題就是,我們學到的這些特徵對於判別來說有用嗎?所以我們所需要的就是增加一個最終的10通道softmax在頂部,然後用BP來對它進行微調,然後看是否做的比之前純判別式訓練更好。

所以這裏就是排列不變的MNIST任務的結果。我們說的排列不變的意思是如果我們使用所有像素的一個固定的隨機排列,對於每個測試和訓練樣本都是同樣的排列,我們算法的結果就不會變。很明顯這對於CNN來說不正確。一個CNN是會被告知這個任務的一些事情(也就是模型本身包含的信息)。通過音樂這個固定的排列,我們摧毀了所有簡單方式,那些用來告訴網絡一些有關這個任務空間屬性的信息的方式。所以如果你使用標準的BP結果很難超過1.6%錯誤率。John Platt和Hinton都努力在不同的結構上使用標準的BP,結果顯示都還不錯。你沒法通過在隱藏單元的引入權重向量上加上約束來使結果超過1.6%.。如果你在引入的權重向量的長度上使用一個合適的約束,你就可以做的比1.6%結果更好。SVM可以得到1.4%。這是SVM可以取代BP的一個證明。如果你使用玻爾茲曼機的堆疊來進行預訓練一個網絡,然後接着進行微調,使得更好的生成數字和圖像標籤的聯合密度,那麼你就能得到1.25%的結果。如果你訓練一個堆疊RBM,然後簡單的加上10-way的softmax,然後進行微調,你就能得到結果爲1.15%,在加入更多的周邊的擺動(fiddling around),你可以將 結果達到1%..所以你可以做很多比標準BP更好的結果,同樣可以使用生成預訓練然後使用判別式微調來比SVM做的更好。

Mackerie Yerenzato 在Yann LeCun的團隊工作,同樣顯示,使用輕微的不同的預訓練模型,這個預訓練有助於對更多的數據和更好的先驗進行建模,所以他們使用額外的60000個扭曲的數字圖像,所以他們有更多的訓練數據。他們同樣使用卷積多層網絡。yan的團隊在調整參數上是最好的團隊,通過BP,他們成功的將結果降到了0.49%。但他們通過來做無監督逐層預訓練,然後使用BP之後,結果達到了0.39%,這是一個記錄。

所以你可以記住這張圖,這是第一課中的,這是一個在NN上成功的例子。之前說,可以通過預訓練然後進行BP微調使得結果降到20.7%,之前,在這個上面的記錄是24.4%,而這實際上是需要均化好幾個不同的模型纔得到的。微軟研究院的li deng立馬提升了這個結果,然後一起合作來提升它,這使得在語音識別中有很大的改進。如果你看過這個新聞,(上圖中的鏈接),它可以讓你連接到一個博客上,微軟的首席研究員的談話,關於語音識別上由於DNN帶來的的巨大提升。

三、在判別微調的時候發生了什麼

這部分將會介紹當一個NN在進行判別式微調的時候的時候發生的事情。我們將會看到在下層中的權重幾乎沒改變。不過然而這些微小的改變還是會在NN分類效果上有着巨大的影響,因爲他們將決策面放到了正確的位置上。我們同樣可以看到預訓練的影響是讓更深的網絡比淺層網絡更有效。在沒有預訓練的情況下它通常就是另一個情況了。最終,得到了一個相當普遍的想法就是爲什麼開始通過生成式訓練,然後只在這樣很好的完成之後使用判別式的訓練是有意義的。

現在來看下Yoshua Bengio他們實驗室的工作,檢查了在網絡已經被生成的預訓練之後微調發生的事情,如果觀察上圖左邊,是第一層隱藏層也就是特徵檢測器的感受野,在生成預訓練(generative pre-training)之後,而在微調之前;右邊的是同樣的感受野,不過是在微調之後,你可以發現幾乎沒有什麼改變。不過這些改變有助於判別。

這是一個關於預訓練如何減少只有一層隱藏層網絡的測試誤差的例子(上圖左邊部分),任務是判別一個非常大的扭曲數字集合裏面的數字。可以發現在微調自豪,這個通過預訓練得到的網絡幾乎總是比沒有預訓練的網絡效果要好。如果使用的網絡層數越深,影響越明顯。(接着來看上圖右邊)你可以發現基本上在兩個分佈之間幾乎沒有重疊。預訓練的深度網絡比淺層網絡更好,而沒有預訓練的深度網絡卻比淺層網絡更糟糕。

(上圖左邊)這是展示在不同的層數下分類的錯誤和錯誤的變化,你可以發現有兩層是最好的,觀察有4層的結果,你發現結果更差了。通過對比(上圖右邊)如果你使用了預訓練,4層的結果會好於2層的結果,有着更少的變化而且錯誤率更低。

這是有Teeson製作的可視化圖,關於在有預訓練和沒有預訓練的時候網絡的權重,他們都被畫在了同一個空間中,不過你可以發現他們在網絡中形成了兩個不同的類別。頂層的那個是沒有預訓練的,下面那個是有預訓練的,每一個點顯示函數空間中的一個模型,比較權重向量是沒意義的,因爲兩個網絡可以通過循環的交換兩個隱藏單元來區分。所以他們的行爲都是一樣的方式,不過權重看上去非常的不同。爲了將它們進行對比,你需要比較執行函數。一種方法是使用一個合適的測試樣本然後觀察網絡在這些測試樣本上的輸出結果。然後將這些輸出連接到一個長向量中。所以如果兩個網絡生成非常的相似,那麼這個鏈接的向量將會非常相似,現在你使用這些連接的輸出向量然後用t-SNE畫在2d上。顏色說明了訓練的階段,所以觀察頂部這個網絡,是黑藍爲初始,然後看到他們都吵着同一個方向粗略的移動。換句話說,網絡在一個epoch的訓練之後,會比初始化的時候更像另一個網絡(意思就是殊途同歸)。從底部這個網絡上能夠看出,這個現象更加的明顯。所以顏色是爲了說明你現在處在哪個epoch中。頂部的這個沒有預訓練的軌跡顯示不同的網絡會在函數空間中以不同的位置結束,而且他們相當的分開,底部的這個有預訓練的軌跡顯示,是以一個相當不同的函數空間區域結束的。這個網絡傾向於它們之間更加的相似。不過這裏的重點是他們沒有重疊,如果你生成式的預訓練這個網絡,你會發現這種答案是相當不同於你以隨機權重開始的。

最後想要說的就是解釋爲什麼預訓練是有意義的。先想象下我們生成一個圖像和標籤對的方法,是通過在真實世界中從stuff中得到的,使用這個來生成一張圖片,例如拍照。然後在有了一張圖片之後,我們給它貼上標籤,而這個標籤不是由stuff來決定的,所以對於圖片自身來說,世界中的stuff是與這個標籤相關的,因此依賴於圖片中的像素。例如,如果標籤告訴我們關於頂部左邊的像素相似於右下角的像素,現在如果以這種方式來生成圖片,那麼就可以有意識的試着學習圖片到標籤的映射。(上圖右邊)因爲標籤直接依賴於圖片,不過事實上,這是直接有我們生成圖片標籤對的方式決定的,通過世界中的stuff直接得到的圖片。這個圖片有名字的原因是因爲世界中的stuff,而不是因爲圖片中的像素。所以你看到一個奶牛,然後拍照,你稱這個圖片爲奶牛,因爲你拿着圖片的時候看到一個奶牛。現在重點是,有一個stuff的高帶寬從世界到圖片上,而且有一個stuff的低帶寬從世界到標籤。例如,如果說奶牛,你不知道這個奶牛是否是上下顛倒的,它是否是棕色的,黑色的,還是白色的,是否是活的還是死的,多大,圖片中還有其他什麼東西,它是面對着你還是背對着你。這些事情都不是從標籤上看得出來的。如果你觀察一張千乘以千像素大小的圖片,你通常會知道所有的這些疑問。你得到的很多信息是因爲一張圖片,通過觀察圖片,然後觀察圖片的標籤。所以在這種情況下,對於有着從世界到圖片的高帶寬路徑和從世界到標籤的低帶寬來說,因爲標籤通常包含的信息很少。試着還原標籤是很有意義的,首先通過將高帶寬路徑轉換回到引起這個圖片的真實世界中的stuff,然後再來決定應該用什麼標籤。所以這所以一個更合理的模型關於如何將名字賦予圖片中的東西。這交代了一個你試着從圖像到他潛在的原因的預訓練階段,然後跟着一個你試着從前在原有到標籤的判別階段。接着輕微的微調這個從圖片到潛在的原因的映射。

四、用RBM來對實值數據進行建模

在這部分中,將會介紹如何用RBM來對實值數據進行建模。idea就是讓可視單元中用帶有高斯噪音的線性單元替換原來的二值隨機單元。當我們想要這麼做的時候,我們就會遇到有關學習的問題,結果顯示一個很好的解決方法就是讓隱藏單元變成ReLU。在對於可視部分的線性高斯單元,和隱藏層的ReLU,學習一個對於實值數值很好的建模的RBM是相當容易的。

我們首先使用RBM來對手寫數字圖像建模,對於這些圖像來說,由那些部分被着色的像素引起的中等的強度可以通過概率來很好的建模,也就是用介於1和0之間的數值,也就是用來表示這個邏輯單元被打開的概率。所以我們將部分着色的像素作爲着色的概率,雖然這不正確,不過卻work。然而,對於真實圖片來說,這就不work了,在真實圖片中,一個像素的強度幾乎總是差不多等於它的周邊的均值。所以會有很大的概率是與這個均值很接近,很小的概率是與離他很遠的地方很接近,而且你沒法通過一個邏輯單元來獲得這樣的結果。平均場邏輯單元沒法表達像強度這樣的東西,比如要表達0.69,而不是0.71或者0.67.所以我們需要另一種單元。

顯而易見的事情是使用一個帶有高斯噪音的線性單元。所以我們將像素作爲高斯變量來建模,我們仍然可以使用交替的,採樣來運行需要交叉發散學習的馬爾可夫鏈。不過我們需要使用一個更小的學習範圍,否而它就會傾向於爆炸。等式就如上圖所示,等式右邊的第一項是一種包含拋物線的函數,它阻止事情的爆炸,所以通過第i 個可是單元來決定這個的和分佈是一個拋物線形狀。它看上去如上圖紅線。這是一個在第i 個單元的偏置處有這最小值的拋物線。如果第i 個單元原理這個值,我們就二次增加能量,所以這是爲了保持第i 個可是單元能夠靠近bi,這個介於可視單元和隱藏單元之間的交互項如公式最後一項,如果你對他關於i 的微分,你可以發現,結果是常量。就是基於所有的hj wiji乘以vi /sigma  j 的和。所以這一項的常量梯度如上圖藍色線。當你將他們加起來的時候,這個自頂向下的分佈到能量的結果是線性的,你得到的一個拋物線函數不過他的均值是遠離bi 的。不過到底遠離多少是由藍線的坡度決定的,所以隱藏單元的影響是爲了將均值推送到另一邊。

可以很容易的寫下一個能量函數,而且很容易對他進行求導,不過當我們要對他進行學習的時候,我們通常會遇到問題。在文獻中有許多的報告顯示人們沒法讓高斯二值RBM工作起來,的確,對可視單元的緊湊方差進行學習是很困難的。需要花很長時間來指出爲什麼學習這些可視方差是這麼困難。這張圖片會有幫助的,如果你考慮在隱藏單元 j 上的這個可是單元 i 的影響,當這個可視單元 i 有一個很強的標準差sigma i ,這會放大自底向上的權重的影響,這是因爲我們需要測量帶有標準差的 i 的激活值。所以當這個標準差很小,我們需要用較大的數乘以這個權重。如果觀察在單元i 上單元 j 的自頂向下的影響,這是通過sigma i與之相乘的,所以當這個可視單元 i 的標準差很小,自底向上的影響會放大,自頂向下的影響會縮小。結果就是我們會有一個爭論,是自底向上的影響太大還是自頂向下的影響太小。結果就是這個隱藏單元傾向於一直固定打開或者關閉,這會影響學習的進程,所以解決方案就是使用比可視單元更多的隱藏單元,這允許介於可視單元和隱藏單元之間的小權重可以有着很大的自頂向下的影響,不過當然,我們真的需要隱藏單元的數量改變使得標準差sigma i 變得更消耗。在下面這個ppt,我們可以看到我們如何做到的。

這裏介紹加強sigmoid單元,idea就是我們會對每個隨機二值隱藏單元進行多次的複製。所有的複製品都有相同的權重,相同的偏置,不過這個自適應偏置b,有一個固定的偏移,第一個單元的偏移是-0.5,第二個單元的偏移是-1.5,第三個單元的偏移是-2.5,以此類推。如果你有整個像這樣的的sigmoid家族,它的偏置是通過介於周邊成員按照1 來改變的。響應代碼如上圖的曲線所示。如果結果中的總和是非常低的,那麼就沒有單元會被開啓。隨着增長,打開的單元的數量也在線性增長。意思就是就像之前的ppt中說的標準差越來越小,每個隱藏單元的複製數量,那些打開的單元數就會越來越多,而且我們獲得了我們想要的effect,我們會得到更多的自頂向下的影響來驅動這些有着小的標準差的可視單元。

現在,使用一個大的有着偏移偏置的二值隨機單元羣體是非常不划算的,因爲對於每個單元來說,我們需要把總的輸入給這個邏輯函數。但是我們可以使用一些快速的逼近值,它們一樣可以很好的work。所以整個有着偏移偏置的sigmoid單元羣體的激活值的和,如上圖中的那個公式一樣,等於逼近log(1+ex),而這又等於逼近max(0,x+noise)。如果我們想的話,可以對x增加一些噪音。所以這個等式中的第一項看上去上圖中第一個圖(就是第一個是多條曲線,第二個是單條曲線,第三個是綠色曲線)第二項像上圖中第二個圖,你可以發現在第一項中所有的這些sigmoid的和像第二個圖,我們可以通過一個線性的有着閾值的單元來逼近,這個單元有着0的閾值,如上圖綠色的曲線,他是按照他的輸入線性增長的。

CD學習在這羣有着偏移偏置隨機二值邏輯單元的和上可以很好的work,在這個情況中,你可以得到一個噪音方差,該方差等於這個邏輯函數,而不是這個和的輸出。或者,我們可以使用這個綠色曲線和使用ReLU,這個可以更快的計算,因爲你不需要使用這個邏輯很多次,可以相信用這些的基礎上,離散可以很好的work。

一個ReLU的很好的特性是如果他們有一個爲0的偏置,他們可以表現出縮放同變性,這對於圖片來說是一個非常好的特性,縮放同變性意思就是如果你有圖片x而且你通過一個縮放因子a來乘以所有的這些像素強度,那麼在ReLU中的ax的表徵可以只是a乘以x的表徵,換句話說當我們對圖像中所有的強度進行縮放的時候,我們縮放所有的隱藏的那袁的激活值,不過所有的比率還是一樣的。ReLU不是全線性的,因爲如果你將兩個圖片加起來,你得到的表徵不是每個獨立單元的表徵的和。這個縮放同變性的特性相似於CNN中的平移同變性,所以如果我們忽略CNN中的池化(pooling),如果我們平移一張圖片,然後觀察他的表徵,這個平移後的表徵其實等於未平移圖片的表徵的平移。所以在一個沒有池化的CNN中,輸入的平移就像是流過網絡的每一層而沒有真正的影響任何東西,每一層的表徵只是平移了下罷了。

五、RBM是無限sigmoid置信網

在這部分中,將會介紹一些超前的東西。這對於NN的第一次課程來說不合適(就是接受一次NN的教育不能理解本部分的內容),不過Hinton這部分就是專門爲那些對DL特別感興趣的人留的。這部分的內容非常的具有數學性,所以就不堅持放入教學中了。之前層說過堆疊RBM可以得到例如sigmoid置信網一樣的東西,在那個介紹中沒有任何的數學部分,不過注意,RBM事實上就是一個有着共享權重的無限深度sigmoid置信網。再一次,權重共享可以導致很多有趣的事情。

這裏介紹一個非常有趣的關於爲什麼逐層學習會work的解釋。這依賴於一個事實,在像RBM這樣的對稱連接的無向網絡與每一層使用相同的權重的無限深度有向網絡之間有個等價。這個等價同樣讓 我們知道爲什麼CD學習會work。所以一個RBM真的只是一個有着許多共享權重的無限深度sigmoid置信網,當我們想要從RBM中採樣的時候使用的馬爾可夫鏈可以被視爲和sigmoid置信網一樣的東西。

所以這就是所需要的圖片,我們有一個非常深的sigmoid置信網,事實上是無限深度。我們在每一層使用相同的權重,並且讓所有的v層都有相同的size,而且所有的h層都有相同的size。不過v和h之間可以有不同的size。通過這樣有着重複權重的非常深的網絡生成的分佈是,你可以通過使用相同的權重矩陣W在交替的P(v|h)和P(h)|v得到的概率值而達到的平衡分佈。這就是但你使用RBM的時候,然後使用馬爾可夫鏈從這個平衡分佈中得到一個採樣所作的事情。所以自頂向下的傳播開始變得無限增大,在這個有向網絡中,也就是讓一個RBM穩定到平衡狀態,不過這會定義同一個分佈.如果你使用這個無限有向網絡,那麼你從v0得到的採樣將會是一個等價RBM的平穩採樣。

現在,讓我們看看在無限深度sigmoid置信網中的推理。我們先從v0開始,然後推論出h0的狀態。正常情況下,這是一個非常困難的事情,因爲explaining away的存在,如果隱藏單元k和j 同時都有與可視單元i 相連的很大的正權重,那麼我們就期望當我們觀察到 i 打開的時候,單元k 和j 在後驗分佈中是反相關的,這就是explaining away。然而在這個網絡中,單元k 和 j 在當給定v0的時候推導過程中是完全之間相互獨立的。所以這個推論是可以忽略的,我們只是通過W的轉置來乘以V0,然後將我們得到的傳給這個邏輯sigmoid,然後採樣。這可以得到h0中單元的二值狀態,不過問題是他們在給定explaining away現象的時候如何是相互獨立的。這個問題的答案在於這個基於h0上的模型執行的是互補先驗,即執行一個基於h0的先驗分佈,這可以完全抵消explaining away中的相關性。所以對於這裏舉的例子,這個先驗將會執行單元k 和 j 之間的 正相關,explaining away會導致負相關,所以兩者會抵消。所以真正發生的就是當我們使用w的轉置乘以v0的時候,我們不是隻計算這個似然項而已,我們是計算一個似然項和先驗項的積,這就是爲了得到後驗所需要的。這對於人們來說非常讓人驚訝。當你通過wT來相乘的時候,這就是你計算的後驗中的先驗的積。所以在這個網絡中發生的就是這個通過基於h0上的所有的stuff 執行的互補先驗,準確的抵消了explaining away ,從而使得推導變得非常簡單。所以我們可以對每一層來進行推導,然後通過簡單的WT乘以V0來得到無偏估計樣本。一旦我們計算了h0的二值狀態,我們用W與之相稱,然後將結果傳給邏輯sigmoid然後進行採樣,這會得到一個關於v1的二值狀態,以此類推。假設從這個模型中生成等於在RBM上交替的運行馬爾可夫鏈到平衡狀態。在這個模型上推論與其相反的方向是有着一樣的處理過程。這是一個非常特殊的sigmoid置信網,其中的推論是與生成一樣非常簡單的。

這裏介紹這個定義這個模型的生成權重,和他們的轉置,這就是我們推論的方法。現在這裏先介紹下如何從爲了有向sigmoid置信網的學習算法中得到玻爾茲曼機學習算法。所以這個sigmoid置信網的學習規則表示應該首先從後驗中得到一個採樣,也就是sj 和si的值,都是從後驗分佈中採樣得到的。然後改變生成權重,按照上圖第一個式子的形式,成比例的改變,其中是在給定所有二值狀態的基礎上 j 的激活值和 i 的激活值與i打開的概率之間的差異的積。現在如果說如何計算Pi ,如果看上圖右邊網絡中的這個推論,我們首先爲h0推論出一個二值狀態,一旦我們選擇了這個二值狀態,我們接着爲v1通過w×h0來推論出二值狀態,將這個結果給邏輯函數,然後進行採樣。所以如果想考慮s(1)_i 是如何生成的?這是一個當你將h0給權重矩陣w,然後給邏輯函數之後得到的採樣。這就是我們所要做的,爲了計算p(0)_i .我們需要h0中的二值激活值,然後下行通過上圖中綠色箭頭表示的權重w,接着計算在給停他的父節點的二值狀態後單元i 打開的概率。所以重點就是,從h0到v1 的這個過程等於從h0到v0之間的過程。所以s(1)_i 是一個關於p(0)_i 的無偏估計採樣。也就是我們可以在學習規則中替換它。

所以在學習規則的最後,就如上圖的幾個階梯式的式子,因爲有重複的權重,這些每一個線都是學習規則中的一項,來自於這些綠色權重矩陣中的對應的部分。對於第一個綠色權重矩陣,(上圖右邊藍色框起來的綠色箭頭),學習規則是突觸前的狀態s(0)_ j 乘以突觸後的狀態s(0)_ i 與在h0中 s i 將會打開的二值狀態的概率之間的差異,我們可以叫這個二值狀態的概率做p(0) _i ,不過這個的一個採樣的概率是s(i)_ i ,所以與之相關的無偏估計可以通過在學習規則的第一行中插入s(1)_ i 得到。相似的,對於第二個權重矩陣,(上圖右邊的紫色框),學習規則是s(1)_ i 乘以(s(0)_ j - p(0) _ j),p(0)_ j 的一個無偏估計是s(1)_ j 。所以這是這個學習規則中,對於第二個權重矩陣的無偏估計(上圖左下角紫色框)。如果你接着爲了所有的權重矩陣這樣下去,你就可以得到無限系列(如上圖左下角的無窮)。所有的這些項,除了非常前面的項和非常後面的項,其他項可以互相抵消,所以在玻爾茲曼機學習規則的最後,是s(0)_ j * (s(0)_ i - s(∞)_ i *s(∞)_  j )。

所以回頭看如何學習一個無限深度sigmoid置信網,先將所有的權重都弄成一樣的。然後將所有的權重矩陣捆綁起來,然後用這些捆綁好的權重來學習。現在這等價於學習一個RBM。上圖右邊的那個圖和左邊的這個圖是一回事。我們可以認爲左圖中這個對稱的箭頭,就是一個對有着綁定權重的有向網的便利的速記方式,所以我們首先學習RBM,然後就該去使用最大似然來學習,不過實際上使用的是CD算法。

一旦我們學好了第一個RBM,接下來就是凍結底層的權重。也就是凍結定義模型的生成權重。同樣會凍結用來推論的權重使他們成爲生成權重的轉置。所以在凍結之後,我們讓所有的其他權重綁定在一起,不過現在可以讓他們不同於底層的權重了,不過他們仍然是全部綁定的。所以學習剩下的綁定的權重是等價於學習另一個RBM,即一個有着h0和他的可視單元v1 的RBM,而這時候v1作爲他的隱藏單元,這裏數據是通過h0的聚合後的 後驗,也就是,如果我們想要採樣一個數據向量來訓練這個網絡,我們要做的就是將真實數據向量輸入到v0中,然後通過這些凍結的權重,然後在h0處得到一個二值向量,然後將這個向量視爲數據來訓練下一個RBM。可以以此類推自己覺得足夠多的層數,當疊加起來之後,在頂層的RBM的最後也就等價於這個無限有向網絡之上的其他所有權重還是綁定的(其實上面之上的那些層不存在,不過在無限角度來看就是未訓練,未改變而已),不過下層的這些權重現在都變的不同了。

現在一個解釋爲什麼這個推論過程是正確的,涉及到關於由上面層中的這些權重生成的互補先驗的idea,不過當然,當我們改變上面層的這些權重的時候,底層的權重是固定的,由這些改變的權重生成的先驗不再完全互補了。所以現在,我們的推論過程,使用底層中的這些凍結的權重,就不再正確了。好消息是,通過這個不正確的推論過程,結果卻總是接近於正確,我們仍然可以得到在這個數據的低概率上一個可變的範圍。

那些改變了的更高層因爲他們已經對底層那些接近於聚合後的後驗分佈的隱藏層學習了一個先驗,這會讓模型變得更好。所以改變這些隱藏權重會讓在底層隱藏層上的推論不正確,不過卻能得到一個更好的模型,如果看這兩個effects,我們可以證明從更好的模型中的可變範圍內得到的提升總是比從這個不是很正確的推論中得到損失要多(就是好處大於壞處)。所以在這個可變範圍中,假設是用正確的最大似然學習,當學習隱藏層中的權重的時候就win了。

現在回頭看看在CD學習中會發生什麼。我們在上圖右邊有個無限網絡和左邊有一個RBM,他們是等價的。如果我們對RBM採用最大似然學習,那麼就相當於對這個無限sigmoid置信網進行最大似然學習。不過接下來要做的就是將東西切分開。忽略從無限sigmoid置信網的更高層中得到的權重的小導數,也就是在上圖右邊在紅虛線的地方切開。現在如果看這個導數,那麼就像上圖的那個式子一樣,有兩項,第一項來自於這個網絡的底層。途中藍色框出來的這項是相互對應的,第二項來自於上圖中紫色框出來的部分,我們需要計算h1中的激活值,爲了計算第二項中的s(1)_  j ,不過這裏不計算第三層的權重導數。當計算出前兩項的時候,就將他們結合起來,這樣就得到了一次CD學習規則。所以在CD上,就是將低層的權重導數結合起來,然後忽略更高層中的權重導數(derivatives)

問題就是爲什麼忽略了更高的導數的時候結果還ok?當權重很小的時候,這個馬爾科夫鏈的混合速度很快。如果權重是0,他就可以在一步之內混合,如果馬爾科夫鏈混合的很快,更高層將會更靠近平穩分佈,即他們忘記了在底層上的輸入是什麼了。現在我們有一個很好的特性,如果更高層是從平穩分佈中採樣的道德,那麼這個關於權重的數據的log概率的導數,肯定均化成0 了,這是因爲模型中當前的權重是一個平穩分佈的完美模型。這個平穩分佈使用這些權重而生成的。如果你想從這個平穩分佈中生成採樣,這就是你可以得到的最好的權重。所以我們知道開根號結果是0,隨着權重變得越來越大,可以使用更多次的CD,這是考慮到這個無限sigmoid置信網有着更多層的情況的。這可以讓CD連續的成爲一個最大似然的很好的逼近,所以如果試着去學習一個密度模型,就更有意義了。當權重在增長,運行的CD次數會越來越多。如果有一個環繞的統計數據(就是很多數據都在這個數據周圍),先給他一個保證(個人:不知道什麼意思)然後在這個無限的約束下,運行CD差不多無限次。然後得到一個逐漸收斂的結果。當然這是完全不相關的,因爲你沒法達到一個完全收斂的點。然後這是一個有趣的點,如果我們的目的是使用CD來建立一個堆疊RBM,來學習多層特徵,結果顯示我們不需要一個最大似然的逼近。對於學習多層特徵來說,CD已經很好了。事實上,它可能做的會比最大似然更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章