Table of Contents
Unsupervised Learning: Deep Auto-encoder
今日的課程來自於: https://youtu.be/Tk5B4seA-AU
Auto-encoder 本質上就是一個自我壓縮以及解壓縮的過程,我們想要獲得壓縮後的code,他代表對原始數據的某種緊湊精簡的有效表達,也就是降維結果,其中Auto-encoder需要:
- Encoder(編碼器): 將原先的圖像壓縮成低維的向量
- Decoder(解碼器): 可以將壓縮的向量還原
Encoder 跟Decoder 都是 Unsupervised Learning,由於code是未知的,對於Encoder來說,我們手中的數據只能提供圖像作為NN的input,卻不能提供code作為output;對Decoder來說,我們只能提供圖像作為NN的output,卻不能提供code作為input
所以encoder跟decoder需要一起訓練,我們將他們連結,這樣整個NN的input&output都是我們已有的圖像數據,再訓練模型。最後降維的編碼就可以從最中間的hidden layer獲取
Compare with PCA
Auto-encoder跟PCA很相似,PCA本質上就是按組件拆分,再按組件重構的過程
在PCA中,我們先把均一化後的x根據組件W分解到更低維度的c,然後再將組建權重c乘上組件的反制 WT 得到重組後的x̂與原始的x越近越好
如果把這個過程當作是神經網路,那麼原始的x就是input layer,重構x̂就是output layer,中間組件分解權重c就是hidden layer,在PCA中是linear的。
對比於auto-encoder,從 input layer到 hidden layer 的案件分解實際上就是encode的過程,以hidden layer到output layer 按組件重構就是解碼的過程
並且可以加更多層的hidden layer
Deep Auto-encoder
Multi layer
我們可以不只使用一層的hidden layer,使用多層的hidden layer就是通過多層的encoder 跟 多層的decoder
- 從input layer到bottleneck layer 的部分都屬於 Encoder
- 從bottleneck layer到output layer 的部分都屬於 Decoder
- bottleneck layer的output就是自編碼結果code
- Training 方法: back propagation
如果按照PCA的思路,encoder的參數Wi 需要和Decoder的參數WiT 保持對應的關係,在訓練時可以綁在一起training,這樣就減少一半的參數,降低overfitting 的機率
但這件事情並不是必要的,實際操作時,可以對神經網路進行直接訓練而不用保持參數的一致
常見的做法就是兜個neural network, 用back propagation直接train下去
visualize
下圖為PCA和Deep Auto-encoder對手寫數字的編碼解碼後的結果,可以看出Deep Auto-encoder的方法比較清楚
若使用降維到二維平面做可視化,不同顏色代表不同數字,可以看到
- 通過PCA降維得到的結果中,不同顏色的數字混在一起
- 通過Deep Auto-encoder 降維得到的編碼結果中,不同顏色代表的數字被分散
Text Retrieval
Auto-encoder 也可以被用在文字處理上(將一篇文章壓成一個code)
比如我們要文字檢索,最簡單的方式就是Vector Space Model ,把每一篇文章都表示成空間中的一個vector
假設我們要查詢某個詞彙,那我們就把該查詢詞彙也變成空間中的一個點,並計算query的每一篇document之間的內積
Bag-of-word
表示詞彙最簡單的方式就是bag-of-word,如果有十萬個詞彙,就會有十萬維。缺點是很難找出詞彙的相關,每個詞彙都是獨立。
Auto-encoder
雖然bag-of-word 不能直接用於表示文章,但我們可以把它作為Auto-encoder 的input,通過降維來取得有效信息,以獲取有用的vector
同樣為了可視化,這裡將bag-of word 降維到二維平面上,下圖每個點都代表一篇文章,不同文章表示不同的文章類型
Similar Image Search
Auto-encoder 同樣可以被用在圖像檢索上
以圖找圖最簡單的做法就是直接對輸入的圖片與數據庫中的圖片計算pixel的相似度,並挑出最像的圖
片,但這種方法的效果是不好的,因為單純的pixel所能夠表達的信息太少了
我們需要使用Auto-encoder對圖像進行降維和特徵提取,並在編碼得到的code所在空間做檢索
下圖展示了Encoder的過程,並給出了原圖與Decoder後的圖像對比
這麼做的好處如下:
- Auto-encoder可以通過降維提取出一張圖像中最有用的特徵信息,包括pixel與pixel之間的關係
- 降維之後數據的size變小了,這意味著模型所需的參數也變少了,同樣的數據量對參數更少的模型來說,可以訓練出更精確的結果,一定程度上避免了過擬合的發生
- Auto-encoder是一個無監督學習的方法,數據不需要人工打上標籤,這意味著我們只需簡單處理就可以獲得大量的可用數據
下圖給出了分別以原圖的pixel計算相似度和以auto-encoder後的code計算相似度的兩種方法在圖像檢
索上的結果,可以看到,通過pixel檢索到的圖像會出現很多奇怪的物品,而通過code檢索到的圖像則都是人臉
可能有些人臉在原圖的pixel上看起來並不像,但把它們投影到256維的空間中卻是相像的,可能在投影
空間中某一維就代表了人臉的特徵,因此能夠被檢索出來
Pre-training DNN
在訓練神經網絡的時候,我們一般都會對如何初始化參數比較困擾,預訓練(pre-training)是一種尋找比
較好的參數初始化值的方法,而我們可以用Auto-encoder來做pre-training
以MNIST數據集為例,我們對每層hidden layer都做一次auto-encoder,使每一層都能夠提取到上一
層最佳的特徵向量
這裡用 x-z-x 來表示一個自編碼器,其中x表述輸入輸出層的維數, z表示隱藏層的維數
- 首先使input通過一個784-1000-784的自編碼器,當該自編碼器訓練穩定後,就把參數W1固定住,然後將數據集中所有784維的圖像都轉化為1000維的vector
- 注意! 如果hidden layer 比input還大的時候(code 比 input 大) ,還要加一個很強的regularization!
對1000維output做L1 的regularization,會希望這1000維的output是sparse,這1000維裡有幾維是有值的,其他都要是0
避免auto-encoder直接把input硬背起來,再輸出的問題
- 接下來再讓這些1000維的vector通過一個 1000-1000-1000 的編碼器,當其訓練穩定後,再把參數W2固定住,對數據集再做一次轉換
- 接下來再用轉換後的數據集去訓練第三個1000-500-1000的自編碼器,訓練穩定後固定W3,數據集再次更新轉化為500維
- 此時三個隱藏層的參數W1、W2、W3就是訓練整個神經網絡時的參數初始值
- 然後隨機初始化最後一個隱藏層到輸出層之間的參數W4
- 再用反向傳播去調整一遍參數,因為W1、W2、W3都已經是很好的參數值了,這裡只是做微調,這個步驟也因此得名為Find-tune
由於現在訓練機器的條件比以往更好,因此pre-training並不是必要的,但它也有自己的優勢
如果你只有大量的unlabeled data和少量的labeled data,那你可以先用這些unlabeled data把W1、W2
、W3先初始化好,最後再用labeled data去微調W1~W4 即可
因此pre-training在有大量unlabeled data的場景下(如半監督學習)是比較有用的
CNN
CNN as Encoder
處理圖像通常都會用卷積神經網路CNN,他的基本思想是交替使用卷積層(concolution)與池化層(pooling),讓圖像越來越小,最終展平,這個過程跟Encoder是類似的
理論上要實現自編碼器,Decoder只需要做跟Encoder相反的事即可,那對CNN來說,解碼的過程也就
變成了交替使用去卷積層和去池化層即可
那甚麼是Deconvolution和Unpooing呢?
Unpooling
做pooling的時候,假如得到一個4*4的matirx,就把每4個pixel分為一組,從每組中挑一個最大的留下
如果要做Unpooling,就需要提前紀錄pooling所挑選的pixel在原圖中的位置,下圖中用灰色框標註
然後做Unpooling,就要把當前的matrix放大到原來的四倍,也就是把2×2 matrix裡的pixel按照原先記
錄的位置插入放大後的4×4 matrix中,其餘項補0即可
當然這不是唯一的做法,在Keras中,pooling並沒有記錄原先的位置,做Unpooling的時候就是直接把
pixel的值複製四份填充到擴大後的matrix裡即可
Deconvolution
實際上,Deconvolution就是convolution
這裡以一維的Convolution為例,假設輸入是5維,過濾器(filter)的大小是3
卷積的過程就是每三個相鄰的點通過過濾器生成一個新的點,如下圖左側所示
在你的想像中,去卷積的過程應該是每個點都生成三個點,不同的點對生成同一個點的貢獻值相加;但
實際上,這個過程就相當於在周圍補0之後再次做卷積,如下圖右側所示,兩個過程是等價的
卷積和去卷積的過程中,不同點在於,去卷積需要補零且過濾器的weight與卷積是相反的
- 在卷積的過程中,依續是橘線、藍線、綠線
- 在去卷積的過程中,依序是綠線、藍線、橘線
因此在實踐過程中,去卷積的時候可以直接做Convolution就可以了