簡介#

生成式 AI 能夠創造高度逼真且多樣化的圖像。本章探討一種能在數秒內生成細緻、多元圖像的技術。

Figure 1: An image generated by VQGAN [1]

需求釐清#

以下是候選人與面試官之間的典型互動:

候選人:系統一開始是否應聚焦於特定類別的圖像?

面試官:為了簡化,我們先從自然場景和城市景觀開始,之後再探索其他類別。

候選人:我們是否有自然場景的訓練資料?資料集規模多大?

面試官:我們有一個大型資料集,包含約 500 萬張自然場景與景觀的高解析度圖像。

候選人:系統是否需要支援額外的條件輸入,例如描述所需圖像的文字?

面試官:好問題。我們先聚焦於無條件的圖像生成,但系統應具備彈性以支援輸入提示。

候選人:生成圖像的目標解析度範圍是多少?

面試官:系統應根據使用者需求生成 1024$\times$1024 或 2048$\times$2048 像素的圖像。

候選人:圖像需要即時生成嗎?還是可以接受一些延遲?

面試官:即時生成並非必要,但合理的處理時間很重要。我們目標是每張圖像五秒鐘。

將問題框架化為機器學習任務#

定義系統的輸入與輸出#

在高解析度圖像合成中,使用者只需請求一張新圖像,輸出則是一張高解析度圖像。

Figure 2: Input and output of an image generation system

選擇合適的機器學習方法#

如第七章所述,圖像生成有多種方法,包括 VAEsGANs自迴歸模型(Autoregressive Models)擴散模型(Diffusion Models)。本節選擇最適合此任務的方法。

為何 VAEs 和 GANs 不足以勝任#

大多數 VAEs 和 GANs 的變體難以生成高解析度圖像(512x512 像素及以上)。它們面臨一個稱為後驗坍縮(Posterior Collapse) 的挑戰:隨著解析度提高,這些模型需要更高容量的解碼器來捕捉額外細節。訓練過程中,解碼器可能變得過於強大,以至於忽略來自潛在空間(Latent Space)的輸入,獨立地建模輸出。結果是潛在變數對生成過程的貢獻很小,降低了圖像的多樣性。

自迴歸模型 vs. 擴散模型#

自迴歸模型和擴散模型都能生成高解析度圖像,但在複雜度和資源需求上有顯著差異:

  • 自迴歸模型通常被認為較慢,因為其序列性質使每個像素依賴於先前生成的像素。這導致對大小為 $N\times N$ 的圖像具有 $O(N^2)$ 的時間複雜度,且過程難以平行化。為解決此問題,自迴歸模型改為逐塊生成(Chunk by Chunk) 而非逐像素生成。例如,使用 64$\times$64 像素的區塊生成 1024$\times$1024 的圖像只需 256 步,大幅減少計算開銷。
  • 擴散模型的複雜度隨圖像大小超線性增長,計算複雜度為 $O(TN^2)$,其中 $N$ 為像素數,$T$ 為去噪步驟數。較大的圖像通常需要更多的精煉步驟,進一步增加計算需求。

實際上,使用標準擴散模型生成高解析度圖像可能需要數分鐘1。相較之下,基於 Transformer 的自迴歸模型因採用逐塊方法,可在數秒內完成類似任務。本章以自迴歸模型為主進行教學,第九章將詳細介紹擴散模型。

Figure 3: Autoregressive image generation

自迴歸模型將圖像生成視為序列生成任務(Sequence Generation Task),依賴兩個主要元件:

  • 圖像分詞器(Image Tokenizer) — 將圖像編碼為離散標記(Discrete Tokens),或從離散標記解碼回圖像
  • 圖像生成器(Image Generator) — 生成標記序列

圖像分詞器#

圖像分詞化(Image Tokenization) 是指用一系列離散標記來表示圖像。這在自迴歸模型中至關重要,因為圖像是逐塊按序列生成的。

圖像分詞器是一個獨立訓練的模型,主要功能為:

  • 編碼(Encode):將圖像轉換為離散標記序列
  • 解碼(Decode):將離散標記序列還原為圖像

Figure 4: Image tokenizer’s encoding and decoding

圖像生成器#

圖像生成器逐塊生成圖像。僅解碼器 Transformer(Decoder-only Transformer) 是最有效的架構選擇,原因有二:

  1. 靈活的架構 — 能處理不同的模態(Modality)。在聊天機器人中處理文字標記;在圖像描述中接收圖像並輸出文字;在圖像生成中則生成圖像標記序列,再解碼為圖像。
  2. 捕捉長程依賴(Long-range Dependency) — 注意力機制能有效捕捉長程依賴,有助於生成連貫的圖像。

