1. 程式人生 > >自動編碼器、語義雜湊、影象檢索

自動編碼器、語義雜湊、影象檢索

Hinton第15課,本節有課外讀物《Semantic Hashing》和《Using Very Deep Autoencoders for Content-Based Image Retrieval》這兩篇論文

一、從PCA到AE

這部分中,首先介紹下PCA,這個方法被廣泛的應用在訊號處理上。PCA的idea就是高維資料可以用更低維度的編碼來表示,當資料位於高維空間中的線性流形(linear manifold)附近時就會發生這種情況。所以如果我們可以找到這個線性流形,我們就能將資料投影到這個流形上,然後只要表現它在流形上的位置就行了。因為在這個方向上是正交於這個流形的,所以並沒有損失多少資訊,所以資料中也沒有很多變化。正如我們看到的,我們使用標準的PCA來有效的完成這個操作,或者使用有著一層隱藏層的NN來低效的完成,這個NN中隱藏層單元和輸出層單元都是線性的。使用NN的優勢在於我們可以將它推廣到那些使用非線性函式編碼的DNN來實現。從這個編碼中得到的資料的重構同樣是這個編碼的非線性函式。這可以讓我們處理輸入空間中的曲線流形。所以我們通過將資料對映到這個曲線流形上來表現資料,這是一個更有力的表徵。


在PCA中,我們有N維的資料,然後想要使用少於N維資料來表示他們。所以我們找到了資料的從大到小前M個方差的正交方向,然後忽略那些方差不是很大的方向。這M個主維度來自於更低維度子空間,然後通過對映到更低維度空間的M維上來表示N維的資料點。所以我們損失所有的資訊是關於資料在剩下的正交方向上的點。不過因為這些地方都沒什麼方差,所以也沒損失多少資訊。如果我們想要從這M個維度上重構這些資料點,首先在那些沒有表示出來的N-M方向上減去均值,然後重構中的區域就是那些未表現出來的方向上介於資料點的值與其均值之間的平方差的和,可以在下圖中看到。


所以先考慮2維的資料,這個分佈是按照拉長高斯得到的。這個橢圓意思就是有著標準差輪廓的高斯。考慮向上圖中那個紅點的資料點。如果我們使用只有一個主成分的PCA,這個成分將會是資料有著最大方差的方向。所以為了表現這個紅點,我們需要表現沿著這個方向上資料偏移多遠。換句話說,我們需要表現紅點在那條線上的投影,也就是那個綠點。當我們需要重構這個紅點的時候,我們需要用到忽略的那個方向上所有的資料點的均值,換句話說需要在那個黑線上表現出這個點,所以重構上損失的就是介於紅點和綠點之間的平方差。也就是會損失之前忽略方向上所有資料點和均值之間的差。所以我們顯而易見的在最小化損失,如果我們選擇忽略的方向是最小方差的。


現在我們可以執行PCA或者使用BP的版本,不過這不是很有效的。所以我們要做的就是在做一個網路,他的輸出就是資料的重構。然後我們試著最小化這個平方誤差。這個網路有一箇中心瓶頸,它只有M個隱藏單元。這些都是對應著主成分,或者一些類似於主成分的東西。所以看上圖左邊的那個模型,有一個輸入向量,然後將輸入投影到編碼向量上,然後從這個編碼向量上構建一個輸出向量,目的就是讓這個輸出向量儘可能的相似於輸入向量。編碼向量的隱藏單元的啟用值來自於這個瓶頸。所以這個編碼向量是一個輸入向量的壓縮表示。如果這個隱藏單元和這個輸出單元都是線性的,那麼輸出的編碼就像這樣,我們學到的編碼是最小化平方重構誤差的。這就是PCA所作的。它得到的重構誤差與PCA所作的一樣。不過他不需要一定有隱藏單元來表示主成分。他們會跨越同樣的空間作為前面M個主成分,不過他們也許是這些軸的旋轉或者歪斜。所以引入編碼單元的權重向量是表示主成分的方向,不過也許不是正交的。而且不像PCA,他們通常有相同的方差,不過這個用這些編碼單元引入的權重向量跨越的空間是完全與這M個主成分跨越的空間一致的。所以以這種角度來看,這個網路做的就是與PCA做的一樣的事情,只是如果我們使用降序來學習這個網路,它通常會比用於主成分的演算法少得多就足夠了。儘管如果有著大量的資料,他也許會更有效。


