AIGC圖像困局
算法技術的歷史,是"用小資源幹大事"的心酸歷。
在寫深度學習優化器算法巧思速覽之前其實本來計劃是先寫現在這篇的,只是那個時候手上熱乎的思路還是優化器相關,所以這篇博文就延後到今天才寫。
這個標題起得很大,真寫起來,篇幅真的太長了,所以只能想到哪寫到哪。
2012年,Alex Krizhevsky的AlexNet在ImageNet上達到的精度震驚了世界,而那個時候也只做了一件事就是在224x224的分辨率下識別一千類物體。
而十年後的今天,真的變化太大了,現在AI的發展真的是日新月異,但我們仍在為如何讓模型輸出高質量的1024×1024圖片視頻而絞盡腦汁。
這不是技術進步太慢,而是這其中的涉及到的技術難處比想象中更甚。
引言
剛入行時候,博主第一個圖像任務是語義分割,也就是俗話説的摳圖。
這個在博主其他文章也可能看到相關信息。
從那個時候起,就有一個毒瘤或者是技術頑疾讓人深惡痛絕。
它就是分辨率,由於技術的侷限性,也因為算力的侷限性,我們只能在小分辨率的圖像裏進行訓練,而當你想要適配高分辨率的時候,對不起,重訓或者外掛傳統算法去打補丁。
如果在摳圖領域,最經典的問題就是摳髮絲,因為如果分辨率過低,你是看不見頭髮的,更別談摳髮絲是一種苦哈哈的細活。
但是如果採用高分辨率,是看見髮絲了,計算量卻暴漲了。對於很多場景需要的“實時”摳圖,只能跪了,因為單是訓練的算力就不能接受了,更別提最終使用。
但是仍然存在一些所謂傳統算法,可以為我們鋪路,例如利用導向濾波進行後處理。因為既然我們有大分辨率的圖片信息,那直接利用起來就好了,細節我們從大分辨率圖片裏找回來就是了。也可以作為一種先驗輔助訓練。
那個時期 resnet, unet 百家爭鳴。
後來gan的出現,迎來了圖像生成的大爆發。
而圖像生成這個事,跟摳圖,摳髮絲是不一樣的,因為它是完全生成新的圖片,或者生成局部再貼回原圖,幾乎沒有任何原始信息可以合理地補充,畢竟生成的那個區域已經面目全非了。
而gan帶來兩層挑戰,它需要幾乎同時或者交替訓練兩個模型,一個負責生成,一個負責鑑別。這裏的計算量就已經不小了,如果還要支持更大的分辨率,顯存就岌岌可危了,當然gan在早期提出的時候本身訓練也是不穩定的,後來為了穩定訓練才提出來很多正則化懲罰以及歸一化的思路。
那個時期,你不gan不行。
而當年最重要的事情就是transformer的提出。
[1706.03762] Attention Is All You Need
一直到了2022年Stable Diffusion徹底引暴了圖像生成。
也就是新冠三年疫情的最後一年末。
所以一切便從Stable Diffusion開始説起。
關於Stable Diffusion的技術原理補充,可移步大話AI繪畫技術原理與算法優化 一覽。
分辨率是AIGC的陣痛
1.1 算力的三次方詛咒
分辨率對計算資源的吞噬是非線性的:
- 像素維度:分辨率×2 → 像素數×4
- Attention維度:序列長度×4 → 計算量×16(O(N²))
- 內存維度:激活值×4 → 顯存佔用×4(中間狀態爆炸)
綜合效應:分辨率×2 → 總成本×64。
這意味着512×512到1024×1024不是"兩倍工作量",而是64倍。
1.2 數據的沙漠
LAION-5B的統計真相:
- 短邊<512像素的圖像:87%
- 短邊<1024像素的圖像:98%
- 短邊>2048像素的圖像:0.3%
高分辨率圖像不僅少,而且分佈偏移。4K照片的拍攝設備、構圖習慣、後期處理流程與手機快照完全不同。模型在512×512上學習到的"世界知識",在4K上可能完全失效。
1.3 頻率的牢籠
奈奎斯特採樣定理在深度學習中的殘酷映射:
訓練分辨率決定了模型能學習的最高頻率。
512×512的模型,其latent空間通常是64×64。這意味着任何小於8像素的細節都無法被表達——不是模糊,是根本不存在。模型從未見過更細的紋理,它不知道"毛孔"應該長什麼樣。
1.4 第一個核心困局
訓練分辨率是模型認知的"光速上限",推理分辨率是用户需求的"超光速幻想"。
所有架構演化,都是在這個物理限制下的工程妥協。
SD1.5:U-Net的困境,只能打補丁了。(2022)
“第一次把擴散模型帶到可用的工業級質量”
2.1 架構的先天殘疾
SD1.5的U-Net架構有三個致命設計:
Receptive Field的硬邊界
U-Net的encoder-decoder結構,下采樣到8×8時,每個特徵點理論上能看到64×64的原始區域。但對於2048×2048的圖像,64×64只是3%的畫面。模型根本看不見全局,只能憑統計規律猜測。
Latent的密度陷阱
KL-VAE將512×512壓縮到64×64×4,每個latent向量負責8×8像素的重建。這意味着:
- 紋理:可學習(重複模式)
- 結構:可學習(大尺度形狀)
- 精確幾何:不可學習(亞像素級定位)
Attention的局部性
U-Net的self-attention只在同分辨率特徵圖內進行,跨尺度的信息融合依賴skip connection的通道拼接。這種層次化而非全局化的設計,讓SD1.5擅長"畫得像",不擅長"畫得對"。
2.2 推理端的絕望補救
面對用户的4K需求,SD1.5只能訴事後工程:
方案A:插值——數學的暴力
雙三次插值將64×64 latent拉到256×256再解碼。新像素完全由卷積核權重決定,零語義理解。
結果:建築線條彎曲,文字無法辨認,人臉變成橡皮泥。
方案B:超分網絡——幻覺的代價
ESRGAN作為後置處理器,用對抗學習"編造"高頻細節。
結果:磚牆紋理逼真但重複,皮膚毛孔存在但位置錯誤,統計上合理,物理上荒謬。
方案C:Tiled生成——一致性的獻祭
將4K畫布切成16個512×512 tiles獨立生成,切片堆疊。
結果:每個tile質量完美,拼接處光照突變,人物長出四個耳朵。
2.3 SD1.5的本質 verdict
SD1.5從未"理解"過高分辨率,它只是用低分辨率的認知,通過工程技巧偽裝成高分辨率。
這種偽裝在:
- 自然風景(低頻主導):可接受
- 人臉特寫(結構敏感):崩壞
- 文字排版(精確幾何):災難
新困局產生:U-Net的局部性無法突破,必須換架構。VAE的一致性也是崩壞的。
所以 SD1.5 的高分辨率不是“生成”,而是“插值 + 幻覺”。
SDXL:分工的藝術(2023)
補上了 SD1.5 在“高頻細節”和“結構一致性”上的缺口
3.1 架構層面的第一次革命
SDXL沒有拋棄U-Net,但做了結構性分工:
更密的Latent空間
從64×64提升到更精細的表徵(實際實現為更高效的VAE壓縮),每個latent向量負責的像素區域減小,頻率上限提升約40%。
這不是簡單的"放大latent",而是重新訓練VAE,讓編碼器學習更高效的語義壓縮——用同樣的比特數表達更多信息。
Base + Refiner的雙階段流水線
核心洞察:結構和紋理是不同頻率的現象,應該用不同模型處理。
- Base模型(U-Net):在相對低分辨率下運行,負責構圖、語義、大尺度結構
- Refiner模型(另一個U-Net):接收Base的輸出作為條件,負責高頻細節、紋理、局部對比度
這類似於傳統圖像處理中的拉普拉斯金字塔:Base處理低頻,Refiner處理高頻殘差。
原生1024與可外推性
SDXL的訓練分辨率達到1024×1024,且通過改進的位置編碼(插值型),可以外推到2048×2048仍保持可用質量。
3.2 為什麼分工有效?
從信號處理視角,SDXL的分解是頻率解耦:
圖像 = 低頻結構(可壓縮)+ 高頻細節(可預測)
↓ ↓
Base模型 Refiner模型
(全局理解) (局部生成)
Base只需要"知道"畫面有張臉,Refiner負責"畫"出毛孔。這種解耦讓:
- Base的attention負擔減輕(分辨率固定)
- Refiner的生成空間受限(已有結構指導),幻覺減少
3.3 SDXL的新邊界
仍然無法突破的牆:
- U-Net的receptive field問題依舊,只是被Refiner部分緩解
- 兩階段串行,推理時間×2
- 外推到4K時,Refiner的局部性導致細節與結構脱節(如頭髮絲漂浮在空中)
新困局產生:U-Net的局部性是天生的,必須徹底換架構。
FLUX:Transformer的全局視野(2024)
補上了 U-Net 架構無法突破的“全局視野”缺口
4.1 為什麼必須是DiT?
FLUX的架構切換(U-Net → DiT)不是追熱點,而是物理必然:
Attention的全局性
DiT的self-attention是全連接的:每個patch能看見所有其他patch。對於2048×2048的圖像(256×256 patches),這意味着任意兩點間的信息傳遞只需一層。
對比U-Net:信息從左上角傳到右下角需要經過4次下采樣-上採樣循環,每次都有信息損失。
Scaling的友好性
Transformer的性能隨計算量可預測提升(scaling law)。U-Net的卷積結構在達到一定深度後收益遞減,而DiT可以通過增加層數、頭數、維度持續改進。
位置編碼的外推性
FLUX採用RoPE(旋轉位置編碼),其設計本質是相對位置編碼。這使得:
- 訓練時:模型學習的是"距離為k的 patches 如何交互"
- 推理時:任意距離的交互都遵循同一函數,自然外推
4.2 FLUX的三重突破
更密的Latent
相比SDXL,FLUX的latent空間進一步壓縮效率提升,在同等計算預算下能表達更高頻率。
單階段端到端
不再需要SDXL的Base+Refiner分工,單個DiT同時處理結構和細節。這得益於attention的全局性——模型自己學會了在需要時關注全局,在需要時聚焦局部。
Tiled生成的質變
FLUX的tiled效果遠超SDXL,因為:
- 邊界patch的attention可以看到相鄰tile的上下文(若實現為 overlapping attention)
- 光照、風格的統計特性由全局attention隱式約束,無需顯式同步
4.3 FLUX的物理極限
Attention²的詛咒依舊
DiT解決了U-Net的局部性,但沒有解決計算複雜度。2048×2048的圖像在latent空間為256×256,attention矩陣大小為65536×65536,單精度存儲需16GB,計算不可行。
單尺度的頻率天花板
FLUX仍然是單尺度latent。雖然比SDXL更密,但固定的壓縮比意味着頻率上限固定。想要真正的4K細節,必須接受更大的latent,進而觸發顯存爆炸。
新困局產生:全局性有了,但算力不夠;想要更密latent,但內存不夠。需要更高效的注意力或多尺度架構。
Z-Image:輕量與多尺度的平衡(2024-2025)
“成本、速度、落地”
5.1 阿里的工程判斷
Z-Image的設計哲學與FLUX不同:
不是"更大更強",而是"剛好夠用,極致高效"。
這是基於阿里雲的產品場景:
- 淘寶商品圖:需要1024-2048,但要求結構穩定(不能變形)、推理快速(實時生成)
- 釘釘文檔插圖:需要輕量部署
- 通義APP:需要低功耗
5.2 架構層面的創新
輕量DiT
比FLUX更少的層數、更小的維度:
- 淺層:寬attention,捕獲全局
- 深層:窄attention+MLP,細化局部
這種異構設計讓同樣計算量下,有效receptive field更大。
多尺度特徵融合(核心創新)
Z-Image不依賴單尺度latent,而是在DiT內部顯式維護多分辨率特徵:
輸入圖像 → 多尺度編碼(1×, 1/2×, 1/4×, 1/8×)
↓
跨尺度attention(每個尺度能看到其他尺度)
↓
漸進式上採樣 + 特徵融合
↓
輸出
這類似於傳統計算機視覺中的圖像金字塔,但完全可學習、端到端訓練。
效果:
- 高頻:從1×尺度獲取
- 結構:從1/8×尺度獲取
- 一致性:跨尺度attention保證
高效注意力變體
採用局部-全局混合attention:
- 局部窗口:計算密集型,但O(N)複雜度
- 全局token:可學習的"彙總"token,數量固定(如64個),與圖像尺寸無關
這讓Z-Image的顯存佔用與分辨率線性相關,而非平方相關。
5.3 Z-Image的定位
| 維度 | Z-Image | FLUX | SDXL |
|---|---|---|---|
| 設計目標 | 產品落地 | 質量極限 | 工業穩定 |
| 架構 | 輕量異構DiT | 標準DiT | U-Net分工 |
| 多尺度 | 顯式融合 | 隱式單尺度 | 兩階段分工 |
| Attention | 局部-全局混合 | 標準全局 | 局部層次 |
| 外推能力 | 強(2K-4K) | 很強(4K+) | 弱(<2K) |
| 推理速度 | 最快 | 中等 | 最慢(雙階段) |
| 工程成本 | 最低 | 高 | 中 |
| 適用場景 | 實時生成 | 專業創作 | 傳統工業 |
5.4 Z-Image的妥協
為了效率犧牲的質量:
- 極端複雜場景(如擁擠街道)的全局一致性弱於FLUX
- 最高頻率細節(如毛髮、織物紋理)不如FLUX真實
- 藝術性、創造力略遜於大規模DiT
但這是正確的工程選擇:
對於90%的商業場景,"90分質量、100分速度"比"100分質量、50分速度"更有價值。
位置編碼演化的總覽
除了主要架構的變化之外,還有語義模塊位置編碼的演化。
因為
位置編碼的演化,就是 AIGC 模型空間認知能力的演化。
SD1.5 靠卷積“猜位置”,SDXL 開始顯式編碼位置,FLUX 建立了可外推的全局座標系,而 Z-Image 則在工程成本下構建了多尺度的高效位置體系。
高分辨率生成的突破,不僅來自更大的模型或更強的 attention,更來自“模型終於知道自己在畫布的哪裏”。
| 代際 | 架構 | 空間位置編碼 | 時間位置編碼 | 文本位置編碼 | 特點 |
|---|---|---|---|---|---|
| SD1.5 | U-Net | 無顯式 2D PE(卷積隱式) | sin-cos | CLIP 1D | 局部性強,無法外推 |
| SDXL | U-Net++ | 顯式 2D sin-cos | sin-cos++ | 雙編碼器 1D | 多尺度增強,但仍局部主導 |
| FLUX | DiT | 2D RoPE(可外推) | RoPE/sin-cos | Transformer 1D | 真正的全局座標系 |
| Z-Image | 輕量 DiT | 多尺度 + 局部相對 + 全局抽象 | sin-cos | Transformer 1D | 工程最優,線性成本 |
回顧四代架構:
- SD1.5(U-Net):證明了擴散模型可行,但暴露了局部性侷限
- SDXL(U-Net+分工):用工程分工繞過侷限,但複雜度爆炸
- FLUX(DiT):用Transformer解決局部性,但算力瓶頸顯現
- Z-Image(輕量DiT+多尺度):用效率優化平衡質量與成本
每一步都不是"更好"的簡單替代,而是在約束條件下的當前最優。
-
SD1.5:低算力時代的最優
-
SDXL:高頻細節的最優
-
FLUX:全局一致性的最優
-
Z-Image:成本與落地性的最優
這或許是AI工程化的終極真理:
沒有最好的架構,只有最合適的架構。
把一些成熟的傳統算法,適配到現有的模型架構裏去,永遠不會過時。
這條路肯定還需要不少時間,一起努力吧。
博主為了把推理性能壓榨到極限,幹了不少辛酸事,
特別是把移植到TF,然後用TF寫個猥瑣發育的Chunked Flash Attention in Keras 寫這個的時候,Flash Attention 還沒發佈,
而開源的這個版本也是整理之後開源出來的,畢竟我已經拋棄TensorFlow/Keras轉投PyTorch了。
SD1.5 時代,為了壓榨推理性能,博主做了很多“苦活”:
TO C:
-
權重預計算(減少重複計算)
-
Flash Attention(降低 attention 顯存)
-
FP16/INT8 量化(端側可運行)
-
跨框架遷移(TF ↔ Torch ↔ ONNX ↔ TFLite)
-
端側蒸餾 Encoder,實現 1 秒級推理
-
多模型並行部署,顯存複用
後來回到廣東,給某個遊戲大廠做了大量遊戲場景定製化LoRa,熱情擁抱PyTorch。
TO B:
-
超高分辨率 壓榨顯存,擠一擠總是有的
-
乾淨的髒 他們對素材的細節要求真的很高
-
高保真生成 必須保證設定的一致性
-
語義可控 數據集雖然少,但是泛化性不能丟,解決小數據的過擬合
但來來回回,問題都一樣:
算法研發,就是用小資源幹大事。
在這之間有些算法做出來了,但沒開源。
後來大廠開源了他們的版本,打法粗暴,一地雞毛。
但無可厚非,畢竟這些年博主從開源項目中也學到了不少。
只是在那時就意識到:
-
不跟大廠硬鋼 → 拿不到資源
-
跟在大廠後面 → 肉湯喝不到,鍋還被砸
也是下了決心,選擇了裸辭。
不再關注戰場發生什麼,只問自己:
我想做什麼,想達成什麼。
現在回頭一看,發現兩年前的一個技術方案,至今沒有看到後來者。
倍感心安,但還得繼續推進~
以上,僅以此文共勉之。
若有各種其他問題可以通過以下方式聯繫博主交流學習。
微信: Dbgmonks
QQ: 200759103
郵箱: gaozhihan@vip.qq.com
注: 不註明來意者一律拒絕。