# 第九章:自編碼器 (Auto-encoder) >上課筆記 * 上課影片連結 * ==[**自編碼器(上):基本概念**](https://youtu.be/3oHlf8-J3Nc)== * ==[**自編碼器(下):領結變聲器與更多應用**](https://youtu.be/JZvEzb5PV3U)== --- ## 基本概念 自編碼器是一種**無監督學習**的神經網路架構,由兩個主要部分組成:**編碼器(Encoder)** 和 **解碼器(Decoder)**。這兩個部分共同完成對資料的壓縮和重建任務。自編碼器的訓練目標是使輸入和輸出盡可能相似,且中間會透過一個維度較低的向量來連接。 編碼器的作用是將高維度的輸入資料壓縮成低維度的向量 (Dimension reduction),例如將一張圖片轉換成一個較短的向量;解碼器則嘗試從這個低維度向量重建原始輸入。整個過程可以視為一種重建(Reconstruction)任務。 --- ## 歷史背景 自編碼器並非新概念,早在2006年,深度學習之父Geoffrey Hinton就在Science期刊上發表了相關論文。但當時,研究者們認為深層神經網路難以直接訓練,因此採用了**逐層預訓練**的方法,使用稱為受限玻爾茲曼機(Restricted Boltzmann Machine, RBM)的技術。 在那個時期,即使只有三層的神經網路都被認為是相當深的架構,並且需要分層訓練。隨著深度學習的發展,Hinton在2012年的論文中指出RBM其實並非必要,這種分層預訓練的方式才逐漸被廢棄。 --- ## 自編碼器的原理 ### 為何能夠成功重建? 自編碼器之所以能夠將高維資料壓縮後再重建,關鍵在於大多數高維資料的**內在變化實際上是有限的**。以3×3像素的圖片為例,雖然理論上需要9個數值來描述,但實際上圖片的變化可能只有少數幾種模式。 ![image](https://hackmd.io/_uploads/B1Yfd-4pyl.png) 這個概念可以類比為金庸小說《神鵰俠侶》中楊過與樊一翁的決鬥。樊一翁的鬍子雖然有兩丈長,但因為鬍子由頭部控制,頭部能做的變化有限,所以鬍子的變化也是有限的,才能被楊過在三招內剪斷。同樣地,圖片看似複雜,但其變化往往是有規律的,因此可以用較低維度的向量來表示。 ### 自編碼器與維度降維 自編碼器的編碼器部分可視為一種維度降維(Dimension Reduction)技術。維度降維是機器學習中常見的任務,其目的是將高維資料轉換為低維表示,同時保留重要資訊。除了自編碼器外,還有其他非深度學習的降維方法,如 [主成分分析PCA](https://youtu.be/iwh5o_M4BNU) 和 [t-SNE](https://youtu.be/GBUEjkpoxXc)等。 ### 自編碼器的瓶頸結構 自編碼器的一個關鍵特性是其「瓶頸」(Bottleneck)結構: - **輸入**:高維度資料 (如圖片) - **中間層**:低維度的編碼 (Code/Embedding/Representation) - **輸出**:嘗試重建的高維度資料 這個瓶頸結構強制模型學習資料的最重要特徵,因為只有通過這些特徵,才能在有限的維度下重建原始資料。 ![image](https://hackmd.io/_uploads/B1QjDWNpkl.png) --- ## 自編碼器的變形 ### 去噪自編碼器 (De-noising Auto-encoder) 去噪自編碼器是標準自編碼器的變形版本,訓練時**刻意在輸入資料中加入雜訊**,但仍要求模型重建原始無雜訊的資料。這樣,編碼器和解碼器必須共同學習如何濾除雜訊,提高模型的穩健性。 ![image](https://hackmd.io/_uploads/rJjEqZVT1e.png) 去噪自編碼器的概念也並不新穎,早在2008年就有相關論文發表。值得注意的是,**現代的BERT模型也可以視為一種去噪自編碼器**: - 輸入:加入遮罩(Masking)的句子,相當於加入了噪音 - 編碼器:BERT模型本身 - 解碼器:預測被遮罩詞彙的線性模型 (或者可以將BERT的後半部分視為解碼器) - 目標:重建原始句子中被遮罩的詞彙 ![image](https://hackmd.io/_uploads/HkYI9Z4p1g.png) --- ## 自編碼器的高級應用 ### 特徵解耦 (Feature Disentanglement) 特徵解耦是指**識別並分離表徵向量中的不同語意特徵**,使每個特徵維度或維度組對應特定含義。例如: * **語音處理**:可能希望分離表示**內容資訊**和**說話者特徵**的維度 * **圖像處理**:可能希望分離表示**物體形狀**、**顏色**和**位置**的特徵。 ![image](https://hackmd.io/_uploads/SJDSjZETyg.png) 實現特徵解耦後,我們就能夠操控這些特徵來實現有趣的應用,如語音轉換(Voice Conversion)。例如,提取A說話的內容特徵和B的聲音特徵,結合後可以生成用B的聲音說A內容的語音。 ![image](https://hackmd.io/_uploads/ry0m2WEa1x.png) 相關文獻:[[1]](https://arxiv.org/abs/1904.05742)[[2]](https://arxiv.org/abs/1804.02812)[[3]](https://arxiv.org/abs/1905.05879) ### 離散潛在表徵 (Discrete Latent Representation) 傳統自編碼器的潛在表徵是連續的實數向量,但我們可以探索使用離散表徵的可能性: 1. **二元編碼**:每個維度只有0或1兩種可能,可用於表示特徵的有無。 2. **One-Hot編碼**:向量中只有一個元素為1,其餘為0,可用於無監督分類。 3. **向量量化變分自編碼器([VQVAE](https://arxiv.org/abs/1711.00937))**:使用一個編碼本(Codebook)儲存一組向量,編碼過程中選擇與輸入最相似的編碼本向量作為潛在表徵 (類似 [Self-attention](https://hackmd.io/@Jaychao2099/imrobot5))。這種方法在語音處理中尤其有用,可能可以[學習到 phonetic(基本的發音單位)](https://arxiv.org/pdf/1901.08810.pdf),類似於音標。 ![image](https://hackmd.io/_uploads/r1ej6Z4aye.png) ### 非向量表徵 更激進的想法是使用非向量形式的潛在表徵,例如: 1. **文字作為表徵**:在文本自編碼器中,使用**短文本**作為中間表徵,這有可能實現無監督的摘要生成。不過這種模型難以直接訓練出摘要功能,因為編碼器和解碼器可能開發出人類無法理解的「密碼」,因此需要結合判別器(Discriminator)和[強化學習(RL)](https://hackmd.io/@Jaychao2099/imrobot14)來解決。其實就是一種 [cycle-GAN](https://hackmd.io/@Jaychao2099/imrobot7#Cycle-GAN)。 ![image](https://hackmd.io/_uploads/Sy4TRbVpyx.png) 2. **樹結構作為表徵**:使用樹結構作為中間表徵,對於處理**具有層次結構的資料**可能有優勢。 ![image](https://hackmd.io/_uploads/HJcRkfVp1l.png) 相關文獻:[[1]](https://arxiv.org/abs/1806.07832)[[2]](https://arxiv.org/abs/1904.03746) --- ## 自編碼器的實用應用 ### Generator 生成模型 自編碼器的解碼器部分可以作為 Generator(生成器)使用。通過從已知分佈 (如高斯分佈) 採樣向量,再通過解碼器生成新資料。[第七章](https://hackmd.io/@Jaychao2099/imrobot7#%E5%85%B6%E4%BB%96%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8B)提到的VAE就是基於這一原理的生成模型。 ![image](https://hackmd.io/_uploads/HkjqefN6kg.png) > 延伸閱讀:[【生成式AI導論 2024】有關影像的生成式AI - VAE](https://hackmd.io/@Jaychao2099/gen-ai-11#Variational-Autoencoder-VAE) ### 資料壓縮 自編碼器可以用於資料壓縮,編碼器執行壓縮操作,解碼器執行解壓縮操作。不過,這種壓縮通常是有損的。 ![image](https://hackmd.io/_uploads/HkQRdSNa1e.png) 相關文獻:[[1]](https://arxiv.org/abs/1708.00838)[[2]](https://arxiv.org/abs/1703.00395) ### 異常檢測 (Anomaly Detection) 異常檢測是自編碼器的一個重要應用。原理是: 1. 使用正常資料訓練自編碼器 2. 測試時,正常資料能被較好地重建,而**異常資料的重建效果較差** 3. 通過計算重建誤差判斷資料是否正常 這種方法適用於**只有大量正常資料但缺乏異常資料**的情境,如[詐欺偵測](https://www.kaggle.com/ntnu-testimon/paysim1/home)、[網路入侵偵測](http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html)和[醫學細胞異常檢測](https://www.kaggle.com/uciml/breast-cancer-wisconsin-data/home)等。這類問題稱為單類別(One-Class)分類問題,傳統的二分類方法難以應用,而自編碼器則提供了有效的解決方案。 ![image](https://hackmd.io/_uploads/SkUf9BV6kx.png) * 更多 Anomaly Detection 內容 (2019上課影片):[[1]](https://youtu.be/gDp2LXGnVLQ)[[2]](https://youtu.be/cYrNjLxkoXs)[[3]](https://youtu.be/ueDlm2FkCnw)[[4]](https://youtu.be/XwkHOUPbc0Q)[[5]](https://youtu.be/Fh1xFBktRLQ)[[6]](https://youtu.be/LmFWzmn2rFY)[[7]](https://youtu.be/6W8FqUGYyDo) --- ## 結論 自編碼器是一種有著豐富歷史的無監督學習方法,雖然構思簡單,但應用廣泛。從基本的資料壓縮到複雜的生成模型,從特徵提取到異常檢測,自編碼器展現了強大的靈活性和實用性。隨著深度學習的發展,自編碼器也在不斷演化,產生了多種變體和新穎應用,如去噪自編碼器、特徵解耦和離散表徵等,為機器學習領域帶來了更多可能性。 --- 回[主目錄](https://hackmd.io/@Jaychao2099/aitothemoon/)