Figure 5: Decoder-only Transformer’s flexibility in handling various modalities

總結來說,我們採用基於 Transformer 的自迴歸模型來進行圖像生成。首先,圖像生成器(僅解碼器 Transformer)生成一系列離散標記,接著圖像分詞器將這些標記解碼為最終圖像。

Figure 6: Autoregressive image generation

資料準備#

資料準備包含兩個步驟:

  • 圖像清理與正規化
  • 圖像分詞化

圖像清理與正規化#

在此步驟中,我們移除低品質圖像並確保資料集的一致性:

  • 移除低品質圖像 — 丟棄低解析度、過多雜訊或無關內容的圖像。確保資料集涵蓋多樣的風格、主題與構圖,讓模型能產出多元且高品質的輸出。
  • 正規化圖像 — 將像素值縮放至 0 到 1 的範圍,以穩定訓練。
  • 調整圖像大小 — 依面試官的要求,將所有圖像統一調整為 1024x1024,以確保輸入的一致性。

圖像分詞化#

圖像生成器需要將圖像表示為離散標記序列。在訓練完圖像分詞器後,我們將訓練資料集中的所有圖像分詞化為離散標記。

此資料準備步驟是為圖像生成器而非圖像分詞器準備的。

Figure 7: Data preparation process

這兩個步驟確保訓練資料具有高品質、一致性,並以數值序列的形式表示。

模型開發#

架構#

圖像分詞器#

圖像分詞器模型執行兩項功能:

  1. 將圖像編碼為離散標記序列
  2. 將離散標記序列解碼回圖像

圖像分詞化的常見架構是 Vector-Quantized VAE(VQ-VAE) [2],這是第七章討論的標準 VAE 的變體。VQ-VAE 包含三個元件:

  • 編碼器(Encoder)
  • 量化器(Quantizer)
  • 解碼器(Decoder)
編碼器#

編碼器將輸入圖像映射到低維潛在空間(Latent Space),將重要特徵編碼為緊湊的表示。

其架構為深度卷積神經網路(Deep CNN),由多個卷積層組成,每層後接 ReLU [3] 啟動函數。這些層處理輸入圖像並提取視覺特徵。

Figure 8: The encoder converts an input image into an encoded representation containing 9 features

量化器#

量化器將連續的潛在向量轉換為離散標記。VQ-VAE 在標準 VAE 之上引入量化器,原因有二:

  • 避免後驗坍縮(Posterior Collapse) — 後驗坍縮是標準 VAE 的常見問題,解碼器無需使用潛在空間即可生成準確輸出。量化將潛在變數離散化,強制模型在重建時使用它們,讓潛在變數持續參與輸出的塑造。
  • 縮減學習空間 — 連續向量難以按序列預測,因為它們有無限可能且差異微小。離散標記簡化了過程,讓 Transformer 只需聚焦於較少的選項。

量化器使用內部的 Codebook 將連續潛在向量轉換為離散標記。Codebook 包含可學習的嵌入(Learnable Embeddings),代表輸入圖像中的不同模式。每個嵌入作為一個標記,由 1 到 $k$ 的整數表示。量化器根據歐幾里得距離(Euclidean Distance) [4] 將每個連續向量替換為 Codebook 中最近的標記。

Figure 9: Quantization process

量化器本質上是一個嵌入表。其唯一參數是在訓練期間學習的 Codebook。它唯一的職責是將每個連續向量映射到 Codebook 中最近的標記;輸出為一組標記 ID。

解碼器#

解碼器將離散標記轉換回原始圖像。通常使用具有轉置卷積(Transposed Convolutions)ConvTranspose2d)的深度 CNN,逐步將表示轉換回原始圖像大小。關於卷積和轉置卷積的更多資訊,請參閱 [5]。

Figure 10: Decoding process

圖像生成器#

圖像生成器生成代表圖像的離散標記序列。使用僅解碼器 Transformer(Decoder-only Transformer),包含以下元件:

  • 嵌入查找(Embedding Lookup) — 以 Codebook 中的嵌入替換每個離散標記
  • 投影(Projection) — 將每個標記嵌入投影到與 Transformer 內部表示匹配的維度
  • 位置編碼(Positional Encoding) — 加入位置編碼以提供空間資訊
  • Transformer — 處理輸入序列並輸出更新後的向量序列
  • 預測頭(Prediction Head) — 使用更新後的嵌入來預測下一個標記

Figure 11: Decoder-only Transformer components

訓練#

自迴歸圖像生成包含兩個訓練階段:

  • 第一階段 — 訓練圖像分詞器
  • 第二階段 — 訓練圖像生成器

第一階段:訓練圖像分詞器#