在NN中使用BP來執行PCA的重點是它允許我們生成主成分分析。如果我們使用在編碼層前後都有非線性層的NN,就可以表示位於一個曲線流形上的資料而不是高維空間中的線性流形,相比來說,這更通用。所以我們的網路看上去就如上圖右邊的模型。一個底層輸入層,然後一層或者多層非線性隱藏單元,這裡通常使用邏輯單元。然後就是一個編碼層,這一層也許是線性單元,然後在編碼層後面是一層或多層非線性隱藏單元,然後就是一個輸出向量,這部分與輸入向量上的訓練很相似。所以這是一個奇怪的網路,這裡使用有監督學習來做無監督學習的事情,這個網路的底層部分是一個編碼器,將輸入向量使用非線性方法轉換成編碼,頂層部分是一個解碼器,這裡使用非線性編碼然後將它映射回輸入的重構,所以在學習之後,我們有兩個方向上的對映。

二、深度AE

在這部分,我們來看看訓練DAE的問題。早在1980年代中期,人們就開始想這個問題了。不過他們沒法將其訓練的結果比PCA還好。有各種關於它的論文被髮,不過沒有那些里程碑的論文,都是水文。在我們提出通過預訓練來一次訓練一層深層網路的方法之後,Russ Salakhutdinov 和Hinton將這個方法用來預訓練DAE,第一次就通過DAE得到了比PCA更好的表徵。


DAE總是看上去是一個很好的方法來做維度約間,因為他看上去應該比PCA更好。他們在兩個方向上提供彈性的對映,而且這個對映可以是非線性的。他們的訓練時間應該是以訓練樣本呈線性增長(或者更少時間)。在學習好之後,這個網路的編碼部分是相當快的,因為這只是逐層的矩陣相乘罷了。不幸的是,使用BP演算法來優化DAE是很困難的。通常人們使用很小的初始化權重,然後BP的梯度會死掉,所以對於深度網路來說,他們沒法走出這個怪圈。不過現在我們有更好的方法來優化他們了。我們可以使用無監督的逐層預訓練,或者我們可以簡單的有意識的初始化這些權重,就像一個echo-state網路一樣。


第一個真正意義上成功的DAE由Russ Salakhutdinov和Hinton在2006年完成。他們將這個網路用來N維的數字。所以開始以784個畫素的圖片開始,然後通過三層隱藏層來對他們進行編碼,在中心的編碼層有30個實值啟用值。然後接著解碼這30個實值啟用值,返回到784個重構畫素上。這裡先使用一個堆疊RBM來初始化用於編碼的權重,然後用這些權重的轉置來初始化解碼器部分。所以在開始,這784個畫素是使用一個用於編碼器的權重的轉置矩陣作為解碼器的權重矩陣來重構的。不過在這4個RBM訓練好之後,然後解開他們得到解碼的轉置,然後用BP來最小化這784個畫素的重構誤差。在這個情況中,是使用交叉熵誤差的,因為畫素是用邏輯單元來表示的,所以這個誤差可以迴向傳播過整個深度網路,一旦我們開始迴向傳播這個誤差,用來重構畫素的權重就變得不同於編碼這個畫素的權重了。


雖然使用BP和之後值都差不多,不過這卻很work。所以如果先看上圖第一行,是從這些數字類中隨機挑的數字。如果觀察第二行,這就是這些隨機挑選的樣本通過這個DAE的重構結果,這個DAE在中間層上有30個線性隱藏單元。所以資料已經被壓縮成30個實值,然後接著重構。如果看看這個8,你可以發現重構的事實上比8還好。它在8中擺脫了一些小缺陷,因為他並沒有編碼的能力。如果將它與線性PCA相比較你會發現它更好,一個線性對映到20個實值數字沒法很好的用來表示資料。

三、DAE用在文件檢索和視覺化上

