# 第十講:淺談生成式人工智慧的生成策略 - 為什麼語言模型用文字接龍,圖片生成不用像素接龍呢? >上課筆記 * 上課影片連結 * ==**[為什麼語言模型用文字接龍,圖片生成不用像素接龍呢?— 淺談生成式人工智慧的生成策略](https://youtu.be/QbwQR9sjWbs)**== * ==**[可以加速所有語言模型生成速度的神奇外掛 — Speculative Decoding](https://youtu.be/MAbGgsWKrg8)**== --- ## 生成式人工智慧 (Generative AI) 概論 生成式人工智慧 (Generative AI) 旨在讓機器能夠產生複雜且具有結構的物件。這些物件的特性是: 1. **複雜性**:可能的生成結果數量龐大,幾乎無法窮舉 (例如:所有可能的文章、圖片、聲音片段)。 2. **結構性**:儘管結果複雜多樣,但它們都是由有限的基本單位 (Building Blocks) 所構成。 這些基本單位根據生成物件的類型而有所不同: * **文字 (Text)**:由 **Token** 構成。Token 是預先定義好的符號單位 (詞彙、字元或子詞),語言模型從一個固定的詞彙庫 (Vocabulary) 中選擇 Token 來組成句子或文章。可以使用 [OpenAI Tokenizer](https://platform.openai.com/tokenizer) 工具來觀察文字如何被拆解成 Token。 ![image](https://hackmd.io/_uploads/BkkRN-Hggl.png) * **影像 (Image)**:由 **像素 (Pixel)** 構成。每個像素有其顏色,顏色的數量取決於 BPP (Bit per Pixel)。常見的 24 BPP 代表每個像素可以有約 1670 萬種顏色 (真彩色)。圖片由大量像素排列組合而成。 ![image](https://hackmd.io/_uploads/ByPh4bHglx.png) * **聲音 (Audio)**:由 **取樣點 (Sample)** 構成。聲音訊號在時間上被切割成離散的點,每個點代表該時刻的聲音強度。 * **取樣率 (Sampling Rate)**:每秒包含的取樣點數量,例如 16 KHz 代表每秒有 16,000 個點。CD 音質通常為 44.1 KHz。 * **取樣解析度 (Bit Resolution)**:每個取樣點可以表示的數值範圍,決定聲音的動態範圍。 ![image](https://web.archive.org/web/20211027193750oe_/https://lh3.googleusercontent.com/XMJlFDtiFU7WtZYnPDMDhT6jTFEXvTpY7c7sY70PtTkzEIDm6DvUv5nvHHwbOrUrDckS34aIu5fiZx0615p1-nf3rFxzhza387ud=w2048-rw-v1) [來源](https://web.archive.org/web/20211027193750/https://deepmind.com/blog/article/wavenet-generative-model-raw-audio) --- ## 生成式人工智慧的本質 生成式 AI 的核心任務是:給定一個**條件 (Condition)** (例如:一段文字描述、一個問題),模型需要學習如何將對應的基本單位 (Token、Pixel 或 Sample) 以**正確的排序組合**起來,生成目標物件。 * **對話 AI (例如:ChatGPT)**:輸入是使用者提問 (Condition),輸出一連串 **Token** 組成的回答。 * **繪圖 AI (例如:Midjourney, Stable Diffusion)**:輸入是圖片描述 (Condition),輸出一堆 **Pixel** 組成的影像。 * **聲音生成 AI (例如:語音合成、音樂生成)**:輸入是文字或指令 (Condition),輸出一大堆 **Sample** 組成的聲音訊號。 ![image](https://hackmd.io/_uploads/HJWpBZHlee.png) --- ## 生成的策略一:Autoregressive Generation (AR) Autoregressive Generation (自迴歸生成),簡稱 AR,是一種常見的生成策略,其核心思想類似於「接龍」。 ### 運作方式: 1. 模型接收輸入 (Condition) 或已生成的序列。 2. 模型預測下一個最可能的基本單位 (Token/Pixel/Sample)。 3. 將新生成的單位附加到序列末端。 4. 將更新後的序列作為新的輸入,重複步驟 2 和 3,直到生成完成 (例如遇到結束符號或達到指定長度)。 ![image](https://hackmd.io/_uploads/HyLzUZSele.png) ### 應用與成功: * **文字生成**:AR 在文字生成上取得了巨大成功,目前主流的語言模型 (如 GPT 系列) 大多採用此策略,也就是「文字接龍」。 * **影像生成 (像素接龍)**:AR 理論上也可應用於影像生成,逐一預測並生成每個像素。早在 2016 年就有相關研究 ([2016 上課影片](https://youtu.be/YNUek8ioAJk?t=537)),OpenAI 也曾推出 [ImageGPT](https://openai.com/blog/image-gpt/)。 ![未命名](https://hackmd.io/_uploads/HJNVdZHglg.jpg) * **聲音生成 (樣本接龍)**:同樣可應用於聲音生成,逐一預測並生成每個取樣點。代表性模型是 2016 年 deepmind 的 [WaveNet](https://arxiv.org/abs/1609.03499)。 ![image](https://web.archive.org/web/20211027193750oe_/https://lh3.googleusercontent.com/Zy5xK_i2F8sNH5tFtRa0SjbLp_CU7QwzS2iB5nf2ijIf_OYm-Q5D0SgoW9SmfbDF97tNEF7CmxaL-o6oLC8sGIrJ5HxWNk79dL1r7Rc=w2048-rw-v1) ### AR 的本質限制:效率問題 AR 策略最大的限制在於其**按部就班 (Sequential)** 的生成方式。必須生成完前一個單位,才能生成下一個單位,無法有效利用平行運算能力。當需要生成的基本單位數量非常龐大時,效率會變得極低: * **生成 1024x1024 圖片**:需要進行約 100 萬次像素接龍,計算量巨大,耗時極長 (相當於每次生成圖片都要寫一部《紅樓夢》)。 * **生成 1 分鐘 22KHz 語音**:需要進行約 132 萬次樣本接龍,同樣非常耗時 (WaveNet 生成幾秒語音可能需要數十分鐘甚至更久)。 由於效率問題,AR 策略雖然在文字生成上表現優異,但在基本單位數量遠超文字的影像和聲音生成上,則顯得不切實際。 ![image](https://hackmd.io/_uploads/HJ6vd-Slex.png) --- ## 生成的策略二:Non-autoregressive Generation (NAR) Non-autoregressive Generation (非自迴歸生成),簡稱 NAR,是為了解決 AR 效率問題而提出的生成策略。 ### 運作方式: NAR 的核心思想是**一次到位 (One-shot)** 或 **平行生成 (Parallel Generation)**。模型嘗試一次性或分批並行地生成所有或大部分基本單位,而非一個接一個生成。 ![image](https://hackmd.io/_uploads/SkGc_bHxeg.png) ### 優點: * **速度快**:可以充分利用現代硬體的平行運算能力,大幅縮短生成時間。 ### 應用: * **影像生成**:目前主流的影像生成模型大多採用 NAR 或其變體策略,以實現快速生成。 * **聲音生成**:同樣廣泛應用於聲音生成領域。 * **文字生成**:NAR 也可以應用於文字生成以加速。 * 方法一:先預測輸出總長度 $N$,然後一次生成 $N$ 個 Token。 * 方法二:生成固定長度的 Token 序列,並包含一個特殊的結束符號 `[END]`,最終輸出時截取 `[END]` 之前的內容。 相關論文:[A Survey on Non-Autoregressive Generation](https://arxiv.org/pdf/2204.09269.pdf) ![image](https://hackmd.io/_uploads/S1NwF-Sxll.png) ### NAR 的品質問題:Multi-modality Problem NAR 雖然速度快,但面臨一個主要的挑戰:**生成品質**。問題根源在於 **Multi-modality Problem** (多模態問題,此處指輸出可能性的多樣性)。 * **問題描述**:當給定一個條件時,可能的輸出往往是多樣的 (例如,「一隻奔跑的狗」可以是各種品種、姿態、背景)。NAR 模型在平行生成不同位置的基本單位時,可能對於「應該生成什麼」產生不一致的「腦補」(Internal Hypothesis)。 * **影像範例**:生成像素 A 時模型想畫「向左奔跑的白狗」,生成像素 B 時卻想畫「向右奔跑的黑狗」。由於缺乏 AR 模型中前一個單位對後一個單位的約束,這些不一致的內部假設混合在一起,可能導致最終圖像模糊不清或「四不像」。![image](https://hackmd.io/_uploads/r1Jot-Sgll.png) * **文字範例**:輸入「李宏毅是」,NAR 模型可能在第一個位置預測「演」的機率最高,在第二個位置獨立預測「授」的機率最高,最終可能生成不合理的「演授」。而 AR 模型在生成「演」之後,會基於「李宏毅是演」來預測下一個字,只會考慮「員」、「藝」等合理選項,避免了此問題。![image](https://hackmd.io/_uploads/rJxlqZrxex.png) * **解決思路**: 1. **提供一致的腦補資訊**:在生成時,除了輸入條件,額外提供一個隨機生成的**潛在向量 (Latent Vector)**。這個向量可以被視為對「具體要生成哪種可能輸出」的指導,確保模型在生成所有位置時,都基於同一個「腦補」方向。許多影像生成模型 (如 VAE, GAN, Flow-based Model, Diffusion Model) 都採用了類似的設計,引入隨機向量來控制生成的多樣性並提高一致性。![image](https://hackmd.io/_uploads/S1pNs-Bgge.png) 2. **結合 AR 與 NAR**。 3. **多次迭代 NAR**。 --- ## 結合 AR 與 NAR 策略 既然 AR 品質好但速度慢,NAR 速度快但品質可能有問題,一個自然的想法是將兩者結合,截長補短。 ### 核心思想: 1. **階段一 (AR 或類 AR)**:先用 AR (或計算量較小的類 AR 方法) 生成一個**精簡的、中間表示 (Compact Representation)**。這個中間表示捕捉了輸出的主要結構和內容,但細節較少,因此生成速度相對較快。這個中間表示**不一定需要人類能看懂**。 2. **階段二 (NAR)**:再用 NAR 模型根據這個精簡的中間表示,快速生成最終的**精細版本 (Detailed Output)**。由於主要結構已由第一階段確定,NAR 模型需要「腦補」的空間變小,Multi-modality 問題得到緩解,可以專注於填充細節。 ![image](https://hackmd.io/_uploads/BJGIsbBlle.png) ### AutoEncoder 的應用: 為了實現這種策略,常使用 **[AutoEncoder](https://hackmd.io/@Jaychao2099/imrobot9)** 結構來學習如何產生和利用這種「精簡的中間表示」。 * **Encoder (編碼器)**:一個神經網路,負責將輸入資料 (如圖片、聲音) **壓縮 (Compress)** 成一個低維度的潛在向量 (Latent Vector),即上述的「精簡中間表示」。壓縮過程會丟失部分細節,但保留關鍵資訊。例如,可以將 $16 \times 16$ 的像素區域壓縮成一個點,並將顏色數量從千萬級減少到千級。 * **Decoder (解碼器)**:另一個神經網路,負責將 Encoder 產生的潛在向量**解壓縮 (Decompress)**,還原成原始的高維度資料。 * **訓練目標**:訓練 Encoder 和 Decoder,使得原始輸入經過「壓縮 -> 解壓縮」後,得到的輸出與原始輸入越接近越好。 ![image](https://hackmd.io/_uploads/S1jRo-Hxxe.png) ### 結合流程: 1. **訓練 AutoEncoder**:使用大量資料 (如圖片或聲音) 訓練好 Encoder 和 Decoder。 2. **生成階段**: * 給定條件 (Condition)。 * 使用一個 **AR 模型** 來生成對應的**潛在向量** (即 Encoder 本來要輸出的東西)。因為潛在向量維度低、資訊量相對少,AR 生成它會比直接生成像素/樣本快得多。 * 將 AR 生成的潛在向量輸入到預訓練好的 **Decoder (NAR)** 中。 * Decoder 將潛在向量還原成最終的、高細節的輸出 (圖片或聲音)。 ![image](https://hackmd.io/_uploads/HJYnnZSege.png) ### 應用實例: * **影像生成**:許多現代模型採用此架構。 * **聲音生成**:例如 [VALL-E](https://arxiv.org/abs/2301.02111) 等模型,先用 AR 生成聲音的壓縮表示 (Codec),再由 Decoder 合成最終聲音波形。 ![image](https://hackmd.io/_uploads/S1IKabrxgx.png) * 相關綜述論文:[Towards audio language modeling](https://arxiv.org/html/2402.13236v1) --- ## 多次 Non-autoregressive Generation (Iterative NAR) 另一種克服 NAR 品質問題並結合 AR 優點的方法是進行**多次迭代的 NAR 生成**。 ### 核心思想: 將生成過程分解成多個步驟 ($N$ 個版本),每個步驟都使用 NAR 模型生成一個中間版本。後一個版本基於前一個版本進行優化和細化。 ![image](https://hackmd.io/_uploads/S1InTbSxeg.png) 這種迭代過程可以看作是**在更高層次上的 Autoregressive**:它不是在基本單位層面按部就班,而是在「版本」層面按部就班。由於總的迭代步數 $N$ 通常遠小於基本單位的數量,因此速度比純 AR 快得多,同時每一步的變化相對較小,有助於保持生成的一致性,緩解 Multi-modality 問題。 ### 迭代方式的多樣性: * **由小圖到大圖 (Progressive Growing)**:從低解析度圖像開始,逐步增加解析度生成更高解析度的版本。[[1]](https://arxiv.org/pdf/1710.10196.pdf)[[2]](https://arxiv.org/abs/2205.11487) ![image](https://hackmd.io/_uploads/rJapaWBlll.png) * **從有雜訊到無雜訊 (Denoising Diffusion)**:從一個純雜訊圖像開始,通過多個步驟逐步去除雜訊,最終得到清晰圖像。這是目前最主流的影像生成方法之一,即 **[Diffusion Model](https://arxiv.org/abs/2006.11239)**。 ![image](https://hackmd.io/_uploads/BJob0-Sllx.png) * **逐步修正 (Inpainting/Refinement)**:先用 NAR 生成一個初步結果,然後模型自動識別生成得不好的區域 (例如使用某些置信度判斷),將這些區域「塗掉」(Mask Out),再用 NAR 模型根據未塗掉的部分重新生成被塗掉的區域,反覆迭代。如 [MaskGIT](https://arxiv.org/abs/2202.04200)。 ![image](https://hackmd.io/_uploads/H1D8AbHegx.png) ### 結合 AutoEncoder 與多次 NAR: 現代頂級的影像生成模型 (如 Midjourney, Stable Diffusion, DALL-E 2/3) 往往結合了 **AutoEncoder** 和 **多次 NAR (通常是 Diffusion)**: 1. **訓練 AutoEncoder**:得到 Encoder 和 Decoder。 2. **生成階段**: * 給定條件 (Condition)。 * 使用**多次迭代的 NAR (Diffusion) 模型**在**潛在空間 (Latent Space)** 中進行生成。即,從一個隨機的潛在向量開始,逐步去噪,生成目標內容對應的**最終潛在向量**。 * 將這個最終潛在向量輸入到預訓練好的 **Decoder** 中。 * Decoder 將潛在向量還原成高解析度的最終圖像。 Midjourney 生成圖像時展示的從模糊到清晰的過程,就是 Diffusion 在潛在空間中逐步去噪,並將每個中間步驟的潛在向量通過 Decoder 展現出來的效果。 ![image](https://hackmd.io/_uploads/H1aj0-Bllg.png) --- ## 小結:AR vs NAR | 特性 | Autoregressive (AR) | Non-autoregressive (NAR) | | :----------- | :------------------------ | :--------------------------- | | **生成方式** | 按部就班、各個擊破、循序 | 齊頭並進、一次到位、平行 | | **速度** | 慢 | **快** :heavy_check_mark: | | **品質** | **較穩定、一致性好** :heavy_check_mark: | 需特殊處理 (易有多模態問題) | | **主要應用** | 文字 | 影像、聲音 | **重要啟示**:AR 和 NAR 各有優劣,實際應用中常將兩者結合 (例如通過 AutoEncoder 或多次迭代 NAR),以實現速度和品質的平衡。 --- ## 進階加速技術:Speculative Decoding Speculative Decoding (推測解碼) 是一種無需修改或重新訓練模型,即可加速任何大型語言模型 (LLM) 生成速度的技術,如同一個神奇的外掛。 ### 目標: 緩解 Autoregressive (AR) 模型按部就班生成導致的等待時間問題,尤其在生成長文本時。根據實驗,此技術可將 Llama 2 13B 等模型的生成速度提升 2 至 3 倍。 ![image alt](https://pytorch.org/wp-content/uploads/2024/11/fig1.gif) [來源](https://pytorch.org/blog/hitchhikers-guide-speculative-decoding/) ### 核心思想: 利用一個**小型、快速但可能不準確的「預言家」模型 (Draft Model / Proposer)** 來**推測 (Speculate)** 大模型接下來可能生成的**多個** Token。然後,讓**大型、準確但較慢的目標模型 (Target Model / Verifier)** 來**一次性驗證 (Verify)** 這些推測的 Token。 ![image](https://hackmd.io/_uploads/ryM9NMSlge.png) ### 運作流程: 1. **預測 (Speculate)**:給定當前輸入序列,快速的「預言家」模型預測接下來的 $k$ 個 Token 作為草稿 (例如,預測接下來會生成 Token A,然後 Token B)。假設預言家的預測時間極快,可忽略不計。 2. **並行驗證 (Verify)**:將`原始輸入`、`原始輸入+Token A`、`原始輸入+Token A+Token B` 等序列**同時**輸入給大型目標模型,讓其並行計算出每個序列對應的下一個「正確」Token。 3. **比對與接受 (Accept/Reject)**:比較預言家預測的 Token 與大型目標模型實際計算出的 Token。 * **步驟 1 驗證**:檢查目標模型對「`原始輸入`」輸出的 Token 是否與預言家預測的 Token A 一致。若一致,則接受 Token A。 * **步驟 2 驗證**:若 Token A 被接受,接著檢查目標模型對「`原始輸入+Token A`」輸出的 Token 是否與預言家預測的 Token B 一致。若一致,則接受 Token B。 * **停止點**:一旦預言家的預測與目標模型的輸出不一致,就停止接受該 Token 及其後續所有預測的 Token。 4. **輸出**:將所有被驗證接受的 Token 序列 (例如 Token A 和 Token B) 一次性輸出。如果第一個預測 Token A 就未通過驗證,則只輸出目標模型對原始輸入計算出的那一個正確 Token。 ![image](https://hackmd.io/_uploads/BynoNGHlex.png) ### 處理預言家錯誤: * **部分錯誤**:即使預言家只預測對了前 $m$ 個 ($m < k$) Token,Speculative Decoding 仍然可以在一個計算週期內輸出這 $m$ 個 Token,實現加速 (速度提升 $m$ 倍)。後續錯誤預測對應的計算會被捨棄。 * **完全錯誤**:如果預言家第一個預測就錯了,模型只會輸出一個正確的 Token,效果等同於標準的 AR 生成。此時的損失僅為預言家預測的微小時間開銷和目標模型驗證後續錯誤 Token 的「無謂運算資源耗損」。本質上,Speculative Decoding 是**用 (可能浪費的) 計算資源來換取時間**。 ![image](https://hackmd.io/_uploads/BJYmHMSgxl.png) ### 效果: * **加速**:只要預言家偶爾能猜對,就能在一個大模型計算週期內輸出多個 Token,顯著提升生成速度。 * **品質不變**:由於所有最終輸出的 Token 都經過了大型目標模型的驗證,因此生成結果的品質與僅使用目標模型進行標準 AR 生成完全一致。 ### 預言家模型的選擇: 對「預言家」的核心要求是**速度極快**,**準確性是次要的** (犯錯沒關係)。可能的選擇包括: * **Non-autoregressive Model (NAR)**:其生成速度快、但品質可能不佳的特性正好符合預言家需求。 * **壓縮後的模型 (Compressed Model)**:例如通過量化 (Quantization) 或知識蒸餾 (Knowledge Distillation) 得到的較小模型,運行速度快,即使精度有所下降也無妨。 * **[搜尋引擎 (Search Engine)](https://arxiv.org/abs/2304.04487)**:根據當前輸入,快速從大型資料庫 (如網頁索引) 中檢索可能的後續文本作為預測。 * **不限於語言模型**:任何能快速提出合理猜測的方法皆可。 * **[多個預言家 (Multiple Prophets)](https://arxiv.org/abs/2305.09781)**:可以同時使用多個不同的預言家進行預測,並選擇最有效的預測結果進行驗證,增加猜對多個 Token 的機會。 ### 相關論文: * [Fast Inference from Transformers via Speculative Decoding](https://arxiv.org/abs/2211.17192) * [Accelerating Large Language Model Decoding with Speculative Sampling](https://arxiv.org/abs/2302.01318) --- ## 總結 生成式 AI 旨在創造由基本單位 (文字 Token、影像 Pixel、聲音 Sample) 構成的複雜物件。 **主要生成策略**: 1. **Autoregressive (AR)**:按部就班生成,如文字接龍。 2. **Non-autoregressive (NAR)**:平行、一次性生成。 **策略融合**:為兼顧速度與品質,常結合兩者: * **AutoEncoder + AR/NAR**:先用 AR 生成壓縮表示,再用 NAR (Decoder) 還原。 * **多次 NAR (Iterative NAR)**:如 Diffusion Model,逐步從雜訊/低解析度生成至清晰/高解析度,在高層次上體現 AR 思想。 **加速技術**: * **Speculative Decoding**:用快速「預言家」模型推測多個 Token,再由大模型一次驗證,加速 AR 模型 (如 LLM) 生成,同時保證品質。 --- 回[主目錄](https://hackmd.io/@Jaychao2099/aitothemoon/)