訓練過程優化編碼器、解碼器和 Codebook,使模型能準確重建原始圖像。此過程分為三個步驟:

  1. 編碼器處理輸入圖像,將其轉換為連續表示。
  2. 量化器使用內部 Codebook 將連續表示替換為離散標記。
  3. 解碼器使用離散標記重建原始圖像。

Figure 12: Image tokenizer training process

由於量化器的查找操作缺乏明確定義的梯度用於反向傳播,VQ-VAE 論文提出近似梯度的方法,直接將梯度從解碼器輸入複製到編碼器輸出。只有被選中的標記會從解碼器接收梯度;未被選中的標記則不會。

訓練資料#

我們使用 500 萬張圖像訓練圖像分詞器。由於訓練是自監督式的,不需要圖像標籤,因此我們納入其他公開可用的資料集以增強穩健性。具體來說,我們使用 LAION-400M 資料集 [6](4 億張圖像),使 Codebook 更豐富,能捕捉更多元的視覺模式。

機器學習目標與損失函數#

機器學習目標是從量化標記中準確重建原始圖像。使用以下損失函數:

重建損失(Reconstruction Loss) 使用均方誤差(MSE) 衡量原始圖像與量化標記重建圖像之間的差異:

$\text {Reconstruction loss}=\frac{1}{n} \sum_{i=1}^n\left(x_i-\hat{x}_i\right)^2$

其中:

  • $x_i$ 為原始圖像的像素值
  • $\hat{x}_i$ 為重建圖像的像素值
  • $n$ 為圖像中的總像素數

量化損失(Quantization Loss) 衡量編碼器輸出與 Codebook 中最近嵌入之間的距離,鼓勵編碼器產出更接近 Codebook 嵌入的輸出:

$\text {Quantization loss}=\left|\operatorname{sg}[E(x)]-z_q\right|_2^2+\left|\operatorname{sg}\left[z_q\right]-E(x)\right|_2^2$

其中:

  • $E(x)$ 為編碼器 $E$ 從輸入 $x$ 產生的連續潛在向量
  • $z_q$ 為從 Codebook $Z$ 中選取的量化潛在向量
  • $\operatorname{sg}(.)$ 代表停止梯度(Stop-gradient) 操作,阻止梯度流過該項,防止在優化編碼器時更新 Codebook

關於量化損失公式的更多細節,請參閱 VQGAN 論文 [1]。

僅使用重建損失和量化損失對低解析度圖像效果良好。然而,對於高解析度圖像,模型仍可能產生偽影(Artifacts)。因此需要兩個額外的損失函數。

感知損失(Perceptual Loss) 衡量原始圖像與重建圖像在預訓練模型(如 VGG [7])特定層提取的特徵之間的差異:

$\text { Perceptual loss }=\sum_l\left|\phi_l(x)-\phi_l(\hat{x})\right|_2^2$

其中:

  • $\phi_l$ 為預訓練 VGG 模型第 $l$ 層的特徵圖
  • $x$ 為原始圖像
  • $\hat{x}$ 為重建圖像

VGG 特徵編碼了內容和風格等高層細節。感知損失引導訓練,使模型在重建圖像中更好地保留這些細節。

對抗損失(Adversarial Loss) 源自 GANs [8],其中判別器(Discriminator)區分真實圖像和重建圖像。此損失衡量重建圖像欺騙判別器的能力:

$\text {Adversarial loss}=-\log (D(\hat{x}))$

其中:

  • $D$ 為判別器網路
  • $\hat{x}$ 為重建圖像

這鼓勵模型產出與真實圖像無法區分的重建結果。VQGAN 論文引入了基於區塊(Patch-based) 的版本,以減少不自然的偽影並提升真實感。

總損失(Overall Loss) 為各損失的加權總和,其中權重($\lambda_i$)為根據效能目標調整的超參數:

$\begin{aligned} \text { Overall loss }= \lambda_{\text {rec }} & \times \text { reconstruction loss }+ \ \lambda_{\text {quant }} &\times \text { quantization loss }+ \ \lambda_{\text {perc }} &\times \text { perceptual loss }+ \ \lambda_{\text {adv }} &\times \text { adversarial loss } \end{aligned}$

訓練完圖像分詞器後,我們將所有 500 萬張訓練圖像轉換為離散標記並快取(如資料準備章節所述),確保所有圖像都以離散標記序列的形式表示,這是訓練圖像生成器所需的。

第二階段:訓練圖像生成器#

訓練圖像生成器(僅解碼器 Transformer)遵循前面章節描述的流程。訓練資料由離散標記序列組成,模型學習按序列預測這些標記。

  • 機器學習目標:下一個標記預測(Next-token Prediction)
  • 損失函數:交叉熵(Cross-entropy),衡量預測機率與正確視覺標記相比的準確程度