在這部分中,會介紹使用DAAE來做文件檢索,之前有個方法被稱之為潛在語義分析,相當於使用PCA來從文件中提取計數向量。由潛在語義分析生成的編碼可以隨後用在判別文件的相似性,所以他們可以用來做文件檢索。顯然,如果DAE比PCA做的更好,我們期望就能夠通過使用一個DAE提取出比使用潛在語義分析更好的編碼。RUss-lan 和Hinton的工作顯示的確是這樣的。使用一個大的文件資料庫,我們現實使用DAE提取的10個成分就能比使用像潛在語義分析這樣的線性方法提取的50個成分更好。我們同樣顯示如果使用的編碼非常小,例如只有2個成分,你可以使用這兩個成分用來將文件視為2維對映中的一個點來進行視覺化。而且,這效果還是比使用PCA提取前兩個成分的效果要好。


為了找到相似於詢問文件的文件,首要做的就是轉換每個文件到一個詞袋中。換句話說,我們有一個詞計數向量,而且是忽略了詞之間的順序,很明顯這丟掉了相當多的資訊。不過他同樣保留了有關文件主題的許多資訊。我們忽略了例如“the”或者“over”這樣的停止單詞,因為他們沒有關於主題的資訊。所以如果看上圖的右邊,是已經對一些單詞計數好的結果,所以如果看到有的單詞是計數為非0,那麼就是文中出現過的,也就是vector、count、query、reduce...等等。這可以告訴你許多這個文件關於什麼的資訊。現在我們可以將這個詢問文件的單詞計數與其他上百萬的文件的單詞計數進行比較。不過這會涉及到相當大的向量。事實上,我們使用2000大小的向量,所以這會很慢。或者,我們可以將每個詢問向量壓縮到更小的向量中,而且仍然保留了大部分關於內容的資訊。


所以這裡介紹如何約間的,我們先得到DAE然後將這2000個單詞計數壓縮到10個實值,從這10個實值上,我們可以重構出這2000個單詞計數,雖然沒法重構的非常好。通過訓練這個NN來儘可能的複製他的輸入向量作為他的輸出向量,這可以儘可能的將資訊壓縮到這10個實值上。我們然後可以使用這10個數值來比較文件,這可以讓過程更快。


所以這裡的一個問題就是單詞計數沒法和畫素或者實值一樣。也就是通過將所有的非停止單詞來將這個計數劃分成到一個詞袋中,這樣可以將計數向量轉換到一個概率向量中,這個向量的所有元素加起來等於1。你可以認為這是從文件中隨機挑選一個具體的非停止單詞的概率,所以這個AE的輸出部分,使用一個大的2000-way的softmax,我們的目標值就是當我們將計數向量約間到一個概率因子的時候單詞的概率。

另一個我們可以使用的技巧就是當重構他們的時候將這個單詞計數視為概率。不過當我們使用他們去啟用第一層隱藏層的時候,我們用N乘以所有的權重,這是因為從這個概率分佈中有N個不同的觀察值,如果我們將他們作為概率,輸入單元將會有非常小的啟用值,而且沒法提供很多的輸入給第一個隱藏層。所以我們有一個關於第一個RBM的很有趣的特性,自底向上的權重是N倍於自頂向下的權重。


所以如何實現呢?我們在Reuters資料集中的4000個商業文件上使用2000個單詞的詞袋來訓練,這些文件已經被手動標記了100個不同的類別。我們首先訓練一個堆疊RBM,然後用BP來微調,並使用2000-way的softmax作為輸出,然後在另一個有著4000文件的資料集上進行測試,為了測試,就是在這些測試文件中針對詢問文件挑出一個文件,然後將所有的其他測試文件使用介於編碼之間的角度的cos值進行排序,這裡的編碼就是那個10維的向量。對於這4000個可能的測試文件來說,每個都要試一遍,然後將檢索到的文件的數量畫出來,也就是對於那些與詢問文件標記的相同的類的文件,在結果列表上有多少結果。這對於檢索的質量來說不是一個非常好的測量方法。不過我們還是使用一樣的測量方法來與LSA做比較。所以這也算是一個相當公平的比較了。


