back to index
【機器學習2021】自編碼器 (Auto-encoder) (上) – 基本概念

link |
在講AutoEncoder之前,其實AutoEncoder也可以算是Seal Supervised Learning的一環,
link |
所以再讓我們用非常短的時間來看一下Seal Supervised Learning的Framework。
link |
那Seal Supervised Learning是怎麼運作的呢?首先你有大量的沒有標註的資料,用這些沒有標註的資料你可以去訓練一個模型,
link |
你必須發明一些不需要標註資料的任務,比如說做填空題,比如說預測下一個Token,你必須要自己想一些不需要標註資料的任務給你的模型進行學習。
link |
那這個不用標註資料的學習叫做Seal Supervised Learning,或者是也有人叫Pre-training。
link |
那用這些不用標註資料的任務學完一個模型以後,它本身沒有什麼用,Birds只能做填空題,GBT只能夠把一句話補完,
link |
但是你可以把它用在其他下游的任務裡面,你可以把Seal Supervised Learning的模型做一點點的微微的調整,就可以用在下游的任務裡面。
link |
那在這些不用標註資料就可以學習的任務裡面,在有Birds、在有GBT之前,其實有一個更古老的任務,更古老的不需要用標註資料的任務,就叫做Autoencoder。
link |
所以你也可以把Autoencoder看作是Seal Supervised Learning的一種Pre-training的方法。
link |
當然可能不是所有人都會同意這個觀點,有人可能會說,Autoencoder不算是Seal Supervised Learning。
link |
Autoencoder很早就有了嘛,2006年、15年前就有了嘛。Seal Supervised Learning是2019年才有這個詞彙嘛,所以Autoencoder不算是Seal Supervised Learning的一環。
link |
但這個都是見仁見智的問題,這種名詞定義的問題我們就不用太糾結在這個地方。從Seal Supervised Learning它是不需要用標註資料來訓練這個觀點來看,Autoencoder我認為它可以算是Seal Supervised Learning的其中一種方法。
link |
它就跟填空預測接下來的Token是很類似的概念,只是用的是另外不一樣的想法。
link |
接下來我們就來先看一下Autoencoder是怎麼運作的。
link |
Autoencoder是怎麼運作的呢?因為剛才在講Seal Supervised Learning的時候都是用文字做例子,現在我們換成用影像來做例子。
link |
假設你有非常大量的圖片,在Autoencoder裡面你有兩個Network,一個叫做Encoder,一個叫做Decoder,它們就是兩個Network。
link |
這兩個Network做的事情是什麼呢?這兩個Network做的事情是Encoder把一張圖片讀進來,它把這張圖片變成一個向量。
link |
Encoder可能是很多層的CNN,把一張圖片讀進來,它的輸出是一個向量。
link |
接下來這個向量會變成Decoder的輸入,Decoder會產生一張圖片。
link |
所以Decoder的Network架構可能會像是Gate裡面的Generator,它是一個向量輸出一張圖片。
link |
不管是Encoder還是Decoder,反正就是多層的Network。
link |
那現在訓練的目標是什麼呢?訓練的目標是希望Encoder的輸入跟Decoder的輸出越接近越好。
link |
假設你把圖片看作是一個很長的向量的話,我們就希望這個向量跟Decoder的輸出這個向量,這兩個向量,它們的距離越接近越好。
link |
也有人把這件事情叫做Reconstruction,叫做重建,因為我們就是把一張圖片壓縮成一個向量,接下來Decoder要根據這個向量重建原來的圖片。
link |
那我們希望原輸入的結果跟重建後的結果越接近越好。
link |
講到這邊,你可能會發現說,這個東西,這個概念似曾相似呢?
link |
沒錯,我們在講Cycle Game的時候,已經講過了這個概念,對不對?
link |
我們說在做Cycle Game的時候,我們會需要兩個Generator,第一個Generator把X-Domain的圖片轉到Y-Domain,另外一個Generator把Y-Domain的圖片轉回來。
link |
希望最原先的圖片跟轉完兩次後的圖片越接近越好。
link |
那這邊Encoder和Decoder,這個Auto Encoder的概念跟Cycle Game其實是一模一樣的,都是希望輸入的圖片經過兩次轉換以後,要跟原來的輸出越接近越好。
link |
而這個訓練的過程完全不需要任何的標註資料,你只需要收集到大量的圖片,你就可以做這個訓練。
link |
所以它是一個Unsupervised learning的方法,跟Sale Supervised那一系列Pretraining的做法一樣,你完全不需要任何的標註資料。
link |
那像這樣子,這個Encoder的輸出,有時候我們叫它Embedding,我們在講Fert的時候也提過Embedding這個詞彙了,那有的人叫它Representation,有的人叫它Code。
link |
因為Encoder是一個編碼嘛,所以有人把這個Vector叫做Code,那其實指的都是同一件事情。
link |
那這個Auto Encoder的技術要怎麼用呢?怎麼把Train完的Auto Encoder用在Downstream的任務裡面呢?
link |
常見的用法就是,原來的圖片,你也可以把它看作是一個很長的向量,但這個向量太長了,不好處理。
link |
那怎麼辦呢?你把這個圖片丟到Encoder以後輸出另外一個向量,這個向量你會讓它比較短,比如說只有10微,只有100微。
link |
那你拿這個新的向量來做你接下來的任務。
link |
也就是圖片不再是一個很高維度的向量,它通過Encoder的壓縮以後變成了一個低維度的向量,你再拿這個低維度的向量來做你接下來想做的事情。
link |
這就是常見的Auto Encoder用在Downstream的任務,用在下游任務的方法。
link |
那因為通常Encoder的輸入是一個維度非常高的向量,而Encoder的輸出,也就是我們的Embedded Representation或者Code,它是一個非常低維度的向量。
link |
比如說輸入是100x100的圖片,那100x100就是1萬微的向量了,如果是RGB,那就是3萬微的向量了。
link |
但是通常Encoder的Output你會設得很小,比如說10、100這樣的等級,所以這邊會有一個特別窄的地方,所以這個部分Encoder的輸出有時候又叫做Bottleneck,叫做瓶頸。
link |
本來輸入是很寬的,輸出也是很寬的,中間特別窄,所以這一段又叫做Bottleneck。
link |
而Encoder做的事情是把本來很高維度的東西轉成低維度的東西,把高維度的東西轉成低維度的東西又叫做Dimension Reduction。
link |
Dimension Reduction這個技術,我相信你在Machine Learning相關的應用上應該常常聽到這個名字。
link |
而有關Dimension Reduction的技術,它其實牽涉得非常非常地廣,所以我們這邊就不再細講。
link |
因為這門課我們只專注在深度學習相關的技術,你可以把Autoencoder的Encoder拿來做Dimension Reduction。
link |
其他還有很多不是Deep Learning Base的、不是以深度學習為基礎的Dimension Reduction的技術,我就把錄影的連結留在這邊,比如說PCA、TSNE,我就把錄影的連結留在這邊給大家參考。
link |
那Autoencoder到底好在哪裡呢?當我們把一個高維度的圖片變成一個低維度的像量的時候,到底帶來什麼樣的幫助呢?
link |
這讓我想到神鵰俠侶的其中一段,我不知道大家有沒有看過神鵰俠侶就是了。
link |
我可以做個調查,有看過神鵰俠侶的同學可以舉手一下嗎?
link |
哇,這麼多,好,手放下。比我想像的多太多了,我還以為現在大家已經沒有在看金庸了。
link |
神鵰俠侶裡面有一段就是楊過進去絕情谷遇到絕情谷谷主公孫子的弟子,就是梵一翁,梵一翁就是這個人。
link |
那梵一翁的武器是什麼呢?他的武器除了一根鋼杖以外,還有他的鬍子,他可以去甩動他的鬍子當作一個軟鞭來使用。
link |
他的鬍子甩起來有兩杖那麼長,可以是一個很厲害的武器。楊過跟他打了很久都難分上下。
link |
突然楊過說,我在三招之內一定要剪掉你的鬍子。
link |
大家突然都很詫異,想說楊過雖然武功可能比梵一翁還高一點,但是也沒有高太多,怎麼有辦法三招就剪掉他的鬍子呢?
link |
後來楊過真的在三招內剪掉他的鬍子。為什麼呢?因為楊過發現說,這個鬍子是由頭所操控的。
link |
雖然鬍子甩開來有兩杖那麼長,但是頭能夠做的變化還是有限的。
link |
所以雖然表面鬍子的鞭法非常厲害,但是只要直接去打他的頭,直接去打他的臉,
link |
就會逼得他不得不閃避,就會逼得他鬍子能夠動的路線變得有限,
link |
然後就打敗了梵一翁,就把他的鬍子剪掉了,故事結束。
link |
這個跟Autoencoder有什麼關係呢?
link |
我們來想一下,Autoencoder這件事情,他要做的是把一張圖片壓縮又還原回來。
link |
你像他假設本來圖片是3x3,3x3很小啦,我們就假設3x3好了,
link |
本來圖片是3x3,你要用9個數值來描述一張3x3的圖片。
link |
假設Autoencoder輸出的這個向量是二維的,
link |
我們怎麼有可能從二維的向量去還原3x3的圖片,還原9個數值呢?
link |
我們怎麼有辦法把9個數值變成2個數值,又還原回9個數值呢?
link |
能夠做到這件事情是因為對於影像來說,並不是所有3x3的矩陣都是圖片。
link |
圖片的變化其實是有限的,你隨便sample一個random noise,
link |
隨便sample一個矩陣出來,它通常都不是你會看到的圖片。
link |
或舉例來說,假設圖片是3x3的,那它的變化,
link |
雖然表面上應該要有3x3的數值才能夠描述3x3的圖片,
link |
也許你把圖片收集起來發現說,它只有這樣子的類型跟這樣子的類型,
link |
其他類型根本就不是你一般在訓練的時候會看到的狀況。
link |
就是因為說圖片的變化還是有限的,所以你在做這個encoder的時候,
link |
encoder可以說,我就只用兩個維度就可以描述一張圖片。
link |
雖然圖片是3x3,應該用9個數值才能夠儲存,
link |
但是實際上它的變化也許只有兩種類型,那你就可以說,
link |
看到這種類型,我就左邊這個維度是1,右邊是0。
link |
看到這種類型,就左邊這個維度是0,右邊這個維度是1。
link |
所以對應到剛才梵諺翁的例子,就是這個鬍子是圖片複雜的狀態,
link |
是原來的圖片,是原來圖片的pixel,是原來圖片的像素。
link |
而encoder做的事情就是劃範圍鍵。
link |
本來比較複雜的東西,它只是表面上比較複雜,
link |
你只要找出它有限的變化,你就可以把本來複雜的東西,
link |
如果我們可以把複雜的圖片用比較簡單的方法來表示它,
link |
那我們就只需要比較少的訓練資料,在下游的任務裡面,
link |
就可以讓機器學到我們本來要它學的事情。
link |
這個就是autoencoder的概念。
link |
autoencoder從來都不是一個新的想法,
link |
舉例來說,Hinton在2006年的Science的paper裡面,
link |
就有提到autoencoder這個概念。
link |
只是那個時候用的network,跟今天用的network,
link |
2006年是15年前,15年前的autoencoder長什麼樣子呢?
link |
那個時候,人們不覺得deep的network是train得起來的。
link |
那時候覺得說,把network疊很多很多層,
link |
然後每一層一起train,不太可能成功。
link |
所以那時候的信念是,每一層應該分開訓練。
link |
所以Hinton用的是一個叫做Restricted Boltzmann Machine的技術,
link |
我們特別把Hinton15年前的文章,
link |
把他paper裡面的圖拿出來給大家看一下,
link |
過去15年前,人們是怎麼看待深度學習這個問題的。
link |
那個時候覺得說,要train一個很深的network,不太可能。
link |
這邊說很深也沒有很深,只是三層,跟你作業惡作的還要更shallow。
link |
但是在15年前這個已經是很深了,三層太可怕了。
link |
這邊說分開來訓練這件事情叫做pre-train,
link |
但他跟self-supervised learning的pre-train又不一樣。
link |
假設你說autoencoder這個東西是pre-train,
link |
那現在這個pre-train是pre-train的pre-train,
link |
他是要pre-train那個autoencoder,
link |
而且每一層用一個叫做RBM的技術分開來訓練。
link |
先把每一層都訓練好,再全部接起來做微調這件事情。
link |
他是微調那個pre-train的model。
link |
好,那這個restricted Boltzmann machine,
link |
它其實不是一個deep learning的技術,
link |
它有點複雜,我們在這門課裡面也沒有打算要深入細講什麼是restricted Boltzmann machine。
link |
在過去,在十年前都相信這個deep的network一定要用restricted Boltzmann machine。
link |
其實Hinton後來在2012年的時候有一篇paper偷偷在結尾下一個結論說,
link |
其實restricted Boltzmann machine也沒有什麼必要啦,哈哈。
link |
所以後來就沒有什麼人在用restricted Boltzmann machine了。
link |
而且那個時候還有一個神奇的信念是覺得說,
link |
那個encoder decoder它必須是對稱。
link |
所以encoder的第一層跟decoder的最後一層,
link |
所以現在已經比較少有人在使用這樣子的限制了。
link |
那這頁投影片只是想告訴你說autoencoder不是新的概念,
link |
那autoencoder還有一個常見的變形叫做denoising的autoencoder。
link |
denoising的autoencoder是說,我們把原來要輸進去給encoder的圖片,
link |
加上一些雜訊,就自己隨便找一個雜訊把它加進去。
link |
然後一樣通過encoder,一樣再通過decoder,
link |
那我們現在要還原的不是encoder的輸入,
link |
encoder的輸入的圖片是有加雜訊的,
link |
我們要還原的不是encoder的輸入,
link |
所以你會發現說,現在encoder跟decoder除了還原原來的圖片這個任務以外,
link |
這個任務就是它必須要自己學會把雜訊去掉。
link |
encoder看到的是沒有雜訊的圖片,
link |
但decoder看到的是有加雜訊的圖片,
link |
但decoder要還原的目標是沒有加雜訊的圖片。
link |
所以encoder加decoder他們合起來必須要聯手能夠把雜訊去掉,
link |
這樣你才能夠把denoising的autoencoder訓練起來。
link |
那說到denoising的autoencoder,
link |
有沒有發現這個概念其實也一點都不陌生呢?
link |
denoising的autoencoder也不算是太新的技術,
link |
至少在2008年的時候就已經有相關的論文了。
link |
其實你也可以把它看作就是一個denoising的autoencoder,
link |
那些masking其實就是noise。
link |
在講BERT的技術的時候我們就告訴你說這個輸出就叫做embedding。
link |
接下來有一個linear的模型就是decoder,
link |
而decoder要做的事情就是還原原來的句子,
link |
也就是把填空題被蓋住的地方把它還原回來。
link |
所以我們可以說BERT其實就是一個denoising的autoencoder。
link |
為什麼這個decoder一定要linear的呢?
link |
它不一定要是linear,它可以不是linear的。
link |
如果我們說這個12層中間第6層的輸出是embedding,
link |
那你其實也可以說剩下的6層就是decoder。
link |
你用的不是第12層的輸出,而是第6層的輸出。
link |
那你完全可以說BERT的前6層就是encoder,
link |
總之這個decoder沒有一定要是linear的。
link |
也許我們在這邊休息一下,我們十分鐘後再回來。