【機器學習】李宏毅——AE自編碼器(Auto-encoder)

FavoriteStar發表於2022-12-20

1、What

在自編碼器中,有兩個神經網路,分別為Encoder和Decoder,其任務分別是:

  • Encoder:將讀入的原始資料(影像、文字等)轉換為一個向量
  • Decoder:將上述的向量還原成原始資料的形式

在這裡插入圖片描述

而目標是希望還原出來的結果能夠與原始資料儘可能的接近。其中的向量可稱為Embedaing、Representation、Code。而它的主要用處就是將原始資料(高維、複雜)經過Encoder後得到的向量(經過處理,低緯度)作為下游任務的輸入

2、Why

因為例如影像這種原始資料它的變化是有限的(不可能每一個畫素點都是完全隨機的,這不是我們可能看到的圖片),因此如果AutoEncoder能夠找到它們之間的變化規律(通常是比原始資料更簡單的)那麼就可以用更加簡便的表達形式來表示資料,那麼在下游任務訓練的時候就可能可以用更簡單的資料、更少的資料來學習到原來想要讓機器學習到的東西了

3、De-noising Auto-encoder

這個和普通的Auto-encoder的區別在於,Encoder的輸入並不是原始的影像,而是將影像加上一定的噪聲之後再作為Encoder的輸入,而在輸出的時候是要求Decoder輸出能夠與未加噪聲之前的影像越接近越好,即:

在這裡插入圖片描述

而如果我們回顧一下之前學習過的BERT,可以發現BERT實際上就是De-noising Auto-encoder,可以看下圖:

在這裡插入圖片描述

4、Feature Disentangle

特徵區分技術可以用於上文介紹的Auto-encoder,具體上可以這麼理解:在Auto-encoder中我們將圖片、文字、語音等放入Encoder得到的輸出向量Embedaing中就包含了這些輸入的特徵資訊,但是一個輸入可能存在不同的特徵資訊,例如一段語音就包含語音的內容、說話者的特徵等等,那麼有沒有可能在Embedaing中將這些特徵分別提取出來呢?這就是Feature Disentangle想要實現的事情。

在這裡插入圖片描述

5、Voice Conversion

語者轉換這個例子就是學習完模型之後,將A說話的內容用B的聲音複述出來作為輸出,就好像柯南的領帶變聲器一般神奇。那麼Auto-encoder如何來實現這個任務呢?
實際上這就需要藉助Feature Disentangle。首先如果將該任務作為一個監督學習的任務,那我們就需要A和B兩個人分別來說同樣的句子同樣的內容,產生大量的樣本從而來進行訓練,但是這顯然是不可能的!因此如果我們利用Auto-encoder和Feature Disentangle,可以有這樣的思路:

  • 訓練完Auto-encoder後,將A說話的語音和B說話的語音都輸出Encoder得到對應的Embedaing輸出
  • 運用特徵提取技術,將A和B對應的Embedaing分別提取出說話的內容和語者的特徵兩部分
  • 將A說話的特徵和B的特徵互換,讓B的特徵和A的內容拼接在一起,這樣就實現了用B語者來說出A的內容

在這裡插入圖片描述

6、Discrete Representation

上述我們說到的Embedaing是一個向量,其中每一個維度都是可以連續變化的數值。那麼有沒有可能我們強迫這個Embedaing是用離散的數值來表示呢?例如表示為二進位制,只有0和1,每個維度表示是否含有某個特徵;或者表示為One-hat-vector,來表示對物品的分類(這樣就不需要標籤)了,因為在學習的過程中就會自動將類似的物品歸於同一類,就類似於聚類演算法了。
在這裡插入圖片描述

那麼這種想法比較有代表性的技術為VQVAE,其具體的流程為:

  • 將輸入經過Encoder之後得到Embedaing,然後現在有一排向量Codebook(裡面向量的個數也是你指定的)
  • 將Embedaing逐一與Codebook中的向量進行計算相似度,並取其中相似度最高的來作為Decoder的輸入
  • 訓練的時候我們會要求Decoder的輸出要與Encoder的輸入越接近越好,從而來不斷地改進Codebook中的各個向量

在這裡插入圖片描述

這樣最終的結果就是讓你Decoder的輸入是離散的,只能在Codebook中進行選取,而且例如應用在語音的例子中,有可能最終學習得到的Codebook中的各個向量的不同維度可能會代表不同音標等等。
但這裡我有一個問題就是如上圖應用在影像上,那麼訓練完成後如果放入Encoder的是之前訓練從未見過的影像,那麼輸出還能夠與輸入相接近嗎?

7、令Embedaing是一段文字

如果天馬行空一點,能否讓Embedaing是一段文字呢?例如我們給Encoder一篇文章,然後希望它輸出一段文字,而Decoder再由這段文字來還原回原來的文章。那麼此時這個Embedaing是否可以認為是文章的摘要呢?

在這裡插入圖片描述

如果真的將這個想法進行實現會發現:Embedaing雖然確實是一段文字,但是它經常是我們人類看不懂的文字,即在我們看來是毫無邏輯的文字無法作為摘要,但這可以認為是En和De之間發明的暗號,它們用這些文字就可以實現輸入和輸出的文章都極其相似。那麼如果希望中間的Embedaing是我們能夠看得懂的文字,我們可以加上GAN的思想,即加上一個辨別器,該辨別器是學習了很多人類寫文章的句子,它能夠分辨一段文字是否是人類能夠理解的邏輯,那麼這就會使得En不斷地調整自己的輸出,希望能夠欺騙過辨別器,讓它認為是人類寫出來的句子,因此Embedaing也就越來越接近於摘要的功能了!

在這裡插入圖片描述

8、其他應用

8.1、生成器

訓練完Auto-encoder後,由於Decoder是接受一個向量,生成一個輸出(例如影像),那麼就可以認為這個Decoder就是一個生成器,因此可以單獨拿出來作為一個生成器使用:
在這裡插入圖片描述

8.2、壓縮

將Encoder訓練完成後它相當於接受一個輸入(例如圖片)然後得到向量,那麼這個向量通常是低維度的,那麼我們可以認為是進行了壓縮,而Decoder就是進行了解壓縮。但需要注意的是由於De輸出的結果無法與原始的輸入一模一樣,因此這樣的壓縮是有損的。

8.3、異常檢測

我們如果想要做一個異常檢測系統,那我們需要很多的資料來進行訓練,而在某些應用場景中很可能我們只有非常多的正常的資料而只有非常少的異常資料,甚至於說有些異常的資料混雜在正常的資料中都分辨不出來,那麼這時候Auto-encoder就可以派上用場了!如下圖,我們先用正常的資料來訓練我們的Auto-encoder,例如正常的資料是人臉:

在這裡插入圖片描述

那麼訓練完成之後,如果你進行檢測時輸入的也是相似的人臉,那麼Auto-encoder就有較大的可能,使得輸入與輸出之間較為接近,即計算相似度就會較大;但是如果輸入不是人臉,例如動漫人物,那麼因為Auto-encoder沒有看過這樣的圖片因此很難正確的將其還原,那麼再計算輸入與輸出之間的相似度時就會較小,即:

在這裡插入圖片描述

相關文章