所以這裡就是檢索的精度,作為檢索到文件數量的函式。當你看到一個AE像這樣使用一個有著10個實值數值的編碼而且效果比使用50個實值數值潛在語義分析要好。當然,在得到編碼之後,所要做的就是少於1/5的工作了。有著10個實值數值的潛在語義分析是更糟糕的。


我們同樣可以約間到兩個實值數值來做一樣的事情,然後不用來檢索,而是將所有的文件畫在一個圖上,不過使用顏色進行標記這些2維的點,是的對應於由PCA對文件類生成的兩個數字。所以我們看文件的主要的類。我們給這些主要類不同的顏色,然後在log(1+count)上使用PCA,點也就是用很大的數字壓縮而成的計數,這就是得到的分佈,正如看到的,這是有著許多分散的類。綠色類在一個地方,紅色類在另一個稍微不同的地方,不過他們都混合起來了。所以我們使用DAE約間文件到2個數字來做相同的事情,然後將這些文件畫出來,畫在2維空間中。

這就是我們得到的結果,這是一個更好的佈局,它告訴我們更多關於資料集的結構。你可以發現不同的類別,你可以發現他們相當的分開,我們假設在中間的文件沒有包含許多單詞,所以它很難被區分開。像這樣的一個視覺化顯示是非常有幫助的,例如,如果你看到其中的一個綠點是來自Enron的Accounts和earning報告,你可能不會想要在那種附近有個綠點的公司裡面購買股票(buy shares)。

四、語義雜湊

在這部分中,將會介紹一種被稱之為語義雜湊的技術,它提供了一個極端高效的方法來尋找針對詢問文件的相似性文件。idea就是將文件轉換到一個記憶體地址上。在這個記憶體上識別東西,所以如果你得到了一個具體的地址,然後觀察附近的地址,你會發現都是相似的文件。這特別像在超級市場上,如果你想要去一個放著具體東西的地方,然後環顧四周,你會發現都是差不多的東西。人們在很長一段時間就知道如果你得到了影象的二值描述子,你就有了一個非常好的方法去快速的檢索影象。許多二值描述子都是很容易得到的,例如是否在室內場景還是室外場景?是黑色圖片還是白色圖片?不過卻很難得到一個有關30個二值描述子的列表,他們或多或少是相互正交的,而這些就是我們真正需要的。不過這個問題機器學習能夠幫助我們,我們先觀察這個與文件一樣的問題,不過我們用的是圖片。


所以不通過使用文件的實值編碼,通過從單詞文件中得到二值編碼。我們通過訓練一個DAE,在他的編碼層是一個邏輯單元,不過這還不夠,因為邏輯單元會被用在他們的中間部分,這裡他們有著實值用來傳達儘可能多的2000個單詞計數的資訊。為了防止這樣的事情發生,我們在微調的時候在輸入和編碼單元部分增加了噪音。所以我們先將它視為堆疊RBM一樣訓練它。然後將這些玻爾茲曼機通過對解碼部分的權重矩陣的轉置來解開,然後用BP來對他進行微調。正如我們做的,我們增加額外的高斯噪音到這個輸入到編碼部分的單元上。為了拒絕這些噪音,編碼單元需要保持開或者保持關。所以噪音可以鼓勵學習能夠避免邏輯的中間區域傳達許多資訊,不過輸入部分卻對噪音非常敏感。在測試時間上,我們簡單的閾值中間層上的邏輯單元來得到二值數值。所以如果我們能像這樣訓練一個AE,我們就能轉換詞袋的計數到一個非常小數量的二值數值。換句話說,我們可以學習一組對於重構詞袋來說很好的二值特徵。後來,Alex Krizhevsky發現我們事實上不必增加高斯噪音到輸入到這30個編碼單元上,相反的,我們值需要隨機二值單元。所以在前向傳播的時候,我們隨機挑選一個用邏輯輸出得到的二值數值。然後在後向傳播中,我們假裝我們從邏輯中傳送了實數概率,而且得到一個用於BP的平滑梯度。一旦我們得到了這些短的二值編碼,我們當然可以做一個連續的研究關於每個所知的文件的位置,然後儲存編碼。然後當有一個詢問文件的時候,我們首先提取他的編碼,如果沒有我們所知的文件,那麼我們將這個編碼與儲存的所有文件的編碼進行對比。這種比較可以非常的快,因為只在傳統的CPU上使用了特別的位對比操作,而CPU可以並行的比較許多位。不過我們還是需要通過一個非常長的文件列表,可能是十億的。不過有可以更快的方法,我們可以將編碼視為記憶體地址。