Figure 13: Image generator loss calculation

採樣#

生成新圖像包含兩個步驟:

  1. 生成離散標記序列
  2. 解碼離散標記為圖像

步驟一:生成離散標記序列#

圖像生成器產生標記序列。自迴歸特性確保每個標記都以前面的標記為條件,從而生成連貫的圖像。

Figure 14: Generating a sequence of discrete tokens using the image generator

自迴歸標記生成的逐步流程:

  1. 種子選擇 — 從 Codebook 中隨機選取一個標記作為第一個標記,作為生成過程的種子。
  2. 自迴歸生成 — 逐一生成標記:
    • 將當前序列傳遞給圖像生成器,預測 Codebook 上的機率分布
    • 使用 top-p 採樣等採樣方法選擇下一個標記
    • 將選定的標記附加到當前序列中

此過程持續進行,直到生成完整圖像。例如,生成 1024$\times$1024 像素的圖像,若每個視覺標記代表 64$\times$64 像素的區塊,則需要 256 個標記。序列完成後,在下一步驟中將其轉換為實際圖像。

步驟二:將離散標記解碼為圖像#

使用圖像分詞器的解碼功能,將離散標記序列轉換為圖像。

Figure 15: Decoding tokens into an image

評估#

高解析度圖像合成的評估指標與第七章類似,本節簡要回顧。

離線評估指標#

品質與多樣性指標#

  • Inception Score — 使用預訓練的 Inception v3 模型衡量生成圖像與真實物體的相似程度。詳見 [9]。
  • Frechet Inception Distance(FID) — 透過比較預訓練 Inception v3 模型提取的特徵,比較生成圖像與真實圖像的分布差異。詳見 [10]。
  • 人工評估 — 評估者判斷圖像對的真實感與美學品質,提供統計指標以衡量哪些模型能產出更逼真的圖像。

效能與成本指標#

  • 圖像生成時間 — 衡量生成延遲。使用者通常期望快速獲得結果。
  • 每次生成成本 — 計算生成一張圖像的成本,取決於模型複雜度、解析度和基礎設施費用。監控此指標對業務營收至關重要。

線上評估指標#

常見的即時品質指標包括:

  • 使用者回饋 — 使用者對生成圖像的直接回饋
  • 定期調查 — 使用者對品質和相關性的意見
  • 訂閱率 — 使用者訂閱圖像生成服務的頻率
  • 流失率(Churn Rate) — 使用者停止使用服務的比率

整體機器學習系統設計#

當圖像生成器和圖像分詞器模型表現令人滿意後,我們將它們整合以建構圖像合成系統。主要元件包括:

  • 生成服務(Generation Service)
  • 解碼服務(Decoding Service)
  • 超解析度服務(Super-resolution Service)

Figure 16: High-resolution image synthesis ML design

生成服務#

處理使用者請求,並與訓練完成的圖像生成器模型互動,產出視覺標記序列。

解碼服務#

與圖像分詞器互動,將生成的視覺標記序列轉換為圖像。

部署模型時,我們不需要圖像分詞器中的編碼器 — 它只在訓練階段使用。

將生成和解碼服務分離至關重要,因為圖像生成器和分詞器是不同的模型,具有不同的計算需求和延遲。這讓每個服務能獨立擴展並有效管理資源。

超解析度服務#

使用預訓練模型來提升生成圖像的解析度。例如,若目標解析度為 2048$\times$2048,但生成器只產出 1024$\times$1024,則使用 2 倍放大因子的超解析度模型。

此服務對需要細緻且逼真視覺效果的應用至關重要,例如醫學影像。現有解決方案從基於 CNN [11] 到 GAN 增強 [12] 的方法都有。近期方法請參閱 [13]。

其他討論主題#

若時間允許,可進一步探討以下主題:

  • 擴展自迴歸模型以支援文字驅動生成 [14] [15]
  • 支援圖像補全(Image Completion)圖像超解析度 [16] 等應用
  • 使用溫度縮放(Temperature Scaling)等技術平衡採樣中的多樣性 vs. 保真度 [17]
  • 透過對抗訓練、梯度裁剪(Gradient Clipping)和學習率排程(Learning Rate Scheduling)增強穩定性 [18] [19]
  • 使用漸進式增長(Progressive Growing) 和多尺度架構來提升圖像品質與細節 [20]
  • 建立互動式系統,讓使用者能精煉和自訂生成的圖像 [21]

總結#

Image represents a mind map summarizing the key aspects of designing a generative AI system for image synthesis