簡介#
個人化文字轉圖像(Text-to-Image,T2I)模型是生成式 AI 最具潛力的新興應用之一。想像你對一個 T2I 模型下達提示詞:「John 坐在椅子上看書」。模型可能會生成一張某人坐著看書的圖像,但這個人大概不會長得像 John。要達成這個目標,我們需要對 T2I 模型進行個人化,讓模型學習特定主體(即 John)的外觀。
本章探討如何開發一個個人化 T2I 模型,使其能為特定個人生成專業品質的頭像照片(Headshot)。
需求釐清#
以下是候選人與面試官之間的典型互動:
候選人: 生成的頭像主要用於商業檔案(例如 LinkedIn)嗎? 面試官: 沒錯。
候選人: 我假設使用者會提供自己在不同姿勢與角度下的多張照片,且臉部清晰可見。請問需要上傳多少張? 面試官: 是的,假設 10 到 20 張。
候選人: 如果有些照片不合適,例如太暗或看不到臉,該怎麼處理? 面試官: 我們需要偵測這些情況並通知使用者提供更好的照片。
候選人: 使用者是否能指定生成圖像的特徵,例如髮型? 面試官: 為了簡化,假設不需要屬性控制。
候選人: 頭像需要什麼解析度? 面試官: 系統應支援 1024x1024 輸出。
候選人: 我可以假設從一個預訓練的通用 T2I 模型開始嗎? 面試官: 可以。
候選人: 使用者是否能提供文字提示來控制生成的頭像? 面試官: 我們傾向保持簡單,假設使用者不需要提供文字提示。
候選人: 系統應該生成多少張頭像? 面試官: 50 張。
候選人: 預期的延遲是多少? 面試官: 使用者上傳照片後,我們在圖片準備好時透過電子郵件通知。整個流程應在一小時內完成。
關鍵需求摘要:
- 輸入: 10–20 張使用者上傳的臉部照片
- 輸出: 50 張 1024x1024 解析度的專業頭像
- 延遲: 一小時內(非同步處理,以電子郵件通知)
- 使用者無需提供文字提示或屬性控制
將問題定義為 ML 任務#
我們以頭像生成作為案例研究,探討圖像生成中一個重要的面向:個人化(Personalization)。此過程將預訓練的 T2I 模型調適為能學習新主體——在本例中是使用者的臉部。
定義輸入與輸出#
- 輸入: 使用者從不同角度與姿勢拍攝的多張臉部照片
- 輸出: 該個人的專業頭像——高品質、多樣化且保留身份特徵
選擇合適的 ML 方法#
擴散模型(Diffusion Model)在生成高細節、逼真的圖像方面表現極為出色。個人化的常見做法是以預訓練於大量圖像的 T2I 模型作為基礎模型(Base Model)。
個人化預訓練 T2I 模型有兩種主要方法:
- 基於微調的方法(Tuning-Based): 針對每個身份,使用一組參考圖像對 T2I 模型進行微調。這會將新身份整合進模型中,使其能生成多樣化的圖像同時保留身份特徵。
- 免微調的方法(Tuning-Free): 不需要針對每個身份微調 T2I 模型。取而代之的是,將預訓練 T2I 模型與視覺編碼器(Visual Encoder)一起進行一次性微調。訓練完成後,視覺編碼器從新的參考圖像中擷取特徵並注入 T2I 模型,無需為每個身份調整內部權重即可實現個人化生成。
免微調 vs. 基於微調#
免微調方法(例如 Meta 的 Imagine Yourself [1])較為簡單,因為:
- 只需訓練一次,且參數較少
- 可為多個身份部署單一模型
- 僅需一張參考圖像
然而,它也有其局限性:
- 單一參考圖像可能無法從不同角度或表情捕捉所有臉部細節
- 通常需要針對主體進行特殊調整(例如 [1] 使用了專門的編碼器與合成配對資料)
基於微調的方法往往能捕捉更細緻的特徵,且更具通用性,能處理人臉以外的各種主體。基於這些優勢,本章後續將聚焦於基於微調的方法。免微調方法可參考 [2][3][1]。
基於微調的個人化方法#
三種常見的基於微調的個人化方法:
- Textual Inversion
- DreamBooth
- 低秩調適(Low-Rank Adaptation,LoRA)
Textual Inversion#
Textual Inversion [4] 透過引入一個代表主體的**新特殊標記(Special Token)**並學習其嵌入向量來個人化 T2I 模型。在微調過程中,只有特殊標記的嵌入向量會被更新——擴散模型、文字編碼器及其他標記的嵌入向量均保持不變。
微調完成後,當提示詞中包含該特殊標記時,模型就能生成該新主體的圖像。
優點#
- 高效率: 只需學習一個新的標記嵌入向量,訓練非常輕量
- 保留原始模型能力: 擴散模型的參數保持不變
- 極低的儲存需求: 每個個人化模型只需儲存特殊標記的嵌入向量
缺點#
- 難以學習主體細節: 新主體僅由一個標記嵌入向量表示,限制了模型精確編碼細粒度細節的能力
Textual Inversion 雖然高效且輕量,但由於其有限的表示能力,通常難以捕捉並保留新主體的所有細節。
DreamBooth#
DreamBooth [5] 是 Google 在 2023 年提出的熱門個人化方法。與 Textual Inversion 不同,DreamBooth 在微調過程中會更新擴散模型的所有參數,使其能更有效地捕捉新主體的細節。
DreamBooth 依賴兩個關鍵技術:
- 稀有標記識別符(Rare-Token Identifier)
- 類別特定先驗保留損失(Class-Specific Prior Preservation Loss)
稀有標記識別符#
大多數個人化方法會選擇一個識別符來代表目標主體。Textual Inversion 創建新標記,而 DreamBooth 從現有詞彙表中選擇識別符。識別符的選擇至關重要。
常見詞或隨機識別符的問題#
- 常見詞彙(如 “unique”、“special”)有問題,因為這些標記已有既定含義。模型必須將標記與原始含義分離並學習新含義。
- 隨機字元序列(如 “xxy5syt00”)也有問題,因為分詞器可能將其拆解為個別字元,每個字元都有預先存在的關聯,會干擾新身份的學習。
稀有標記識別符的運作方式#
DreamBooth 透過選擇稀有標記來解決這些問題——這些標記在訓練資料中出現頻率很低。它們夠獨特,不會有強烈的先驗關聯,同時又夠完整,使分詞器將其視為單一單元。
建立識別符的逐步流程:
- 識別稀有標記: 透過評估標記頻率分布,找出在訓練資料中出現頻率低的標記
- 生成稀有標記序列: 將部分稀有標記組合成序列
- 形成識別符: 分詞器將標記 ID 轉換回文字形式。範例:“XyZ”、“SKS”、"[V]"
類別特定先驗保留損失#
DreamBooth 微調擴散模型的所有層。雖然這能提升圖像品質,但可能導致過擬合(Overfitting)——模型輸出的多樣性下降。例如,在特定狗的圖像上訓練後,模型可能難以生成其他狗的圖像。
為解決此問題,DreamBooth 使用類別特定先驗保留損失來維持通用的類別特徵,防止過擬合並保留生成該類別內多樣化圖像的能力。損失函數的細節將在下方訓練章節中說明。
優點#
- 有效學習主體細節: 更新更多參數使模型能更精確地學習主體細節
- 所需圖像較少: 由於更新整個擴散模型,所需的圖像集較小
缺點#
- 高儲存需求: 每個主體需儲存整個擴散模型(數 GB),成本高且難以擴展
- 資源密集: 更新整個擴散模型在訓練期間需要更多 GPU 記憶體
DreamBooth 能有效學習主體細節,但訓練與儲存成本高。Textual Inversion 高效且輕量但效果較差。LoRA 則提供了一個平衡的方案。
LoRA#
LoRA(Low-Rank Adaptation,低秩調適)由 Microsoft [6] 提出,是一種高效微調超大模型的強大方法。最初為了將大型語言模型(LLM)調適至特定任務而開發,後來被應用於 T2I 個人化。
核心動機:微調大型預訓練模型(如 GPT-3 [7])的所有參數既耗時又昂貴。LoRA 透過引入少量可訓練參數並僅更新這些參數來調適模型,大幅降低計算成本。
LoRA 的數學原理#
在典型的神經網路層中,權重矩陣 $W \in \mathbb{R}^{d_{\text{out}} \times d_{\text{in}}}$ 將輸入向量 $x \in \mathbb{R}^{d_{in}}$ 轉換為輸出向量 $y \in \mathbb{R}^{d_{\text{out}}}$。
LoRA 不直接修改 $W$,而是引入一個額外的低秩分量 $\Delta W$,表示為兩個可學習的低秩矩陣之乘積:
$$\Delta W = AB$$
其中:
- $A \in \mathbb{R}^{d_{\text{out}} \times d_r}$
- $B \in \mathbb{R}^{d_r \times d_{\text{in}}}$
- $d_{\text{in}}$ 與 $d_{\text{out}}$ 分別代表輸入和輸出維度
- $r$ 是一個小整數,代表秩(Rank),通常遠小於 $d_{\text{in}}$ 和 $d_{\text{out}}$
原始矩陣 $W$ 有 $d_{\text{out}} \times d_{\text{in}}$ 個參數,而低秩近似僅引入 $r \times (d_{\text{in}} + d_{\text{out}})$ 個參數。當 $r$ 值較小時,在儲存和計算上都能獲得顯著節省。
LoRA 在 T2I 個人化中的應用#
將 LoRA 應用於預訓練 T2I 模型時,我們在擴散模型中注入可訓練參數,並在微調過程中僅更新這些參數以學習新身份。這只需訓練模型中一小部分的參數,因此速度更快且更節省記憶體。
優點#
- 保留原始模型能力: 原始模型參數凍結不動
- 降低記憶體與計算需求: 僅更新少量參數
- 極低的儲存需求: 每個個人化模型只需儲存 LoRA 層(通常僅數 MB)
缺點#
- 學習效果較弱: 僅微調少量參數限制了學習新主體的能力
- 推論時間略增: 額外的參數與計算增加了些微開銷,但通常可忽略不計
基於微調方法的比較#
| Textual Inversion | LoRA | DreamBooth | |
|---|---|---|---|
| 學習效果 | 低 | 中等 | 高 |
| 儲存需求 | 低 | 中等 | 高 |
| 訓練資源需求 | 低 | 中等 | 高 |
| 保留原始模型能力 | 是 | 是 | 否 |
表 1:常見基於微調的個人化方法比較
哪種方法最適合頭像生成?#
方法的適用性取決於使用情境與系統需求。對於頭像生成,我們選擇 DreamBooth,原因有三:
- 更佳的身份保留: DreamBooth 在保留主體細節方面最為有效,能實現更好的身份保留
- 可接受的訓練時間: 根據 [5],使用 DreamBooth 微調擴散模型約需 15 分鐘——在一小時的需求下完全可接受
- 無需長期儲存: 生成頭像後不需要保存個人化模型,因此 DreamBooth 的高儲存成本並不構成問題
資料準備#
所需的圖像數量因方法而異。免微調方法通常只需一張圖像,而基於微調的方法(如 DreamBooth)需要約 10–20 張圖像。
由於我們使用 DreamBooth,使用者需上傳 10–20 張圖像。這些圖像可能有不同的解析度和長寬比。為了準備訓練資料,我們遵循三個步驟:
- 圖像縮放(Image Resizing)
- 圖像增強(Image Augmentation)
- 通用人臉資料補充(Generic Face Data Addition)
圖像縮放#
擴散模型通常需要固定的輸入維度,但使用者上傳的圖像尺寸不一。我們將所有圖像縮放至適合擴散模型的統一維度。
圖像增強#
T2I 模型需要大量圖像來學習物件、身份和場景等概念。在個人化場景中,我們往往缺乏大型資料集。我們使用增強技術——鏡像翻轉、輕微旋轉和縮放——來人為擴充資料集。當可用圖像數量有限時,這一步至關重要。
通用人臉資料補充#
僅使用使用者提供的圖像進行訓練可能導致模型過擬合至特定身份,並遺忘先前學到的知識。為防止此問題,我們將使用者上傳的圖像與一個更大的通用人臉資料集結合,該資料集由預訓練擴散模型以「a person sitting on a chair」等提示詞生成。
模型開發#
架構#
DreamBooth 方法對預訓練擴散模型進行微調。我們使用具有 U-Net 架構的模型,該模型預訓練為輸出 1024x1024 圖像,與第 9 章介紹的類似。架構保持不變:一系列下採樣區塊(Downsampling Blocks)接一系列上採樣區塊(Upsampling Blocks)。
訓練#
微調預訓練擴散模型的流程與從頭訓練相同:
- 加入雜訊: 根據隨機選定的時間步(Timestep)對圖像加入雜訊
- 條件訊號準備: 分別透過編碼器將圖像標題和時間步準備為雜訊預測的條件訊號
- 雜訊預測: 模型使用條件訊號預測需從雜訊圖像中移除的雜訊
訓練資料#
訓練資料由兩類組成:
- 使用者上傳的圖像: 標籤為 “An image of a [V] person”
- 通用人臉圖像: 標籤為 “An image of a person”
ML 目標與損失函數#
個人化的核心挑戰在於確保模型既能生成通用類別(如人臉)又能生成特定個體(如某位獨特個人)的圖像。我們使用兩個損失函數:
重建損失(Reconstruction Loss)#
衡量重建圖像與特定主體實際圖像之間的差異。它幫助模型保留主體的身份特徵。
類別特定先驗保留損失#
衡量生成圖像與通用人臉實際圖像之間的差異。它確保模型維持人類類別特徵,避免過擬合至特定身份。
整體損失#
整體損失為兩者的加權組合:
$$\text{Overall loss} = \alpha \times \text{reconstruction loss} + \beta \times \text{class-specific prior preservation loss}$$
- $\alpha$ 和 $\beta$ 是超參數,控制身份保留與人類特徵保留之間的權衡
- ML 目標是最小化整體損失,使模型在生成特定身份圖像的同時保留生成通用人臉圖像的能力
取樣#
取樣流程與第 9 章討論的 T2I 生成類似,因為兩者都使用擴散模型。關鍵差異在於文字提示的提供方式。
在第 9 章中,使用者提供文字提示(如 “a cat sitting on a chair”)。而在頭像生成中,使用者不提供提示詞。取而代之的是,我們建立一組手工設計的提示詞(Hand-Engineered Prompts),描述各種專業場景,並包含訓練時使用的識別符:
- “A professional headshot of [V] smiling in front of a plain white background.”
- “A close-up of [V] with a neutral expression, wearing formal attire.”
- “A headshot of [V] with soft lighting, looking slightly to the left.”
- “A profile shot of [V] against a blurred outdoor background.”
- “A professional headshot of [V] wearing a business suit, with a confident expression.”
建立提示詞後,我們按照標準擴散取樣步驟,為每個提示詞生成一張圖像:
- 生成初始隨機雜訊
- 透過多個步驟反覆去噪,每一步使用無分類器引導(Classifier-Free Guidance,CFG)[8] 來降低雜訊並精煉圖像細節。CFG 的回顧請參考 [8] 或第 9 章。
評估#
離線評估指標#
我們從三個面向評估個人化擴散模型的效能:
- 文字對齊度(Text Alignment)
- 圖像品質(Image Quality)
- 圖像對齊度(Image Alignment)
文字對齊度#
文字對齊度指生成圖像與文字提示的匹配程度。常用指標為 CLIPScore [9],它確保圖像不僅品質高,也與輸入文字相關。
圖像品質#
我們使用 FID(Frechet Inception Distance)[10] 和 Inception Score [11] 等常見指標來衡量生成圖像的品質。
圖像對齊度#
圖像對齊度對個人化 T2I 模型特別重要。它評估生成圖像與目標主體之間的視覺相似度。例如,如果模型生成了一個特定背包的圖像,圖像對齊度衡量它與原始背包的相似程度。
常用的視覺相似度指標:
CLIP Score#
CLIP 模型 [12] 使用兩個編碼器——一個用於圖像、一個用於文字——訓練時使相關的圖像-文字配對嵌入在嵌入空間中彼此接近。
使用 CLIP 衡量圖像對齊度時,我們捨棄文字編碼器,僅使用圖像編碼器為生成圖像和真實圖像產生嵌入向量。兩者的**餘弦相似度(Cosine Similarity)**即表示視覺相似程度。分數越高,代表個人化模型生成的圖像與真實圖像越相似。
DINO Score#
DINO [13] 是 Meta 開發的自監督學習(Self-Supervised Learning)方法。它透過對比學習(Contrastive Learning)[14] 在無標註資料的情況下學習視覺表示——模型透過在嵌入空間中組織圖像來學習區分相似與不相似的圖像。
DINO 及其變體(如 DINOv2 [15])在捕捉圖像間的細粒度相似性方面特別有效。透過比較生成圖像與真實圖像的嵌入向量,DINO 可評估生成圖像與真實圖像的匹配程度。
DINO vs. CLIP#
- DINO 更適合圖像間的比較,因為它能捕捉細緻的視覺特徵。兩張夾克顏色不同的圖像(黃色 vs. 紅色)會因顏色差異而得到較低的 DINO 分數。
- CLIP 更適合圖像與文字之間的比較。相同的兩張圖像如果都描繪了「一個穿夾克的人」,可能會得到較高的 CLIP 分數。
臉部相似度分數(Facial Similarity Score)#
雖然 CLIP 和 DINO 能衡量視覺相似度,但它們並非專為評估身份保留而設計。兩張不同人的臉部圖像仍可能從 CLIP 和 DINO 獲得高相似度分數。為此,我們使用人臉辨識模型(Face Recognition Model),它專門識別和衡量臉部相似度——這對個人化頭像生成至關重要。
結合 DINO、CLIP 和臉部相似度分數,能對個人化擴散模型的圖像對齊度進行全面評估。
線上評估指標#
線上評估直接衡量使用者滿意度,這對付費服務至關重要。
- 使用者回饋: 使用者收到頭像後,以 1 到 5 分評分滿意度。高評分代表頭像達到或超出預期。
- 付費轉換率: 從有興趣的使用者轉變為付費客戶的百分比。計算方式為:在特定時間內,新付費客戶數除以總互動使用者數(網站訪問、試用註冊、詢問等)。
整體 ML 系統設計#
生成專業頭像不僅僅需要擴散模型。我們檢視三個關鍵管線:
- 資料管線(Data Pipeline)
- 訓練管線(Training Pipeline)
- 推論管線(Inference Pipeline)
資料管線#
此管線負責兩項工作:
- 準備目標主體的圖像
- 準備通用人臉的圖像
準備目標主體的圖像#
此過程評估使用者上傳的圖像,確保它們符合預定義標準,並為訓練做準備。具體而言,驗證圖像是否:
- 角度和表情多樣化
- 清晰且光線充足
- 僅包含單一目標對象——使用者的臉
我們使用各種啟發式方法和 ML 模型來分析圖像。不符合標準的圖像會被拒絕,並要求使用者上傳更多圖像,以確保只有高品質圖像用於微調。
準備通用人臉圖像#
此步驟防止模型過擬合至特定主體。我們使用預訓練 T2I 模型以「a person sitting on a chair」等提示詞生成通用人臉圖像。
訓練管線#
此管線對預訓練擴散模型進行個人化。
推論管線#
推論管線使用個人化 T2I 模型生成頭像。三個主要元件:
- 圖像生成器(Image Generator)
- 品質評估服務(Quality Assessment Service)
- 上傳服務(Uploader Service)
圖像生成器#
利用個人化 T2I 模型和手工設計的文字提示詞,為每個提示詞生成一張圖像。
品質評估服務#
確保生成的圖像達到身份保留標準。此服務使用預訓練的人臉辨識模型,將生成的頭像與使用者的真實照片進行比較。若生成圖像未能保留使用者的身份,則予以拒絕,並以相同文字提示但不同的初始雜訊重新生成圖像。
上傳服務#
管理生成圖像的交付。將圖像上傳至雲端儲存,供使用者下載頭像。
其他討論主題#
若面試結束前還有時間,以下是可進一步討論的主題:
- 微調過程中防止災難性遺忘(Catastrophic Forgetting)[16]
- 選擇稀有標記代表新主體的細節及其重要性 [5]
- 類別特定先驗保留損失的細節 [5]
- 解決微調後輸出多樣性下降的問題 [5]
- 支援生成圖像的多種尺寸與長寬比 [17]
- 免微調方法的細節,例如 Meta 的 Imagine Yourself [1]
- 降低 Deepfake 風險以及圍繞 Deepfake 生成與偵測的倫理問題 [18]
- 安全處理**個人可識別資訊(PII)**並確保資料隱私的 ML 技術 [19][20]
總結#