所以idea就是在得到一個文件的時候,我們使用DAE作為作為一個雜湊函式,然後將這個文件轉換成一個30位的地址,現在就有了一個30位的記憶體地址。在這個記憶體中,每個地址會有一個指標,指回有這個地址的文件。如果幾個文件有一樣的地址,我們就可以在這個地方作一個列表。現在如果AE成功的用在讓相似文件有著相似地址,就擁有了一個有關查詢相似文件的非常快的方法。我們簡單的處理這個詢問文件,然後在記憶體的對應他的二值編碼這個地址上,然後看看周圍的地址。換句話說,你先將那個地址上的位進行翻轉,以此來訪問附近的地址。你可以想象一個很小的humming球,他的附近的地址都只有相差幾位而已。我們期望找到這些附近的地址,因為他們是語義相似的文件。所以我們完全避免了搜尋大列表的麻煩。我們簡單的計算一個記憶體地址,然後翻轉幾位,然後再去找相似的文件。特別是如果我們有著非常巨大的資料庫,例如十億個文件,這是特別高效的。我們完全避免了在這十億專案中的連續查詢。有時候稱這種為超級市場搜尋,因為他特別像你早超級市場乾的事情。假設你去一家沒去過的超級市場,你想要找到鳳尾魚,你也許會問售貨員罐頭在哪,然後再去那個罐頭的區域,然後環顧四周,幸運的話他們就在相差不多的位置。不過不幸的情況下,這個鳳尾魚可續儲存在一個完全不同的地方,比如在匹薩的上面,這就是這種搜尋的缺點了(個人:因為不是按順序查詢的,這類似於隨機查詢,所以一擊不中的時候就沒辦法了)。正如對超級市場的瞭解,這本質上是一個2d表面。所以這是一個shells(個人:不知道翻譯成啥)的1d 字串,不過它有高度,這會給出一個2d,所以你只能在2維中定位東西,而且這不還不足夠將所有你想要的東西放到另一個的附近,。例如,你想要素食的東西在附近,或者猶太人吃的東西在附近,或者過時的東西在附近。在2d中,你沒法做所有的事情。不過我們這裡有30維的超級市場,這是一個更加複雜的空間,其中很容易的將東西放在許多不同的東西附近,因為在不同的維度上的相似性。


這是另一個觀點關於在語義雜湊中發生的事情。第一個檢索方法的大部分工作是通過與從詢問中提取的線索相關的儲存列表相互動得到的。例如google將會給出一個列表關於所有包含某個具體單詞的文件。當你在你的詢問中使用這個單詞的時候,他們會立馬訪問那個列表。然後互動那個列表和其他列表來找到一個文件能夠滿足詢問中的所有項。現在計算機實際上有特別的硬體,可以在一個單一的機器指令中相交(intersect)32非常長的列表。這個硬體倍叫做記憶體匯流排,所以這32位二值地址中的每一位可以在記憶體中指定一半地址的列表。例如,如果這地址的第一位是開著的,那麼就指定了頂層一半的記憶體了。如果這一位是關閉的,它就指定底層一半的記憶體了。記憶體匯流排做的就是相交32的列表來找到一個位置,這個位置滿足在這個二值編碼中的所有的32個值。所以我們可以認為語義雜湊是作為一個使用機器學習方法將索引問題對映到計算機擅長的列表相交上。只要我們的32位對應於文件或者影象的有意義的特性,那麼我們就能在沒有任何搜尋的情況下快速的找到相似的其他東西。

五、學習二值編碼用以影象檢索

在這部分中,會介紹在影象檢索上二值編碼的使用。對於檢索文件來說,人們喜歡例如google這樣的存在的好方法,像語義雜湊這樣的技術也許沒有什麼價值。不過檢索影象卻不同,而且轉化一張圖片到一個相當大的二值編碼(例如有256位)的這種方法看上去可以很work。然而,我們並不想要一個在這256位的向量上有個非常長的連續搜尋,所以語義雜湊可以被用來先生成短的列表,然後我們通過在一個序列搜尋中使用更長的二值編碼來得到更好的質量匹配。


