---
# System prepended metadata

title: 【生成式AI導論 2024】15~16 生成式人工智慧的生成策略 和 Speculative Decoding
tags: [生成式AI]

---

20251101筆記 內容可能有錯誤，請參考原始影片

[李宏毅【生成式AI導論 2024】](https://www.youtube.com/playlist?list=PLJV_el3uVTsPz6CTopeRp2L2t4aL_KgiI)

[【生成式AI導論 2024】第15講：為什麼語言模型用文字接龍，圖片生成不用像素接龍呢？— 淺談生成式人工智慧的生成策略)
](https://youtu.be/QbwQR9sjWbs?si=uqjfaGlYHtHZdhoR)
[【生成式AI導論 2024】第16講：可以加速所有語言模型生成速度的神奇外掛 — Speculative Decoding](https://youtu.be/MAbGgsWKrg8?si=o2UlTZCo2hEqfmG7)




### 【生成式AI導論 2024】第15講：為什麼語言模型用文字接龍，圖片生成不用像素接龍呢？— 淺談生成式人工智慧的生成策略 大綱


### I. 生成式 AI 的本質與基本單位

*   **目標：** 讓機器產生複雜而有結構的物件（如文字、影像、聲音）。
*   **基本單位：**
    *   文字：**Token** (例如 LLaMA 有 32,000 個 token 組成 vocabulary)。
    *   影像：**Pixel** (像素，如 24BP 達 1670 萬色)。
    *   聲音：**Sample** (取樣點，如 22K/44K 取樣率)。
*   **本質：** 給定一個條件，將基本單位以正確的排序組合起來。

### II. Auto-Regressive Generation：接龍式生成

*   **機制：** 循序漸進、按部就班。每次產生一個基本單位，並將其作為下一次生成的輸入。
*   **優點：** 運作成功且品質較好，因為每次生成都能基於前一個正確的結果，避免不一致性（multi-modality）。
*   **缺點 (速度限制)：** 生成速度慢。
    *   產生 1024x1024 圖片約需 100 萬次像素接龍。
    *   生成 1 分鐘 22K 語音需約 132 萬次接龍。
    *   過往 Wavenet 產生一段聲音訊號可能需耗時一小時以上，無法接受。

### III. Non-Auto-Regressive  Generation：齊頭並進

*   **機制：** 叫模型將所有基本單位（如位置 1, 2, 3 的輸出）**同時一次生成出來**。
*   **優點：** 大幅加快生成過程，特別在平行運算能力強的情況下。
*   **主要應用：** 影像生成通常採取 Non-Auto-Regressive 方式。
*   **缺點：** 容易遇到**生成品質不佳**的問題。

### IV. Non-Auto-Regressive 的限制：Multi-modality 問題

*   **定義：** 在 Non-Auto-Regressive 生成過程中，由於缺乏前一步結果的依賴，模型在不同位置進行獨立「**腦補**」，想法可能不一致。
*   **結果：** 輸出結果可能是模糊或胡成一團的「四不像」。
    *   例如：同時想畫向左跑的白狗與向右跑的黑狗，結果兩者混雜。
    *   文字範例：可能生成不合理的組合，像是「李宏毅是演授」(演員+教授)。
*   **Auto-Regressive 的優勢：** Auto-Regressive 避免了這個問題，因為後續的 token 是基於前面已生成的正確 token 進行條件化生成的。

### V. 克服 Non-Auto-Regressive 限制的策略：Auto-Regressive 與 Non-Auto-Regressive 的結合

*   **策略 1：預先導入隨機向量確保一致性**
    *   設計：除了輸入條件外，給予生成模型一個隨機向量（一排數字）。
    *   作用：此向量作為模型腦補的內容，使所有位置的生成都基於相同的內部想法，保持內容一致。

*   **策略 2：階層式生成 (Hierarchical Generation) / 壓縮與還原**
    *   機制：先用 Non-Auto-Regressive 模型產生一個**精簡的（壓縮的）版本**，再由 Auto-Regressive 模型（Decoder）產生**精細的、人看得懂的版本**。
    *   精簡版本：通常是透過 **Autoencoder** 訓練得到的壓縮結果，人看不懂，但 Decoder 可還原。
    *   壓縮比例：例如 16x16 的範圍可用一個點來表示。
    *   應用：常見於影像生成（如 Midjourney, Stable Diffusion）與語音生成。

*   **策略 3：多步驟 Non-Auto-Regressive (Multi-step Refinement) / 級聯生成**
    *   機制：將生成過程拆解成多個階段，每個階段都使用 Non-Auto-Regressive 模型。
    *   案例一：漸進式網路 (Progressive Network)。版本差異為**圖片大小**（如 4x4 到 1024x1024）。
    *   案例二：**Diffusion Model**。版本差異為**雜訊程度**（從有雜訊到無雜訊的乾淨圖片）。
    *   案例三：**修復式生成 (Inpainting)**。每次生成後，自動將不好的地方塗掉，然後再根據保留的部分重生成下一版本。
    *   效益：雖然仍是某種形式的 auto-regressive，但步數減少，從而加快了生成速度。

---

### 1. 生成式 AI 的基礎與目標

生成式 AI (Generative AI) 的定義在於讓機器產生**複雜而有結構的物件**，包括文字、影像或是聲音訊號。所謂的「複雜」，指的是這些可能的物件幾乎無法被窮舉。然而，這些無法窮舉的複雜物件背後卻是由**有限的基本單位**所構成的。

**基本單位及其特性：**

*   **文字 (Tokens)：** 一句話是由 Token 所構成的。Token 是由語言模型的開發者在訓練模型之前就已經事先定好的。不同的語言模型 Token 數目不同。舉例來說，Llama 模型有 **32,000 個 Token**，這些 Token 組成的集合稱為 **vocabulary**。
*   **影像 (Pixels)：** 影像是像素 (pixel) 所構成的。每個像素的顏色數量取決於 Bits per pixel (BP)，例如 24BP 指的是 1670 萬色，也就是全彩色或真彩色。
*   **聲音 (Samples)：** 聲音是由大量的**取樣點 (sample)** 構成的。一秒鐘內點的數量稱為**取樣率 (sampling rate)**。為了讓聲音聽起來悅耳，取樣率通常至少需要 22K 或 44K 左右。

生成式 AI 的核心工作是：給定一個條件，將這些基本單位（Token、Pixel、Sample）用**正確的排序**組合成最終的輸出。

### 2. Auto-Regressive Generation 的運作與限制

**Auto-Regressive 機制（接龍式生成）：**

對話式 AI 採取的生成方式稱為 **auto-regressive  generation**，也就是所謂的「文字接龍」。語言模型做的事情是：讀取一個輸入，**每次產生一個 Token**，再將這個產生的 Token 當作自己的輸入，然後再產生下一個 Token，以此類推。

**Auto-Regressive 的成功與局限性：**

*   **成功：** Auto-Regressive 方式在文字生成上已證明非常成功且厲害。影像（像素接龍） 和聲音（Sample 接龍） 也理論上可用 Auto-Regressive 方式生成（如 2016 年 Google 的 Wavenet）。
*   **速度限制：** Auto-Regressive 方式的本質限制在於**必須按部就班、循序漸進**。必須等第一個 Token 產生後才能生成第二個。
    *   生成一張 1024x1024 的圖片（約 100 萬個像素）需要做 **100 萬次像素接龍**，這相當於每次生成一張圖都要寫一部《紅樓夢》。
    *   生成一分鐘 22K 取樣率的語音，需要做約 **132 萬次接龍**。
    *   例如 Wavenet 雖然品質好，但生成一段音訊可能耗時一小時以上，完全無法接受。
*   **結論：** Auto-Regressive 方式在生成圖、音訊時會碰到非常大的障礙，因此必須換一個思路。

### 3. Non-Auto-Regressive  Generation 的引入與挑戰

**Non-Auto-Regressive 機制（非接龍式生成）：**

為了解決 Auto-Regressive 必須按部就班的問題，我們可以採用 **Non-Auto-Regressive generation**。Non-Auto-Regressive 的核心思想是**不要按部就班**，而是告訴模型輸入是什麼，然後叫它將輸出位置 1、2、3... 的所有基本單位**同時一次生成出來**。

*   **效益：** 如果機器具備強大的平行運算能力，Non-Auto-Regressive 可以**大幅加快**生成的速度。雖然 Auto-Regressive 和 Non-Auto-Regressive 在所需的總運算量上可能沒有本質差異，但在時間上會有巨大的差異。
*   **應用：** 這就是為什麼今天**影像的生成**通常都採用 Non-Auto-Regressive 方式，而不是像素接龍。文字生成雖然 Auto-Regressive 已經夠快，但在生成長篇大論時，也可以考慮採用 Non-Auto-Regressive 方式加速。
    *   Non-Auto-Regressive 應用於文字：可以先讓模型預測要回答的 Token 數量，然後一次性生成所有位置的 Token；或者讓模型生成固定長度（如 1000 個 Token），再根據 End 符號丟棄後面的部分。

**Non-Auto-Regressive 的本質限制：品質不佳 (Multi-modality 問題)：**

*   Non-Auto-Regressive 經常遇到的問題是**生成出來的東西品質不好**。
*   原因：生成式 AI 在生成時需要進行「**腦補**」（自補齊）。當 Non-Auto-Regressive 在平行運算時，模型在生成不同位置的像素時，其內部想腦補的內容可能**不一致**。
    *   例如：畫一隻奔跑的狗，模型畫第一個像素時想的是「向左跑的白狗」，畫第二個像素時卻突然想畫「向右跑的黑狗」。
    *   結果：如果將所有獨立生成的結果加在一起，可能產生一個**模糊或混雜的「四不像」**。這個問題被稱為 **multi-modality 的問題**（詞彙上帶有一點混淆性）。
*   **Auto-Regressive 的優勢：** Auto-Regressive 模型因為是依賴前一個正確的結果生成後續的內容，例如先生成「演」，後續的生成會基於「李宏毅是演」，所以 Auto-Regressive 能夠保證生成結果的連貫性與合理性，不會有這種同時想講 A 又想講 B 的問題。

### 4. 克服 Non-Auto-Regressive 缺點的策略：Auto-Regressive 與 Non-Auto-Regressive 的結合

由於影音生成不得不採用 Non-Auto-Regressive 以追求速度，因此需要發明新方法來克服 Non-Auto-Regressive 的品質問題。

#### 4.1. 預先固定腦補內容 (使用隨機向量)

*   **思路：** 在生成開始時，就將所有需要腦補的內容**講清楚並定好**，讓 AI 在整個生成過程中，所有位置腦補出來的東西都保持一致。
*   **設計：** 知名的影像生成模型（如 VAE、Flow-based model、Diffusion model）都共享一個設計：在生成之前，必須**隨機生成一個向量**（一排數字）。
*   **實踐：** 模型在生成時，不僅考慮輸入的文字條件，同時也要考慮這個向量的內容。這個向量的作用就是**幫助模型腦補**，使整張圖片的內容保持一致。

#### 4.2. 階層式生成（壓縮與還原）

*   **思路：** 結合 Auto-Regressive 和 Non-Auto-Regressive 的優點。先用速度快的 Non-Auto-Regressive 模型產生一個**精簡的 (reduced) 版本**，然後再用品質好的 Auto-Regressive 模型根據這個精簡版本產生**精細的版本**。
    *   由於精簡版本已經把大框架定好，限制了 Auto-Regressive 模型腦補的空間，使得其只負責填補細節，從而避免了不一致性。
*   **精簡版本生成：**
    *   **Autoencoder (自編碼器)：** 這是一種常見的技術，透過訓練一個 **Encoder** (類神經網路) 將圖檔進行壓縮，產生人看不懂的壓縮結果；再透過一個 **Decoder** 將壓縮結果還原成原來的圖檔。
    *   **壓縮程度：** 一個 16x16 範圍的像素可以壓縮成僅用一個點來表示。
    *   **最終流程：** Non-Auto-Regressive 模型專注生成人看不懂的**壓縮版 Token**；然後將這個壓縮版丟給 **Decoder** (它通常是個 Auto-Regressive 模型)，Decoder 將其還原成最終的圖案。

#### 4.3. 多次 Non-Auto-Regressive 迭代精修 (Multi-step Non-Auto-Regressive)

*   **思路：** 將生成步驟拆解成多個階段，每個階段都使用 Non-Auto-Regressive 生成一個「版本」，而後續的版本都基於前一個版本生成。這本質上是將原本痛苦的 Auto-Regressive 步驟變少的一種「層級式 Auto-Regressive Generation」。
*   **版本間的差異：**
    *   **圖形尺寸：** 如 NVIDIA 的 Progressive Network 或 Google 的影像模型，先生成 4x4 的圖片，再生成 8x8，直到 1024x1024。
    *   **雜訊程度 (Diffusion Model)：** 從一個充滿雜訊的圖開始，逐步生成到雜訊少一點的版本，直到最後生成乾淨的圖。這是目前影像生成（如 Diffusion Model）主流的技術。
    *   **修復式生成：** 每一次生成後，自動識別並**塗掉**生成得不好的地方（淺色），然後根據保留的部分（深色）再重生成下一版本，直到生成完整圖片。

*   **當代應用：** 現今常見的影像生成模型（如 Midjourney, Stable Diffusion, 新版 DALL-E）大都採取 **Non-Auto-Regressive 迭代精修 + 壓縮**的結合方式。例如，Midjourney 在生成時，會將每一次使用 Non-Auto-Regressive 模型生成的壓縮版輸出，透過 Decoder 呈現給用戶，使其看到從模糊到清晰的漸進過程。

### 5. Auto-Regressive 與 Non-Auto-Regressive 的總結對比

| 特性 | Auto-Regressive  | Non-Auto-Regressive |
| :--- | :--- | :--- |
| **生成方式** | 按部就班、循序漸進 (Sequential) | 齊頭並進、一次到位 (Parallel/Simultaneous) |
| **生成品質** | 較好，避免 Multi-modality 問題 | 較差，易發生 Multi-modality 問題 |
| **生成速度** | 較慢 | 較快 |
| **主要應用** | 文字生成（如 GPT 系列） | 影音生成（需大量加速） |

**最終結論：** Auto-Regressive 和 Non-Auto-Regressive 各有長短，目前最好的生成式 AI 應用（特別是影像生成）都是將這兩種方法結合起來生成的。
### 【生成式AI導論 2024】第16講：可以加速所有語言模型生成速度的神奇外掛 — Speculative Decoding 大綱

### I. Speculative Decoding 概述

*   **定義：** 一種加速任何語言模型（LM）生成速度的新技術。
*   **特性：** 是一個「**神奇的外掛**」，無需對原有模型進行任何訓練或修改。
*   **效益：** 可將生成速度加快約兩倍甚至到三倍左右。

### II. 核心概念：解決 Auto-regressive 的痛點

*   **痛點：** Auto-regressive 模型必須按部就班、循序漸進地生成，必須等第一個 token 產出才能生成第二個 token。
*   **核心思想：** 引入一個「**預言家**」（Prophet）來預判語言模型接下來的輸出。
*   **機制：** 預言家預測後，將多個 token 作為輸入，丟給主語言模型進行**平行運算**。

### III. Speculative Decoding 的運作流程

*   **預測：** 輸入先給預言家快速預測接下來的 $K$ 個 token。
*   **平行處理：** 將包含 $K$ 個預測 token 的多組輸入同時丟給主語言模型。
*   **驗證與輸出：** 語音模型同時產生多個 token，再與預言家的輸出進行比對驗證，只輸出確認正確的部分。
*   **效益/取捨：** 即使預言家犯錯，只要部分預測正確，仍能加速；本質上是用**運算資源換取時間**。

### IV. 誰來擔任預言家 (Prophet)

*   **要求：** 速度超快（時間耗費可忽略）、偶爾犯錯沒關係。
*   **候選者：**
    1. **Non-auto-regressive 模型：** 生成速度快，但品質較差、容易犯錯。
    2. **壓縮後的小模型：** 透過量化或知識蒸餾等技術變小，跑得快，但容易出錯。
    3. **搜尋引擎/資料庫：** 搜尋資料庫中與當前輸入接續的常見句型。
*   **多個預言家：** 可同時使用多個預言家來提高預測的正確機會。

---

### 1. Speculative Decoding 的背景與效益

Speculative decoding 是一種應用於語言模型生成過程中的新技術。語言模型在生成長篇大論時，等待時間可能會非常漫長。雖然對於不需生成非常長結果的任務來說，使用 auto regressive 模型或許已經足夠，但 speculative decoding **可以加快任何語言模型（LM）生成的速度**。

該方法與您使用的模型本身無關，它不需要對原模型做任何訓練或改動。它被稱為一個「**神奇的外掛**」，掛上去之後，語言模型生成的速度就會突然加快。例如，L3B 模型在使用 speculative decoding 之後，其生成速度大約可以達到原來的**兩倍，甚至到三倍左右**。這項技術非常值得介紹，甚至目前我們看到的如 GPT-4 產生的結果，也可能已經使用了 speculative decoding 來加速原有的語言模型生成速度。

### 2. Auto-regressive 模型的痛點與核心概念

Auto-regressive model 的主要痛點在於它需要**按部就班、循序漸進**。在第一個 token 尚未生成出來之前，我們沒有辦法生成第二個 token。

Speculative decoding 的核心想法是引入一個「**預言家**」（Prophet）。這個預言家能夠做的事情就是**預判**語言模型接下來的生成內容。如果預言家能夠根據輸入直接預判語言模型等一下會產生的 token（例如黃色的 token），那麼就可以將**輸入**，以及**輸入加上預測的 token**，同時丟給語言模型進行**平行的運算**。這樣一來，就可以一次產生兩個 token，從而跳過了 auto-regressive 必須等待前一個 token 生成才能生成下一個 token 的問題。

如果能夠讓多個 token 同時被產生出來，例如一次產生兩個 token，那麼生成速度馬上就會變成原來的兩倍。

### 3. Speculative Decoding 的具體運作方式

整個 speculative decoding 的運作方法如下：

1.  **預言家預測：** 當輸入（例如藍色的輸入）進來時，會先給預言家看。預言家會快速預測接下來的 token 序列（例如先是紅色的 token，再是黃色的 token）。在實際假設中，**預言家做預言的時間可以被忽略不計**，因為它被假設為奇快無比。
2.  **主模型平行運算：** 既然預言家已經預測了結果，我們就可以同時將多組輸入丟給語言模型進行運算：
    *   第一組：原始輸入。
    *   第二組：輸入 + 紅色 token。
    *   第三組：輸入 + 紅色 token + 黃色 token。
    語言模型就會直接預測這三步的結果。
3.  **外人視角：** 從外人的觀點來看，語言模型似乎一次就吐出了三個 token，速度變成了原來的三倍。

### 4. 預言家犯錯的處理機制

你可能會困惑：如果預言家這麼厲害，為什麼還要語言模型？直接用預言家生成就好。這就引出了關鍵問題：**預言家有可能會犯錯**。

*   **錯誤情境：** 假設預言家無法精準預測，例如它猜測第一個 token 是紅色的（對），但第二個 token 猜是灰色的（錯）。
*   **平行處理照常：** 即使預言家犯錯，我們仍然先相信它，將包含紅色 token 和灰色 token 的輸入丟給語言模型，讓語言模型**同時輸出三個 token**。
*   **驗證機制：** 我們會將語言模型真正輸出的結果拿去與預言家的輸出進行比對。
*   **結果不可信的判斷：** 由於預言家的第二個輸出（灰色 token）是錯的，所以語言模型所輸出的第三個 token（例如綠色 token）是**不可信的**，因為它的輸入（包含灰色的部分）已經是錯的了。
*   **實際輸出：** 我們只會把肯定是對的部分拿出來給使用者來看。即使預言家犯了一個錯誤，導致語言模型只有前兩個 token 是對的，你仍然可以一次輸出前兩個 token。原本只能一次輸出一一個 token，現在變成一次輸出兩個 token，**速度仍然變成了原來的兩倍，你還是有賺**。

### 5. 最糟情況與資源耗損

*   **最糟情況：** 假設預言家非常差勁，它的所有預測完全都是錯的。在這種情況下，只有第一個 token 的結果是可信的。
*   **不賺不賠（近似）：** 如果你只能輸出一一個 token，整體來講，你幾乎可以說是不賺不賠，因為本來一樣的時間你也只能輸出一個 token。
*   **資源損失：** 雖然時間上可能沒有損失，但仍然會有耗損：
    1.  **預言家預言時間：** 雖然我們通常假設預言家的時間消耗可以忽略不計。
    2.  **運算資源的浪費：** 為了預測多個 token 而進行的平行運算，如果預言家是錯的，這些運算就白費了，沒有派上用場。
*   **核心取捨：** Speculation decoding 假設你不在意運算資源，而**真正在意的是時間**。它就是用運算資源來換取了時間的加速。

### 6. 預言家（Prophet）的身份選擇

擔任預言家的模型必須具備的特質是**超快**，並且偶爾犯錯沒有關係。最糟的狀況也不過是全部輸出都是錯的，達到不損不失的狀態而已。

**潛在的預言家候選者包括：**

1.  **Non-auto-regressive Model：** Non-auto-regressive 模型的特性是生成速度快，因為所有輸出都是同時生成的。雖然它的缺點是**容易犯錯**且生成品質不好，但這恰好符合預言家可以犯錯的要求。因此，speculative decoding 也可以看成是 **Nauto-regressive model 與 auto-regressive model 的結合**。
2.  **壓縮後的小模型：** 可以將原有的語言模型做壓縮，作為預言家。壓縮方法有很多種，例如對模型參數進行量化 (quantization) 或知識蒸餾 (knowledge distillation)。模型變小後跑起來當然就快了，但缺點是「腦袋不好使了」，很容易說出奇怪的錯誤答案。但因為預言家可以犯錯，所以壓製後跑得快的模型可以擔任此職位。
3.  **搜尋引擎/資料庫：** 預言家不一定非得是一個語言模型。有研究使用**搜尋引擎**來擔任預言家。它會根據當前輸入，在資料庫（例如 Google，但不一定）中搜尋後面常接什麼樣的句子，然後將找到的句子直接貼出來作為預言家的輸出。前提是必須假設搜尋資料庫的速度非常快，快到可以忽略。

此外，預言家不只能有一個。可以同時有多個預言家各自產生預言，藉此來強化預測正確的機會。預測越正確，你節省的時間就越多。


---
其他課程:

[【生成式AI導論 2024】00~02 生成式AI介紹](https://hackmd.io/@JuitingChen/ByiS0S_Aex)
[【生成式AI導論 2024】03~05 訓練不了人工智慧？你可以訓練你自己](https://hackmd.io/@JuitingChen/SJZdX5KAlx)
[【生成式AI導論 2024】06~08 大型語言模型修練史](https://hackmd.io/@JuitingChen/H1vfEqYCee)
[【生成式AI導論 2024】09~11 AI Agent、Transfoermer、可解釋性](https://hackmd.io/@JuitingChen/BybEB9KRxx)
[【生成式AI導論 2024】12~14 淺談檢定大型語言模型能力和大型語言模型相關的安全性議題](https://hackmd.io/@JuitingChen/ByyxUcY0le)
[【生成式AI導論 2024】15~16 生成式人工智慧的生成策略 和 Speculative Decoding](https://hackmd.io/@JuitingChen/H1sW_mfJZg)
[【生成式AI導論 2024】17~18 有關影像的生成式AI 和 GPT-4o 可能的語音技術](https://hackmd.io/@JuitingChen/S1uFKmG1Zx)