---
# System prepended metadata

title: 第九章：自編碼器 (Auto-encoder)
tags: [機器學習]

---

# 第九章：自編碼器 (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/)