現在我們來看看使用二值編碼如何來進行影象檢索。當前的影象檢索通常是使用標題的,不過為什麼不使用影象呢?顯然他們包含著比標題還多的資訊,基本的問題在於畫素不像單詞。單獨的畫素不會告訴我們太多有關影象內容的東西。顯然,如果你要識別影象包含的物件,那麼我們需要擁有比單詞多更多的東西,不過識別物件是很困難的。至少當我們第一次接觸這個事情的時候是困難的。現在DNN已經更加的擅長幹這個了,所以這也許是一個好方法了。所以如果我們不打算識別物件,也許我們要做的就是提取一個有關影象內容的向量。顯然所需要提取的是實值數值向量。不過問題是在真實資料庫中匹配實值向量是很慢的,而且實值數值向量需要許多的儲存空間。如果我們能提取出一個相對來說很短的二值向量,它包含著許多關於影象的資訊,那麼儲存就變得更簡單,而且匹配會變得更快。


更快是通過一個兩階段的方法完成的。首先,我們提取一個差不多30位的短二值編碼,這個短的二值編碼是通過語義雜湊得到的,用來快速的得到一個有關未來影象的短列表。所以我們簡單的使用這個短二值編碼,翻轉一些位來得到待選影象。這些候選的圖隨後可以使用那些已知的影象的256位的二值編碼來匹配,為了尋找比使用28位二值編碼更好的匹配。甚至一個256位的二值編碼值來說,每個影象只需要4個詞的記憶體大小。即使我們隨後要在這些二值編碼上做一個序列搜尋,這個搜尋也可以完成的很塊,因為它只需要很少的操作來對比兩個256二值編碼來找到他們之間有多少位是一樣的。問題就是在檢索圖片的時候一個二值編碼的256的結果有多好。所查詢的圖片是我們認為的相似嗎?


這裡是一個由Alex Krizhevsky訓練的網路。它在一個小彩色影象集上效果不錯,他們都是32×32畫素大小的,而且他將輸入分為紅色,綠色和藍色三個通道,所以這些圖片有3000多個輸入。隨後他擴充套件成一個更大的隱藏單元層,因為我們要從實值輸入轉換到邏輯隱藏單元,這可能有更少的容量。然後我們逐漸減少每一層的單元數量,直到我們得到的了256位。這個編碼器有大約67百萬的引數。這相當大,它需要在GPU上好幾天才能訓練完,而且是在2百萬個影象上訓練。幾乎沒有理論來判斷這裡使用的結構,我們知道我們想要一個相當深的網路,讓他像一個箭頭一樣是有道理的。不過這個具體的結構,每一層的單元數量還是靠猜的。有趣的就是像這樣的猜已經表明它可以很好的work。想必,有許多其他的更work的結構。


第一個問題就是像這樣的一個順序編碼器在重構影象上的結果如何?所以上圖第一行的左邊是一個人臉,它對應的就是重構的結果,你可以看到從這個重構中,你可以判斷這個影象屬於哪一類。第二行就是另一個例子,這是一個在party上的場景,你沒法分辨這是一個什麼場景,不過你可以猜這是涉及到許多人或者你猜不到。最後一行是一個戶外場景,你可以發現重構的圖抓住了很多準確的資訊,它抓住了水,天空,和中間的陸地。


所以讓我們看看通過這個順序編碼索引影象的質量。上圖上面的部分的紅框是一個Michael Jackson的影象,Alex 索引了最相似的影象,在每個影象中,你可以發現有多少位與Michael Jackson身體不一樣。你可以發現他們都差不多有數量相當的相似的位。在256位上,如果是隨機影象的話,只有61位不同是不太可能發生的。只有如此少的幾位不同的話,那麼就是一個相當相似的影象。有關什麼是檢索的一個nice的事情是,有一個例外,他們都是人臉。如果我們看你通過使用歐式距離在原始畫素上的索引結果,(上圖下面部分)那麼他們中一些是人臉,不過大部分都不是。所以顯然這個順序編碼器可以理解有關人臉的資訊,而這些資訊是沒法通過歐式距離來包含的。這明顯可以得到更好的索引。


