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)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up