)
1. 先搞清楚這套系統(tǒng)到底在做什么從一張噪點到一幅畫Stable Diffusion 這套系統(tǒng)你拆開來看核心其實就三塊一個負責(zé)理解文字的 CLIP一個負責(zé)去噪的 UNet還有一個負責(zé)調(diào)度整個去噪節(jié)奏的采樣器。很多人一上來就被擴散模型潛在空間交叉注意力這些詞嚇住但本質(zhì)上它干的事情很簡單從一個隨機噪點出發(fā)一步步把噪點擦干凈最終顯露出你想要的圖像。就像一個盲人在一塊大理石上雕刻先敲掉大塊再精修細節(jié)最后呈現(xiàn)出一尊雕像。我寫這套四集精講筆記的初衷就是把這條鏈路上每個環(huán)節(jié)的為什么講透而不是丟一堆 Python 代碼讓你照著抄。這套方法適合誰說實話只要你對文生圖這個詞感過興趣無論你是搞設(shè)計的、做算法的、還是純粹想玩玩本地部署的愛好者都能從這套筆記里找到自己需要的部分。設(shè)計師可能只需要理解 CLIP 為什么能聽懂人話、CFG 參數(shù)調(diào)太高為什么圖會發(fā)黑算法工程師可以深入去看 UNet 里的時間步嵌入和注意力權(quán)重而動手型玩家我希望你能照著最后一集的代碼在自己電腦上跑通一個最小流程——那才是真正產(chǎn)生原來如此感受的時刻。我見過太多人拿著別人訓(xùn)練好的模型埋頭調(diào)參數(shù)卻完全不知道 PD 和 DDIM 有什么區(qū)別也不知道為什么換了采樣器出圖風(fēng)格會變。這不是你的錯是現(xiàn)有教程普遍在原理和代碼之間那道鴻溝上跳過去了。這套筆記就是來填這條溝的我會從整體流程開始一步步拆解 CLIP 的編碼邏輯、擴散模型的正向加噪與逆向去噪、UNet 的結(jié)構(gòu)與注意力機制最后給出一段真正能跑通的文生圖代碼并附上我在實際部署中踩過的坑。如果你按順序讀下來再回頭去看那些調(diào)參數(shù)玄學(xué)你會發(fā)現(xiàn)大部分問題都有了合理的解釋。1.1 文生圖的本質(zhì)與整體流程先不要管任何數(shù)學(xué)公式用一句話概括整個 Stable Diffusion 的推理流程你輸入一段文字然后系統(tǒng)在純隨機的噪聲圖上按照文字給出的方向感一步步將噪聲抹去。每一步都基于兩個信息——當(dāng)前這張圖長什么樣以及文字希望它長什么樣。兩個信息被拼接在一起輸入到 UNet 這個雕刻家里UNet 預(yù)測出下一步應(yīng)該往哪個方向修然后采樣器就據(jù)此更新圖片。這個流程里的關(guān)鍵點在于UNet 不是一次性預(yù)測出最終圖像而是每步只預(yù)測一小步。為什么這樣因為一步到位太難了神經(jīng)網(wǎng)絡(luò)在復(fù)雜的圖像分布上直接映射結(jié)果會非常粗糙。而迭代式的去噪把一個大難題拆成了幾百個小步驟每一步的預(yù)測任務(wù)都相對簡單誤差也就更可控。擴散模型的名字就來源于這個拆步的思路——它受熱力學(xué)中擴散過程的啟發(fā)如果你把一滴墨水滴入清水它會不可逆地擴散均勻擴散模型就是學(xué)習(xí)這個擴散過程的逆過程從均勻混沌的噪聲中找回原本墨滴的形狀。1.2 為什么是潛在空間不是畫布太大是計算太貴講到 Stable Diffusion就繞不開潛在擴散模型Latent Diffusion Model這個說法。為什么不直接在像素上做擴散原因特別現(xiàn)實一張 512x512 的 RGB 圖片有 78 萬個像素點每個點有 3 個通道。你在這么大尺寸上迭代 50 步每一步都要讓神經(jīng)網(wǎng)絡(luò)處理幾十萬維的數(shù)據(jù)訓(xùn)練和推理的計算量都大到離譜。所以 Stable Diffusion 采用了一個很聰明的前置操作先通過一個叫 VAE變分自編碼器的模型把圖片壓縮到一個很小的潛在空間里。這個壓縮不是簡單的縮放而是把圖片的語義信息編碼成一組低維向量——你可以理解為它在 8x 到幾十倍的壓縮率下仍然保留了畫面里有什么、布局如何這樣的高層信息。擴散和去噪過程都在這個潛在空間里進行最后再用 VAE 的解碼器把去噪后的潛在向量還原成像素圖像。這就是潛在兩個字的核心含義。我剛接觸的時候把潛在空間想象成草稿還挺貼切的模型在草稿本上反復(fù)修改構(gòu)圖和物體改滿意了再謄到正式畫布上。這個設(shè)計的直接好處是訓(xùn)練成本大幅下降普通顯卡也跑得動后來各種加速 LoRA 微調(diào)的思路也都是建立在潛在空間這個底座上的。2. CLIP讓機器把文字和圖像對齊的翻譯官Stable Diffusion 里接收你文字的那個模塊就是 CLIP。CLIP 的全稱是 Contrastive Language-Image Pre-training由 OpenAI 在 2021 年提出。它的核心思想非常直白訓(xùn)練一個模型讓它在同一個向量空間里把相關(guān)的圖片和文字放在相近的位置。相關(guān)性越高向量距離越近不相關(guān)就推遠。這個概念聽著簡單但它是整個文生圖體系的基石。沒有 CLIP你的提示詞對模型來說就是一堆無意義的符號有了 CLIP模型才能在每一步去噪時讀懂你應(yīng)該往哪個方向修圖。2.1 CLIP 的核心設(shè)計雙塔編碼器與對比學(xué)習(xí)CLIP 的網(wǎng)絡(luò)結(jié)構(gòu)一般叫雙塔結(jié)構(gòu)左邊一個圖像編碼器右邊一個文本編碼器。圖像編碼器可以是 ResNet 或者 ViT文本編碼器通常是 Transformer。這兩個編碼器各干各的但它們的輸出被映射到同一個多維向量空間里。訓(xùn)練方式用的是對比學(xué)習(xí)。想象你有一批圖片每張圖片配了一段描述文字。模型的目標是讓正確的圖片-文字對的相似度分數(shù)盡可能高讓錯誤的圖片-文字對的分數(shù)盡可能低。這里的相似度通常用余弦相似度計算。因為訓(xùn)練數(shù)據(jù)足夠大OpenAI 用了將近 4 億個圖文對CLIP 最終學(xué)到了一種通用對齊關(guān)系不只是記住訓(xùn)練集里的配對而是能理解一只戴著帽子的狗這種在訓(xùn)練數(shù)據(jù)里可能沒見過的組合。這個特性對 Stable Diffusion 至關(guān)重要。因為用戶輸入的提示詞千奇百怪模型必須有能力把沒見過的新組合映射到視覺概念上。CLIP 的文本編碼器就像一個經(jīng)驗豐富的翻譯官不僅懂語法還懂畫面感。2.2 在 Stable Diffusion 中 CLIP 到底扮演什么角色在 Stable Diffusion 的 UNet 里CLIP 的文本編碼器被用來把提示詞轉(zhuǎn)成一組 embedding 向量。注意這里用的是 CLIP 的文本編碼器部分圖像編碼器在推理階段基本不用。這組向量會通過一種叫交叉注意力的機制注入到 UNet 的各個層中指導(dǎo)去噪過程。具體來說UNet 在處理每一張噪聲圖時會同時關(guān)注兩個東西一個是當(dāng)前圖像自身的特征另一個是用 CLIP 提取的文本特征。兩者通過注意力層融合。你可以把交叉注意力想象成在作畫過程中每畫一筆都要抬頭看一眼前人給的草稿對照一下方向?qū)Σ粚?。草稿就是提示詞編碼畫布就是潛在空間里的噪聲圖。CLIP 在這里還有一層特殊作用它的 text encoder 輸出的是 77 個 token 的序列超出部分會被截斷或者通過其他方式擴展。這也是為什么你在輸入超長提示詞時會發(fā)現(xiàn)后半段的影響變?nèi)酢驗?CLIP 的文本編碼器輸入端就是這么設(shè)計的。了解這個限制你就能理解為什么有些插件比如長提示詞增強能提升表現(xiàn)力本質(zhì)是繞開了這個 77 token 的瓶頸。2.3 動手看 CLIP 的輸入輸出一段 Python 實測光說原理太空我建議你親手跑一下這段代碼直觀感受 CLIP 文本編碼器的輸入輸出。下面用 transformers 庫加載最常用的 CLIP 文本編碼器看看它對一句話的編碼結(jié)果長什么樣。from transformers import CLIPProcessor, CLIPTextModel import torch model_id openai/clip-vit-large-patch14 processor CLIPProcessor.from_pretrained(model_id) text_model CLIPTextModel.from_pretrained(model_id) text a portrait of a cat, detailed, photorealistic inputs processor(texttext, return_tensorspt, paddingTrue) outputs text_model(**inputs) # 輸出是一個 [batch_size, seq_len, hidden_dim] 的張量 # hidden_dim 是 768seq_len 是 77CLIP 固定長度 last_hidden_state outputs.last_hidden_state print(last_hidden_state.shape) # 拿第一個 token對應(yīng) [CLS]的向量作為整句的全局表示 sentence_embedding last_hidden_state[:, 0, :] print(sentence_embedding[:5]) # 打印前 5 個數(shù)字看看維度值你跑完會看到張量形狀是[1, 77, 768]。這就是 CLIP 給 Stable Diffusion 的文本特征。其中 77 是它固定的序列長度768 是隱藏維度。在 Stable Diffusion 內(nèi)部這個原始向量還會經(jīng)過一個線性層投影到 UNet 使用的維度。這一步實測的意義在于解掉你對 CLIP 的黑盒感——它沒有魔法就是一組高維數(shù)值后續(xù)所有關(guān)于提示詞、CFG 的討論都是建立在這組數(shù)值之上的。另外一個常見疑問是CLIP 的文本編碼器能不能微調(diào)當(dāng)然能。我在筆記里專門講過 CLIP 微調(diào)對文生圖風(fēng)格的影響。從我的實驗看微調(diào) CLIP 比微調(diào) UNet 影響更全局因為它改變的是對提示詞的整體理解方式就像換了翻譯官的母語習(xí)慣。但這也意味著風(fēng)險微調(diào)不當(dāng)會讓原本能理解的提示詞變笨所以新手不建議輕易動 CLIP。3. 擴散模型與 UNet一步步去噪的雕刻家CLIP 幫你讀懂了要求接下來要執(zhí)行去噪工作的就是 UNet。UNet 這個名字聽起來像某種網(wǎng)絡(luò)協(xié)議的縮寫其實它源自 2015 年一篇醫(yī)學(xué)圖像分割論文因為網(wǎng)絡(luò)結(jié)構(gòu)呈 U 形而得名左邊逐步下采樣提取特征右邊逐步上采樣恢復(fù)尺寸中間有跳躍連接保留細節(jié)。這個結(jié)構(gòu)最初是給分割任務(wù)設(shè)計的沒想到在擴散模型時代成了主力工具。要理解 UNet 在 Stable Diffusion 里干了什么得先搞清楚擴散模型的兩個階段前向過程加噪和逆向過程去噪。3.1 前向擴散給圖片慢慢加噪的過程擴散模型的想法是如果我們能把一張清晰的圖片一步步破壞成純噪聲那么反過來能不能從純噪聲一步步重建回清晰圖片前向過程就是那個逐步破壞的動作。每一步我們在圖片上疊加一點高斯噪聲并且用當(dāng)前步數(shù) t 來控制噪聲強度。這個過程的數(shù)學(xué)形式是x_t sqrt(alpha_bar_t) * x_0 sqrt(1 - alpha_bar_t) * epsilon其中epsilon是從標準高斯分布采樣的噪聲alpha_bar_t是遞減的系數(shù)控制 t 越大時原圖保留越少、噪聲越多。到足夠大的 T 步時x_T基本就是一張純噪聲圖。這個公式看著簡單但它有一個漂亮的性質(zhì)給定 x_0你可以直接跳到任意第 t 步的加噪結(jié)果而不必一步一步模擬。這一下子就讓訓(xùn)練變得高效了。訓(xùn)練目標是讓 UNet 學(xué)會預(yù)測出這個噪聲epsilon而不是預(yù)測原圖或者預(yù)測分數(shù)。我估計有讀者會問為什么預(yù)測噪聲不直接預(yù)測原圖實驗發(fā)現(xiàn)預(yù)測噪聲在訓(xùn)練和采樣過程中穩(wěn)定得更好。你把它理解成雕刻家只需要知道自己下一步該鑿掉哪塊廢料就順了找到廢料去掉它剩下的自然就是雕像。3.2 逆向去噪UNet 是如何學(xué)會猜噪聲的真正生成圖像時我們做的是逆向過程。先從純噪聲x_T出發(fā)然后需要模型告訴我們當(dāng)前這幅圖里包含了什么樣的可去除噪聲。UNet 輸入兩個東西當(dāng)前噪聲圖x_t以及一個時間步的信號t。輸出是一張預(yù)測的噪聲圖epsilon_hat。然后采樣器根據(jù)epsilon_hat和某種調(diào)度規(guī)則算出下一步的圖像x_{t-1}。如此反復(fù)直到x_0。這聽起來像一個自證過程噪聲圖里的噪聲和內(nèi)容是混合在一起的模型怎么知道哪些該去掉答案來自訓(xùn)練。訓(xùn)練階段我們給 UNet 看了海量的第 t 步噪聲圖 對應(yīng)的真實噪聲配對UNet 就是在學(xué)這樣一個映射給定當(dāng)前圖它里面藏著的那團噪聲長什么樣。它不需要知道圖里的物體叫什么只需要能從噪聲圖里分離出噪聲成分。我在筆記里畫過一張對比圖前向過程是圖片 → 加噪 → 噪聲逆向過程是噪聲 → 去噪 → 圖片。你會發(fā)現(xiàn)這兩個過程使用的網(wǎng)絡(luò)權(quán)重其實是同一個 UNet但它們對應(yīng)的場景不同所以模型中大量用到了條件信息——這就是為什么 UNet 里會有那么多注意力層它需要整理來自文本、圖像和時間步三方面的信號。3.3 UNet 里的注意力機制為什么它能理解提示詞UNet 不是那種簡單的卷積堆疊。Stable Diffusion 用的 UNet 加入了多個注意力模塊其中最重要的是交叉注意力cross-attention。交叉注意力的查詢來自圖像特征鍵值來自文本特征。這樣網(wǎng)絡(luò)在做局部操作時可以查詢提示詞中的相關(guān)部分。用個生活例子你在畫一只戴帽子的貓UNet 的每個卷積塊就像你在揮舞畫筆而交叉注意力就是你時不時低頭看一眼草稿上畫的帽子應(yīng)該在哪個位置、什么形狀。它讓噪聲圖里每個區(qū)域都能從文本序列里挑出最相關(guān)的單詞來指導(dǎo)自己的繪制。這也解釋了為什么cat 和 hat 的 embedding 之間的關(guān)系會對畫面產(chǎn)生那么大的影響——交叉注意力機制本質(zhì)上建立了文本和圖像區(qū)域之間的軟關(guān)聯(lián)。時間步 t 的處理也有講究。UNet 會通過一個正弦位置編碼將 t 變成向量然后加到所有層的特征上。這樣同一個網(wǎng)絡(luò)在處理噪點很多的前期步驟和細節(jié)豐富的后期步驟時會主動調(diào)整自己的行為方式前期負責(zé)鋪大色塊后期負責(zé)描細節(jié)。3.4 訓(xùn)練與推理兩個階段完全不同的邏輯訓(xùn)練階段和推理階段有一個非常容易混淆的地方我單獨拎出來說。訓(xùn)練擴散模型時我們需要的是完整的加噪-去噪循環(huán)隨機選一張真實圖隨機選一個步數(shù) t對它加噪讓 UNet 預(yù)測噪聲然后用均方誤差損失更新權(quán)重。而推理階段也就是你實際生成圖片時根本沒有真實圖作為參照就是從噪聲出發(fā)靠 UNet 的預(yù)測驅(qū)動整個去噪鏈條。你可能會覺得奇怪沒有真實圖模型怎么會越去噪越像真實圖這恰恰是擴散模型訓(xùn)練生效的結(jié)果——網(wǎng)絡(luò)在訓(xùn)練中學(xué)到了真實圖片的分布特征所以它在去噪時總是傾向于生成看起來像真實圖像的結(jié)構(gòu)而不是隨機圖案。推理階段還有兩個關(guān)鍵參數(shù)步數(shù) steps 和引導(dǎo)強度 guidance_scale。步數(shù)越多去噪過程越精細但速度越慢guidance_scale 控制的是文本條件的權(quán)重越高代表越忠實提示詞但過高會導(dǎo)致色彩過飽和甚至崩壞。這兩者我在下一部分的代碼實戰(zhàn)里都會用到。4. 文生圖代碼實戰(zhàn)從零跑通一個最小流程原理聊到這兒不寫代碼等于沒講。這一節(jié)我?guī)惆?Stable Diffusion 的文生圖跑通。其實現(xiàn)在用 diffusers 庫代碼量少得驚人但我更希望你在跑通之后能回頭對應(yīng)到前面講的每個部件——注意觀察哪里是 VAE 編碼哪里是 CLIP 編碼哪里是 UNet 去噪哪里是 VAE 解碼。4.1 環(huán)境準備與依賴安裝我以當(dāng)前比較穩(wěn)定的 diffusers 版本為例。建議你用一個干凈的 Python 3.10 環(huán)境先裝 PyTorch帶 CUDA 的版本再裝幾個庫pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install diffusers transformers accelerate safetensors裝完之后可以用一個小腳本確認一切正常import torch from diffusers import StableDiffusionPipeline print(torch.cuda.is_available()) print(torch.__version__)如果你沒有獨立顯卡內(nèi)存大于 8GB 也能硬跑但速度會慢到懷疑人生。我個人的建議是至少一塊 6GB 顯存的顯卡或者直接用在線服務(wù)試水。本地環(huán)境的坑最常見的就是 CUDA 版本和 PyTorch 對不上所以我用--index-url明確指定了 cu118 這個版本號省得后面到處報錯。4.2 用 Transformers 和 Diffusers 實現(xiàn)文生圖核心代碼就下面這一段。我用的是 Stable Diffusion 2.1 基礎(chǔ)版模型文件會自動從 Hugging Face 下載到本地緩存第一次跑會要些時間。from diffusers import StableDiffusionPipeline import torch # 加載管線這里會自動拉取 text encoder、VAE 和 UNet 三個組件 pipe StableDiffusionPipeline.from_pretrained( stabilityai/stable-diffusion-2-1-base, torch_dtypetorch.float16 ) pipe pipe.to(cuda) # 建議開啟這個能省不少顯存 pipe.enable_attention_slicing() prompt a cinematic photo of a cat astronaut, detailed fur, nebula background image pipe( prompt, num_inference_steps50, guidance_scale7.5, seed42 ).images[0] image.save(cat_astronaut.png)注意我傳了seed42這是為了結(jié)果可復(fù)現(xiàn)。diffusers 庫的新版本用的是generator參數(shù)我在筆記里用的是舊接口其實兩者等價。你看短短幾行就生成了圖片。但如果你只滿足于這個 Demo那這套筆記就白看了。我們拆解一下這段代碼背后發(fā)生了什么pipe對象內(nèi)部其實是一個StableDiffusionPipeline它按順序調(diào)用 text encoder → UNet → VAE decoder 三個組件。image是一張 PIL 圖片它最終由 VAE decoder 把潛在空間的向量解碼回像素。num_inference_steps50意味著 UNet 會被調(diào)用 50 次一次一步地修正潛在向量。4.3 核心參數(shù)逐個調(diào)一遍steps、guidance_scale、scheduler參數(shù)調(diào)參是玄學(xué)這種說法本質(zhì)是不理解各參數(shù)在流程里的作用。我用自己的實驗數(shù)據(jù)給你列一張表方便你看著調(diào)參數(shù)取值范圍作用調(diào)高了會怎樣steps20~100控制 UNet 迭代次數(shù)細節(jié)更豐富但時間更長超過 50 收益遞減guidance_scale5~15控制文本條件強度過于貼近提示詞色彩易飽和、出現(xiàn)偽影seed任意控制初始噪聲固定種子換提示詞能觀察到風(fēng)格穩(wěn)定變化關(guān)于 steps 我有一個實測體會從 20 步提高到 50 步效果提升非常明顯從 50 提到 100肉眼幾乎看不出差別但耗時翻倍。所以日常生成用 30~50 步是性價比最高的區(qū)間。guidance_scale這個參數(shù)對應(yīng)原理部分說的文本條件權(quán)重。它的實現(xiàn)方式是采樣時做兩次 UNet 前向一次是有文本條件的預(yù)測一次是無文本條件的預(yù)測最后用noise_pred noise_uncond guidance_scale * (noise_cond - noise_uncond)融合。這個公式解釋了為什么過高的值會導(dǎo)致生成結(jié)果過于用力——它放大了文本的影響同時也放大了誤差。另外你還可以換采樣器scheduler。默認的PNDMScheduler是確定性采樣DDIMScheduler步數(shù)更少但質(zhì)量相近DPMSolverMultistepScheduler則幾乎成為當(dāng)下默認選項因為它在保證質(zhì)量的同時能把步數(shù)壓到 20 左右。換采樣器的代碼就一行pipe.scheduler DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)我在筆記里強烈推薦新手直接上 DPM 這類采樣器因為它的 20 步效果接近默認的 50 步視覺上沒有明顯退化。這個結(jié)論不是玄學(xué)DEIS 和 DPM 這類采樣器本身就是在數(shù)學(xué)上做了更高效的離散化逼近。5. 實際踩過的坑與調(diào)優(yōu)心得最后一章我把自己跑這套流程時真實踩過的坑整理出來。這些經(jīng)驗不是教科書上會寫的但每一個都耽誤過我至少半小時到一天的時間。5.1 顯存不夠怎么辦優(yōu)化選項清單很多人問6GB 顯存能不能跑 512x512 的 Stable Diffusion能但你必須開優(yōu)化。diffusers 提供了一系列開關(guān)我從最有效到最輔助排序enable_attention_slicing()把注意力計算切塊顯著降低峰值顯存。enable_vae_slicing()將 VAE 解碼過程拆成小塊省 30% 左右顯存。采樣分辨率降到 512x512 以下潛在空間是直接按比例縮放的分辨率降低顯存占用是近似平方下降。開啟torch.compile如果你的 PyTorch 版本支持不僅是加速有時候也能減少部分臨時張量的開銷。我自己的經(jīng)驗是三行優(yōu)化全開之后5GB 顯存跑 512x512 的 20 步迭代沒有壓力。如果還是爆顯存建議考慮用 SD 1.5 的官方低分辨率模型效果差異不大但顯存友好很多。5.2 出圖質(zhì)量不穩(wěn)定種子、步數(shù)與 CFG 的平衡新手常見抱怨是同一句話每次生成都不一樣是不是出 bug 了。記住只要把seed固定住生成結(jié)果就是完全可復(fù)現(xiàn)的。所以做比較實驗時請永遠固定種子。種子不同初始噪聲就不同最后畫面構(gòu)圖不同是正?,F(xiàn)象這也是發(fā)散靈感的好工具——你甚至可以用固定提示詞 隨機種子當(dāng)抽卡玩。不穩(wěn)定感的另一個來源是 CFGguidance_scale設(shè)置過高。比如你把 guidance_scale 調(diào)到 20它雖然會在語義上更貼近提示詞但圖像會變得油膩背景畫風(fēng)雜亂。我的建議是先調(diào)到你喜歡的步數(shù)再逐漸減小guidance_scale直到出現(xiàn)你能接受的最自然風(fēng)格。通常 6~8 是比較穩(wěn)的甜點區(qū)間。5.3 CLIP 微調(diào)到底有用嗎個人經(jīng)驗分享關(guān)于 CLIP 微調(diào)這件事我在筆記里單獨開過一節(jié)。很多人誤以為微調(diào) CLIP 能讓自己的模型更好地理解某種畫風(fēng)比如把臉畫得更美、更二次元。但這其實是個誤區(qū)——CLIP 負責(zé)的是文-圖對齊不是畫風(fēng)渲染。畫風(fēng)主要通過 UNet 和微調(diào) UNet比如 LoRA、DreamBooth來改變。那 CLIP 微調(diào)有什么用有但作用很底層。它可以讓你的模型在訓(xùn)練數(shù)據(jù)有限的領(lǐng)域里遇到更貼合的語義特征比如某個特定的角色名、產(chǎn)品或藝術(shù)流派專屬詞匯。但你必須清醒地認識到CLIP 是文生圖鏈路里的總指揮動它一下所有提示詞的響應(yīng)都會變所以它更像是讓模型聽得懂更專業(yè)的話而不是讓模型畫得更像誰。如果你想讓模型輸出特定角色去微調(diào) UNet 和 VAE decoder 才更靠譜。我做過一個邪道實驗給 CLIP 文本編碼器做了幾天 LoRA結(jié)果對普通畫風(fēng)的促進微乎其微反而讓一些常規(guī)詞匯的理解出現(xiàn)了位移最后只好回滾。5.4 從筆記到實踐完成四集精講的學(xué)習(xí)路徑這套四集筆記我整理過一段時間它的原版相當(dāng)于是從零到部署的完整視頻課每個章節(jié)都配了代碼和檢查點。我提煉出最重要的部分做成現(xiàn)在的文字版第一集確認整體架構(gòu)與 CLIP第二集深入擴散模型與 UNet第三集是拉通跑一個最小流程第四集是各種部署優(yōu)化與質(zhì)量調(diào)優(yōu)。你現(xiàn)在看到的這篇文字基本是前三集的濃縮加第四集的心得。如果你想真正學(xué)會我強烈建議你按這個順序來先用自己的話把這篇文章的流程圖畫一遍然后用我給的代碼跑通一張圖哪怕是粗糙的接著試著換一個提示詞、換一個采樣器、換一組 steps觀察畫面變化。只要你能解釋清楚為什么換采樣器后 20 步效果反而更好你就已經(jīng)走出了純玄學(xué)調(diào)參的怪圈。最后再分享一個小技巧我習(xí)慣把每次實驗的提示詞、參數(shù)、種子、生成結(jié)果截圖一起放進一個 Markdown 表格里。當(dāng)你積累了 50 組記錄之后你再回頭看參數(shù)之間的相互作用就會發(fā)現(xiàn)很多規(guī)律是肉眼掃一眼根本看不出來的。這套筆記的價值不在于讓你背下所有概念而是讓你知道去哪里找答案、怎么看參數(shù)之間的關(guān)系。這一行就是這樣——沒有一勞永逸的完美參數(shù)只有不斷摸索中沉淀出的感覺。