我們來看看另一個例子,這裡我們的影象都是party場景的影象,你可以發現差不多一半的圖片你可以認為是相似於其他party場景的。其他party場景的有著一些明亮的東西在中間位置,就像最原始的party場景,你同樣注意到大多數壞的匹配同樣在中間位置上有許多明亮的東西。所以即使我們通過一些隱藏層降低到256位二值編碼,它仍然敏感於影象的結構和更亮的塊的位置等資訊。如果你看上圖下半部分,也就是歐式距離做的,結果更糟糕。歐式距離得到的其他場景有一群人的,而且任何東西看上去都那麼不相似。你可以發現用歐式距離,它通常得到的是非常平滑的影象,這是因為如果你沒法匹配影象中高頻率的變化,它更擅長匹配他的均值,然後得到其他有著高頻率變化的stuff。所以當你得到了一個複雜的影象,包含的距離通常可以找到平滑的影象來匹配它。這是因為它在畫素空間中最小化一個平凡誤差。


所以顯然的,我們需要檢索的影象可以更敏感於影象的內容,也即是儲存的物件是相關的的,少敏感於影象的強度。我們可以先訓練一個大網路來識別真實影象中許多不同種類的物件,這個在lecture5中說過了,然後我們得到這個大網路的最後一個隱藏層中的啟用向量,然後使用這個作為影象的表徵。這在抓取影象中不同類別的資訊時會比畫素強度更好。所以如果這個方法work的話,我們使用在lecture5中描述的網路,在影象比賽中使用的那個網路。到目前為止,我們只在歐式距離與最後一層隱藏層中的向量的啟用值之間對比過(也就是上上圖的兩個結果,一個AE得到的,一個歐式距離得到的)。不過顯然如果他work的話,我們隨後可以使用這些啟用的向量來建立一個順序編碼來得到很少位數的二值編碼。所以先看看它用歐式距離是否work。結果顯示它work的很好,我們不知道他是否在二值編碼上會work。


所以在上圖左邊的列中,你可以發現所需要詢問的影象。然後在他們的右邊都是檢索得到的,如果你看這個大象詢問影象,你可以看到檢索得到的是其他大象,不過他們有著不同的姿勢。所以這些影象在畫素空間中沒有一個非常好的重疊,經過這個重疊也沒那麼糟糕。如果你看這個萬聖節南瓜,你可以發現所有的這些檢索到的都是都是萬聖節南瓜,不過他們在畫素空間中有一個相當壞的重疊。和航空母艦相似的,我們檢索到的其他航空母艦的圖片都是非常不同的。所以我們預料如果我們可以將啟用的向量約間到短的二值編碼。我們就會有一個快速的有效的方法來檢索相似的圖片,只通過影象的內容。我們會在lecture16中看到我們可以將影象的內容和影象的標題結合起來,來得到一個更好的表徵。

六、淺層AE用來預訓練

在這部分中,會介紹對於DNN來說可代替的預訓練方法。會介紹使用CD訓練的RBM的預訓練方法。之後,人們發現許多其他的方法用來預訓練層級特徵。確實,在當提供了足夠多的標籤資料的時候,如果你正確的初始化權重,你也許不需要預訓練。


我們看到了許多巧妙的事情,即可以通過DAE生稱的程式碼來完成。現在這裡先考慮只有一層隱藏層的淺層AE。REM可以可淺層ASE一起用,特別是當他們用CD來訓練的時候,因為他們試著是重構像原資料。當你使用一個AE呢?一個RBM有非常強的重構能力,因為隱藏單元之允許有二值啟用。這約束了他們的能力。如果我們用最大似然來訓練RBM,那麼他們就完全不像AE了。一個觀察是否有一個純噪音的畫素的方法是,一個AE試圖重構它有的任何噪音。一個用最大似然訓練的RBM會完全忽略這個畫素,而且只通過那個輸入的偏置來建模。所以既然我們可以將RBM視為一種有著強烈正則化的AE,也許我們就能替換這個用來為堆疊AE做預訓練的RBM。結果顯示,如果這樣做的話,預訓練就不那麼有效了,至少如果你使用淺層AE的話,這是真的,這些淺層AE都是用懲罰平方權重來正則化的。所以堆疊這些AE並不會和堆疊RBM一樣work。


然而,有一種完全不同AE,它可以很work,這就是消噪AE。它被Montreal小組研究透了。DAE通過將許多成分設定成0來在每個輸入向量上增加噪音來工作,不過不同的輸入向量有不同的成分。這很像dropout,不過他是針對輸入而不是針對隱藏單元。這個DAE仍然需要重構被設定成0的輸入.所以他沒法簡單的複製她的輸入。使用淺層AE的一個危險在於如果你給他足夠的隱藏單元,它也許只複製每個畫素到一個隱藏單元,然後從這個隱藏單元中重構這個畫素。一個DAE明顯沒法做這樣的事情,所以他使用隱藏單元來抓取輸入之間的相關性,所以他可以使用一些輸入的值來幫助重構那些被0出的輸入。

如果我們使用堆疊DAE,預訓練就是非常有效的。在一些情況下RBM仍然更好,不過在大部分情況下DAE卻更有效。評估使用DAE來預訓練是更簡單的,因為我們可以輕鬆的計算目標函式的值。當我們使用CD來預訓練一個RBM,我們沒法計算我們試圖最小化的真正的目標函式的值,所以我們通常只使用平方重構誤差,這實際上不是什麼最小化。在DAE中,我們可以打印出我們試圖最小化的值,而且這非常有幫助。一個DAE的缺點是它缺少可RBM一樣很好的可變約束。不過這只是理論部分,因為他只會在當RBM用最大似然來學習的時候適用。



另一種AE就是搜尋AE,這也是Montreal小組提出的。它work的方式是我們試圖讓隱藏啟用值儘可能的對輸入遲鈍(就是不敏感)。當然隱藏單元不能只忽略輸入,因為他們需要重構他們。達到不敏感的方法就是通過懲罰的每個隱藏單元關於每個輸入的平方梯度。所以我們試圖讓每個隱藏當我們改變一個輸入值的時候不會改變太多。CAE同樣可以很好的用在預訓練。他們的編碼傾向於有這樣的特性,在他們的敏感範圍內只有很小隱藏單元的子集。對於空間的不同部分上,他是一個不同的自己,所以這個啟用的集合的行為就像是一個稀疏編碼。其他的隱藏單元是未飽和,也還是不敏感的。RBM實際上也有著一個非常相似的行為。在他們被訓練之後,許多的隱藏單元已經飽和,而且未飽和的部分的工作的集合將會不同於不同的訓練樣本。


這裡進行總結當前有關預訓練的觀點。現在有許多非常不同的方法來做逐層預訓練來發掘好的特徵。當我們的資料集沒有很多的標籤的時候,這種在你使用標籤之前的發掘特徵的方法是對於後續的判別式微調來說非常有幫助的。它在沒有使用標籤中的資訊的時候發掘標籤,然後標籤中的資訊用來微調類之間的決策超平面。當我們有許多無標籤資料的時候,它特別的有用,所以這個預訓練可以是在使用許多資料的基礎上一個非常好的發掘有趣的特徵的工作。對於有著超多標籤資料的情況下,初始化權重可以用於有監督學習,通過使用無監督預訓練就不是那麼必須了,即使當這個網路很深的時候。預訓練是首要的用於初始化DNN的權重的好方法,不過現在我們有許多其他的方法了。然而,如果我們有許多標籤,如果我們讓網路變得更大,我們再次需要預訓練。所以一個Hinton與google的人們常用的觀點就是,他們得到了許多許多的有標籤資料,所以我們根本不需要正則化方法,我們的網路完全不會過擬合,因為我們有這麼多的資料。不過一個反對的觀點是,這是因為你使用的網路太小了,你應該在更多更多的計算機上使用很大很大的網路。然後你會開始再次過擬合,你會需要這些正則化的,例如dropout和預訓練。如果你要問那個regime存在於大腦中,大腦很明顯對於這些資料來說有著巨多的引數,所以對於大腦來說,至少正則化是非常重要的。